JCRVLT-108 Import of binaries fail because they cannot be converted to strings

- adding more test cases

git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/commons/filevault/trunk@1727172 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/parent/pom.xml b/parent/pom.xml
index 6e8997e..6b94dab 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -41,7 +41,7 @@
 
     <properties>
         <jackrabbit.version>2.11.3</jackrabbit.version>
-        <oak.version>1.3.9</oak.version>
+        <oak.version>1.3.14</oak.version>
     </properties>
 
     <!-- ====================================================================== -->
@@ -321,7 +321,7 @@
             <dependency>
                 <groupId>commons-io</groupId>
                 <artifactId>commons-io</artifactId>
-                <version>1.4</version>
+                <version>2.4</version>
             </dependency>
             <dependency>
                 <groupId>commons-collections</groupId>
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java
index 4154713..49a67b9 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/IntegrationTestBase.java
@@ -48,11 +48,16 @@
 import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.core.data.FileDataStore;
 import org.apache.jackrabbit.core.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
 import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
 import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
 import org.apache.jackrabbit.oak.security.user.RandomAuthorizableNodeName;
+import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
@@ -70,6 +75,8 @@
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -91,6 +98,14 @@
     private static final Logger log = LoggerFactory.getLogger(IntegrationTestBase.class);
 
     private static final String REPO_HOME = "target/repository";
+    private static final File DIR_REPO_HOME = new File(REPO_HOME);
+    private static final File DIR_DATA_STORE = new File(REPO_HOME + "/datastore");
+    private static final File DIR_BLOB_STORE = new File(REPO_HOME + "/blobstore");
+
+    @Rule
+    public static TemporaryFolder tempFolder = new TemporaryFolder();
+
+    private static FileStore fileStore = null;
 
     protected static Repository repository;
 
@@ -99,7 +114,7 @@
     protected JcrPackageManager packMgr;
 
     @BeforeClass
-    public static void initRepository() throws RepositoryException {
+    public static void initRepository() throws RepositoryException, IOException {
         if (isOak()) {
             Properties userProps = new Properties();
             AuthorizableNodeName nameGenerator = new RandomAuthorizableNodeName();
@@ -115,7 +130,21 @@
             Properties securityProps = new Properties();
             securityProps.put(UserConfiguration.NAME, ConfigurationParameters.of(userProps));
             securityProps.put(AuthorizationConfiguration.NAME, ConfigurationParameters.of(authzProps));
-            repository = new Jcr()
+
+            Jcr jcr;
+            if (useFileStore()) {
+                BlobStore blobStore = createBlobStore();
+                DIR_DATA_STORE.mkdirs();
+                fileStore = FileStore.newFileStore(DIR_DATA_STORE)
+                        .withBlobStore(blobStore)
+                        .create();
+                SegmentNodeStore nodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create();
+                jcr = new Jcr(nodeStore);
+            } else {
+                jcr = new Jcr();
+            }
+
+            repository = jcr
                     .with(new SecurityProviderImpl(ConfigurationParameters.of(securityProps)))
                     .createRepository();
 
@@ -134,12 +163,33 @@
                 repository.getDescriptor(Repository.REP_VERSION_DESC));
     }
 
+    public static boolean useFileStore() {
+        return true;
+    }
+
+    private static BlobStore createBlobStore() throws IOException {
+        DIR_BLOB_STORE.mkdirs();
+        FileDataStore fds = new FileDataStore();
+        fds.setMinRecordLength(4092);
+        fds.init(DIR_BLOB_STORE.getAbsolutePath());
+        return new DataStoreBlobStore(fds);
+    }
+
     @AfterClass
-    public static void shutdownRepository() {
+    public static void shutdownRepository() throws IOException {
         if (repository instanceof RepositoryImpl) {
             ((RepositoryImpl) repository).shutdown();
+        } else if (repository instanceof org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl) {
+            ((org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl) repository).shutdown();
         }
         repository = null;
+
+        if (fileStore != null) {
+            fileStore.close();
+            fileStore = null;
+        }
+
+        FileUtils.deleteDirectory(DIR_REPO_HOME);
     }
 
     @Before
@@ -415,4 +465,35 @@
         admin.getAccessControlManager().setPolicy(path, acl);
         admin.save();
     }
+
+    public static class TrackingListener implements ProgressTrackerListener {
+
+        private final ProgressTrackerListener delegate;
+
+        private final Map<String, String> actions = new HashMap<String, String>();
+
+        public TrackingListener(ProgressTrackerListener delegate) {
+            this.delegate = delegate;
+        }
+
+        public Map<String, String> getActions() {
+            return actions;
+        }
+
+        @Override
+        public void onMessage(Mode mode, String action, String path) {
+            if (delegate != null) {
+                delegate.onMessage(mode, action, path);
+            }
+            actions.put(path, action);
+        }
+
+        @Override
+        public void onError(Mode mode, String path, Exception e) {
+            if (delegate != null) {
+                delegate.onError(mode, path, e);
+            }
+            actions.put(path, "E");
+        }
+    }
 }
\ No newline at end of file
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestBinarylessExport.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestBinarylessExport.java
index 1d078f4..3ab5196 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestBinarylessExport.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestBinarylessExport.java
@@ -17,17 +17,22 @@
 
 package org.apache.jackrabbit.vault.packaging.integration;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.api.ReferenceBinary;
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
 import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.ExportOptions;
+import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.PackageException;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import javax.jcr.Binary;
@@ -69,7 +74,6 @@
         BIG_TEXT = buffer.toString();
     }
 
