/* * 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.jena.tdb.transaction; import java.nio.ByteBuffer ; import java.util.Iterator ; import org.apache.jena.atlas.junit.BaseTest ; import org.apache.jena.atlas.lib.Bytes ; import org.apache.jena.tdb.base.block.Block ; import org.apache.jena.tdb.base.file.BufferChannel ; import org.apache.jena.tdb.base.file.BufferChannelMem ; import org.apache.jena.tdb.sys.FileRef ; import org.apache.jena.tdb.transaction.Journal ; import org.apache.jena.tdb.transaction.JournalEntry ; import org.apache.jena.tdb.transaction.JournalEntryType ; import org.junit.Before ; import org.junit.Test ; public class TestJournal extends BaseTest { static { FileRef.file("xyz") ; FileRef.file("abc") ; } // bb1 and bb2 have the same contents and different contents to bb3. static ByteBuffer bb1 = ByteBuffer.allocate(4) ; static ByteBuffer bb2 = ByteBuffer.allocate(4) ; static ByteBuffer bb3 = ByteBuffer.allocate(8) ; static { Bytes.setInt(0xFFABCD12, bb1.array()) ; Bytes.setInt(0x1234ABCD, bb2.array()) ; Bytes.setLong(0x2222222211111111L, bb3.array()) ; } static Block blk1 = new Block(1, bb1) ; static Block blk2 = new Block(2, bb2) ; static Block blk3 = new Block(3, bb3) ; static FileRef testRef = FileRef.create("TEST") ; static FileRef testRef1 = FileRef.create("TEST1") ; static FileRef testRef2 = FileRef.create("TEST2") ; Journal journal ; @Before public void before() { BufferChannel mem = BufferChannelMem.create("journal") ; journal = new Journal(mem) ; bb1.clear() ; bb2.clear() ; bb3.clear() ; } @Test public void journal_01() { assertFalse(journal.entries().hasNext()) ; } @Test public void journal_02() { JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ; long x = journal.writeJournal(entry1) ; assertEquals(0, x) ; JournalEntry entry9 = journal.readJournal(x) ; assertTrue(equal(entry1, entry9)) ; } @Test public void journal_03() { JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ; JournalEntry entry2 = new JournalEntry(JournalEntryType.Object, testRef, bb1) ; long x1 = journal.writeJournal(entry1) ; bb1.clear() ; long x2 = journal.writeJournal(entry2) ; bb1.clear() ; assertEquals(0, x1) ; assertNotEquals(0, x2) ; JournalEntry entry1a = journal.readJournal(x1) ; JournalEntry entry2a = journal.readJournal(x2) ; assertNotSame(entry1, entry1a) ; assertNotSame(entry2, entry2a) ; assertTrue(equal(entry1, entry1a)) ; assertTrue(equal(entry2, entry2a)) ; assertFalse(equal(entry1a, entry2a)) ; } @Test public void journal_04() { JournalEntry entry1 = new JournalEntry(JournalEntryType.Object, testRef, bb1) ; JournalEntry entry2 = new JournalEntry(JournalEntryType.Object, testRef, bb3) ; long x1 = journal.writeJournal(entry1) ; long x2 = journal.writeJournal(entry2) ; Iterator<JournalEntry> iter = journal.entries() ; JournalEntry entry1a = iter.next(); JournalEntry entry2a = iter.next(); assertFalse(iter.hasNext()) ; } @Test public void journal_05() { JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ; JournalEntry entry2 = new JournalEntry(JournalEntryType.Buffer, testRef1, bb1) ; long x1 = journal.writeJournal(entry1) ; bb1.clear(); long x2 = journal.writeJournal(entry2) ; bb1.clear(); assertEquals(0, x1) ; assertNotEquals(0, x2) ; JournalEntry entry1a = journal.readJournal(x1) ; JournalEntry entry2a = journal.readJournal(x2) ; assertNotSame(entry1, entry1a) ; assertNotSame(entry2, entry2a) ; assertTrue(equal(entry1, entry1a)) ; assertTrue(equal(entry2, entry2a)) ; assertFalse(equal(entry1a, entry2a)) ; } @Test public void journal_06() { JournalEntry entry1 = new JournalEntry(JournalEntryType.Block, testRef, blk1) ; JournalEntry entry2 = new JournalEntry(JournalEntryType.Block, testRef, blk2) ; long x1 = journal.writeJournal(entry1) ; bb1.clear(); long x2 = journal.writeJournal(entry2) ; bb1.clear(); assertEquals(0, x1) ; assertNotEquals(0, x2) ; JournalEntry entry1a = journal.readJournal(x1) ; JournalEntry entry2a = journal.readJournal(x2) ; assertNotSame(entry1, entry1a) ; assertNotSame(entry2, entry2a) ; assertTrue(equal(entry1, entry1a)) ; assertTrue(equal(entry2, entry2a)) ; assertFalse(equal(entry1a, entry2a)) ; } private static boolean equal(JournalEntry entry1, JournalEntry entry2) { if ( entry1.getType() != entry2.getType()) return false ; if ( ! entry1.getFileRef().equals(entry2.getFileRef()) ) return false ; if ( entry1.getByteBuffer() == null && entry2.getByteBuffer() != null ) return false ; if ( entry1.getByteBuffer() != null && entry2.getByteBuffer() == null ) return false ; if ( entry1.getBlock() == null && entry2.getBlock() != null ) return false ; if ( entry1.getBlock() != null && entry2.getBlock() == null ) return false ; if ( entry1.getBlock() != null ) return sameValue(entry1.getBlock(), entry2.getBlock()) ; else return sameValue(entry1.getByteBuffer(), entry2.getByteBuffer()) ; } // In ByteBufferLib - remove/migrate public static boolean sameValue(ByteBuffer bb1, ByteBuffer bb2) { if ( bb1 == null && bb2 == null ) return true ; if ( bb1 == null ) return false ; if ( bb2 == null ) return false ; if ( bb1.capacity() != bb2.capacity() ) return false ; int x1 = bb1.position() ; int x2 = bb1.position() ; try { for ( int i = 0 ; i < bb1.capacity() ; i++ ) if ( bb1.get(i) != bb2.get(i) ) return false ; return true ; } finally { bb1.position(x1) ; bb2.position(x2) ; } } // In ByteBufferLib - remove/migrate public static boolean sameValue(Block bb1, Block bb2) { if ( bb1 == null && bb2 == null ) return true ; if ( bb1 == null ) return false ; if ( bb2 == null ) return false ; if ( bb1.getId() != bb2.getId() ) return false ; return sameValue(bb1.getByteBuffer(), bb2.getByteBuffer()) ; } }