01: /*-
02: * See the file LICENSE for redistribution information.
03: *
04: * Copyright (c) 2005,2008 Oracle. All rights reserved.
05: *
06: * $Id: SR13061Test.java,v 1.4.2.2 2008/01/07 15:14:25 cwl Exp $
07: */
08:
09: package com.sleepycat.je.cleaner;
10:
11: import junit.framework.TestCase;
12:
13: import com.sleepycat.bind.tuple.TupleOutput;
14: import com.sleepycat.je.DatabaseException;
15: import com.sleepycat.je.cleaner.FileSummary;
16: import com.sleepycat.je.tree.FileSummaryLN;
17:
18: /**
19: * Tests that a FileSummaryLN with an old style string key can be read. When
20: * we relied solely on log entry version to determine whether an LN had a
21: * string key, we could fail when an old style LN was migrated by the cleaner.
22: * In that case the key was still a string key but the log entry version was
23: * updated to something greater than zero. See FileSummaryLN.hasStringKey for
24: * details of how we now guard against this.
25: */
26: public class SR13061Test extends TestCase {
27:
28: public SR13061Test() {
29: }
30:
31: public void testSR13061() throws DatabaseException {
32:
33: FileSummaryLN ln = new FileSummaryLN(new FileSummary());
34:
35: /*
36: * All of these tests failed before checking that the byte array must
37: * be eight bytes for integer keys.
38: */
39: assertTrue(ln.hasStringKey(stringKey(0)));
40: assertTrue(ln.hasStringKey(stringKey(1)));
41: assertTrue(ln.hasStringKey(stringKey(12)));
42: assertTrue(ln.hasStringKey(stringKey(123)));
43: assertTrue(ln.hasStringKey(stringKey(1234)));
44: assertTrue(ln.hasStringKey(stringKey(12345)));
45: assertTrue(ln.hasStringKey(stringKey(123456)));
46: assertTrue(ln.hasStringKey(stringKey(1234567)));
47: assertTrue(ln.hasStringKey(stringKey(123456789)));
48: assertTrue(ln.hasStringKey(stringKey(1234567890)));
49:
50: /*
51: * These tests failed before checking that the first byte of the
52: * sequence number (in an eight byte key) must not be '0' to '9' for
53: * integer keys.
54: */
55: assertTrue(ln.hasStringKey(stringKey(12345678)));
56: assertTrue(ln.hasStringKey(stringKey(12340000)));
57:
58: /* These tests are just for good measure. */
59: assertTrue(!ln.hasStringKey(intKey(0, 1)));
60: assertTrue(!ln.hasStringKey(intKey(1, 1)));
61: assertTrue(!ln.hasStringKey(intKey(12, 1)));
62: assertTrue(!ln.hasStringKey(intKey(123, 1)));
63: assertTrue(!ln.hasStringKey(intKey(1234, 1)));
64: assertTrue(!ln.hasStringKey(intKey(12345, 1)));
65: assertTrue(!ln.hasStringKey(intKey(123456, 1)));
66: assertTrue(!ln.hasStringKey(intKey(1234567, 1)));
67: assertTrue(!ln.hasStringKey(intKey(12345678, 1)));
68: assertTrue(!ln.hasStringKey(intKey(123456789, 1)));
69: assertTrue(!ln.hasStringKey(intKey(1234567890, 1)));
70: }
71:
72: private byte[] stringKey(long fileNum) {
73:
74: try {
75: return String.valueOf(fileNum).getBytes("UTF-8");
76: } catch (Exception e) {
77: fail(e.toString());
78: return null;
79: }
80: }
81:
82: private byte[] intKey(long fileNum, long seqNum) {
83:
84: TupleOutput out = new TupleOutput();
85: out.writeUnsignedInt(fileNum);
86: out.writeUnsignedInt(seqNum);
87: return out.toByteArray();
88: }
89: }
|