/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2013-2014 ForgeRock AS * Portions Copyright 2014-2015 ForgeRock AS */ package org.opends.server.replication.common; import static org.assertj.core.api.Assertions.*; import static org.testng.Assert.*; import org.forgerock.util.Pair; import org.opends.server.replication.ReplicationTestCase; import org.opends.server.types.DN; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @SuppressWarnings("javadoc") public class MultiDomainServerStateTest extends ReplicationTestCase { private static final CSN csn1 = new CSN(1, 2, 3); private static final CSN csn2 = new CSN(4, 5, 6); private static final CSN csn3 = new CSN(7, 8, 3); private static DN dn1; private static DN dn2; private static DN dn3; @BeforeClass public void setBaseDNs() throws Exception { dn1 = DN.valueOf("o=test1"); dn2 = DN.valueOf("o=test2"); dn3 = DN.valueOf("o=test3"); } @DataProvider public Object[][] decodeAndEncodeData() { String cookie = "o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:"; return new Object[][] { { "", "" }, { "o=test1:", "o=test1:;" }, { ";;o=test1:;;", ":;o=test1:;" }, { cookie, cookie + ";" }, { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";;o=test6:", ":;o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:;" }, }; } @Test(dataProvider = "decodeAndEncodeData") public void decodeAndEncode(String cookie, String expectedCookie) throws Exception { final MultiDomainServerState state = new MultiDomainServerState(cookie); assertEquals(state.toString(), expectedCookie); } @DataProvider public Object[][] copyCtorData() { return new Object[][] { { "" }, { "o=test1:" + csn1 + ";" }, { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";" }, { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:;" }, }; } @Test(dataProvider = "copyCtorData") public void copyCtor(String cookie) throws Exception { final MultiDomainServerState state = new MultiDomainServerState(cookie); final MultiDomainServerState copy = new MultiDomainServerState(state); assertEquals(copy.toString(), cookie); } @Test public void testUpdateCSN() throws Exception { final MultiDomainServerState state = new MultiDomainServerState(); assertTrue(state.update(dn1, csn1)); assertTrue(state.update(dn2, csn2)); assertFalse(state.update(dn1, (CSN) null)); assertFalse(state.update(dn1, csn1)); assertTrue(state.update(dn1, csn3)); final String expected = "o=test1:" + csn3 + ";o=test2:" + csn2 + ";"; assertEquals(state.toString(), expected); } @Test public void testUpdateServerState() throws Exception { final MultiDomainServerState state = new MultiDomainServerState(); final ServerState ss1 = new ServerState(); assertTrue(ss1.update(csn3)); final ServerState ss2 = new ServerState(); assertTrue(ss2.update(csn2)); state.update(dn1, ss1); state.update(dn2, ss2); final String expected = "o=test1:" + csn3 + ";o=test2:" + csn2 + ";"; assertEquals(state.toString(), expected); } @Test public void testUpdateMultiDomainServerState() throws Exception { final MultiDomainServerState state1 = new MultiDomainServerState(); state1.update(dn1, csn3); state1.update(dn2, csn2); final MultiDomainServerState state2 = new MultiDomainServerState(); state2.update(state1); assertSame(csn3, state2.getCSN(dn1, csn3.getServerId())); assertSame(csn2, state2.getCSN(dn2, csn2.getServerId())); assertTrue(state1.equalsTo(state2)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testEqualsTo() throws Exception { final MultiDomainServerState state1 = new MultiDomainServerState(); assertTrue(state1.update(dn1, csn3)); final MultiDomainServerState state2 = new MultiDomainServerState(); assertFalse(state1.equalsTo(state2)); assertTrue(state2.update(dn1, csn1)); assertFalse(state1.equalsTo(state2)); assertTrue(state2.update(dn1, csn3)); assertTrue(state1.equalsTo(state2)); assertTrue(state2.update(dn2, csn2)); assertFalse(state1.equalsTo(state2)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testIsEmpty() throws Exception { final MultiDomainServerState state = new MultiDomainServerState(); assertTrue(state.isEmpty()); assertTrue(state.update(dn1, csn1)); assertFalse(state.isEmpty()); assertThat(state).containsOnly(dn1); assertTrue(state.update(dn2, csn2)); assertFalse(state.isEmpty()); assertThat(state).containsOnly(dn1, dn2); state.clear(); assertTrue(state.isEmpty()); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testRemoveCSN() throws Exception { final MultiDomainServerState state = getLastAliveCSNs(); assertNull(state.getCSN(dn3, 42)); assertFalse(state.removeCSN(dn3, csn1)); assertSame(csn1, state.getCSN(dn1, csn1.getServerId())); assertSame(csn1, state.getCSN(dn2, csn1.getServerId())); assertSame(csn2, state.getCSN(dn2, csn2.getServerId())); assertFalse(state.removeCSN(dn1, csn2)); assertSame(csn1, state.getCSN(dn1, csn1.getServerId())); assertSame(csn1, state.getCSN(dn2, csn1.getServerId())); assertSame(csn2, state.getCSN(dn2, csn2.getServerId())); assertTrue(state.removeCSN(dn2, csn1)); assertSame(csn1, state.getCSN(dn1, csn1.getServerId())); assertNull(state.getCSN(dn2, csn1.getServerId())); assertSame(csn2, state.getCSN(dn2, csn2.getServerId())); } private MultiDomainServerState getLastAliveCSNs() { final MultiDomainServerState lastAliveCSNs = new MultiDomainServerState(); assertTrue(lastAliveCSNs.update(dn1, csn1)); assertTrue(lastAliveCSNs.update(dn2, csn1)); assertTrue(lastAliveCSNs.update(dn2, csn2)); return lastAliveCSNs; } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testGetOldestCSNExcluding_null() throws Exception { final MultiDomainServerState lastAliveCSNs = getLastAliveCSNs(); assertEquals(lastAliveCSNs.getOldestCSNExcluding(null), Pair.of(dn1, csn1)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testGetOldestCSNExcluding_empty() throws Exception { final MultiDomainServerState lastAliveCSNs = getLastAliveCSNs(); final MultiDomainServerState excluded = new MultiDomainServerState(); assertEquals(lastAliveCSNs.getOldestCSNExcluding(excluded), Pair.of(dn1, csn1)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testGetOldestCSNExcluding_currentOldestCSN_givesNewOldestCSN() throws Exception { final MultiDomainServerState lastAliveCSNs = getLastAliveCSNs(); final MultiDomainServerState excluded = new MultiDomainServerState(); excluded.update(dn1, csn1); assertEquals(lastAliveCSNs.getOldestCSNExcluding(excluded), Pair.of(dn2, csn1)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testGetOldestCSNExcluding_CSNOlderThanCurrentOldestCSN_givesNewOldestCSN() throws Exception { final MultiDomainServerState lastAliveCSNs = getLastAliveCSNs(); final MultiDomainServerState excluded = new MultiDomainServerState(); excluded.update(dn1, csn1); final CSN olderThanCSN1 = new CSN(0, 2, 3); assertEquals(olderThanCSN1.getServerId(), csn1.getServerId()); assertTrue(olderThanCSN1.isOlderThan(csn1)); excluded.update(dn2, olderThanCSN1); assertEquals(lastAliveCSNs.getOldestCSNExcluding(excluded), Pair.of(dn2, csn1)); } @Test(dependsOnMethods = { "testUpdateCSN" }) public void testGetOldestCSNExcluding_CSNNewerThanCurrentOldestCSN_givesNewOldestCSN() throws Exception { final MultiDomainServerState lastAliveCSNs = getLastAliveCSNs(); final MultiDomainServerState excluded = new MultiDomainServerState(); excluded.update(dn1, csn1); final CSN newerThanCSN1 = new CSN(42, 2, 3); assertEquals(newerThanCSN1.getServerId(), csn1.getServerId()); assertTrue(newerThanCSN1.isNewerThan(csn1)); excluded.update(dn2, newerThanCSN1); assertEquals(lastAliveCSNs.getOldestCSNExcluding(excluded), Pair.of(dn2, csn1)); } }