/**
* Copyright 2015 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.placeholders;
import com.netflix.spectator.api.BasicTag;
import com.netflix.spectator.api.DefaultRegistry;
import com.netflix.spectator.api.Id;
import com.netflix.spectator.api.Registry;
import com.netflix.spectator.api.Tag;
import nl.jqno.equalsverifier.EqualsVerifier;
import nl.jqno.equalsverifier.Warning;
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.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Unit tests for the DefaultPlaceholderId class.
*
* Created on 9/17/15.
*/
@RunWith(JUnit4.class)
public class DefaultPlaceholderIdTest {
private static final Registry REGISTRY = new DefaultRegistry();
private static final Id ID_1 = REGISTRY.createId("foo", "k1", "v1");
private static final Id ID_2 = REGISTRY.createId("foo", "k1", "v1", "k2", "v2");
@Test(expected = NullPointerException.class)
public void testNullName() {
new DefaultPlaceholderId(null, REGISTRY);
}
@Test
public void testName() {
PlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY);
Assert.assertEquals(id.name(), "foo");
}
@Test
public void equalsContractTest() {
EqualsVerifier
.forClass(DefaultPlaceholderId.class)
.withPrefabValues(Iterable.class, ID_1.tags(), ID_2.tags())
.suppress(Warning.NULL_FIELDS)
.verify();
}
@Test
public void testToString() {
DefaultPlaceholderId id = (new DefaultPlaceholderId("foo", REGISTRY)).withTag("k1", "v1").withTag("k2", "v2");
Assert.assertEquals("foo:k1=v1:k2=v2", id.toString());
}
@Test
public void testToStringNameOnly() {
DefaultPlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY);
Assert.assertEquals(id.toString(), "foo");
}
@Test
public void testWithTag() {
Tag expected = new BasicTag("key", "value");
DefaultPlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY).withTag(expected);
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertTrue("tags empty", tags.hasNext());
Assert.assertEquals(expected, tags.next());
}
@Test
public void testWithTagsIterable() {
List<Tag> tags = new ArrayList<>();
tags.add(new BasicTag("k1", "v1"));
tags.add(new BasicTag("k2", "v2"));
DefaultPlaceholderId id = (new DefaultPlaceholderId("foo", REGISTRY)).withTags(tags);
Assert.assertEquals("foo:k1=v1:k2=v2", id.toString());
}
@Test
public void testWithTagsMap() {
Map<String, String> map = new LinkedHashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
DefaultPlaceholderId id = (new DefaultPlaceholderId("foo", REGISTRY)).withTags(map);
Assert.assertEquals("foo:k1=v1:k2=v2", id.toString());
}
@Test
public void testWithNoopTagFactory() {
DefaultPlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY).withTagFactory(new TagFactory() {
@Override
public String name() {
return "noopTagFactory";
}
@Override
/* Implementation that always returns null, which should result in the tag being omitted. */
public Tag createTag() {
return null;
}
});
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertFalse("tags not empty", tags.hasNext());
}
@Test
public void testWithTagFactory() {
Tag expected = new BasicTag("key", "value");
DefaultPlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY).withTagFactory(new ConstantTagFactory(expected));
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertTrue("tags empty", tags.hasNext());
Assert.assertEquals(expected, tags.next());
}
@Test
public void testWithTagFactories() {
Tag tags1 = new BasicTag("k1", "v1");
Tag tags2 = new BasicTag("k2", "v2");
List<TagFactory> factories = Arrays.asList(new ConstantTagFactory(tags1), new ConstantTagFactory(tags2));
DefaultPlaceholderId id = new DefaultPlaceholderId("foo", REGISTRY).withTagFactories(factories);
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertTrue("tags empty", tags.hasNext());
Assert.assertEquals(tags1, tags.next());
Assert.assertEquals(tags2, tags.next());
}
@Test
public void testResolveToId() {
Tag tag = new BasicTag("key", "value");
Id expected = REGISTRY.createId("foo").withTag(tag);
PlaceholderId placeholderId = new DefaultPlaceholderId("foo", REGISTRY).withTag(tag);
Assert.assertEquals(expected, placeholderId.resolveToId());
}
@Test
public void testCreateWithFactories() {
Tag tags1 = new BasicTag("k1", "v1");
Tag tags2 = new BasicTag("k2", "v2");
List<TagFactory> factories = Arrays.asList(new ConstantTagFactory(tags1), new ConstantTagFactory(tags2));
DefaultPlaceholderId id = DefaultPlaceholderId.createWithFactories("foo", factories, REGISTRY);
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertEquals("foo", id.name());
Assert.assertTrue("tags empty", tags.hasNext());
Assert.assertEquals(tags1, tags.next());
Assert.assertEquals(tags2, tags.next());
}
@Test
public void testCreateWithFactoriesNullIterable() {
DefaultPlaceholderId id = DefaultPlaceholderId.createWithFactories("foo", null, REGISTRY);
Iterator<Tag> tags = id.resolveToId().tags().iterator();
Assert.assertEquals("foo", id.name());
Assert.assertFalse("tags not empty", tags.hasNext());
}
}