/* * Copyright 2014-2017 Netflix, 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.netflix.spectator.api; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @RunWith(JUnit4.class) public class ArrayTagSetTest { @Test public void equalsContractTest() { // NOTE: EqualsVerifier doesn't work with cached hash code ArrayTagSet ts1 = ArrayTagSet.create("k1", "v1"); ArrayTagSet ts2 = ArrayTagSet.create("k2", "v2").addAll(ts1); Assert.assertEquals(ts1, ts1); Assert.assertEquals(ts2, ts2); Assert.assertNotEquals(ts1, null); Assert.assertNotEquals(ts1, new Object()); Assert.assertNotEquals(ts1, ArrayTagSet.create("k1", "v2")); Assert.assertNotEquals(ts1, ArrayTagSet.create("k2", "v1")); Assert.assertNotEquals(ts1, ArrayTagSet.create("k1", "v1").addAll(ts2)); Assert.assertEquals(ts2, ArrayTagSet.create("k2", "v2").addAll(ts1)); Assert.assertEquals(ts2, ArrayTagSet.create("k2", "v2").addAll(ArrayTagSet.create("k1", "v1"))); } @Test public void testToString() { ArrayTagSet ts1 = ArrayTagSet.create("k1", "v1"); ArrayTagSet ts2 = ArrayTagSet.create("k2", "v2").addAll(ts1); ArrayTagSet ts3 = ArrayTagSet.create("k3", "v3").addAll(ts2); Assert.assertEquals(":k1=v1", ts1.toString()); Assert.assertEquals(":k1=v1:k2=v2", ts2.toString()); Assert.assertEquals(":k1=v1:k2=v2:k3=v3", ts3.toString()); } @Test public void testSingle() { ArrayTagSet ts = ArrayTagSet.create("k", "v"); for (Tag t : ts) { Assert.assertEquals(t.key(), "k"); Assert.assertEquals(t.value(), "v"); } } @Test(expected = NullPointerException.class) public void testNullKey() { ArrayTagSet.create(null, "v"); } @Test(expected = NullPointerException.class) public void testNullValue() { ArrayTagSet.create("k", null); } @Test(expected = UnsupportedOperationException.class) public void testIteratorRemoveUnsupported() { ArrayTagSet.create("k", "v").iterator().remove(); } @Test(expected = NoSuchElementException.class) public void testIteratorNext() { ArrayTagSet tag = ArrayTagSet.create("k", "v"); Iterator<Tag> iter = tag.iterator(); Assert.assertTrue(iter.hasNext()); Assert.assertEquals(new BasicTag("k", "v"), iter.next()); Assert.assertFalse(iter.hasNext()); iter.next(); } @Test public void testCreateFromMap() { Map<String, String> m = new HashMap<>(); m.put("k", "v"); ArrayTagSet ts1 = ArrayTagSet.create(m); ArrayTagSet ts2 = ArrayTagSet.create("k", "v"); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromMapWithMultipleValues() { Map<String, String> m = new HashMap<>(); m.put("k1", "v1"); m.put("k2", "v2"); ArrayTagSet ts1 = ArrayTagSet.create(m); ArrayTagSet ts2 = ArrayTagSet.create("k1", "v1").addAll(ArrayTagSet.create("k2", "v2")); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromArrayTagSet() { ArrayTagSet ts = ArrayTagSet.create("k", "v"); ArrayTagSet ts1 = ArrayTagSet.create(ts); ArrayTagSet ts2 = ArrayTagSet.create("k", "v"); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromVarargs2() { Map<String, String> m = new HashMap<>(); m.put("k1", "v1"); m.put("k2", "v2"); ArrayTagSet ts1 = ArrayTagSet.create(m); ArrayTagSet ts2 = ArrayTagSet.create("k1", "v1", "k2", "v2"); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromVarargs5() { Map<String, String> m = new HashMap<>(); m.put("a", "1"); m.put("b", "2"); m.put("c", "3"); m.put("d", "4"); m.put("e", "5"); ArrayTagSet ts1 = ArrayTagSet.create(m); ArrayTagSet ts2 = ArrayTagSet.create("a", "1", "b", "2", "c", "3", "d", "4", "e", "5"); Assert.assertEquals(ts1, ts2); } @Test(expected = IllegalArgumentException.class) public void testCreateFromVarargsOdd() { ArrayTagSet.create("a", "1", "b"); } @Test public void testCreateFromEmptyIterable() { Assert.assertEquals(ArrayTagSet.EMPTY, ArrayTagSet.create(Collections.emptyList())); } @Test public void testCreateFromSingleValueIterable() { Collection<Tag> coll = Collections.singleton(new BasicTag("k", "v")); ArrayTagSet ts1 = ArrayTagSet.create(coll); ArrayTagSet ts2 = ArrayTagSet.create("k", "v"); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromMultiValueIterable() { List<Tag> coll = new ArrayList<>(); coll.add(new BasicTag("k1", "v1")); coll.add(new BasicTag("k2", "v2")); ArrayTagSet ts1 = ArrayTagSet.create(coll); ArrayTagSet ts2 = ArrayTagSet.create("k1", "v1").addAll(ArrayTagSet.create("k2", "v2")); Assert.assertEquals(ts1, ts2); } @Test public void testCreateFromEmptyMap() { Assert.assertEquals(ArrayTagSet.EMPTY, ArrayTagSet.create(Collections.emptyMap())); } @Test public void testCreateFromSingleValueMap() { Map<String, String> tags = new HashMap<>(); tags.put("k", "v"); Assert.assertEquals(ArrayTagSet.create("k", "v"), ArrayTagSet.create(tags)); } @Test public void testCreateFromMultiValueMap() { Map<String, String> tags = new HashMap<>(); tags.put("k1", "v1"); tags.put("k2", "v2"); Assert.assertEquals(ArrayTagSet.create("k1", "v1") .addAll(ArrayTagSet.create("k2", "v2")), ArrayTagSet.create(tags)); } @Test(expected = NullPointerException.class) public void testMergeNullTag() { ArrayTagSet expected = ArrayTagSet.create("k", "v"); expected.add(null); } @Test public void testMergeTag() { ArrayTagSet initial = ArrayTagSet.create("k2", "v2"); ArrayTagSet update = ArrayTagSet.create("k1", "v1"); ArrayTagSet expected = ArrayTagSet.create("k1", "v1").addAll(ArrayTagSet.create("k2", "v2")); Assert.assertEquals(expected, initial.addAll(update)); } @Test public void testMergeTagWithSameKey() { ArrayTagSet initial = ArrayTagSet.create("k1", "v1"); ArrayTagSet expected = ArrayTagSet.create("k1", "v2"); ArrayTagSet actual = initial.addAll(expected); Assert.assertNotSame(expected, actual); Assert.assertEquals(expected, actual); } @Test(expected = NullPointerException.class) public void testMergeNullList() { ArrayTagSet expected = ArrayTagSet.create("k3", "v3"); expected.addAll((Iterable<Tag>) null); } @Test public void testMergeEmptyList() { ArrayTagSet expected = ArrayTagSet.create("k3", "v3"); ArrayTagSet actual = expected.addAll(new ArrayList<>()); Assert.assertSame(expected, actual); } @Test public void testMergeSingleValueAsList() { ArrayList<Tag> prefix = new ArrayList<>(); ArrayTagSet initial = ArrayTagSet.create("k3", "v3"); ArrayTagSet expected = ArrayTagSet.create("k1", "v1").addAll(ArrayTagSet.create("k3", "v3")); prefix.add(new BasicTag("k1", "v1")); ArrayTagSet actual = initial.addAll(prefix); Assert.assertEquals(expected, actual); } @Test public void testMergeMultipleValuesAsList() { ArrayList<Tag> prefix = new ArrayList<>(); ArrayTagSet initial = ArrayTagSet.create("k3", "v3"); ArrayTagSet expected = ArrayTagSet.create("k1", "v1") .addAll(ArrayTagSet.create("k2", "v2")) .addAll(ArrayTagSet.create("k3", "v3")); prefix.add(new BasicTag("k1", "v1")); prefix.add(new BasicTag("k2", "v2")); ArrayTagSet actual = initial.addAll(prefix); Assert.assertEquals(expected, actual); } @Test(expected = NullPointerException.class) public void testMergeNullMap() { ArrayTagSet expected = ArrayTagSet.create("k3", "v3"); expected.addAll((Map<String, String>) null); } @Test public void testMergeEmptyMap() { ArrayTagSet expected = ArrayTagSet.create("k3", "v3"); ArrayTagSet actual = expected.addAll(new HashMap<>()); Assert.assertSame(expected, actual); } @Test public void testMergeSingleValueAsMap() { Map<String, String> extra = new HashMap<>(); ArrayTagSet initial = ArrayTagSet.create("k3", "v3"); ArrayTagSet expected = ArrayTagSet.create("k1", "v1").addAll(ArrayTagSet.create("k3", "v3")); extra.put("k1", "v1"); ArrayTagSet actual = initial.addAll(extra); Assert.assertEquals(expected, actual); } @Test public void testMergeMultipleValuesAsMap() { Map<String, String> extra = new HashMap<>(); ArrayTagSet initial = ArrayTagSet.create("k3", "v3"); ArrayTagSet expected = ArrayTagSet.create("k1", "v1") .addAll(ArrayTagSet.create("k2", "v2")) .addAll(ArrayTagSet.create("k3", "v3")); extra.put("k1", "v1"); extra.put("k2", "v2"); ArrayTagSet actual = initial.addAll(extra); Assert.assertEquals(expected, actual); } @Test public void addAllTagArrayEmpty() { ArrayTagSet ts = ArrayTagSet.EMPTY.addAll(new Tag[0]); Assert.assertSame(ArrayTagSet.EMPTY, ts); } @Test public void addAllStringArrayEmpty() { ArrayTagSet ts = ArrayTagSet.EMPTY.addAll(new String[0]); Assert.assertSame(ArrayTagSet.EMPTY, ts); } @Test public void addAllIterable() { // Add an arbitrary iterable that isn't a collection or ArrayTagSet Collection<Tag> tags = Collections.singletonList(new BasicTag("app", "foo")); ArrayTagSet ts = ArrayTagSet.EMPTY.addAll(tags::iterator); Assert.assertEquals(ArrayTagSet.EMPTY.addAll(tags), ts); } @Test public void addAllDedupEmpty() { ArrayTagSet ts = ArrayTagSet.EMPTY.addAll(new String[] {"a", "1", "a", "2", "a", "3"}); Assert.assertEquals(ArrayTagSet.EMPTY.add(new BasicTag("a", "3")), ts); } @Test public void addAllDedupMerge() { ArrayTagSet ts = ArrayTagSet.EMPTY .addAll(new String[] {"a", "1", "a", "2", "a", "3"}) .addAll(new String[] {"a", "4", "a", "5", "a", "6", "b", "1"}); ArrayTagSet expected = ArrayTagSet.EMPTY .add(new BasicTag("a", "6")) .add(new BasicTag("b", "1")); Assert.assertEquals(expected, ts); } }