/** * Replication Benchmarker * https://github.com/score-team/replication-benchmarker/ Copyright (C) 2013 * LORIA / Inria / SCORE Team * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package crdt.tree.fctree; import crdt.CRDTMessage; import crdt.PreconditionException; import crdt.simulator.sizecalculator.StandardSizeCalculator; import crdt.tree.orderedtree.OrderedTreeOperation; import crdt.tree.orderedtree.OrderedTreeOperation.OpType; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import org.junit.Test; import org.junit.Before; import static org.junit.Assert.*; /** * * @author Stephane Martin <stephane@stephanemartin.fr> */ public class FCTreeGfTest { FCTree<String> tree; FCTree<String> tree2; FCTree<String> tree3; @Before public void setUp() throws PreconditionException { tree = new FCTreeGf(); tree2 = new FCTreeGf(); tree3 = new FCTreeGf(); tree.setReplicaNumber(1); tree2.setReplicaNumber(2); tree3.setReplicaNumber(3); CRDTMessage mess1 = tree.add(new ArrayList(), 0, "a"); CRDTMessage mess2 = tree.add(new ArrayList(), 1, "b"); CRDTMessage mess3 = tree.add(new ArrayList(), 2, "c"); CRDTMessage mess4 = tree.add(Arrays.asList(0), 0, "d"); CRDTMessage mess5 = tree.add(Arrays.asList(0), 1, "e"); CRDTMessage mess6 = tree.add(Arrays.asList(0, 1), 1, "f"); CRDTMessage mess7 = tree.add(Arrays.asList(2), 0, "g"); CRDTMessage mess8 = tree.add(Arrays.asList(2), 1, "h"); tree2.applyOneRemote(mess1); tree2.applyOneRemote(mess4); tree2.applyOneRemote(mess5); tree2.applyOneRemote(mess6); tree2.applyOneRemote(mess3); tree2.applyOneRemote(mess7); tree2.applyOneRemote(mess8); tree2.applyOneRemote(mess2); } @Test public void addTest() { assertEquals("null{a{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{a{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void removeTest() throws PreconditionException { CRDTMessage m = tree2.remove(Arrays.asList(0, 1)); tree.applyOneRemote(m); assertEquals("null{a{d,},b,c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{a{d,},b,c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void removeAllTest() throws PreconditionException, IOException { StandardSizeCalculator sdc=new StandardSizeCalculator(true); long s1=sdc.serializ(tree); long s2=sdc.serializ(tree2); long s3=sdc.serializ(tree3); assertTrue(s3<s1); assertTrue(s3<s2); CRDTMessage mess1 = tree2.remove(Arrays.asList(0, 1, 0));//f CRDTMessage mess2 = tree2.remove(Arrays.asList(2, 1));//h CRDTMessage mess3 = tree2.remove(Arrays.asList(2, 0));//g CRDTMessage mess4 = tree2.remove(Arrays.asList(0, 1));//e CRDTMessage mess5 = tree2.remove(Arrays.asList(0, 0));//d CRDTMessage mess6 = tree2.remove(Arrays.asList(2));//c CRDTMessage mess7 = tree2.remove(Arrays.asList(1));//b CRDTMessage mess8 = tree2.remove(Arrays.asList(0));//a tree.applyOneRemote(mess1); tree.applyOneRemote(mess4); tree.applyOneRemote(mess5); tree.applyOneRemote(mess6); tree.applyOneRemote(mess3); tree.applyOneRemote(mess7); tree.applyOneRemote(mess8); tree.applyOneRemote(mess2); assertEquals("null", tree.getRoot().nodetail()); assertEquals("null", tree2.getRoot().nodetail()); long sa1=sdc.serializ(tree); long sa2=sdc.serializ(tree2); assertEquals(s3, sa1); assertEquals(s3, sa2); } @Test public void removeAll2Test()throws Exception{ tree.setRemoveEntireSubtree(true); tree2.setRemoveEntireSubtree(true); StandardSizeCalculator sdc=new StandardSizeCalculator(true); long s1=sdc.serializ(tree); long s2=sdc.serializ(tree2); long s3=sdc.serializ(tree3); assertTrue(s3<s1); assertTrue(s3<s2); CRDTMessage mess1 = tree2.remove(Arrays.asList(0));//f CRDTMessage mess2 = tree2.remove(Arrays.asList(0));//f CRDTMessage mess3 = tree2.remove(Arrays.asList(0));//f tree.applyRemote(mess1); tree.applyRemote(mess3); tree.applyRemote(mess2); assertEquals("null", tree2.getRoot().nodetail()); assertEquals("null", tree.getRoot().nodetail()); long sa1=sdc.serializ(tree); long sa2=sdc.serializ(tree2); assertEquals(1,tree.map.size()); assertEquals(1,tree2.map.size()); assertEquals(s3, sa1); assertEquals(s3, sa2); } @Test public void ChLabelTest() { CRDTMessage m = tree2.rename(Arrays.asList(0), "ZoidBerg"); tree.applyOneRemote(m); assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void switchTest() { CRDTMessage m = tree2.move(Arrays.asList(0), new LinkedList(), 1); tree.applyOneRemote(m); assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void moveTest() { CRDTMessage m = tree2.move(Arrays.asList(0, 1), Arrays.asList(2), 1); tree.applyRemote(m); assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree.getRoot().nodetail()); assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree2.getRoot().nodetail()); } @Test public void removeTestop() throws PreconditionException { CRDTMessage m = tree2.applyLocal(new OrderedTreeOperation<String>(Arrays.asList(0, 1))); tree.applyOneRemote(m); assertEquals("null{a{d,},b,c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{a{d,},b,c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void ChLabelTestop() throws PreconditionException { OpType rename = OrderedTreeOperation.OpType.chContent; OrderedTreeOperation<String> op1 = new OrderedTreeOperation<String>(rename, Arrays.asList(0), null, 0, "ZoidBerg"); CRDTMessage m = tree2.applyLocal(op1); tree.applyOneRemote(m); assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail()); } final static OpType MOVE = OrderedTreeOperation.OpType.move; @Test public void switchTestop() throws PreconditionException { OrderedTreeOperation<String> op1 = new OrderedTreeOperation<String>(MOVE, Arrays.asList(0), new LinkedList(), 1, null); CRDTMessage m = tree2.applyLocal(op1); tree.applyOneRemote(m); assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree.getRoot().nodetail()); assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree2.getRoot().nodetail()); } @Test public void moveTestop() throws PreconditionException { OrderedTreeOperation<String> op1 = new OrderedTreeOperation<String>(MOVE, Arrays.asList(0, 1), Arrays.asList(2), 1, null); CRDTMessage m = tree2.applyLocal(op1); tree.applyRemote(m); assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree.getRoot().nodetail()); assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree2.getRoot().nodetail()); } public FCTreeGfTest() { } }