com.testvagrant.monitor.radiator.MongoWriter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of optimus-cloud-monitor Show documentation
Show all versions of optimus-cloud-monitor Show documentation
The Java Client provides access to Optimus cloud for all java based projects.
The newest version!
/*
* Copyright (c) 2017. TestVagrant Technologies
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
package com.testvagrant.monitor.radiator;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.mongodb.BasicDBObject;
import com.mongodb.client.DistinctIterable;
import com.mongodb.client.FindIterable;
import com.testvagrant.monitor.clients.BuildsClient;
import com.testvagrant.monitor.clients.DevicesClient;
import com.testvagrant.monitor.clients.ScenariosClient;
import com.testvagrant.monitor.constants.MongoDB;
import com.testvagrant.monitor.entities.CrashData;
import com.testvagrant.monitor.entities.DeviceDetails;
import com.testvagrant.monitor.entities.ScenarioTimeline;
import com.testvagrant.monitor.entities.SmartBOT;
import com.testvagrant.monitor.entities.reportParser.ExecutedScenario;
import com.testvagrant.monitor.exceptions.DeviceEngagedException;
import com.testvagrant.monitor.exceptions.DeviceReleaseException;
import com.testvagrant.monitor.helpers.TestCaseHelper;
import com.testvagrant.monitor.reql.DeviceMatcherFunction;
import com.testvagrant.monitor.requests.Build;
import com.testvagrant.monitor.requests.Device;
import com.testvagrant.monitor.requests.Scenario;
import com.testvagrant.monitor.requests.Screenshot;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.json.simple.JSONObject;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import static com.testvagrant.monitor.constants.MongoDB.*;
import static com.testvagrant.monitor.utils.DeviceToDeviceDetailsMapper.getDevicesFromDeviceDetails;
public class MongoWriter extends MongoIO {
public MongoWriter() {
super();
}
public void insertDeviceList(List deviceDetailsList) {
latestBuildID = getLatestBuild();
System.out.println("Inserting devices "+deviceDetailsList);
List devicesFromDeviceDetails = getDevicesFromDeviceDetails(latestBuildID,deviceDetailsList);
new DevicesClient().storeDevices(devicesFromDeviceDetails);
}
public void updateDeviceScreenshot(String udid, byte[] screenshot) {
Device device = new Device();
device.setUdid(udid);
device.setScreenshot(screenshot);
new DevicesClient().storeScreenShot(latestBuildID,device);
}
public void notifyBOTRegistration(SmartBOT smartBOT) {
Scenario scenario = new Scenario();
scenario.setScenarioName(smartBOT.getTestCase().getName());
scenario.setStartTime(new Date());
scenario.setDeviceUdid(smartBOT.getDeviceUdid());
scenario.setTags(smartBOT.getTestCase().getSourceTagNames());
scenario.setBuildId(latestBuildID);
setScenarioLocation(smartBOT, scenario);
new ScenariosClient().createNewScenario(scenario, smartBOT.getTestCase().getLines());
}
private void setScenarioLocation(SmartBOT smartBOT, Scenario scenario) {
if(isScenarioOutline(smartBOT)) {
scenario.setLocation(smartBOT.getTestCase().getLines().get(1));
} else {
scenario.setLocation(smartBOT.getTestCase().getLines().get(0));
}
}
private boolean isScenarioOutline(SmartBOT smartBOT) {
return smartBOT.getTestCase().getLines().size()>1;
}
public void notifyScenarioCompletion(SmartBOT smartBOT) {
Scenario scenario = new ScenariosClient().findRelevantScenario(latestBuildID,"",smartBOT.getTestCase().getName(), getLocation(smartBOT), smartBOT.getDeviceUdid());
Date endTime = new Date();
long timeTaken = (endTime.getTime() - scenario.getStartTime().getTime()) / 1000;
scenario.setStatus(smartBOT.getTestCase().getStatus().toLowerCase());
scenario.setCompleted(true);
scenario.setEndTime(new Date());
scenario.setTimeTaken(Math.toIntExact(timeTaken));
setScenarioLocation(smartBOT,scenario);
new ScenariosClient().updateScenario(latestBuildID,scenario);
}
private Integer getLocation(SmartBOT smartBOT) {
if(isScenarioOutline(smartBOT)) {
return smartBOT.getTestCase().getLines().get(1);
} else {
return smartBOT.getTestCase().getLines().get(0);
}
}
private Object getLatestRecordFor(SmartBOT smartBOT) {
BasicDBObject andQuery = new BasicDBObject();
List objects = new ArrayList<>();
String uniqueScenarioName = new TestCaseHelper(smartBOT.getTestCase()).getUniqueScenarioName();
// objects.add(new BasicDBObject(KEY_SCENARIOS_SCENARIO_NAME, smartBOT.getScenario().getId()));
objects.add(new BasicDBObject(KEY_SCENARIOS_SCENARIO_NAME, uniqueScenarioName));
objects.add(new BasicDBObject(KEY_SCENARIOS_DEVICE_UDID, smartBOT.getDeviceUdid()));
andQuery.put(QUERY_AND, objects);
Document document = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_SCENARIOS)
.find(andQuery)
.sort(new BasicDBObject(MongoDB.KEY_SCENARIOS_START_TIME, -1)).first();
return document.get(ID);
}
public String getLatestRecordFor(ExecutedScenario scenario) {
Scenario executedScenario = getScenarioByNameAndLocation(scenario);
Scenario relevantScenario = new ScenariosClient().findRelevantScenario(latestBuildID, "",executedScenario.getScenarioName(), executedScenario.getLocation(),scenario.getDeviceName());
return relevantScenario.getId();
}
public synchronized DeviceDetails updateFirstAvailableDeviceToEngaged(JSONObject testFeed) throws DeviceEngagedException {
System.out.println("Updating first available device to Engaged");
Device matchingDevice = new DeviceMatcherFunction().getDeviceQuery(testFeed);
Device deviceToEngage = new DevicesClient().getDevice(latestBuildID, matchingDevice);
deviceToEngage.setStatus("Engaged");
DeviceDetails deviceDetails = new DevicesClient().updateDevice(deviceToEngage);
System.out.println(String.format("Updated device %s to engaged", deviceDetails.getDeviceName()));
return deviceDetails;
}
public synchronized DeviceDetails updateFirstAvailableDeviceToEngaged(String udid) throws DeviceEngagedException {
System.out.println(latestBuildID);
Device matchingDevice = new Device();
matchingDevice.setUdid(udid);
matchingDevice.setStatus("Engaged");
return new DevicesClient().updateDevice(matchingDevice);
}
public void updateStatusToAvailableForDevice(String udid) throws DeviceReleaseException {
// new DevicesClient().releaseDevice(latestBuildID,udid);
}
public void updateExecutionDetailsFor(List scenarios) {
for (ExecutedScenario executedScenario : scenarios) {
Scenario scenario = getScenarioByNameAndLocation(executedScenario);
scenario.setSteps(new Gson().toJson(executedScenario.getSteps()));
scenario.setFeatureName(executedScenario.getFeatureName());
scenario.setFailedOnScreen(executedScenario.getEmbeddedFailedScreen());
new ScenariosClient().updateScenario(latestBuildID,scenario);
}
}
private Scenario getScenarioByNameAndLocation(ExecutedScenario executedScenario) {
String scenarioId = executedScenario.getId();
String location = scenarioId.substring(scenarioId.lastIndexOf("-")+1);
String scenarioName = scenarioId.substring(0,scenarioId.lastIndexOf("-")).replaceAll("-"," ");
return new ScenariosClient().findRelevantScenario(latestBuildID,"",scenarioName,Integer.parseInt(location),executedScenario.getDeviceName());
}
public void notifyBuildStart() {
System.out.println("Notifyiing build start");
new BuildsClient().createNewBuild();
}
public void notifyBuildEnd() {
Build buildToUpdate = new BuildsClient().findBuildById(latestBuildID);
buildToUpdate.setBuildEndTime(new Date());
new BuildsClient().updateBuildRecord(buildToUpdate);
}
public void updateCrashes(SmartBOT bot, String exceptions, String activity) {
if (exceptions != null && exceptions.length() > 0) {
ObjectId latestScenario = (ObjectId) getLatestRecordFor(bot);
Document queryDocument = new Document(ID, latestScenario);
Document updateDocument = new Document(KEY_SCENARIO_ID, latestScenario)
.append(KEY_CRASHES_STACKTRACE, exceptions)
.append(KEY_CRASHES_ACTIVITY, activity);
mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_SCENARIOS).findOneAndUpdate(queryDocument, updateDocument);
}
}
public void updateBuildWithUniqueScenarios() {
List distinctScenarios = new ScenariosClient().getDistinctScenarios();
int numberOfUniqueScenarios = distinctScenarios.size();
int passedScenariosCount = distinctScenarios.stream().filter(scenario -> scenario.getStatus().equalsIgnoreCase(STATUS_PASSED)).collect(Collectors.toList()).size();
float pass_percentage = (passedScenariosCount*100.0f)/numberOfUniqueScenarios;
DecimalFormat df = new DecimalFormat("#.0");
String passRate = df.format(pass_percentage);
Build buildById = new BuildsClient().findBuildById(latestBuildID);
buildById.setScenariosCount(numberOfUniqueScenarios);
buildById.setScenarioSuccessRate(passRate);
new BuildsClient().updateBuildRecord(buildById);
}
public void updateScenarioTimeLine(SmartBOT smartBOT, List scenarioTimelines) {
ScenariosClient scenariosClient = new ScenariosClient();
Scenario scenario = getScenario(smartBOT, scenariosClient);
scenarioTimelines.forEach(scenarioTimeline -> {
if (scenarioTimeline.getScreenshotData() != null) {
String fileName = scenario.getId()+"_"+scenarioTimeline.getInterval();
scenarioTimeline.setScreenshotFileName(fileName);
Screenshot screenshot = new Screenshot();
screenshot.setFileName(fileName);
screenshot.setData(scenarioTimeline.getScreenshotData());
scenariosClient.loadScreenshot(screenshot);
}
});
scenario.setScenarioTimeline(new GsonBuilder().disableHtmlEscaping().create().toJson(scenarioTimelines));
new ScenariosClient().updateScenario(latestBuildID,scenario);
}
private Scenario getScenario(SmartBOT smartBOT, ScenariosClient scenariosClient) {
Scenario scenario = null;
if(isScenarioOutline(smartBOT)) {
scenario = scenariosClient.findRelevantScenario(latestBuildID, "",smartBOT.getTestCase().getName(), smartBOT.getTestCase().getLines().get(1),smartBOT.getDeviceUdid());
} else {
scenario = scenariosClient.findRelevantScenario(latestBuildID, "",smartBOT.getTestCase().getName(), smartBOT.getTestCase().getLines().get(0),smartBOT.getDeviceUdid());
}
return scenario;
}
public void createCrashCollection() {
//Get all unique device udid's
DistinctIterable deviceUdids = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_SCENARIOS)
.distinct("deviceUdid", new Document(KEY_BUILD_ID,getLatestBuild()),String.class);
List crashDataList = new ArrayList<>();
//for each udid try to get unique activities
StreamSupport.stream(deviceUdids.spliterator(),false).forEach(udid -> {
Map> stackTraceMap = new HashMap<>();
CrashData crashData = new CrashData();
crashData.setUdid(udid);
DistinctIterable documents = mongoClient.getDatabase(DATABASE_NAME)
.getCollection(COLLECTION_SCENARIOS)
.distinct("activity", new Document(KEY_SCENARIOS_DEVICE_UDID, udid).append(KEY_BUILD_ID,getLatestBuild()),String.class);
//For each activity on that build get all stacktraces and point it to the activity
StreamSupport.stream(documents.spliterator(),false).forEach(activity -> {
List stackTraceList = new ArrayList<>();
FindIterable stacktraces = mongoClient.getDatabase(DATABASE_NAME)
.getCollection(COLLECTION_SCENARIOS)
.find(new Document(KEY_BUILD_ID, getLatestBuild()).append(KEY_SCENARIOS_DEVICE_UDID, udid).append(KEY_CRASHES_ACTIVITY, activity));
StreamSupport.stream(stacktraces.spliterator(),false).forEach(stacktrace -> {
stackTraceList.add(stacktrace.getString(KEY_CRASHES_STACKTRACE));
});
stackTraceMap.put(activity,stackTraceList);
});
crashData.setActivityStacktraceMap(stackTraceMap);
crashDataList.add(crashData);
Object crashAnalyticsList = new GsonBuilder().disableHtmlEscaping().create().toJson(crashDataList);
mongoClient.getDatabase(DATABASE_NAME)
.getCollection(COLLECTION_BUILDS)
.findOneAndUpdate(new Document(ID,getLatestBuild()),new Document("crashlytics",crashAnalyticsList));
});
}
}