/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2015 ForgeRock AS. */ package org.opends.server.backends.pluggable; import static org.assertj.core.api.Assertions.*; import static org.opends.server.backends.pluggable.EntryIDSet.*; import static org.opends.server.backends.pluggable.Utils.*; import java.util.Arrays; import org.forgerock.opendj.ldap.ByteString; import org.opends.server.DirectoryServerTestCase; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @SuppressWarnings("javadoc") @Test(groups = { "precommit", "pluggablebackend", "unit" }, sequential=true) public class EntryIDSetTest extends DirectoryServerTestCase { private final static ByteString KEY = ByteString.valueOfUtf8("test"); @Test(expectedExceptions = NullPointerException.class) public void testDefinedCannotCreateWithNull() { newDefinedSet(null); } @Test public void testDefinedAdd() { final EntryIDSet set = newDefinedSet(6, 8, 10, 12); assertThat(set.add(id(4))).isTrue(); assertIdsEquals(set, 4, 6, 8, 10, 12); assertThat(set.add(id(14))).isTrue(); assertIdsEquals(set, 4, 6, 8, 10, 12, 14); assertThat(set.add(id(11))).isTrue(); assertIdsEquals(set, 4, 6, 8, 10, 11, 12, 14); assertThat(set.add(id(10))).isFalse(); assertIdsEquals(set, 4, 6, 8, 10, 11, 12, 14); } @Test public void testDefinedAddAll() { final EntryIDSet set = newDefinedSet(10, 12); // Add nothing set.addAll(newDefinedSet()); assertIdsEquals(set, 10, 12); // Prepend set.addAll(newDefinedSet(6, 8)); assertIdsEquals(set, 6, 8, 10, 12); // Append set.addAll(newDefinedSet(14, 16)); assertIdsEquals(set, 6, 8, 10, 12, 14, 16); // Prepend & middle set.addAll(newDefinedSet(2, 4, 6, 8, 9)); assertIdsEquals(set, 2, 4, 6, 8, 9, 10, 12, 14, 16); // Middle & append set.addAll(newDefinedSet(13, 14, 16, 18, 20)); assertIdsEquals(set, 2, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20); // Fully overlapping set.addAll(newDefinedSet(1, 2, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20, 21)); assertIdsEquals(set, 1, 2, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20, 21); } @Test public void testDefinedRemove() { final EntryIDSet set = newDefinedSet(4, 6, 8, 10, 12, 14); assertThat(set.remove(id(4))).isTrue(); assertIdsEquals(set, 6, 8, 10, 12, 14); assertThat(set.remove(id(14))).isTrue(); assertIdsEquals(set, 6, 8, 10, 12); assertThat(set.remove(id(10))).isTrue(); assertIdsEquals(set, 6, 8, 12); assertThat(set.remove(id(10))).isFalse(); assertIdsEquals(set, 6, 8, 12); } @Test public void testDefinedRemoveAll() { final EntryIDSet set = newDefinedSet(1, 2, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20, 21); // Remove nothing set.removeAll(newDefinedSet()); assertIdsEquals(set, 1, 2, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20, 21); // Sequential from the beginning set.removeAll(newDefinedSet(0, 1, 2)); assertIdsEquals(set, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18, 20, 21); // Sequential from the end set.removeAll(newDefinedSet(20, 21, 22)); assertIdsEquals(set, 4, 6, 8, 9, 10, 12, 13, 14, 16, 18); // Random in the middle set.removeAll(newDefinedSet(9, 13)); assertIdsEquals(set, 4, 6, 8, 10, 12, 14, 16, 18); // All missing set.removeAll(newDefinedSet(1, 5, 11, 17)); assertIdsEquals(set, 4, 6, 8, 10, 12, 14, 16, 18); } @Test public void testDefinedContain() { final EntryIDSet set = newDefinedSet(4, 6, 8, 10, 12, 14); assertThat(set.contains(id(2))).isFalse(); assertThat(set.contains(id(4))).isTrue(); assertThat(set.contains(id(9))).isFalse(); assertThat(set.contains(id(10))).isTrue(); assertThat(set.contains(id(14))).isTrue(); assertThat(set.contains(id(16))).isFalse(); } @Test public void testDefinedIterator() { assertIdsEquals(newDefinedSet(4, 6, 8, 10, 12).iterator(), 4, 6, 8, 10, 12); } @Test(dataProvider = "codecs") public void testCodecs(EntryIDSetCodec codec) { ByteString string = codec.encode(newDefinedSet(4, 6, 8, 10, 12)); assertIdsEquals(codec.decode(KEY, string), 4, 6, 8, 10, 12); string = codec.encode(newUndefinedSet()); assertThat(codec.decode(KEY, string).isDefined()).isFalse(); assertThat(codec.decode(KEY, string).size()).isEqualTo(Long.MAX_VALUE); string = codec.encode(newUndefinedSetWithKey(ByteString.valueOfUtf8("none"))); assertThat(codec.decode(KEY, string).isDefined()).isFalse(); assertThat(codec.decode(KEY, string).size()).isEqualTo(Long.MAX_VALUE); } @Test(enabled = false, dataProvider = "codec") public void testCodecsEmptyDefinedSet(EntryIDSetCodec codec) { // FIXME: When decoded, an empty defined set becomes an undefined set // see OPENDJ-1833 ByteString string = codec.encode(newDefinedSet()); assertThat(codec.decode(KEY, string).size()).isEqualTo(0); string = codec.encode(newDefinedSet()); assertThat(codec.decode(KEY, string).size()).isEqualTo(0); } @Test(expectedExceptions = NullPointerException.class) public void testUndefinedCannotCreateWithNull() { newUndefinedSetWithKey(null); } @Test public void testUndefinedAddDoesNothing() { final EntryIDSet undefined = newUndefinedSet(); assertThat(undefined.add(id(4))).isTrue(); assertThat(undefined.size()).isEqualTo(Long.MAX_VALUE); } @Test public void testUndefinedAddAllDoesNothing() { final EntryIDSet undefined = newUndefinedSet(); undefined.addAll(newDefinedSet()); assertThat(undefined.size()).isEqualTo(Long.MAX_VALUE); undefined.addAll(newDefinedSet(2, 4, 6)); assertThat(undefined.size()).isEqualTo(Long.MAX_VALUE); } @Test public void testUndefinedRemoveDoesNothing() { final EntryIDSet undefined = newUndefinedSet(); assertThat(undefined.remove(id(4))).isTrue(); assertThat(undefined.size()).isEqualTo(Long.MAX_VALUE); } @Test public void testUndefinedDeleteAllDoesNothing() { final EntryIDSet undefined = newUndefinedSet(); undefined.removeAll(newDefinedSet(20, 21, 22)); assertThat(undefined.size()).isEqualTo(Long.MAX_VALUE); } @Test public void testUndefinedContain() { assertThat(newUndefinedSet().contains(id(4))).isTrue(); } @Test public void testUndefinedIterator() { assertThat(newUndefinedSet().iterator().hasNext()).isFalse(); } @Test public void testNewEmptySet() { assertThat(newDefinedSet().isDefined()).isTrue(); assertThat(newDefinedSet().size()).isEqualTo(0); } @Test public void testNewSetWIthIDs() { assertThat(newDefinedSet().isDefined()).isTrue(); assertThat(newDefinedSet().size()).isEqualTo(0); assertThat(newDefinedSet(1, 2, 3).isDefined()).isTrue(); assertThat(newDefinedSet(1, 2, 3).size()).isEqualTo(3); } @Test public void testNewUndefinedSet() { assertThat(newUndefinedSet().isDefined()).isFalse(); assertThat(newUndefinedSetWithKey(KEY).isDefined()).isFalse(); assertThat(newUndefinedSetWithKey(KEY).size()).isEqualTo(Long.MAX_VALUE); } @Test public void testNewSetFromUnions() { EntryIDSet union = newSetFromUnion(Arrays.asList(newDefinedSet(1, 2, 3), newDefinedSet(4, 5, 6), newDefinedSet(3, 4))); assertIdsEquals(union, 1, 2, 3, 4, 5, 6); union = newSetFromUnion(Arrays.asList(newDefinedSet(), newDefinedSet(4, 5, 6), newDefinedSet(3, 4))); assertIdsEquals(union, 3, 4, 5, 6); union = newSetFromUnion(Arrays.asList(newDefinedSet(), newDefinedSet(4, 5, 6), newUndefinedSet())); assertThat(union.isDefined()).isFalse(); } @Test public void testRetainAll() { EntryIDSet retained = newDefinedSet(2, 4, 6, 8); retained.retainAll(newDefinedSet(1, 2, 3, 5, 6, 7, 8)); assertThat(retained.isDefined()).isTrue(); assertIdsEquals(retained, 2, 6, 8); retained = newDefinedSet(2, 4, 6, 8); retained.retainAll(newDefinedSet(1, 3, 5, 7, 9)); assertThat(retained.isDefined()).isTrue(); assertIdsEquals(retained); retained = newUndefinedSet(); retained.retainAll(newDefinedSet(1, 3, 5, 7, 9)); assertThat(retained.isDefined()).isTrue(); assertIdsEquals(retained, 1, 3, 5, 7, 9); } @DataProvider(name = "codecs") public static Object[][] codecs() { return new Object[][] { { CODEC_V1 }, { CODEC_V2 } }; } }