adding btree tests

git-svn-id: https://hyracks.googlecode.com/svn/trunk/hyracks@89 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-btree/src/test/java/BTreeFieldPrefixNSMTest.java b/hyracks-storage-am-btree/src/test/java/BTreeFieldPrefixNSMTest.java
new file mode 100644
index 0000000..4ad5e05
--- /dev/null
+++ b/hyracks-storage-am-btree/src/test/java/BTreeFieldPrefixNSMTest.java
@@ -0,0 +1,167 @@
+package edu.uci.ics.asterix.test.storage;
+
+import java.io.File;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.Random;
+import java.util.logging.Level;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import edu.uci.ics.asterix.common.config.GlobalConfig;
+import edu.uci.ics.asterix.indexing.btree.frames.FieldPrefixNSMLeaf;
+import edu.uci.ics.asterix.indexing.btree.impls.FieldPrefixSlotManager;
+import edu.uci.ics.asterix.indexing.btree.impls.MultiComparator;
+import edu.uci.ics.asterix.indexing.btree.interfaces.IComparator;
+import edu.uci.ics.asterix.indexing.btree.interfaces.IFieldAccessor;
+import edu.uci.ics.asterix.indexing.btree.interfaces.IPrefixSlotManager;
+import edu.uci.ics.asterix.indexing.types.Int32Accessor;
+import edu.uci.ics.asterix.indexing.types.Int32Comparator;
+import edu.uci.ics.asterix.om.AInt32;
+import edu.uci.ics.asterix.storage.buffercache.BufferAllocator;
+import edu.uci.ics.asterix.storage.buffercache.BufferCache;
+import edu.uci.ics.asterix.storage.buffercache.ClockPageReplacementStrategy;
+import edu.uci.ics.asterix.storage.buffercache.IBufferCache;
+import edu.uci.ics.asterix.storage.buffercache.ICacheMemoryAllocator;
+import edu.uci.ics.asterix.storage.buffercache.ICachedPage;
+import edu.uci.ics.asterix.storage.buffercache.IPageReplacementStrategy;
+import edu.uci.ics.asterix.storage.file.FileInfo;
+import edu.uci.ics.asterix.storage.file.FileManager;
+
+public class BTreeFieldPrefixNSMTest {
+	
+    //private static final int PAGE_SIZE = 8192;
+    //private static final int PAGE_SIZE = 8192;
+	//private static final int PAGE_SIZE = 32768; // 32K
+	//private static final int PAGE_SIZE = 65536; // 64K
+	private static final int PAGE_SIZE = 131072; // 128K
+    private static final int NUM_PAGES = 40;
+    
+    // to help with the logger madness
+    private void print(String str) {
+    	if(GlobalConfig.ASTERIX_LOGGER.isLoggable(Level.FINEST)) {            
+        	GlobalConfig.ASTERIX_LOGGER.finest(str);
+        }
+    }       
+    
+    private void tupleInsert(FieldPrefixNSMLeaf frame, MultiComparator cmp, int f0, int f1, int f2, boolean print, ArrayList<byte[]> records) throws Exception {
+    	if(print) System.out.println("INSERTING: " + f0 + " " + f1 + " " + f2);
+    	
+    	byte[] record = new byte[12];
+        AInt32 field0 = new AInt32(f0);
+        AInt32 field1 = new AInt32(f1);
+        AInt32 field2 = new AInt32(f2);
+        System.arraycopy(field0.toBytes(), 0, record, 0, 4);
+        System.arraycopy(field1.toBytes(), 0, record, 4, 4);
+        System.arraycopy(field2.toBytes(), 0, record, 8, 4);
+        frame.insert(record, cmp);
+        
+        if(records != null) records.add(record);
+    }
+    
+    @Test
+    public void test01() throws Exception {
+    	
+        FileManager fileManager = new FileManager();
+        ICacheMemoryAllocator allocator = new BufferAllocator();
+        IPageReplacementStrategy prs = new ClockPageReplacementStrategy();
+        IBufferCache bufferCache = new BufferCache(allocator, prs, fileManager, PAGE_SIZE, NUM_PAGES);
+        
+        File f = new File("/tmp/btreetest.bin");
+        RandomAccessFile raf = new RandomAccessFile(f, "rw");
+        int fileId = 0;
+        FileInfo fi = new FileInfo(fileId, raf);
+        fileManager.registerFile(fi);
+                
+        int numFields = 3;
+        IFieldAccessor[] fields = new IFieldAccessor[numFields];
+        fields[0] = new Int32Accessor(); // first key field
+        fields[1] = new Int32Accessor(); // second key field
+        fields[2] = new Int32Accessor(); // third key field
+        
+        int keyLen = 3;
+        IComparator[] cmps = new IComparator[keyLen];
+        cmps[0] = new Int32Comparator();
+        cmps[1] = new Int32Comparator();
+        cmps[2] = new Int32Comparator();
+        MultiComparator cmp = new MultiComparator(cmps, fields);
+        
+        Random rnd = new Random();
+        rnd.setSeed(50);
+        
+        ICachedPage page = bufferCache.pin(FileInfo.getDiskPageId(fileId, 0), false);
+        try {
+        	        	        	        	
+            IPrefixSlotManager slotManager = new FieldPrefixSlotManager();
+            FieldPrefixNSMLeaf frame = new FieldPrefixNSMLeaf();                                    
+            frame.setPage(page);            
+            frame.initBuffer((byte)0);
+            slotManager.setFrame(frame);          
+            frame.setNumPrefixRecords(0);
+            
+            String before = new String();
+            String after = new String();
+            
+            int compactFreq = 5;
+        	int compressFreq = 5;
+        	int smallMax = 10;        	
+        	int numRecords = 5000;
+        	ArrayList<byte[]> records = new ArrayList<byte[]>();
+        	records.ensureCapacity(numRecords);
+        	        	
+        	// insert records with random calls to compact and compress
+        	for(int i = 0; i < numRecords; i++) {
+        		
+        		if((i+1) % 100 == 0) print("INSERTING " + (i+1) + " / " + numRecords + "\n");        		
+        		
+        		int a = rnd.nextInt() % smallMax;
+        		int b = rnd.nextInt() % smallMax;
+        		int c = i;
+        		tupleInsert(frame, cmp, a, b, c, false, records);
+        		
+        		if(rnd.nextInt() % compactFreq == 0) {
+        			before = frame.printKeys(cmp);
+        			frame.compact(cmp);
+        			after = frame.printKeys(cmp);
+        			Assert.assertEquals(before, after);
+        		}
+        		
+        		if(rnd.nextInt() % compressFreq == 0) {
+        			before = frame.printKeys(cmp);
+        			frame.compress(cmp);
+        			after = frame.printKeys(cmp);
+        			Assert.assertEquals(before, after);
+        		}
+        	}
+        	
+        	// delete records with random calls to compact and compress        	
+        	for(int i = 0; i < records.size(); i++) {        	            	    
+        		
+        		if((i+1) % 100 == 0) print("DELETING " + (i+1) + " / " + numRecords + "\n");
+        		
+        		frame.delete(records.get(i), cmp, true);    
+        		
+        		if(rnd.nextInt() % compactFreq == 0) {
+        			before = frame.printKeys(cmp);
+        			frame.compact(cmp);
+        			after = frame.printKeys(cmp);
+        			Assert.assertEquals(before, after);
+        		}
+        		
+        		if(rnd.nextInt() % compressFreq == 0) {
+        			before = frame.printKeys(cmp);
+        			frame.compress(cmp);
+        			after = frame.printKeys(cmp);
+        			Assert.assertEquals(before, after);
+        		}  
+        	}
+        	        	
+        } finally {            
+            bufferCache.unpin(page);
+        }              
+        
+        bufferCache.close();
+        fileManager.close();
+    }
+}