forked from Qortal/qortal
Added arbitrary data merge tests.
This commit is contained in:
parent
d6d564c027
commit
12b3267d5c
@ -7,7 +7,6 @@ import com.github.difflib.patch.PatchFailedException;
|
|||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.eclipse.jetty.util.IO;
|
|
||||||
import org.qortal.arbitrary.metadata.ArbitraryDataMetadataPatch;
|
import org.qortal.arbitrary.metadata.ArbitraryDataMetadataPatch;
|
||||||
import org.qortal.settings.Settings;
|
import org.qortal.settings.Settings;
|
||||||
import org.qortal.utils.FilesystemUtils;
|
import org.qortal.utils.FilesystemUtils;
|
||||||
|
@ -24,7 +24,7 @@ public class ArbitraryDataDigestTests extends Common {
|
|||||||
@Test
|
@Test
|
||||||
public void testDirectoryDigest() throws IOException {
|
public void testDirectoryDigest() throws IOException {
|
||||||
Path dataPath = Paths.get("src/test/resources/arbitrary/demo1");
|
Path dataPath = Paths.get("src/test/resources/arbitrary/demo1");
|
||||||
String expectedHash58 = "59dw8CgVybcHAUL5GYgYUUfFffVVhiMKZLCnULPKT6oC";
|
String expectedHash58 = "4cibh7BWNUiaPXL88EgsoKxwg4SG7GVmRRQbBYUrkbcy";
|
||||||
|
|
||||||
// Ensure directory exists
|
// Ensure directory exists
|
||||||
assertTrue(dataPath.toFile().exists());
|
assertTrue(dataPath.toFile().exists());
|
||||||
|
@ -0,0 +1,143 @@
|
|||||||
|
package org.qortal.test.arbitrary;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.qortal.arbitrary.ArbitraryDataCreatePatch;
|
||||||
|
import org.qortal.arbitrary.ArbitraryDataDigest;
|
||||||
|
import org.qortal.arbitrary.ArbitraryDataMerge;
|
||||||
|
import org.qortal.crypto.Crypto;
|
||||||
|
import org.qortal.repository.DataException;
|
||||||
|
import org.qortal.test.common.Common;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class ArbitraryDataMergeTests extends Common {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeTest() throws DataException {
|
||||||
|
Common.useDefaultSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateAndMergePatch() throws IOException, DataException {
|
||||||
|
Path path1 = Paths.get("src/test/resources/arbitrary/demo1");
|
||||||
|
Path path2 = Paths.get("src/test/resources/arbitrary/demo2");
|
||||||
|
|
||||||
|
// Create a patch using the differences in path2 compared with path1
|
||||||
|
ArbitraryDataCreatePatch patch = new ArbitraryDataCreatePatch(path1, path2, new byte[16]);
|
||||||
|
patch.create();
|
||||||
|
Path patchPath = patch.getFinalPath();
|
||||||
|
assertTrue(Files.exists(patchPath));
|
||||||
|
|
||||||
|
// Check that lorem1, 2, 4, and 5 exist
|
||||||
|
assertTrue(Files.exists(Paths.get(patchPath.toString(), "lorem1.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(patchPath.toString(), "lorem2.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(patchPath.toString(), "dir1", "lorem4.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(patchPath.toString(), "dir1", "dir2", "lorem5.txt")));
|
||||||
|
|
||||||
|
// Ensure that lorem3 doesn't exist, as this file is identical in the original paths
|
||||||
|
assertFalse(Files.exists(Paths.get(patchPath.toString(), "lorem3.txt")));
|
||||||
|
|
||||||
|
// Ensure that the patch files differ from the first path (except for lorem3, which is missing)
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path1.toString(), "lorem1.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "lorem1.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path1.toString(), "lorem2.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "lorem2.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path1.toString(), "dir1", "lorem4.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "dir1", "lorem4.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path1.toString(), "dir1", "dir2", "lorem5.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "dir1", "dir2", "lorem5.txt").toFile())
|
||||||
|
));
|
||||||
|
|
||||||
|
// Ensure that the patch files differ from the second path (except for lorem3, which is missing)
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "lorem1.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "lorem1.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "lorem2.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "lorem2.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "dir1", "lorem4.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "dir1", "lorem4.txt").toFile())
|
||||||
|
));
|
||||||
|
assertFalse(Arrays.equals(
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "dir1", "dir2", "lorem5.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(patchPath.toString(), "dir1", "dir2", "lorem5.txt").toFile())
|
||||||
|
));
|
||||||
|
|
||||||
|
// Now merge the patch with the original path
|
||||||
|
ArbitraryDataMerge merge = new ArbitraryDataMerge(path1, patchPath, "unified-diff");
|
||||||
|
merge.compute();
|
||||||
|
Path finalPath = merge.getMergePath();
|
||||||
|
|
||||||
|
// Ensure that all files exist in the final path (including lorem3)
|
||||||
|
assertTrue(Files.exists(Paths.get(finalPath.toString(), "lorem1.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(finalPath.toString(), "lorem2.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(finalPath.toString(), "lorem3.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(finalPath.toString(), "dir1", "lorem4.txt")));
|
||||||
|
assertTrue(Files.exists(Paths.get(finalPath.toString(), "dir1", "dir2", "lorem5.txt")));
|
||||||
|
|
||||||
|
// Ensure that the files match those in path2 exactly
|
||||||
|
assertArrayEquals(
|
||||||
|
Crypto.digest(Paths.get(finalPath.toString(), "lorem1.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "lorem1.txt").toFile())
|
||||||
|
);
|
||||||
|
assertArrayEquals(
|
||||||
|
Crypto.digest(Paths.get(finalPath.toString(), "lorem2.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "lorem2.txt").toFile())
|
||||||
|
);
|
||||||
|
assertArrayEquals(
|
||||||
|
Crypto.digest(Paths.get(finalPath.toString(), "lorem3.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "lorem3.txt").toFile())
|
||||||
|
);
|
||||||
|
assertArrayEquals(
|
||||||
|
Crypto.digest(Paths.get(finalPath.toString(), "dir1", "lorem4.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "dir1", "lorem4.txt").toFile())
|
||||||
|
);
|
||||||
|
assertArrayEquals(
|
||||||
|
Crypto.digest(Paths.get(finalPath.toString(), "dir1", "dir2", "lorem5.txt").toFile()),
|
||||||
|
Crypto.digest(Paths.get(path2.toString(), "dir1", "dir2", "lorem5.txt").toFile())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Also check that the directory digests match
|
||||||
|
ArbitraryDataDigest path2Digest = new ArbitraryDataDigest(path2);
|
||||||
|
path2Digest.compute();
|
||||||
|
ArbitraryDataDigest finalPathDigest = new ArbitraryDataDigest(path2);
|
||||||
|
finalPathDigest.compute();
|
||||||
|
assertEquals(path2Digest.getHash58(), finalPathDigest.getHash58());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIdenticalPaths() throws IOException, DataException {
|
||||||
|
Path path = Paths.get("src/test/resources/arbitrary/demo1");
|
||||||
|
|
||||||
|
// Create a patch from two identical paths
|
||||||
|
ArbitraryDataCreatePatch patch = new ArbitraryDataCreatePatch(path, path, new byte[16]);
|
||||||
|
|
||||||
|
// Ensure that an exception is thrown due to matching states
|
||||||
|
try {
|
||||||
|
patch.create();
|
||||||
|
fail("Creating patch should fail due to matching states");
|
||||||
|
|
||||||
|
} catch (IllegalStateException expectedException) {
|
||||||
|
assertEquals("Current state matches previous state. Nothing to do.", expectedException.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
2ea5a99a-3b85-4f1f-a259-436787f90bd1
|
db2d9ab2-a97e-43bf-a259-ebbc1a1b0c59
|
@ -1 +1,10 @@
|
|||||||
Sed non lacus ante.
|
Pellentesque mollis risus laoreet neque lobortis, ut euismod nisl gravida.
|
||||||
|
Nullam sit amet scelerisque sapien, id aliquet elit. Suspendisse eu
|
||||||
|
accumsan eros. Nullam non nunc ut risus facilisis posuere sed sed ipsum.
|
||||||
|
Pellentesque habitant morbi tristique senectus et netus et malesuada fames
|
||||||
|
ac turpis egestas. Nullam magna felis, vehicula a accumsan luctus, vulputate
|
||||||
|
vitae justo. Integer mollis lacus eu nisi iaculis, ac ultrices sem aliquam.
|
||||||
|
Sed ac lacus eget nibh posuere sodales. Phasellus sodales, augue ac
|
||||||
|
tincidunt scelerisque, mi erat varius mauris, sed blandit ex nisl ut
|
||||||
|
justo. Etiam ac nisl venenatis, malesuada odio vitae, blandit velit.
|
||||||
|
Phasellus congue leo a porttitor hendrerit.
|
||||||
|
@ -1 +1 @@
|
|||||||
Pellentesque laoreet laoreet dui ut volutpat.
|
Pellentesque laoreet laoreet dui ut volutpat. Sentence added.
|
||||||
|
@ -1 +1,11 @@
|
|||||||
Sed non lacus ante.
|
Pellentesque mollis risus laoreet neque lobortis, ut euismod nisl gravida.
|
||||||
|
Nullam sit amet scelerisque sapien, id aliquet elit. Suspendisse eu
|
||||||
|
accumsan eros. Nullam non nunc ut risus facilisis posuere sed sed ipsum.
|
||||||
|
Pellentesque habitant morbi tristique senectus et netus et malesuada fames
|
||||||
|
ac turpis egestas. Nullam magna felis; vehicula a accumsan luctus, vulputate
|
||||||
|
vitae justo. Integer mollis lacus eu nisi iaculis, ac ultrices sem aliquam.
|
||||||
|
Sed ac lacus eget nibh posuere sodales. Phasellus sodales, augue ac
|
||||||
|
tincidunt scelerisque, mi erat Varius mauris, sed blandit ex nisl ut
|
||||||
|
justo. Etiam ac nisl venenatis, malesuada odio vitae, blandit velit.
|
||||||
|
Phasellus congue leo a porttitor hendrerit.
|
||||||
|
Line added.
|
||||||
|
@ -1 +1 @@
|
|||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
Lorem ipsum dolor sit amet, adipiscing elit.
|
||||||
|
@ -1 +1,2 @@
|
|||||||
Quisque viverra neque quis eros dapibus
|
Quisque viverra neque
|
||||||
|
quis eros dapibus
|
||||||
|
Loading…
Reference in New Issue
Block a user