diff --git a/oak-segment-tar/pom.xml b/oak-segment-tar/pom.xml index ff4b6803ef..c846df7bc1 100644 --- a/oak-segment-tar/pom.xml +++ b/oak-segment-tar/pom.xml @@ -257,7 +257,14 @@ org.osgi - osgi.core + org.osgi.framework + 1.10.0 + provided + + + org.osgi + org.osgi.util.tracker + 1.5.4 provided @@ -367,7 +374,12 @@ - + + org.hamcrest + hamcrest + 2.2 + test + junit junit @@ -398,6 +410,29 @@ commons-lang3 test + + org.junit.jupiter + junit-jupiter-api + 5.10.0 + test + + + org.apache.felix + org.apache.felix.framework + test + + + org.apache.sling + org.apache.sling.testing.osgi-unit + 0.0.1-T20240110144927-3d8e9e8f + test + + + org.apache.felix + org.apache.felix.scr + 2.1.30 + test + org.easymock easymock diff --git a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java new file mode 100644 index 0000000000..1e6b923e96 --- /dev/null +++ b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/osgi/SplitPersistenceServiceTest.java @@ -0,0 +1,62 @@ +package org.apache.jackrabbit.oak.segment.osgi; + +import org.apache.jackrabbit.oak.api.CommitFailedException; +import org.apache.jackrabbit.oak.segment.SegmentNodeStore; +import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders; +import org.apache.jackrabbit.oak.segment.file.FileStore; +import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder; +import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; +import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; +import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; +import org.apache.jackrabbit.oak.spi.commit.CommitInfo; +import org.apache.jackrabbit.oak.spi.commit.EmptyHook; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; +import org.apache.sling.testing.osgi.unit.OSGiSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.osgi.framework.FrameworkUtil.asDictionary; + +public class SplitPersistenceServiceTest { + + /** + * Verifies that a minimally-configured SplitPersistence can be registered successfully + */ + @Test + @OSGiSupport(additionalClasses = SplitPersistenceService.class) + void bootstrap(@TempDir File roDir, @TempDir File rwDir, BundleContext ctx) throws IOException, InvalidFileStoreVersionException, CommitFailedException, InvalidSyntaxException { + SegmentNodeStorePersistence roPersistence = new TarPersistence(roDir); + + FileStore baseFileStore = FileStoreBuilder + .fileStoreBuilder(roDir) + .withCustomPersistence(roPersistence) + .build(); + SegmentNodeStore base = SegmentNodeStoreBuilders.builder(baseFileStore).build(); + + NodeBuilder builder = base.getRoot().builder(); + builder.child("foo").child("bar").setProperty("version", "v1"); + base.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + baseFileStore.flush(); + baseFileStore.close(); + + SegmentNodeStorePersistence localPersistence = new TarPersistence(rwDir); + + ctx.registerService(SegmentNodeStorePersistence.class, roPersistence, asDictionary(Map.of("role", "split-persistence-ro"))); + ctx.registerService(SegmentNodeStorePersistence.class, localPersistence, asDictionary(Map.of("role", "split-persistence-rw"))); + + final Collection> serviceReferences = ctx.getServiceReferences(SegmentNodeStorePersistence.class, null); + assertThat("No SegmentNodeStorePersistence registered", serviceReferences, notNullValue()); + assertThat("SegmentNodeStorePersistence registrations different of 3", serviceReferences.size(), is(3)); + } +}