package io.prometheus.client.bridge;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Gauge;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;

class GraphiteTest {
  @Test
  public void testPush() throws Exception {
    // Create a metric.
    CollectorRegistry registry = new CollectorRegistry();
    Gauge labels = Gauge.build().name("labels").help("help").labelNames("l").register(registry);
    labels.labels("fo*o").inc();

    // Server to accept push.
    final ServerSocket ss = new ServerSocket(0);
    final StringBuilder result = new StringBuilder();
    Thread t =
        new Thread() {
          public void run() {
            try {
              Socket s = ss.accept();
              BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
              result.append(reader.readLine());
              s.close();
            } catch (Exception e) {
              e.printStackTrace();
              fail();
            }
          }
        };
    t.start();

    // Push.
    Graphite g = new Graphite("localhost", ss.getLocalPort());
    g.push(registry);
    t.join();
    ss.close();

    // Check result.
    String[] parts = result.toString().split(" ");
    assertEquals(3, parts.length);
    assertEquals("labels;l=fo_o", parts[0]);
    assertEquals("1.0", parts[1]);
    Integer.parseInt(parts[2]); // This shouldn't throw an exception.
  }
}
