/*
* Copyright 2008-2009 LinkedIn, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.sdnplatform.sync.internal.version;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.sdnplatform.sync.IInconsistencyResolver;
import org.sdnplatform.sync.Versioned;
import org.sdnplatform.sync.internal.TUtils;
import org.sdnplatform.sync.internal.version.VectorClockInconsistencyResolver;
public class VectorClockInconsistencyResolverTest {
private IInconsistencyResolver<Versioned<String>> resolver;
private Versioned<String> later;
private Versioned<String> prior;
private Versioned<String> current;
private Versioned<String> concurrent;
private Versioned<String> concurrent2;
@Before
public void setUp() {
resolver = new VectorClockInconsistencyResolver<String>();
current = getVersioned(1, 1, 2, 3);
prior = getVersioned(1, 2, 3);
concurrent = getVersioned(1, 2, 3, 3);
concurrent2 = getVersioned(1, 2, 3, 4);
later = getVersioned(1, 1, 2, 2, 3);
}
private Versioned<String> getVersioned(int... nodes) {
return new Versioned<String>("my-value", TUtils.getClock(nodes));
}
@Test
public void testEmptyList() {
assertEquals(0, resolver.resolveConflicts(new ArrayList<Versioned<String>>()).size());
}
@SuppressWarnings("unchecked")
@Test
public void testDuplicatesResolve() {
assertEquals(2, resolver.resolveConflicts(Arrays.asList(concurrent,
current,
current,
concurrent,
current)).size());
}
@SuppressWarnings("unchecked")
@Test
public void testResolveNormal() {
assertEquals(later, resolver.resolveConflicts(Arrays.asList(current, prior, later)).get(0));
assertEquals(later, resolver.resolveConflicts(Arrays.asList(prior, current, later)).get(0));
assertEquals(later, resolver.resolveConflicts(Arrays.asList(later, current, prior)).get(0));
}
@SuppressWarnings("unchecked")
@Test
public void testResolveConcurrent() {
List<Versioned<String>> resolved = resolver.resolveConflicts(Arrays.asList(current,
concurrent,
prior));
assertEquals(2, resolved.size());
assertTrue("Version not found", resolved.contains(current));
assertTrue("Version not found", resolved.contains(concurrent));
}
@SuppressWarnings("unchecked")
@Test
public void testResolveLargerConcurrent() {
assertEquals(3, resolver.resolveConflicts(Arrays.asList(concurrent,
concurrent2,
current,
concurrent2,
current,
concurrent,
current)).size());
}
@SuppressWarnings("unchecked")
@Test
public void testResolveConcurrentPairWithLater() {
Versioned<String> later2 = getVersioned(1, 2, 3, 3, 4, 4);
List<Versioned<String>> resolved = resolver.resolveConflicts(Arrays.asList(concurrent,
concurrent2,
later2));
assertEquals(1, resolved.size());
assertEquals(later2, resolved.get(0));
}
}