/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package loadTest;
import commonTestTools.TestFileUtils;
import commonTestTools.config.PieShareAppServiceTestConfig;
import java.io.File;
import java.util.Date;
import java.util.List;
import loadTest.loadTestLib.LUtil;
import loadTest.loadTestLib.LoadTestConfigModel;
import loadTest.loadTestLib.config.LoadTestConfig;
import loadTest.loadTestLib.helper.LFileComparer;
import loadTest.loadTestLib.message.AllClientsDoneMessage;
import loadTest.loadTestLib.message.AllFilesCompleteMessage;
import loadTest.loadTestLib.message.ClientIsUpMessage;
import loadTest.loadTestLib.message.MasterIsReadyMessage;
import loadTest.loadTestLib.task.AllClientsDoneTask;
import loadTest.loadTestLib.task.AllFilesCompleteTask;
import loadTest.loadTestLib.task.ClientIsUpTask;
import loadTest.loadTestLib.task.MasterIsReadyTask;
import org.pieShare.pieShareApp.model.PieShareConfiguration;
import org.pieShare.pieShareApp.model.PieUser;
import org.pieShare.pieShareApp.model.command.LoginCommand;
import org.pieShare.pieShareApp.model.pieFile.PieFile;
import org.pieShare.pieShareApp.service.fileService.LocalFileService;
import org.pieShare.pieShareApp.service.networkService.INetworkService;
import org.pieShare.pieShareApp.service.networkService.NetworkService;
import org.pieShare.pieShareApp.service.shareService.BitTorrentService;
import org.pieShare.pieShareApp.springConfiguration.PiePlateConfiguration;
import org.pieShare.pieShareApp.springConfiguration.PieShareApp.PieShareAppModel;
import org.pieShare.pieShareApp.springConfiguration.PieShareApp.PieShareAppService;
import org.pieShare.pieShareApp.springConfiguration.PieShareApp.PieShareAppTasks;
import org.pieShare.pieShareApp.springConfiguration.PieUtilitiesConfiguration;
import org.pieShare.pieShareApp.task.commandTasks.loginTask.LoginTask;
import org.pieShare.pieShareApp.task.commandTasks.loginTask.api.ILoginFinished;
import org.pieShare.pieShareApp.task.commandTasks.loginTask.exceptions.WrongPasswordException;
import org.pieShare.pieTools.piePlate.service.channel.PlainTextChannel;
import org.pieShare.pieTools.piePlate.service.cluster.ClusterManagementService;
import org.pieShare.pieTools.pieUtilities.model.PlainTextPassword;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.PieExecutorTaskFactory;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IPieExecutorTaskFactory;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import pieShareAppITs.helper.ITTasksCounter;
/**
*
* @author richy
*/
@ContextConfiguration(classes = {PieUtilitiesConfiguration.class, PiePlateConfiguration.class,
PieShareAppModel.class, PieShareAppServiceTestConfig.class, PieShareAppTasks.class, LoadTestConfig.class})
@TestExecutionListeners({DirtiesContextTestExecutionListener.class})
public class LoadTestIT extends AbstractTestNGSpringContextTests {
//private AnnotationConfigApplicationContext context;
private ITTasksCounter counter;
private LFileComparer comparer;
private List<PieFile> files;
private LUtil lUtil = new LUtil();
@BeforeClass
public static void setUpClass() throws Exception {
//LUtil.runInDockerCluster();
LUtil.setUpEnviroment();
if (LUtil.IsMaster()) {
LUtil.setUpResultFile();
Assert.assertTrue(LUtil.startDockerBuild());
}
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@BeforeMethod
public void setUpMethod() throws Exception {
PieLogger.info(this.getClass(), "SetupMethod");
lUtil.performTearDownDelete();
}
@AfterMethod
public void tearDownMethod() throws Exception {
PieLogger.info(this.getClass(), "TeardownMethod");
lUtil.performTearDown(this.applicationContext);
}
@DataProvider(name = "loadTestDataProvider")
public static Object[][] loadTestDataProvider() throws Exception {
//if (LUtil.IsMaster()) {
List<LoadTestConfigModel> ltModels = LUtil.readJSONConfig();
Object[][] data = new Object[ltModels.size()][1];
for (int i = 0; i < ltModels.size(); i++) {
data[i][0] = ltModels.get(i);
}
return data;
//}
/*LoadTestConfigModel ltModel = new LoadTestConfigModel();
ltModel.setFileSize(0);
ltModel.setNodeCount(0);
int fc = Integer.parseInt(System.getenv("LTFILES"));
ltModel.setFileCount(fc);
return new Object[][]{{ltModel}};*/
}
//@Test
public void dockerSetUpTest() throws Exception {
}
//@Test
public void selfTest() throws Exception {
loadTestDataProvider();
}
@DirtiesContext
@Test(dataProvider = "loadTestDataProvider")
public void loadTest(LoadTestConfigModel ltModel) throws Exception {
//validate context
PieShareAppService appService = this.applicationContext.getBean(PieShareAppService.class);
Assert.assertNotNull(appService);
String userName = "testUser";
PieUser user = this.applicationContext.getBean("pieUser", PieUser.class);
ClusterManagementService service = this.applicationContext.getBean(ClusterManagementService.class);
PlainTextChannel loadTestChannel = this.applicationContext.getBean(PlainTextChannel.class);
loadTestChannel.setChannelId("loadTest");
service.registerChannel("loadTest", loadTestChannel);
counter = this.applicationContext.getBean(ITTasksCounter.class);
if (LUtil.IsMaster()) {
comparer = this.applicationContext.getBean(LFileComparer.class);
if (LUtil.UseDocker()) {
INetworkService networkService = this.applicationContext.getBean(NetworkService.class);
networkService.setNicDisplayName("docker0");
//start slave nodes
for (int i = 1; i < ltModel.getNodeCount(); i++) {
if (!lUtil.startDockerSlave(ltModel)) {
i--;
}
}
}
}
PieShareConfiguration config = user.getPieShareConfiguration();
config.setPwdFile(new File("./loadTest/pwdFile"));
config.setTmpDir(new File("./loadTest/tmpDir"));
config.setWorkingDir(new File("./loadTest/workingDir"));
LoginTask task = this.applicationContext.getBean(LoginTask.class);
LoginCommand command = new LoginCommand();
PlainTextPassword pwd = new PlainTextPassword();
pwd.password = "test".getBytes();
command.setPlainTextPassword(pwd);
command.setUserName(userName);
IPieExecutorTaskFactory executorFactory = this.applicationContext.getBean("pieExecutorTaskFactory", PieExecutorTaskFactory.class);
if (LUtil.IsMaster()) {
executorFactory.registerTask(AllFilesCompleteMessage.class, AllFilesCompleteTask.class);
executorFactory.registerTask(ClientIsUpMessage.class, ClientIsUpTask.class);
}
else {
executorFactory.registerTask(AllClientsDoneMessage.class, AllClientsDoneTask.class);
executorFactory.registerTask(MasterIsReadyMessage.class, MasterIsReadyTask.class);
}
command.setCallback(new ILoginFinished() {
@Override
public void error(Exception ex) {
Assert.fail(ex.getMessage());
}
@Override
public void wrongPassword(WrongPasswordException ex) {
Assert.fail(ex.getMessage());
}
@Override
public void OK() {
}
});
if (LUtil.IsMaster()) {
user.getPieShareConfiguration().getWorkingDir().mkdirs();
System.out.println("Creating files!");
for (int i = 0; i < ltModel.getFileCount(); i++) {
String fileName = String.format("testFile_%s", i);
File file = new File(user.getPieShareConfiguration().getWorkingDir(), fileName);
TestFileUtils.createFile(file, ltModel.getFileSize());
}
System.out.println("Files successfully created!");
PieLogger.info(this.getClass(), "Files successfully created!");
}
//this block syncs master and client nodes so test starts when all ready
if (LUtil.IsMaster()) {
while (counter.getCount(ClientIsUpTask.class) < ltModel.getNodeCount() - 1) {
Thread.sleep(2000);
PieLogger.debug(this.getClass(),
String.format("Waiting for nodes to start up! Missing nodes: %s", ltModel.getNodeCount() - 1 - counter.getCount(ClientIsUpTask.class)));
}
MasterIsReadyMessage masterReadyMsg = this.applicationContext.getBean(MasterIsReadyMessage.class);
masterReadyMsg.getAddress().setClusterName("loadTest");
masterReadyMsg.getAddress().setChannelId("loadTest");
service.sendMessage(masterReadyMsg);
} else {
ClientIsUpMessage message = this.applicationContext.getBean(ClientIsUpMessage.class);
message.getAddress().setClusterName("loadTest");
message.getAddress().setChannelId("loadTest");
service.sendMessage(message);
while (counter.getCount(MasterIsReadyMessage.class) < 1) {
Thread.sleep(2000);
}
}
task.setEvent(command);
task.run();
System.out.println("Waiting for completion!");
if (LUtil.IsMaster()) {
PieLogger.info(this.getClass(), "Master");
Date start = new Date();
while (counter.getCount(AllFilesCompleteTask.class) < (ltModel.getNodeCount() - 1)) {
Thread.sleep(1000);
}
Date stop = new Date();
long resultTime = stop.getTime() - start.getTime();
Assert.assertTrue(comparer.getResult());
LUtil.writeCSVResult(ltModel, resultTime);
AllClientsDoneMessage doneMsg = this.applicationContext.getBean(AllClientsDoneMessage.class);
doneMsg.getAddress().setClusterName("loadTest");
doneMsg.getAddress().setChannelId("loadTest");
service.sendMessage(doneMsg);
} else {
PieLogger.info(this.getClass(), "Slave");
BitTorrentService torrentService = this.applicationContext.getBean(BitTorrentService.class);
while (user.getPieShareConfiguration().getWorkingDir().listFiles().length < ltModel.getFileCount()
|| torrentService.activeTorrents()) {
Thread.sleep(1000);
}
PieLogger.info(this.getClass(), "WorkingDirFileCount: " + String.valueOf(user.getPieShareConfiguration().getWorkingDir().listFiles().length));
PieLogger.info(this.getClass(), "TestModelCount: " + String.valueOf(ltModel.getFileCount()));
AllFilesCompleteMessage message = this.applicationContext.getBean(AllFilesCompleteMessage.class);
LocalFileService fileService = this.applicationContext.getBean(LocalFileService.class);
message.setFiles(fileService.getAllFiles());
message.getAddress().setClusterName("loadTest");
message.getAddress().setChannelId("loadTest");
service.sendMessage(message);
PieLogger.info(this.getClass(), "Before waiting for AllClientsDone!");
while (counter.getCount(AllClientsDoneMessage.class) < 1) {
Thread.sleep(1000);
}
PieLogger.info(this.getClass(), "After waiting for AllClientsDone!");
//this sleep alows the master to be first up in order to receive all client up notifications
Thread.sleep(5000);
}
Date now = new Date();
System.out.println(now.toString() + ": Finished!");
}
}