/** * Copyright 2016 Yahoo 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 com.yahoo.pulsar.common.naming; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import org.testng.annotations.Test; import com.google.common.collect.BoundType; import com.google.common.collect.Range; import com.google.common.hash.Hashing; import com.yahoo.pulsar.common.naming.DestinationName; import com.yahoo.pulsar.common.naming.NamespaceBundle; import com.yahoo.pulsar.common.naming.NamespaceBundleFactory; import com.yahoo.pulsar.common.naming.NamespaceBundles; import com.yahoo.pulsar.common.naming.NamespaceName; public class NamespaceBundleTest { private final NamespaceBundleFactory factory = NamespaceBundleFactory.createFactory(Hashing.crc32()); @Test public void testConstructor() { try { new NamespaceBundle(null, null, null); fail("Should have failed w/ null pointer exception"); } catch (NullPointerException npe) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar.old.ns"), null, null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.CLOSED, 0L, BoundType.OPEN), null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.OPEN, 1L, BoundType.OPEN), null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(1L, BoundType.CLOSED, 1L, BoundType.OPEN), null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.CLOSED, 1L, BoundType.CLOSED), null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.CLOSED, NamespaceBundles.FULL_UPPER_BOUND, BoundType.OPEN), null); fail("Should have failed w/ illegal argument exception"); } catch (IllegalArgumentException iae) { // OK, expected } try { new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.CLOSED, NamespaceBundles.FULL_UPPER_BOUND, BoundType.CLOSED), null); fail("Should have failed w/ null pointer exception"); } catch (NullPointerException npe) { // OK, expected } NamespaceBundle bundle = new NamespaceBundle(new NamespaceName("pulsar/use/ns"), Range.range(0L, BoundType.CLOSED, 1L, BoundType.OPEN), factory); assertTrue(bundle.getKeyRange().lowerEndpoint().equals(0L)); assertEquals(bundle.getKeyRange().lowerBoundType(), BoundType.CLOSED); assertTrue(bundle.getKeyRange().upperEndpoint().equals(1L)); assertEquals(bundle.getKeyRange().upperBoundType(), BoundType.OPEN); assertEquals(bundle.getNamespaceObject().toString(), "pulsar/use/ns"); } @Test public void testGetBundle() throws Exception { NamespaceBundle bundle = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0L, BoundType.CLOSED, 0xffffffffL, BoundType.CLOSED)); assertNotNull(bundle); NamespaceBundle bundle2 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0L, BoundType.CLOSED, 0xffffffffL, BoundType.CLOSED)); // Don't call equals and make sure those two are the same instance assertEquals(bundle, bundle2); } @Test public void testCompareTo() throws Exception { NamespaceBundle bundle = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); NamespaceBundle bundle2 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0x20000000l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); try { bundle.compareTo(bundle2); fail("Should have failed due to overlap ranges"); } catch (IllegalArgumentException iae) { // OK, expected } NamespaceBundle bundle0 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x10000000L, BoundType.OPEN)); assertTrue(bundle0.compareTo(bundle2) < 0); assertTrue(bundle2.compareTo(bundle0) > 0); NamespaceBundle bundle1 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x20000000L, BoundType.OPEN)); assertTrue(bundle1.compareTo(bundle2) < 0); NamespaceBundle bundle3 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); assertTrue(bundle.compareTo(bundle3) == 0); NamespaceBundle otherBundle = factory.getBundle(new NamespaceName("pulsar/use/ns2"), Range.range(0x10000000l, BoundType.CLOSED, 0x30000000L, BoundType.OPEN)); assertTrue(otherBundle.compareTo(bundle0) > 0); } @Test public void testEquals() throws Exception { NamespaceBundle bundle = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); NamespaceBundle bundle2 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0x20000000l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); assertTrue(!bundle.equals(bundle2)); NamespaceBundle bundle0 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); assertTrue(bundle0.equals(bundle)); NamespaceBundle otherBundle = factory.getBundle(new NamespaceName("pulsar/use/ns2"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); assertTrue(!otherBundle.equals(bundle)); } @Test public void testIncludes() throws Exception { DestinationName dn = DestinationName.get("persistent://pulsar/use/ns1/topic-1"); Long hashKey = factory.getLongHashCode(dn.toString()); Long upper = Math.max(hashKey + 1, NamespaceBundles.FULL_UPPER_BOUND); BoundType upperType = upper.equals(NamespaceBundles.FULL_UPPER_BOUND) ? BoundType.CLOSED : BoundType.OPEN; NamespaceBundle bundle = factory.getBundle(dn.getNamespaceObject(), Range.range(hashKey / 2, BoundType.CLOSED, upper, upperType)); assertTrue(bundle.includes(dn)); bundle = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(upper, BoundType.CLOSED, NamespaceBundles.FULL_UPPER_BOUND, BoundType.CLOSED)); assertTrue(!bundle.includes(dn)); NamespaceBundle otherBundle = factory.getBundle(new NamespaceName("pulsar/use/ns2"), Range.range(0l, BoundType.CLOSED, 0x40000000L, BoundType.OPEN)); assertTrue(!otherBundle.includes(dn)); } @Test public void testToString() throws Exception { NamespaceBundle bundle0 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0l, BoundType.CLOSED, 0x10000000L, BoundType.OPEN)); assertEquals(bundle0.toString(), "pulsar/use/ns1/0x00000000_0x10000000"); bundle0 = factory.getBundle(new NamespaceName("pulsar/use/ns1"), Range.range(0x10000000l, BoundType.CLOSED, NamespaceBundles.FULL_UPPER_BOUND, BoundType.CLOSED)); assertEquals(bundle0.toString(), "pulsar/use/ns1/0x10000000_0xffffffff"); } }