/* * Copyright 2014-2016 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.atlas.impl; import com.netflix.spectator.api.DefaultRegistry; import com.netflix.spectator.api.ManualClock; import com.netflix.spectator.api.Measurement; import com.netflix.spectator.api.Registry; import com.netflix.spectator.api.Tag; 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.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RunWith(JUnit4.class) public class EvaluatorTest { private final ManualClock clock = new ManualClock(); private final Registry registry = new DefaultRegistry(clock); private List<TagsValuePair> data(String name, double... vs) { List<Measurement> ms = new ArrayList<>(); for (int i = 0; i < vs.length; ++i) { String pos = String.format("%03d", i); String value = String.format("%f", vs[i]); ms.add(new Measurement(registry.createId(name, "i", pos, "v", value), 0L, vs[i])); } return ms.stream().map(this::newTagsValuePair).collect(Collectors.toList()); } private TagsValuePair newTagsValuePair(Measurement m) { Map<String, String> tags = new HashMap<>(); for (Tag t : m.id().tags()) { tags.put(t.key(), t.value()); } tags.put("name", m.id().name()); return new TagsValuePair(tags, m.value()); } @Test public void noSubsForGroup() { Evaluator evaluator = new Evaluator(); EvalPayload payload = evaluator.eval("test", 0L, Collections.emptyList()); EvalPayload expected = new EvalPayload(0L, Collections.emptyList()); Assert.assertEquals(expected, payload); } @Test public void sumAndMaxForGroup() { List<Subscription> subs = new ArrayList<>(); subs.add(new Subscription().withId("sum").withExpression(":true,:sum")); subs.add(new Subscription().withId("max").withExpression(":true,:max")); Evaluator evaluator = new Evaluator().addGroupSubscriptions("local", subs); EvalPayload payload = evaluator.eval("local", 0L, data("foo", 1.0, 2.0, 3.0)); List<EvalPayload.Metric> metrics = new ArrayList<>(); metrics.add(new EvalPayload.Metric("sum", Collections.emptyMap(), 6.0)); metrics.add(new EvalPayload.Metric("max", Collections.emptyMap(), 3.0)); EvalPayload expected = new EvalPayload(0L, metrics); Assert.assertEquals(expected, payload); } @Test public void removeSub() { List<Subscription> subs = new ArrayList<>(); subs.add(new Subscription().withId("sum").withExpression(":true,:sum")); subs.add(new Subscription().withId("max").withExpression(":true,:max")); Evaluator evaluator = new Evaluator().addGroupSubscriptions("local", subs); evaluator.removeGroupSubscriptions("local"); EvalPayload payload = evaluator.eval("test", 0L, Collections.emptyList()); EvalPayload expected = new EvalPayload(0L, Collections.emptyList()); Assert.assertEquals(expected, payload); } @Test public void updateSub() { // Eval with sum List<Subscription> sumSub = new ArrayList<>(); sumSub.add(new Subscription().withId("sum").withExpression(":true,:sum")); Evaluator evaluator = new Evaluator().addGroupSubscriptions("local", sumSub); EvalPayload payload = evaluator.eval("local", 0L, data("foo", 1.0, 2.0, 3.0)); List<EvalPayload.Metric> metrics = new ArrayList<>(); metrics.add(new EvalPayload.Metric("sum", Collections.emptyMap(), 6.0)); EvalPayload expected = new EvalPayload(0L, metrics); Assert.assertEquals(expected, payload); // Update to use max instead List<Subscription> maxSub = new ArrayList<>(); maxSub.add(new Subscription().withId("sum").withExpression(":true,:max")); evaluator.addGroupSubscriptions("local", maxSub); payload = evaluator.eval("local", 0L, data("foo", 1.0, 2.0, 3.0)); metrics = new ArrayList<>(); metrics.add(new EvalPayload.Metric("sum", Collections.emptyMap(), 3.0)); expected = new EvalPayload(0L, metrics); Assert.assertEquals(expected, payload); } }