package samplest.core;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import com.github.kevinsawicki.http.HttpRequest;
import com.google.common.collect.Lists;
import org.junit.After;
import org.junit.ClassRule;
import org.junit.Test;
import restx.factory.Factory;
import restx.metrics.codahale.CodahaleMetricRegistry;
import restx.tests.RestxServerRule;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Set;
import java.util.SortedMap;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Date: 13/12/13
* Time: 23:09
*/
public class ProdModeTest {
@ClassRule
public static RestxServerRule server = new RestxServerRule().setMode("prod");
@Test
public void should_accept_stars_in_url_and_monitor_it() throws Exception {
// test for #126
// first we do a request and check it is properly processed
HttpRequest httpRequest = server.client().authenticatedAs("admin").GET(
"/api/params/path/v1*/v2/35v4");
assertThat(httpRequest.code()).isEqualTo(200);
assertThat(httpRequest.body().trim()).isEqualTo("a=v1* b=v2 c=35 d=v4");
// then we check corresponding timer has been registered in Metrics
MetricRegistry registry = ((CodahaleMetricRegistry) Factory.getFactory(server.getServer().getServerId()).get()
.getComponent(restx.common.metrics.api.MetricRegistry.class)).getCodahaleMetricRegistry();
SortedMap<String, Timer> timers = registry.getTimers(new MetricFilter() {
@Override
public boolean matches(String name, Metric metric) {
return name.indexOf("<HTTP> GET /params/path/") != -1;
}
});
assertThat(timers.size()).isEqualTo(1);
assertThat(timers.firstKey()).isEqualTo("<HTTP> GET /params/path/v1*/v2/35v4");
// and now we check a MBean has been created for that timer too.
// the name of the MBean is escaped, so it is enclosed in quotes: "
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = mBeanServer.queryNames(
ObjectName.getInstance("metrics:name=\"<HTTP> GET /params/path/*\""), null);
assertThat(objectNames.size()).isEqualTo(1);
}
}