/*
* Copyright (c) 2015 Spotify AB
*
* 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.spotify.folsom.client;
import com.google.common.base.Charsets;
import com.spotify.folsom.AsciiMemcacheClient;
import com.spotify.folsom.ConnectFuture;
import com.spotify.folsom.FakeRawMemcacheClient;
import com.spotify.folsom.MemcacheStatus;
import com.spotify.folsom.client.ascii.DefaultAsciiMemcacheClient;
import com.spotify.folsom.transcoder.StringTranscoder;
import com.yammer.metrics.core.Metered;
import com.yammer.metrics.core.MetricsRegistry;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
public class YammerMetricsTest {
private YammerMetrics metrics;
private AsciiMemcacheClient<String> client;
private FakeRawMemcacheClient fakeRawMemcacheClient;
@Before
public void setUp() throws Exception {
metrics = new YammerMetrics(new MetricsRegistry());
fakeRawMemcacheClient = new FakeRawMemcacheClient(metrics);
client = new DefaultAsciiMemcacheClient<>(
fakeRawMemcacheClient,
metrics,
StringTranscoder.UTF8_INSTANCE,
Charsets.UTF_8);
ConnectFuture.connectFuture(client).get();
}
@Test
public void testGetMiss() throws Exception {
assertEquals(0, metrics.getGets().count());
assertEquals(0, metrics.getGetHits().count());
assertEquals(0, metrics.getGetMisses().count());
assertEquals(0, metrics.getGetFailures().count());
assertEquals(0, metrics.getGetSuccesses().count());
assertNull(client.get("key-miss").get());
awaitCount(1, metrics.getGets());
assertEquals(0, metrics.getGetHits().count());
assertEquals(1, metrics.getGetMisses().count());
assertEquals(0, metrics.getGetFailures().count());
assertEquals(1, metrics.getGetSuccesses().count());
}
@Test
public void testGetHit() throws Exception {
assertEquals(0, metrics.getGets().count());
assertEquals(0, metrics.getGetHits().count());
assertEquals(0, metrics.getGetMisses().count());
assertEquals(0, metrics.getGetFailures().count());
assertEquals(0, metrics.getGetSuccesses().count());
assertEquals(MemcacheStatus.OK, client.set("key", "value", 0).get());
assertEquals("value", client.get("key").get());
awaitCount(1, metrics.getGets());
assertEquals(1, metrics.getGetHits().count());
assertEquals(0, metrics.getGetMisses().count());
assertEquals(0, metrics.getGetFailures().count());
assertEquals(1, metrics.getGetSuccesses().count());
}
@Test
public void testMultiget() throws Exception {
assertEquals(0, metrics.getMultigets().count());
assertEquals(0, metrics.getGetHits().count());
assertEquals(0, metrics.getGetMisses().count());
assertEquals(0, metrics.getMultigetFailures().count());
assertEquals(0, metrics.getMultigetSuccesses().count());
assertEquals(MemcacheStatus.OK, client.set("key", "value", 0).get());
assertEquals(Arrays.asList("value", null), client.get(Arrays.asList("key", "key-miss")).get());
awaitCount(1, metrics.getMultigets());
assertEquals(1, metrics.getGetHits().count());
assertEquals(1, metrics.getGetMisses().count());
assertEquals(0, metrics.getMultigetFailures().count());
assertEquals(1, metrics.getMultigetSuccesses().count());
}
@Test
public void testSet() throws Exception {
assertEquals(0, metrics.getSets().count());
assertEquals(0, metrics.getSetFailures().count());
assertEquals(0, metrics.getSetSuccesses().count());
assertEquals(MemcacheStatus.OK, client.set("key", "value", 0).get());
awaitCount(1, metrics.getSets());
assertEquals(0, metrics.getSetFailures().count());
assertEquals(1, metrics.getSetSuccesses().count());
}
@Test
public void testIncrDecr() throws Exception {
assertEquals(MemcacheStatus.OK, client.set("key", "0", 0).get());
assertEquals(0, metrics.getIncrDecrs().count());
assertEquals(0, metrics.getIncrDecrFailures().count());
assertEquals(0, metrics.getIncrDecrSuccesses().count());
assertEquals(Long.valueOf(1L), client.incr("key", 1).get());
awaitCount(1, metrics.getIncrDecrs());
assertEquals(0, metrics.getIncrDecrFailures().count());
assertEquals(1, metrics.getIncrDecrSuccesses().count());
}
@Test
public void testTouch() throws Exception {
assertEquals(MemcacheStatus.OK, client.set("key", "0", 0).get());
assertEquals(0, metrics.getTouches().count());
assertEquals(0, metrics.getTouchFailures().count());
assertEquals(0, metrics.getTouchSuccesses().count());
assertEquals(MemcacheStatus.OK, client.touch("key", 1).get());
awaitCount(1, metrics.getTouches());
assertEquals(0, metrics.getTouchFailures().count());
assertEquals(1, metrics.getTouchSuccesses().count());
}
@Test
public void testDelete() throws Exception {
assertEquals(0, metrics.getDeletes().count());
assertEquals(0, metrics.getDeleteFailures().count());
assertEquals(0, metrics.getDeleteSuccesses().count());
assertEquals(MemcacheStatus.OK, client.delete("key").get());
awaitCount(1, metrics.getDeletes());
assertEquals(0, metrics.getDeleteFailures().count());
assertEquals(1, metrics.getDeleteSuccesses().count());
}
/** Test wiring up of OutstandingRequestGauge to the Yammer-metrics gauge. */
@Test
public void testOutstandingRequests() throws Exception {
// baseline
assertEquals(0, metrics.getOutstandingRequestsGauge().value().intValue());
fakeRawMemcacheClient.setOutstandingRequests(5);
assertEquals(5, metrics.getOutstandingRequestsGauge().value().intValue());
fakeRawMemcacheClient.setOutstandingRequests(0);
assertEquals(0, metrics.getOutstandingRequestsGauge().value().intValue());
}
private void awaitCount(int expectedValue, Metered timer) throws InterruptedException {
final int timeout = 10;
final long t1 = System.currentTimeMillis();
while (expectedValue != timer.count()) {
if (System.currentTimeMillis() - t1 > timeout) {
assertEquals(expectedValue, timer.count());
return;
}
Thread.sleep(0, 100);
}
}
}