package me.chanjar.tomcat.valves;

import java.io.File;

import org.apache.catalina.Globals;
import org.apache.catalina.Valve;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.junit.Test;

import me.chanjar.tomcat.util.PostGenerator;

public class AccessLogBenchmark extends AbstractValveTest {

  String accessLogDirectory = System.getProperty("tomcat.test.reports");
  
  @Override
  public void setUpValve(Tomcat tomcat) {
    // clear AccessLogValve
    for (Valve vl : tomcat.getHost().getPipeline().getValves()) {
      if (vl.getClass().equals(AccessLogValve.class)) {
        tomcat.getHost().getPipeline().removeValve(vl);
      }
    }
    
    if (accessLogDirectory == null) {
      accessLogDirectory = new File(getBuildDirectory(), "logs").toString();
    }
    AccessLogValve alv = new AccessLogValve();
    alv.setDirectory(accessLogDirectory);
    alv.setPattern("combined");

    tomcat.getHost().getPipeline().addValve(alv);
  }
  
  @Override
  public void tearDown() throws Exception {
    super.tearDown();
    // delete logs directory
    File dir = new File(accessLogDirectory);
    if (!dir.isAbsolute()) {
      dir = new File(System.getProperty(Globals.CATALINA_BASE_PROP), accessLogDirectory);
  }
    for(String f : dir.list()) {
      new File(dir.getAbsolutePath(), f).delete();
    }
    dir.delete();
  }
  
  @Test
  public void benchmark() throws Exception {
    Tomcat tomcat = getTomcatInstance();
    tomcat.start();
    
    CloseableHttpClient httpclient = HttpClients.createDefault();
    
    int[] iterationsArray = {100/*, 1000, 10000, 100000*/};

    long total = 0;
    for(int iterations : iterationsArray) {
      for (int i = 0; i < iterations; i++) {
        HttpUriRequest post = PostGenerator.gen(tomcat.getConnector().getLocalPort());
        long start = System.currentTimeMillis();
        httpclient.execute(post).close();
        total += System.currentTimeMillis() - start;
      }
      sb.append(iterations + " iterations using AccessLogValve took " + total + "ms").append("\n");
    }
    
  }

}