1 /*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 2002, 2014 Oracle and/or its affiliates. All rights reserved. 5 * 6 */ 7 8 package com.sleepycat.je.tree; 9 10 import static org.junit.Assert.assertEquals; 11 import static org.junit.Assert.assertTrue; 12 13 import java.io.File; 14 import java.nio.ByteBuffer; 15 16 import org.junit.After; 17 import org.junit.Before; 18 19 import com.sleepycat.je.CacheMode; 20 import com.sleepycat.je.Database; 21 import com.sleepycat.je.DatabaseConfig; 22 import com.sleepycat.je.DatabaseEntry; 23 import com.sleepycat.je.DbInternal; 24 import com.sleepycat.je.Environment; 25 import com.sleepycat.je.EnvironmentConfig; 26 import com.sleepycat.je.dbi.DatabaseImpl; 27 import com.sleepycat.je.util.TestUtils; 28 import com.sleepycat.util.test.SharedTestUtils; 29 import com.sleepycat.util.test.TestBase; 30 31 public class INEntryTestBase extends TestBase { 32 33 File envHome = SharedTestUtils.getTestDir(); 34 35 EnvironmentConfig envConfig; 36 37 int nodeMaxEntries; 38 39 short compactMaxKeyLength = 0; 40 41 CacheMode cacheMode = CacheMode.DEFAULT; 42 43 Environment env = null; 44 45 protected static String DB_NAME = "TestDb"; 46 47 @Before setUp()48 public void setUp() 49 throws Exception { 50 51 super.setUp(); 52 envConfig = TestUtils.initEnvConfig(); 53 envConfig.setAllowCreate(true); 54 envConfig.setConfigParam(EnvironmentConfig.ENV_RUN_CLEANER, 55 "false"); 56 envConfig.setConfigParam(EnvironmentConfig.ENV_RUN_CHECKPOINTER, 57 "false"); 58 envConfig.setConfigParam(EnvironmentConfig.TREE_COMPACT_MAX_KEY_LENGTH, 59 String.valueOf(compactMaxKeyLength)); 60 nodeMaxEntries = Integer.parseInt 61 (envConfig.getConfigParam(EnvironmentConfig.NODE_MAX_ENTRIES)); 62 env = new Environment(envHome, envConfig); 63 } 64 65 @After tearDown()66 public void tearDown() { 67 env.close(); 68 } 69 70 /* Assumes the test creates just one IN node. */ verifyINMemorySize(DatabaseImpl dbImpl)71 protected void verifyINMemorySize(DatabaseImpl dbImpl) { 72 BIN in = (BIN)(dbImpl.getTree().getFirstNode(cacheMode)); 73 in.releaseLatch(); 74 75 final IN lastNode = dbImpl.getTree().getLastNode(cacheMode); 76 assertEquals(in, lastNode); 77 assertTrue(in.verifyMemorySize()); 78 79 in.releaseLatch(); 80 TestUtils.validateNodeMemUsage(dbImpl.getEnv(), true); 81 } 82 createDb(String dbName, int keySize, int count, boolean keyPrefixingEnabled)83 protected Database createDb(String dbName, 84 int keySize, 85 int count, 86 boolean keyPrefixingEnabled) { 87 DatabaseConfig dbConfig = new DatabaseConfig(); 88 dbConfig.setAllowCreate(true); 89 dbConfig.setSortedDuplicates(false); 90 dbConfig.setKeyPrefixing(keyPrefixingEnabled); 91 Database db = env.openDatabase(null, dbName, dbConfig); 92 final DatabaseImpl dbImpl = DbInternal.getDatabaseImpl(db); 93 DatabaseEntry key = new DatabaseEntry(); 94 for (int i=0; i < count; i++) { 95 key.setData(createByteVal(i, keySize)); 96 db.put(null, key, key); 97 verifyINMemorySize(dbImpl); 98 } 99 return db; 100 } 101 createDb(String dbName, int keySize, int count)102 protected Database createDb(String dbName, 103 int keySize, 104 int count) { 105 return createDb(dbName, keySize, count, false); 106 } 107 createDupDb(String dbName, int keySize, int count)108 protected Database createDupDb(String dbName, 109 int keySize, 110 int count) { 111 DatabaseConfig dbConfig = new DatabaseConfig(); 112 dbConfig.setAllowCreate(true); 113 dbConfig.setSortedDuplicates(false); 114 Database db = env.openDatabase(null, dbName, dbConfig); 115 final DatabaseImpl dbImpl = DbInternal.getDatabaseImpl(db); 116 DatabaseEntry key = new DatabaseEntry(); 117 DatabaseEntry data = new DatabaseEntry(); 118 for (int i=0; i < count; i++) { 119 key.setData(new byte[0]); 120 data.setData(createByteVal(i, keySize)); 121 db.put(null, key, data); 122 verifyINMemorySize(dbImpl); 123 } 124 return db; 125 } 126 createByteVal(int val, int arrayLength)127 protected byte[] createByteVal(int val, int arrayLength) { 128 ByteBuffer byteBuffer = ByteBuffer.allocate(arrayLength); 129 if (arrayLength >= 4) { 130 byteBuffer.putInt(val); 131 } else if (arrayLength >= 2) { 132 byteBuffer.putShort((short) val); 133 } else { 134 byteBuffer.put((byte) val); 135 } 136 return byteBuffer.array(); 137 } 138 139 /* Dummy test IN. */ 140 class TestIN extends IN { 141 private int maxEntries; 142 TestIN(int capacity)143 TestIN(int capacity) { 144 maxEntries = capacity; 145 } 146 147 @Override getCompactMaxKeyLength()148 protected int getCompactMaxKeyLength() { 149 return compactMaxKeyLength; 150 } 151 152 @Override getMaxEntries()153 public int getMaxEntries() { 154 return maxEntries; 155 } 156 } 157 } 158