package eu.dnetlib.efg.stress.app;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import eu.dnetlib.efg.stress.test.HttpStresser;
import eu.dnetlib.efg.stress.test.HttpStresserFactory;

public class StressApp {
	private static final int N_RUN = 4;
	private static final int MAX_THREADS = 60;
	private static final int STEP_THREADS = 2;
	
	public static void main(final String[] args) throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/eu/dnetlib/efg/stress/test/stressContext.xml");
		//SingleStressFactory stressFactory = (SingleStressFactory) ctx.getBean("singleStressFactory");
		HttpStresserFactory stressFactory = (HttpStresserFactory) ctx.getBean("httpStresserFactory");
		
		//HttpStresserFactory stressFactory = new HttpStresserFactory();
				
		int nThreads=STEP_THREADS;
		while (nThreads <= MAX_THREADS) {
			for (int currentRun=1; currentRun <= N_RUN; currentRun++) {
				ExecutorService executor = Executors.newFixedThreadPool(nThreads);
				
				List<HttpStresser> tasks = new ArrayList<HttpStresser>();
				for (int i=0; i<nThreads; i++) {
					tasks.add(stressFactory.newInstance());
				}
			
				List<Future<Double>> response = executor.invokeAll(tasks);
				
				Thread.sleep(1000);
				
				for (Future<Double> fs : response) {
					System.out.println(nThreads + "|" + (response.indexOf(fs) + 1) + "|RUN_" + currentRun + "|" + fs.get());
				}
			}
			
			nThreads += STEP_THREADS;
		}
	}
}
