/*
* Copyright 2014 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.servo.tag;
import com.netflix.servo.util.UnmodifiableList;
import com.netflix.servo.util.UnmodifiableSet;
import org.testng.annotations.Test;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
public class SmallTagMapTest {
@Test
public void testEmpty() {
SmallTagMap smallTagMap = SmallTagMap.builder().result();
assertTrue(smallTagMap.isEmpty());
SmallTagMap notEmpty = SmallTagMap.builder().add(Tags.newTag("k", "v")).result();
assertFalse(notEmpty.isEmpty());
assertEquals(notEmpty.size(), 1);
}
@Test
public void testGet() {
Tag tag = Tags.newTag("k1", "v1");
SmallTagMap map = SmallTagMap.builder().add(tag).result();
assertEquals(map.get("k1"), tag);
assertNull(map.get("k2"));
}
@Test
public void testBuilderUpdatesExisting() {
Tag t1 = Tags.newTag("k1", "v1");
Tag t2 = Tags.newTag("k1", "v2");
SmallTagMap map = SmallTagMap.builder().add(t1).add(t2).result();
assertEquals(map.get("k1"), t2);
}
@Test
public void testBuilderAddAll() {
Tag t1 = Tags.newTag("k1", "v1");
Tag t2 = Tags.newTag("k1", "v2");
Tag t3 = Tags.newTag("k2", "v2");
List<Tag> tags = UnmodifiableList.of(t1, t2, t3);
SmallTagMap map = SmallTagMap.builder().addAll(tags).result();
assertEquals(map.get("k1"), t2);
assertEquals(map.size(), 2);
}
@Test
public void testIteratorEmpty() {
SmallTagMap empty = SmallTagMap.builder().result();
assertFalse(empty.iterator().hasNext());
}
@Test(expectedExceptions = NoSuchElementException.class)
public void testIteratorNextThrows() {
SmallTagMap empty = SmallTagMap.builder().result();
empty.iterator().next();
}
@Test
public void testIterator() {
final Tag t1 = Tags.newTag("k1", "v");
final Tag t2 = Tags.newTag("k2", "v2");
SmallTagMap map = SmallTagMap.builder().add(t1).add(t2).result();
Set<Tag> tags = UnmodifiableSet.copyOf(map.iterator());
assertEquals(tags, UnmodifiableSet.of(t1, t2));
}
@Test
public void testResize() {
SmallTagMap.Builder builder = SmallTagMap.builder();
for (int i = 0; i < SmallTagMap.MAX_TAGS; ++i) {
Tag t = Tags.newTag("k" + i, "0");
builder.add(t);
assertEquals(builder.size(), i + 1);
}
SmallTagMap map = builder.result();
assertEquals(map.size(), SmallTagMap.MAX_TAGS);
}
@Test
public void testTooManyTags() {
SmallTagMap.Builder builder = SmallTagMap.builder();
for (int i = 0; i < SmallTagMap.MAX_TAGS + 2; ++i) {
builder.add(Tags.newTag("k" + i, "0"));
}
assertEquals(builder.size(), SmallTagMap.MAX_TAGS);
assertEquals(builder.result().size(), SmallTagMap.MAX_TAGS);
}
@Test
public void testContains() {
SmallTagMap map = SmallTagMap.builder().add(Tags.newTag("k1", "v")).add(
Tags.newTag("k2", "v2")).result();
assertTrue(map.containsKey("k1"));
assertTrue(map.containsKey("k2"));
assertFalse(map.containsKey("k3"));
}
@Test
public void testHashcode() {
SmallTagMap map1 = SmallTagMap.builder().add(Tags.newTag("k1", "v1")).result();
SmallTagMap map2 = SmallTagMap.builder().add(Tags.newTag("k1", "v2")).result();
SmallTagMap map3 = SmallTagMap.builder().add(Tags.newTag("k1", "v1")).result();
assertEquals(map1.hashCode(), map1.hashCode());
assertEquals(map1.hashCode(), map3.hashCode());
assertNotEquals(map1.hashCode(), map2.hashCode());
}
@SuppressWarnings({"EqualsWithItself", "ObjectEqualsNull"})
@Test
public void testEquals() {
SmallTagMap map1 = SmallTagMap.builder().add(Tags.newTag("k1", "v1")).result();
SmallTagMap map2 = SmallTagMap.builder().add(Tags.newTag("k1", "v2")).result();
SmallTagMap map3 = SmallTagMap.builder().add(Tags.newTag("k1", "v1")).result();
SmallTagMap map4 = SmallTagMap.builder().add(Tags.newTag("k1", "v1"))
.add(Tags.newTag("k2", "v2")).result();
assertTrue(map1.equals(map1));
assertTrue(map1.equals(map3));
assertFalse(map1.equals(map2));
assertFalse(map1.equals(null));
assertFalse(map1.equals(map4));
}
@Test
public void testToString() {
SmallTagMap empty = SmallTagMap.builder().result();
assertEquals(empty.toString(), "SmallTagMap{}");
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testIteratorImmutable() {
SmallTagMap map1 = SmallTagMap.builder().add(Tags.newTag("k1", "v1")).result();
Iterator<Tag> it = map1.iterator();
assertTrue(it.hasNext());
it.remove();
}
@Test
public void testEqualsRandomOrder() {
SmallTagMap.Builder builder1 = SmallTagMap.builder();
SmallTagMap.Builder builder2 = SmallTagMap.builder();
final int n = 16;
for (int i = 0; i < n; i++) {
builder1.add(Tags.newTag("k" + i, "0"));
builder2.add(Tags.newTag("k" + (n - i - 1), "0"));
}
assertEquals(builder1.result(), builder2.result());
}
@Test
public void testHashcodeRandomOrder() {
SmallTagMap.Builder builder1 = SmallTagMap.builder();
SmallTagMap.Builder builder2 = SmallTagMap.builder();
final int n = 16;
for (int i = 0; i < n; i++) {
builder1.add(Tags.newTag("k" + i, "0"));
builder2.add(Tags.newTag("k" + (n - i - 1), "0"));
}
assertEquals(builder1.result().hashCode(), builder2.result().hashCode());
}
}