/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.hadoop.chukwa.datacollection.test;


import org.apache.hadoop.chukwa.conf.ChukwaConfiguration;
import org.apache.hadoop.chukwa.datacollection.agent.ChukwaAgent;
import org.apache.hadoop.chukwa.datacollection.collector.servlet.ServletCollector;
import org.apache.hadoop.chukwa.datacollection.connector.http.HttpConnector;
import org.apache.hadoop.chukwa.datacollection.controller.ChukwaAgentController;
import org.apache.hadoop.chukwa.datacollection.writer.ConsoleWriter;
import org.apache.hadoop.chukwa.datacollection.writer.SeqFileWriter;
import org.apache.hadoop.conf.Configuration;
import org.apache.log4j.Logger;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;

import java.io.*;
import java.util.*;

public class FileTailerStressTest {

  static final int DELAY_MIN = 10 * 1000;
  static final int DELAY_RANGE = 2 * 1000;
  static final Logger log = Logger.getLogger(FileTailerStressTest.class);

  static class OccasionalWriterThread extends Thread {
    File file;

    OccasionalWriterThread(File f) {
      file = f;
    }

    public void run() {
      PrintWriter out = null;
      try {
        out = new PrintWriter(file.getAbsolutePath(), "UTF-8");
        Random rand = new Random();
        while (true) {
          int delay = rand.nextInt(DELAY_RANGE) + DELAY_MIN;
          Thread.sleep(delay);
          Date d = new Date();
          out.println("some test data written at " + d.toString());
          out.flush();
        }
      } catch (IOException e) {
        e.printStackTrace();
      } catch (InterruptedException e) {
        if(out != null) {
          out.close();
        }
      }
    }
  }

  static int FILES_TO_USE = 100;

  /**
   * @param args
   */
  public static void main(String[] args) {
    try {
      Server server = new Server(9990);
      Context root = new Context(server, "/", Context.SESSIONS);

      Configuration conf =  new Configuration();
      ServletCollector collector = new ServletCollector(conf);
      collector.setWriter(new ConsoleWriter(true));
      root.addServlet(new ServletHolder(collector), "/*");
      server.start();
      server.setStopAtShutdown(false);

      Thread.sleep(1000);
      ChukwaAgent agent = ChukwaAgent.getAgent();
      HttpConnector connector = new HttpConnector(agent,
          "http://localhost:9990/chukwa");
      connector.start();

      ChukwaConfiguration cc = new ChukwaConfiguration();
      int portno = cc.getInt("chukwaAgent.control.port", 9093);
      ChukwaAgentController cli = new ChukwaAgentController("localhost", portno);

      File workdir = new File("/tmp/stresstest/");
      if(!workdir.mkdir()) {
        log.warn("Error creating working directory:" + workdir.getAbsolutePath());
      }
      for (int i = 0; i < FILES_TO_USE; ++i) {
        File newTestF = new File("/tmp/stresstest/" + i);

        newTestF.deleteOnExit();
        (new OccasionalWriterThread(newTestF)).start();
        cli.addFile("test-lines", newTestF.getAbsolutePath());
      }

      Thread.sleep(60 * 1000);
      System.out.println("cleaning up");
      if(!workdir.delete()) {
        log.warn("Error clean up working directory:" + workdir.getAbsolutePath());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
