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