package io.prometheus.client.exporter; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Gauge; import java.io.IOException; import java.util.TreeMap; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockserver.junit.MockServerRule; import org.mockserver.client.server.MockServerClient; public class PushGatewayTest { @Rule public MockServerRule mockServerRule = new MockServerRule(this); private MockServerClient mockServerClient; CollectorRegistry registry; Gauge gauge; PushGateway pg; Map groupingKey; @Before public void setUp() { registry = new CollectorRegistry(); gauge = (Gauge) Gauge.build().name("g").help("help").create(); pg = new PushGateway("localhost:" + mockServerRule.getHttpPort()); groupingKey = new TreeMap<String, String>(); groupingKey.put("l", "v"); } @Test public void testPush() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j") ).respond(response().withStatusCode(202)); pg.push(registry, "j"); } @Test(expected=IOException.class) public void testNon202ResponseThrows() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j") ).respond(response().withStatusCode(500)); pg.push(registry, "j"); } @Test public void testPushCollector() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j") ).respond(response().withStatusCode(202)); pg.push(gauge, "j"); } @Test public void testPushWithGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/l/v") ).respond(response().withStatusCode(202)); pg.push(registry, "j", groupingKey); } @Test public void testPushWithMultiGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/l/v/l2/v2") ).respond(response().withStatusCode(202)); groupingKey.put("l2", "v2"); pg.push(registry, "j", groupingKey); } @Test public void testPushWithGroupingKeyWithSlashes() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/a%2Fb/l/v/l2/v%2F2") ).respond(response().withStatusCode(202)); groupingKey.put("l2", "v/2"); pg.push(registry, "a/b", groupingKey); } @Test public void testPushCollectorWithGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/l/v") ).respond(response().withStatusCode(202)); pg.push(gauge, "j", groupingKey); } @Test public void testPushAdd() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j") ).respond(response().withStatusCode(202)); pg.pushAdd(registry, "j"); } @Test public void testPushAddCollector() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j") ).respond(response().withStatusCode(202)); pg.pushAdd(gauge, "j"); } @Test public void testPushAddWithGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j/l/v") ).respond(response().withStatusCode(202)); pg.pushAdd(registry, "j", groupingKey); } @Test public void testPushAddCollectorWithGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j/l/v") ).respond(response().withStatusCode(202)); pg.pushAdd(gauge, "j", groupingKey); } @Test public void testDelete() throws IOException { mockServerClient.when( request() .withMethod("DELETE") .withPath("/metrics/job/j") ).respond(response().withStatusCode(202)); pg.delete("j"); } @Test public void testDeleteWithGroupingKey() throws IOException { mockServerClient.when( request() .withMethod("DELETE") .withPath("/metrics/job/j/l/v") ).respond(response().withStatusCode(202)); pg.delete("j", groupingKey); } @Test public void testOldPushWithoutInstance() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/instance/") ).respond(response().withStatusCode(202)); pg.push(registry, "j", ""); } @Test public void testOldPushWithInstance() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(202)); pg.push(registry, "j", "i"); } @Test(expected=IOException.class) public void testOldNon202ResponseThrows() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(500)); pg.push(registry,"j", "i"); } @Test public void testOldPushWithSlashes() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/a%2Fb/instance/c%2Fd") ).respond(response().withStatusCode(202)); pg.push(registry, "a/b", "c/d"); } @Test public void testOldPushCollector() throws IOException { mockServerClient.when( request() .withMethod("PUT") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(202)); pg.push(gauge, "j", "i"); } @Test public void testOldPushAdd() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(202)); pg.pushAdd(registry, "j", "i"); } @Test public void testOldPushAddCollector() throws IOException { mockServerClient.when( request() .withMethod("POST") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(202)); pg.pushAdd(gauge, "j", "i"); } @Test public void testOldDelete() throws IOException { mockServerClient.when( request() .withMethod("DELETE") .withPath("/metrics/job/j/instance/i") ).respond(response().withStatusCode(202)); pg.delete("j", "i"); } @Test public void testInstanceIPGroupingKey() throws IOException { groupingKey = PushGateway.instanceIPGroupingKey(); Assert.assertTrue(!groupingKey.get("instance").equals("")); } }