/*
* Copyright 2008-2009 LinkedIn, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package voldemort.store.readonly;
import java.io.File;
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.junit.Test;
import voldemort.TestUtils;
import voldemort.utils.ByteUtils;
import voldemort.utils.Pair;
import voldemort.utils.Utils;
/**
* Tests for the HDFS-based fetcher
*
*
*/
public class ReadOnlyUtilsTest extends TestCase {
@Test
public void testGetPartitionReplicaTuple() {
try {
ReadOnlyUtils.getPartitionReplicaTuple("0_0.data");
fail("Should have thrown an exception");
} catch(Exception e) {}
assertEquals(ReadOnlyUtils.getPartitionReplicaTuple("0_0_0.data"), Pair.create(0, 0));
assertEquals(ReadOnlyUtils.getPartitionReplicaTuple("0_1_1.index"), Pair.create(0, 1));
assertEquals(ReadOnlyUtils.getPartitionReplicaTuple("10_31_1.index"), Pair.create(10, 31));
assertEquals(ReadOnlyUtils.getPartitionReplicaTuple("5_310_10.data"), Pair.create(5, 310));
}
@Test
public void testIsFormatCorrect() {
Logger.getRootLogger().removeAllAppenders();
assertFalse(ReadOnlyUtils.isFormatCorrect("0", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0.", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0index", ReadOnlyStorageFormat.READONLY_V0));
assertTrue(ReadOnlyUtils.isFormatCorrect("0_0.index", ReadOnlyStorageFormat.READONLY_V0));
assertTrue(ReadOnlyUtils.isFormatCorrect("10_0.data", ReadOnlyStorageFormat.READONLY_V0));
assertTrue(ReadOnlyUtils.isFormatCorrect("10_10.data", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_10.dat", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_10.inde", ReadOnlyStorageFormat.READONLY_V0));
assertFalse(ReadOnlyUtils.isFormatCorrect("0", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0.", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0.index", ReadOnlyStorageFormat.READONLY_V2));
assertTrue(ReadOnlyUtils.isFormatCorrect("0_0_0.index", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("0_0_0index", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_0.d", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_10.d", ReadOnlyStorageFormat.READONLY_V2));
assertTrue(ReadOnlyUtils.isFormatCorrect("10_10_0.index", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_10_0.inde", ReadOnlyStorageFormat.READONLY_V2));
assertFalse(ReadOnlyUtils.isFormatCorrect("10_10_0.dat", ReadOnlyStorageFormat.READONLY_V2));
}
@Test
public void testGetChunkId() {
assertEquals(ReadOnlyUtils.getChunkId("0_0.d"), 0);
assertEquals(ReadOnlyUtils.getChunkId("0_1.d"), 1);
assertEquals(ReadOnlyUtils.getChunkId("0_100.d"), 100);
assertEquals(ReadOnlyUtils.getChunkId("10_83_674.d"), 674);
assertEquals(ReadOnlyUtils.getChunkId("0_10_30.d"), 30);
}
public void testMinIntegerBug() {
byte[] keyBytes = new byte[4];
ByteUtils.writeInt(keyBytes, Integer.MIN_VALUE, 0);
assertEquals(0, ReadOnlyUtils.chunk(keyBytes, 15));
}
public void testVersionParsing() throws IOException {
File tempParentDir = TestUtils.createTempDir();
File testFile = new File(tempParentDir, "blahDir");
Utils.mkdirs(testFile);
assertFalse(ReadOnlyUtils.checkVersionDirName(testFile));
assertEquals(ReadOnlyUtils.getVersionId(testFile), -1);
File testFile2 = new File(tempParentDir, "blahFile");
testFile2.createNewFile();
assertFalse(ReadOnlyUtils.checkVersionDirName(testFile2));
assertEquals(ReadOnlyUtils.getVersionId(testFile2), -1);
File testFile3 = new File(tempParentDir, "version-23");
Utils.mkdirs(testFile3);
assertTrue(ReadOnlyUtils.checkVersionDirName(testFile3));
assertEquals(ReadOnlyUtils.getVersionId(testFile3), 23);
File testFile4 = new File(tempParentDir, "version-23.bak");
Utils.mkdirs(testFile4);
assertFalse(ReadOnlyUtils.checkVersionDirName(testFile4));
assertEquals(ReadOnlyUtils.getVersionId(testFile4), -1);
File latestSymLink = new File(tempParentDir, "latest");
Utils.symlink(testFile.getAbsolutePath(), latestSymLink.getAbsolutePath());
assertFalse(ReadOnlyUtils.checkVersionDirName(latestSymLink));
assertEquals(ReadOnlyUtils.getVersionId(latestSymLink), -1);
assertEquals(ReadOnlyUtils.getVersionDirs(tempParentDir).length, 1);
}
private void generateVersionDirs(final File parentDir, final String... versions) {
File versionDir = null;
for(String version: versions) {
versionDir = new File(parentDir, "version-" + version);
Utils.mkdirs(versionDir);
}
}
public void testFindKthVersionedDir() {
File tempParentDir = TestUtils.createTempDir();
generateVersionDirs(tempParentDir, "0");
assertNull(ReadOnlyUtils.findKthVersionedDir(ReadOnlyUtils.getVersionDirs(tempParentDir),
-1,
100));
assertNull(ReadOnlyUtils.findKthVersionedDir(ReadOnlyUtils.getVersionDirs(tempParentDir),
0,
1));
File[] returnedFiles = ReadOnlyUtils.findKthVersionedDir(ReadOnlyUtils.getVersionDirs(tempParentDir),
0,
0);
assertEquals(returnedFiles.length, 1);
assertEquals(returnedFiles[0], new File(tempParentDir, "version-0"));
tempParentDir = TestUtils.createTempDir();
String[] versions = { "100", "10", "200", "20", "250", "300", "6", "6a" };
generateVersionDirs(tempParentDir, versions);
returnedFiles = ReadOnlyUtils.getVersionDirs(tempParentDir);
assertEquals(returnedFiles.length, 7);
File[] returnedFiles2 = ReadOnlyUtils.findKthVersionedDir(returnedFiles, 5, 6);
assertEquals(returnedFiles2.length, 2);
assertEquals(returnedFiles2[0], new File(tempParentDir, "version-250"));
assertEquals(returnedFiles2[1], new File(tempParentDir, "version-300"));
returnedFiles2 = ReadOnlyUtils.findKthVersionedDir(returnedFiles, 0, 3);
assertEquals(returnedFiles2.length, 4);
assertEquals(returnedFiles2[0], new File(tempParentDir, "version-6"));
assertEquals(returnedFiles2[1], new File(tempParentDir, "version-10"));
assertEquals(returnedFiles2[2], new File(tempParentDir, "version-20"));
assertEquals(returnedFiles2[3], new File(tempParentDir, "version-100"));
returnedFiles2 = ReadOnlyUtils.findKthVersionedDir(returnedFiles, 0, 0);
assertEquals(returnedFiles2.length, 1);
assertEquals(returnedFiles2[0], new File(tempParentDir, "version-6"));
returnedFiles2 = ReadOnlyUtils.findKthVersionedDir(returnedFiles, 6, 6);
assertEquals(returnedFiles2.length, 1);
assertEquals(returnedFiles2[0], new File(tempParentDir, "version-300"));
returnedFiles2 = ReadOnlyUtils.findKthVersionedDir(returnedFiles, 7, 7);
assertNull(returnedFiles2);
}
}