-
     @Before
     public void setup() throws RepositoryException, PackageException, IOException {
         Node binaryNode = JcrUtils.getOrCreateByPath(BINARY_NODE_PATH, "nt:unstructured", admin);
@@ -81,14 +85,18 @@
 
         Binary smallBin = admin.getValueFactory().createBinary(IOUtils.toInputStream(SMALL_TEXT, "UTF-8"));
         Property smallProperty = binaryNode.setProperty(SMALL_BINARY_PROPERTY, smallBin);
-        assertFalse(smallProperty.getBinary() instanceof ReferenceBinary);
-
+        if (isOak()) {
+            assertTrue(smallProperty.getBinary() instanceof ReferenceBinary);
+        } else {
+            assertFalse(smallProperty.getBinary() instanceof ReferenceBinary);
+        }
 
         JcrUtils.putFile(binaryNode.getParent(), "file", "text/plain", IOUtils.toInputStream(BIG_TEXT, "UTF-8"));
         admin.save();
     }
 
 
+
     @Test
     public void exportBinary() throws RepositoryException, IOException, PackageException {
 
@@ -116,7 +124,7 @@
         assertNotNull(pkg.getArchive().getEntry("jcr_root"+ BINARY_NODE_PATH + "/" + SMALL_BINARY_PROPERTY + ".binary"));
 
 
-        admin.getNode(nodePath).remove();
+        clean(nodePath);
 
         pkg.extract(admin, getDefaultOptions());
 
@@ -155,7 +163,7 @@
 
         assertTrue(pkg.getArchive().getEntry("jcr_root" + FILE_NODE_PATH).isDirectory());
 
-        admin.getNode(nodePath).remove();
+        clean(nodePath);
 
         pkg.extract(admin, getDefaultOptions());
 
@@ -171,4 +179,53 @@
         pkg.close();
         tmpFile.delete();
     }
+
+    /**
+     * Tests if the same package installed twice does not report and update. See JCRVLT-108
+     */
+    @Test
+    @Ignore("JCRVLT-108")
+    public void importTwice() throws RepositoryException, IOException, PackageException {
+        String nodePath = BINARY_NODE_PATH;
+
+        ExportOptions opts = new ExportOptions();
+        DefaultMetaInf inf = new DefaultMetaInf();
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        filter.add(new PathFilterSet(nodePath));
+
+        inf.setFilter(filter);
+        Properties props = new Properties();
+        props.setProperty(VaultPackage.NAME_GROUP, "jackrabbit/test");
+        props.setProperty(VaultPackage.NAME_NAME, "test-package");
+        props.setProperty(PackageProperties.NAME_USE_BINARY_REFERENCES, "true");
+        inf.setProperties(props);
+
+        opts.setMetaInf(inf);
+
+        File tmpFile = File.createTempFile("vaulttest", "zip");
+        VaultPackage pkg = packMgr.assemble(admin, opts, tmpFile);
+        pkg.close();
+
+        clean(nodePath);
+
+        // import again
+        JcrPackage pack = packMgr.upload(FileUtils.openInputStream(tmpFile), false);
+        assertNotNull(pack);
+
+        ImportOptions io = getDefaultOptions();
+        TrackingListener listener = new TrackingListener(opts.getListener());
+        io.setListener(listener);
+        pack.install(io);
+        assertEquals("A", listener.getActions().get(BINARY_NODE_PATH));
+
+        // and again
+        io = getDefaultOptions();
+        listener = new TrackingListener(opts.getListener());
+        io.setListener(listener);
+
+        pack.install(io);
+        assertEquals("U", listener.getActions().get(BINARY_NODE_PATH));
+
+        tmpFile.delete();
+    }
 }
\ No newline at end of file
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java
index 6412fcd..1cb3e7d 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java
@@ -28,12 +28,14 @@
 
 import org.apache.commons.io.FileUtils;
 import org.apache.derby.impl.load.Import;
+import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.InstallContext;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.PackageException;
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.tika.io.IOUtils;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -377,9 +379,11 @@
     }
 
     /**
-     * Installs a package that and checks if snapshot is created
+     * Installs a binary properties twice to check if it doesn't report an update. JCRVLT-108.
+     * this only works for small binaries, though.
      */
     @Test
+    @Ignore("JCRVLT-108")
     public void testBinaryProperties() throws RepositoryException, IOException, PackageException {
         JcrPackage pack = packMgr.upload(getStream("testpackages/tmp_binary.zip"), false);
         assertNotNull(pack);
@@ -387,7 +391,23 @@
 
         Property p = admin.getProperty("/tmp/binary/test/jcr:data");
         assertEquals(PropertyType.BINARY, p.getType());
-        assertEquals("this is binary data.\n", p.getString());
+
+        StringBuilder buffer = new StringBuilder(8192);
+        while (buffer.length() < 8192) {
+            buffer.append("0123456789abcdef");
+        }
+        String result = IOUtils.toString(p.getBinary().getStream());
+
+        assertEquals(buffer.toString(), result);
+
+        // install again to check if binary data is not updated
+        ImportOptions opts = getDefaultOptions();
+        TrackingListener listener = new TrackingListener(opts.getListener());
+        opts.setListener(listener);
+
+        pack.install(opts);
+
+        assertEquals("-", listener.getActions().get("/tmp/binary/test"));
     }
 
     // todo: upload with version
diff --git a/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/tmp_binary.zip b/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/tmp_binary.zip
index f9bce2d..e3ab482 100644
--- a/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/tmp_binary.zip
+++ b/vault-core/src/test/resources/org/apache/jackrabbit/vault/packaging/integration/testpackages/tmp_binary.zip
Binary files differ