/**
* 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 jbenchmarker.ot.ttf.update;
import crdt.CRDTMessage;
import crdt.PreconditionException;
import jbenchmarker.core.MergeAlgorithm;
import jbenchmarker.core.ReplicaFactory;
import jbenchmarker.core.SequenceOperation;
import jbenchmarker.factories.TTFUFactories;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Test of TTF with update
* @author urso
*/
public class TTFUpdateBasicTest {
ReplicaFactory upd = new TTFUFactories.Update(), del = new TTFUFactories.DelWins();
public TTFUpdateBasicTest() {
}
@Test
public void testLWW() throws PreconditionException {
MergeAlgorithm r1 = upd.create(1), r2 = upd.create(2);
CRDTMessage ins = r1.applyLocal(SequenceOperation.insert(0, "abc"));
assertEquals("abc", r1.lookup());
r2.applyRemote(ins);
assertEquals("abc", r2.lookup());
CRDTMessage u1 = r1.applyLocal(SequenceOperation.replace(1, 1, "xy")),
u2 = r2.applyLocal(SequenceOperation.replace(1, 2, "z"));
assertEquals("axyc", r1.lookup());
assertEquals("az", r2.lookup());
r1.applyRemote(u2);
r2.applyRemote(u1);
assertEquals("azy", r1.lookup());
assertEquals("azy", r2.lookup());
}
@Test
public void testLWWDelete() throws PreconditionException {
MergeAlgorithm r1 = upd.create(1), r2 = upd.create(2);
CRDTMessage ins = r1.applyLocal(SequenceOperation.insert(0, "abc"));
assertEquals("abc", r1.lookup());
r2.applyRemote(ins);
assertEquals("abc", r2.lookup());
CRDTMessage u1 = r1.applyLocal(SequenceOperation.delete(1, 1)),
u2 = r2.applyLocal(SequenceOperation.replace(1, 1, "z"));
assertEquals("ac", r1.lookup());
assertEquals("azc", r2.lookup());
r1.applyRemote(u2);
r2.applyRemote(u1);
assertEquals("azc", r1.lookup());
assertEquals("azc", r2.lookup());
}
@Test
public void testDelWinsLWW() throws PreconditionException {
MergeAlgorithm r1 = del.create(1), r2 = del.create(2);
r1.setReplicaNumber(1);
r2.setReplicaNumber(2);
CRDTMessage ins = r1.applyLocal(SequenceOperation.insert(0, "abc"));
assertEquals("abc", r1.lookup());
r2.applyRemote(ins);
assertEquals("abc", r2.lookup());
CRDTMessage u1 = r1.applyLocal(SequenceOperation.replace(1, 1, "xy")),
u2 = r2.applyLocal(SequenceOperation.replace(1, 2, "z"));
assertEquals("axyc", r1.lookup());
assertEquals("az", r2.lookup());
r1.applyRemote(u2);
r2.applyRemote(u1);
assertEquals("azy", r1.lookup());
assertEquals("azy", r2.lookup());
}
@Test
public void testDelWins() throws PreconditionException {
MergeAlgorithm r1 = del.create(1), r2 = del.create(2);
r1.setReplicaNumber(1);
r2.setReplicaNumber(2);
CRDTMessage ins = r1.applyLocal(SequenceOperation.insert(0, "abc"));
assertEquals("abc", r1.lookup());
r2.applyRemote(ins);
assertEquals("abc", r2.lookup());
CRDTMessage u1 = r1.applyLocal(SequenceOperation.delete(1, 1)),
u2 = r2.applyLocal(SequenceOperation.replace(1, 1, "z"));
assertEquals("ac", r1.lookup());
assertEquals("azc", r2.lookup());
r1.applyRemote(u2);
r2.applyRemote(u1);
assertEquals("ac", r1.lookup());
assertEquals("ac", r2.lookup());
}
}