/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.core.id; import java.io.File; import java.io.IOException; import javax.jcr.RepositoryException; import org.apache.commons.io.FileUtils; import junit.framework.TestCase; public class NodeIdFactoryTest extends TestCase { private static final String factoryDir = "target/temp/nodeIdFactory"; public void setUp() throws IOException { System.clearProperty(NodeIdFactory.SEQUENTIAL_NODE_ID); FileUtils.deleteDirectory(new File(factoryDir)); } public void tearDown() throws IOException { setUp(); System.clearProperty(NodeIdFactory.SEQUENTIAL_NODE_ID); } public void testRandomVersusSequential() throws RepositoryException { NodeIdFactory f = new NodeIdFactory(factoryDir); f.open(); NodeId id = f.newNodeId(); assertTrue(id.getLeastSignificantBits() != 0); f.close(); System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "true"); f = new NodeIdFactory(factoryDir); f.open(); id = f.newNodeId(); assertTrue(id.getLeastSignificantBits() == 0); f.close(); } /** * Test that the version field is reset (0), and that all other MSB bits are * 1 at some point. This also tests the LSB bits. */ public void testUUIDVersionFieldReset() throws Exception { System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "true"); long msbOr = 0, msbAnd = -1, lsbOr = 0, lsbAnd = -1; for (int i = 0; i < 0x1f; i++) { FileUtils.deleteDirectory(new File(factoryDir)); NodeIdFactory f = new NodeIdFactory(factoryDir); f.open(); for (int j = 0; j < 8; j++) { NodeId x = f.newNodeId(); msbOr |= x.getMostSignificantBits(); msbAnd &= x.getMostSignificantBits(); lsbAnd &= x.getLeastSignificantBits(); lsbOr |= x.getLeastSignificantBits(); } f.close(); } assertEquals(0xffffffffffff0fffL, msbOr); assertEquals(0, msbAnd); assertEquals(7, lsbOr); assertEquals(0, lsbAnd); } public void testNormalUsage() throws RepositoryException { System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "true"); NodeIdFactory f = new NodeIdFactory(factoryDir); f.open(); assertTrue(f.newNodeId().toString().endsWith("-0000-000000000000")); f.close(); f = new NodeIdFactory(factoryDir); f.open(); assertTrue(f.newNodeId().toString().endsWith("-0000-000000000001")); f.close(); } public void testOffset() throws RepositoryException { System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "ab/0"); NodeIdFactory f = new NodeIdFactory(factoryDir); f.open(); assertEquals("00000000-0000-00ab-0000-000000000000", f.newNodeId().toString()); f.close(); f = new NodeIdFactory(factoryDir); f.open(); assertEquals("00000000-0000-00ab-0000-000000000001", f.newNodeId().toString()); f.close(); } public void testKillRepository() throws RepositoryException { System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "true"); int cacheSize = 8; for (int i = 1; i < 40; i++) { File id = new File(factoryDir, "nodeId.properties"); id.delete(); NodeIdFactory f = new NodeIdFactory(factoryDir); f.setCacheSize(cacheSize); f.open(); NodeId last = null; for (int j = 0; j < i; j++) { last = f.newNodeId(); } // don't close the factory - this is the same as killing the process // f.close(); f = new NodeIdFactory(factoryDir); f.setCacheSize(cacheSize); f.open(); NodeId n = f.newNodeId(); assertTrue("now: " + n + " last: " + last, n.compareTo(last) > 0); long diff = n.getLeastSignificantBits() - last.getLeastSignificantBits(); assertTrue("diff: " + diff, diff > 0 && diff <= cacheSize); f.close(); } } public void testKillWhileSaving() throws RepositoryException { System.setProperty(NodeIdFactory.SEQUENTIAL_NODE_ID, "true"); NodeIdFactory f = new NodeIdFactory(factoryDir); f.open(); assertTrue(f.newNodeId().toString().endsWith("-0000-000000000000")); f.close(); File id = new File(factoryDir, "nodeId.properties"); assertTrue(id.exists()); File idTemp = new File(factoryDir, "nodeId.properties.temp"); id.renameTo(idTemp); f = new NodeIdFactory(factoryDir); f.open(); assertTrue(f.newNodeId().toString().endsWith("-0000-000000000001")); assertFalse(idTemp.exists()); f.close(); } }