/**
* Copyright 2014 Netflix, Inc.
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.monitor;
import com.netflix.servo.util.ManualClock;
import org.testng.annotations.Test;
import java.util.List;
import static org.testng.AssertJUnit.assertEquals;
public class DurationTimerTest extends AbstractMonitorTest {
@Override
public Monitor<?> newInstance(String name) {
return new DurationTimer(MonitorConfig.builder(name).build());
}
@SuppressWarnings("unchecked")
private static Monitor<Long> getDuration(List<Monitor<?>> monitors) {
return (Monitor<Long>) monitors.get(0);
}
@SuppressWarnings("unchecked")
private static Monitor<Long> getActiveTasks(List<Monitor<?>> monitors) {
return (Monitor<Long>) monitors.get(1);
}
@Test
public void testGetMonitors() throws Exception {
List<Monitor<?>> monitors = ((CompositeMonitor<?>) newInstance("test")).getMonitors();
assertEquals(monitors.size(), 2);
Monitor<Long> duration = getDuration(monitors);
Monitor<Long> activeTasks = getActiveTasks(monitors);
assertEquals(duration.getConfig().getName(), "test.duration");
assertEquals(activeTasks.getConfig().getName(), "test.activeTasks");
assertEquals(duration.getValue().longValue(), 0L);
assertEquals(activeTasks.getValue().longValue(), 0L);
}
@Test
public void testTimer() throws Exception {
ManualClock clock = new ManualClock(0);
DurationTimer timer = new DurationTimer(MonitorConfig.builder("test").build(), clock);
Stopwatch s = timer.start();
clock.set(10 * 1000L);
assertEquals(10, s.getDuration());
Monitor<Long> duration = getDuration(timer.getMonitors());
Monitor<Long> activeTasks = getActiveTasks(timer.getMonitors());
assertEquals(10L, duration.getValue().longValue());
assertEquals(1L, activeTasks.getValue().longValue());
clock.set(20 * 1000L);
assertEquals(20L, duration.getValue().longValue());
assertEquals(1L, activeTasks.getValue().longValue());
Stopwatch anotherTask = timer.start();
assertEquals(20L, duration.getValue().longValue());
assertEquals(2L, activeTasks.getValue().longValue());
clock.set(30 * 1000L);
assertEquals(40L, duration.getValue().longValue()); // 30s for the first, 10s for the second
assertEquals(2L, activeTasks.getValue().longValue());
s.stop();
assertEquals(10L, duration.getValue().longValue()); // 30s for the first, 10s for the second
assertEquals(1L, activeTasks.getValue().longValue());
anotherTask.stop();
assertEquals(0L, duration.getValue().longValue());
assertEquals(0L, activeTasks.getValue().longValue());
}
@Test
public void testValue() throws Exception {
ManualClock clock = new ManualClock(0L);
DurationTimer timer = new DurationTimer(MonitorConfig.builder("test").build(), clock);
assertEquals(0L, timer.getValue().longValue());
Stopwatch s = timer.start();
clock.set(10 * 1000L);
assertEquals(10L, timer.getValue().longValue());
s.stop();
assertEquals(0L, timer.getValue().longValue());
}
@Test
public void testReset() throws Exception {
ManualClock clock = new ManualClock(0L);
DurationTimer timer = new DurationTimer(MonitorConfig.builder("test").build(), clock);
Stopwatch s = timer.start();
clock.set(10 * 1000L);
assertEquals(10L, timer.getValue().longValue());
s.reset();
assertEquals(0L, timer.getValue().longValue());
clock.set(20 * 1000L);
assertEquals(10L, timer.getValue().longValue());
}
}