package de.is24.util.monitoring.statsd;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Random;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class StatsdClientTest {
private StatsdDatagrammSocket socket;
private StatsdClient target;
@Before
public void setUp() throws Exception {
socket = mock(StatsdDatagrammSocket.class);
target = new StatsdClient(socket, new StatsdHostGroupedMessageFormatter("test", "testHost"));
}
@Test
public void shouldSendTiming() throws IOException {
target.timing("testTiming", 42);
verify(socket, times(1)).send("testTiming:42|ms||test.testHost");
}
@Test
public void shouldDecrement() throws IOException {
target.decrement("testDecrement");
verify(socket, times(1)).send("testDecrement:-1|c||test.testHost");
}
@Test
public void shouldDecrementByMagnitude() throws IOException {
target.decrement("testDecrement", 23);
verify(socket, times(1)).send("testDecrement:-23|c||test.testHost");
}
@Test
public void shouldDecrementMultipleKeys() throws IOException {
target.decrement("testDecrement1", "testDecrement2");
verify(socket, times(1)).send("testDecrement1:-1|c||test.testHost");
verify(socket, times(1)).send("testDecrement2:-1|c||test.testHost");
}
@Test
public void shouldDecrementMultipleKeysByMagnitude() throws IOException {
target.decrement(19, "testDecrement1", "testDecrement2");
verify(socket, times(1)).send("testDecrement1:-19|c||test.testHost");
verify(socket, times(1)).send("testDecrement2:-19|c||test.testHost");
}
@Test
public void shouldDecrementMultipleKeysByMagnitudeUsingSampling() throws IOException {
target.decrement(21, 1.0, "testDecrement1", "testDecrement2");
verify(socket, times(1)).send("testDecrement1:-21|c||test.testHost");
verify(socket, times(1)).send("testDecrement2:-21|c||test.testHost");
}
@Test
public void shouldNotDecrementUsingZeroSampling() throws IOException {
target.decrement("testDecrement1", 1, 0.0);
verify(socket, times(0)).send(anyString());
}
@Test
public void shouldIncrement() throws IOException {
target.increment("testIncrement");
verify(socket, times(1)).send("testIncrement:1|c||test.testHost");
}
@Test
public void shouldIncrementByMagnitude() throws IOException {
target.increment("testIncrement", 81);
verify(socket, times(1)).send("testIncrement:81|c||test.testHost");
}
@Test
public void normalIncrementShouldReturnTrue() throws IOException {
socket.send(anyString());
assertThat(target.increment("testIncrement")).isEqualTo(true);
}
@Test
public void incrementShouldReturnFalseOnError() throws IOException {
expectToFail();
assertThat(target.increment("testIncrement")).isEqualTo(false);
}
@Test
public void incrementShouldReturnTrueIfIncludedInSample() throws IOException {
socket.send(anyString());
mockRngAndReturn(0.4);
assertThat(target.increment("testIncrement", 1, 0.5)).isEqualTo(true);
verify(socket, times(1)).send("testIncrement:1|c|@0.5|test.testHost");
}
@Test
public void incrementShouldReturnFalseIfExcludedFromSample() throws IOException {
socket.send(anyString());
mockRngAndReturn(0.6);
assertThat(target.increment("testIncrement", 1, 0.5)).isEqualTo(false);
}
@Test
public void incrementShouldReturnFalseIfIncludedInSampleOnError() throws IOException {
expectToFail();
mockRngAndReturn(0.4);
assertThat(target.increment("testIncrement", 1, 0.5)).isEqualTo(false);
}
@Test(expected = UnknownHostException.class)
public void instantiationFailsIfHostCanNotBeResolved() throws UnknownHostException, SocketException {
StatsdClient failApp = new StatsdClient("host.not.known", 8125, "failApp");
}
@Test
public void instantiationDoesNotFailIfHostNotListening() throws UnknownHostException, SocketException {
StatsdClient client = new StatsdClient("localhost", 8125, "works");
}
private void expectToFail() throws IOException {
socket.send(anyString());
when(socket).thenThrow(new IOException());
}
private void mockRngAndReturn(double value) {
StatsdClient.rng = mock(Random.class);
when(StatsdClient.rng.nextDouble()).thenReturn(value);
}
}