diff --git a/dhfs-parent/kleppmanntree/pom.xml b/dhfs-parent/kleppmanntree/pom.xml index 077abfd1..72f83688 100644 --- a/dhfs-parent/kleppmanntree/pom.xml +++ b/dhfs-parent/kleppmanntree/pom.xml @@ -18,6 +18,11 @@ junit-jupiter-engine test + + org.junit.jupiter + junit-jupiter + test + org.apache.commons commons-collections4 diff --git a/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java b/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java index d4694d1a..06e74d5b 100644 --- a/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java +++ b/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java @@ -64,7 +64,7 @@ public class KleppmannTree, PeerIdT ex // Needs to be read after changing curParent, as it might be the same node var oldParent = _storage.getById(effect.oldInfo().oldParent()); { - var newOldParentChildren = oldParent.children().plus(node.meta().getName(), node.key()); + var newOldParentChildren = oldParent.children().plus(effect.oldInfo().oldMeta().getName(), node.key()); oldParent = oldParent.withChildren(newOldParentChildren); _storage.putNode(oldParent); } diff --git a/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java b/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java index dfe99ebd..eb651b08 100644 --- a/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java +++ b/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java @@ -2,13 +2,15 @@ package com.usatiuk.kleppmanntree; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.util.List; public class KleppmanTreeSimpleTest { private final TestNode testNode1 = new TestNode(1); private final TestNode testNode2 = new TestNode(2); - + private final TestNode testNode3 = new TestNode(3); @Test void circularTest() { @@ -89,4 +91,50 @@ public class KleppmanTreeSimpleTest { Assertions.assertTrue(testNode2._storageInterface.getLog().size() <= 1); } + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void undoWithRenameTest(boolean opOrder) { + var d1id = testNode1._storageInterface.getNewNodeId(); + var d2id = testNode2._storageInterface.getNewNodeId(); + var d3id = testNode2._storageInterface.getNewNodeId(); + testNode1._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d1id); + testNode2._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d2id); + testNode3._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d3id); + var r1 = testNode1.getRecorded(); + var r2 = testNode2.getRecorded(); + var r3 = testNode3.getRecorded(); + Assertions.assertEquals(1, r1.size()); + Assertions.assertEquals(1, r2.size()); + Assertions.assertEquals(1, r3.size()); + + if (opOrder) { + testNode2._tree.applyExternalOp(3L, r3.getFirst()); + testNode2._tree.applyExternalOp(1L, r1.getFirst()); + } else { + testNode2._tree.applyExternalOp(1L, r1.getFirst()); + testNode2._tree.applyExternalOp(3L, r3.getFirst()); + } + + Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode2._storageInterface.getById(testNode2._storageInterface.getRootId()).children().keySet()); + + if (opOrder) { + testNode1._tree.applyExternalOp(3L, r3.getFirst()); + testNode1._tree.applyExternalOp(2L, r2.getFirst()); + } else { + testNode1._tree.applyExternalOp(2L, r2.getFirst()); + testNode1._tree.applyExternalOp(3L, r3.getFirst()); + } + + Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode1._storageInterface.getById(testNode1._storageInterface.getRootId()).children().keySet()); + + if (opOrder) { + testNode3._tree.applyExternalOp(2L, r2.getFirst()); + testNode3._tree.applyExternalOp(1L, r1.getFirst()); + } else { + testNode3._tree.applyExternalOp(1L, r1.getFirst()); + testNode3._tree.applyExternalOp(2L, r2.getFirst()); + } + + Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode3._storageInterface.getById(testNode3._storageInterface.getRootId()).children().keySet()); + } }