package com.facebook.infrastructure.io; import com.facebook.infrastructure.ServerTest; import com.facebook.infrastructure.db.FileStruct; import com.facebook.infrastructure.utils.BloomFilter; import org.apache.commons.collections.CollectionUtils; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.util.*; public class SSTableTest extends ServerTest { @Test public void testSingleWrite() throws IOException { File f = File.createTempFile("sstable", ""); SSTable ssTable; // write test data ssTable = new SSTable(f.getParent(), f.getName()); BloomFilter bf = new BloomFilter(1000, 8); Random random = new Random(); byte[] bytes = new byte[1024]; random.nextBytes(bytes); String key = Integer.toString(1); ssTable.append(key, bytes); bf.add(key); ssTable.close(bf); // verify ssTable = new SSTable(f.getPath() + "-Data.db"); DataInputBuffer bufIn = ssTable.next(key, "Test:C"); byte[] bytes2 = new byte[1024]; bufIn.readFully(bytes2); assert Arrays.equals(bytes2, bytes); } @Test public void testManyWrites() throws IOException { File f = File.createTempFile("sstable", ""); SSTable ssTable; TreeMap<String, byte[]> map = new TreeMap<String,byte[]>(); for ( int i = 100; i < 1000; ++i ) { map.put(Integer.toString(i), ("Avinash Lakshman is a good man: " + i).getBytes()); } // write ssTable = new SSTable(f.getParent(), f.getName()); BloomFilter bf = new BloomFilter(1000, 8); for (String key: map.navigableKeySet()) { ssTable.append(key, map.get(key)); } ssTable.close(bf); // verify List<String> keys = new ArrayList(map.keySet()); Collections.shuffle(keys); ssTable = new SSTable(f.getPath() + "-Data.db"); for (String key: keys) { DataInputBuffer bufIn = ssTable.next(key, "Test:C"); byte[] bytes2 = new byte[map.get(key).length]; bufIn.readFully(bytes2); assert Arrays.equals(bytes2, map.get(key)); } } @Test public void testFileStruct() throws IOException { File f = File.createTempFile("sstable", ""); SSTable ssTable; FileStruct fs; TreeMap<String, byte[]> map = new TreeMap<String,byte[]>(); for ( int i = 200; i < 1000; i += 2 ) { map.put(Integer.toString(i), ("Avinash Lakshman is a good man: " + i).getBytes()); } // write ssTable = new SSTable(f.getParent(), f.getName()); BloomFilter bf = new BloomFilter(1000, 8); for (String key: map.navigableKeySet()) { ssTable.append(key, map.get(key)); } ssTable.close(bf); // test seek List<String> keys = new ArrayList<String>(); CollectionUtils.addAll(keys, new ArrayList(map.keySet()).listIterator(200)); assert keys.get(0).equals("600"); fs = new FileStruct(SequenceFile.reader(f.getPath() + "-Data.db")); fs.seekTo("599"); assert fs.getKey().equals("600"); for (String key : keys) { assert !fs.isExhausted(); assert key.equals(fs.getKey()); fs.getNextKey(); } assert fs.isExhausted(); // test iterator fs = new FileStruct(SequenceFile.reader(f.getPath() + "-Data.db")); Iterator<String> iter = fs.iterator(); for (String key : map.keySet()) { assert key.equals(iter.next()); } assert !iter.hasNext(); } }