summaryrefslogtreecommitdiff
path: root/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java')
-rw-r--r--src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java502
1 files changed, 0 insertions, 502 deletions
diff --git a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
deleted file mode 100644
index 7fad9a2..0000000
--- a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * Licensed 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 com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.util.FilterUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.PropertyProjection;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-public class ShowGreenReleaseServlet extends BaseServlet {
- private static final int MAX_RUNS_PER_PAGE = 9999;
-
- /** Helper class for displaying each device build info on the green build page. */
- public class DeviceBuildInfo implements Comparable<DeviceBuildInfo>, Cloneable {
-
- /** Device model name ex) marlin, walleye */
- private String deviceBuildTarget;
- /** Candidate Build ID */
- private String candidateBuildId;
- /** Candidate Build ID Timestamp for url parameter */
- private Long candidateBuildIdTimestamp;
- /** Green Build ID */
- private String greenBuildId;
- /** Green Build ID Timestamp for url parameter */
- private Long greenBuildIdTimestamp;
-
- /**
- * Device Build Info constructor.
- *
- * @param deviceBuildTarget The key of the test.
- * @param candidateBuildId The number of tests failing.
- */
- public DeviceBuildInfo(String deviceBuildTarget, String candidateBuildId) {
- this.deviceBuildTarget = deviceBuildTarget;
- this.candidateBuildId = candidateBuildId;
- this.candidateBuildIdTimestamp = 0L;
- this.greenBuildId = "N/A";
- this.greenBuildIdTimestamp = 0L;
- }
-
- /**
- * Get the device name.
- *
- * @return The device name.
- */
- public String getDeviceBuildTarget() {
- return this.deviceBuildTarget;
- }
-
- /**
- * Get the candidate build ID.
- *
- * @return The candidate build ID.
- */
- public String getCandidateBuildId() {
- return this.candidateBuildId;
- }
-
- /** Set the candidate build ID. */
- public void setCandidateBuildId(String candidateBuildId) {
- this.candidateBuildId = candidateBuildId;
- }
-
- /**
- * Get the candidate build ID timestamp.
- *
- * @return The candidate build ID timestamp.
- */
- public Long getCandidateBuildIdTimestamp() {
- return this.candidateBuildIdTimestamp;
- }
-
- /** Set the candidate build ID timestamp. */
- public void setCandidateBuildIdTimestamp(Long candidateBuildIdTimestamp) {
- this.candidateBuildIdTimestamp = candidateBuildIdTimestamp;
- }
-
- /**
- * Get the green build ID.
- *
- * @return The green build ID.
- */
- public String getGreenBuildId() {
- return this.greenBuildId;
- }
-
- /** Set the green build ID. */
- public void setGreenBuildId(String greenBuildId) {
- this.greenBuildId = greenBuildId;
- }
-
- /**
- * Get the candidate build ID timestamp.
- *
- * @return The candidate build ID timestamp.
- */
- public Long getGreenBuildIdTimestamp() {
- return this.greenBuildIdTimestamp;
- }
-
- /** Set the candidate build ID timestamp. */
- public void setGreenBuildIdTimestamp(Long greenBuildIdTimestamp) {
- this.greenBuildIdTimestamp = greenBuildIdTimestamp;
- }
-
- @Override
- public int compareTo(DeviceBuildInfo deviceBuildInfo) {
- return this.deviceBuildTarget.compareTo(deviceBuildInfo.getDeviceBuildTarget());
- }
-
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
-
- @Override
- public PageType getNavParentType() {
- return PageType.RELEASE;
- }
-
- @Override
- public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
- List<Page> links = new ArrayList<>();
- String planName = request.getParameter("plan");
- links.add(new Page(PageType.PLAN_RELEASE, planName, "?plan=" + planName));
- return links;
- }
-
- // This function will build and return basic parameter HashMap based on parameter information
- // and
- // this value will also be used on green build page to show the basic structure.
- private Map<String, List<DeviceBuildInfo>> getBasicParamMap(Map<String, List<String>> param) {
- Map<String, List<DeviceBuildInfo>> basicParamMap = new HashMap<>();
- param.forEach(
- (branch, buildTargetList) -> {
- List<DeviceBuildInfo> deviceBuildTargetList = new ArrayList<>();
- buildTargetList.forEach(
- buildTargetName -> {
- deviceBuildTargetList.add(
- new DeviceBuildInfo(buildTargetName, "N/A"));
- });
- basicParamMap.put(branch, deviceBuildTargetList);
- });
- return basicParamMap;
- }
-
- @Override
- public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
-
- String testType =
- request.getParameter("type") == null ? "plan" : request.getParameter("type");
-
- RequestDispatcher dispatcher;
- if (testType.equalsIgnoreCase("plan")) {
- dispatcher = this.getTestPlanDispatcher(request, response);
- } else {
- dispatcher = this.getTestSuiteDispatcher(request, response);
- }
-
- try {
- request.setAttribute("testType", testType);
- response.setStatus(HttpServletResponse.SC_OK);
- dispatcher.forward(request, response);
- } catch (ServletException e) {
- logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
- }
- }
-
- private RequestDispatcher getTestPlanDispatcher(
- HttpServletRequest request, HttpServletResponse response) {
- String GREEN_RELEASE_JSP = "WEB-INF/jsp/show_green_plan_release.jsp";
-
- String testPlan = request.getParameter("plan");
-
- Calendar cal = Calendar.getInstance();
- cal.add(Calendar.DATE, -7);
- Long startTime = cal.getTime().getTime() * 1000;
- Long endTime = Calendar.getInstance().getTime().getTime() * 1000;
-
- DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
- Query deviceInfoQuery =
- new Query(DeviceInfoEntity.KIND)
- .setAncestor(KeyFactory.createKey(TestPlanEntity.KIND, testPlan))
- .addProjection(
- new PropertyProjection(DeviceInfoEntity.BRANCH, String.class))
- .addProjection(
- new PropertyProjection(DeviceInfoEntity.BUILD_FLAVOR, String.class))
- .setDistinct(true);
-
- Map<String, List<String>> paramInfoMap = new HashMap<>();
- for (Entity entity : datastore.prepare(deviceInfoQuery).asIterable()) {
- String branch = entity.getProperty(DeviceInfoEntity.BRANCH).toString();
- String target = entity.getProperty(DeviceInfoEntity.BUILD_FLAVOR).toString();
- if (paramInfoMap.containsKey(branch)) {
- paramInfoMap.get(branch).add(target);
- } else {
- paramInfoMap.put(branch, new LinkedList<>(Arrays.asList(target)));
- }
- }
-
- Map<String, List<DeviceBuildInfo>> baseParamMap = getBasicParamMap(paramInfoMap);
- baseParamMap.forEach(
- (branchKey, deviceBuildInfoList) -> {
- List<List<String>> allPassIdLists = new ArrayList<>();
- Map<String, List<TestPlanRunEntity>> allTestPlanRunEntityMap = new HashMap<>();
- deviceBuildInfoList.forEach(
- deviceBuildInfo -> {
- Map<String, String[]> paramMap =
- new HashMap<String, String[]>() {
- {
- put("branch", new String[] {branchKey});
- put(
- "device",
- new String[] {
- deviceBuildInfo.getDeviceBuildTarget()
- });
- }
- };
-
- SortDirection dir = SortDirection.DESCENDING;
-
- boolean unfiltered = false;
- boolean showPresubmit = false;
- boolean showPostsubmit = true;
- Filter typeFilter =
- FilterUtil.getTestTypeFilter(
- showPresubmit, showPostsubmit, unfiltered);
- Key testPlanKey =
- KeyFactory.createKey(TestPlanEntity.KIND, testPlan);
- Filter testPlanRunFilter =
- FilterUtil.getTimeFilter(
- testPlanKey,
- TestPlanRunEntity.KIND,
- startTime,
- endTime,
- typeFilter);
-
- List<Filter> userTestFilters =
- FilterUtil.getUserTestFilters(paramMap);
- userTestFilters.add(0, testPlanRunFilter);
- Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(paramMap);
-
- List<Key> matchingKeyList =
- FilterUtil.getMatchingKeys(
- testPlanKey,
- TestPlanRunEntity.KIND,
- userTestFilters,
- userDeviceFilter,
- dir,
- MAX_RUNS_PER_PAGE);
-
- logger.log(
- Level.INFO,
- "the number of matching key => " + matchingKeyList.size());
- if (matchingKeyList.size() > 0) {
- Map<Key, Entity> entityMap = datastore.get(matchingKeyList);
-
- List<TestPlanRunEntity> testPlanRunEntityList =
- entityMap
- .values()
- .stream()
- .map(
- entity ->
- TestPlanRunEntity.fromEntity(
- entity))
- .collect(Collectors.toList());
-
- allTestPlanRunEntityMap.put(
- branchKey
- + "-"
- + deviceBuildInfo.getDeviceBuildTarget(),
- testPlanRunEntityList);
-
- // The passBuildIdList containing all passed buildId List for
- // device
- List<String> passBuildIdList =
- testPlanRunEntityList
- .stream()
- .filter(entity -> entity.getFailCount() == 0L)
- .map(entity -> entity.getTestBuildId())
- .collect(Collectors.toList());
- allPassIdLists.add(passBuildIdList);
- logger.log(Level.INFO, "passBuildIdList => " + passBuildIdList);
-
- // The logic for candidate build ID is starting from here
- Comparator<TestPlanRunEntity> byPassing =
- Comparator.comparingLong(
- elemFirst -> elemFirst.getPassCount());
-
- Comparator<TestPlanRunEntity> byNonPassing =
- Comparator.comparingLong(
- elemFirst -> elemFirst.getFailCount());
-
- // This will get the TestPlanRunEntity having maximum number of
- // passing and minimum number of fail
- Optional<TestPlanRunEntity> testPlanRunEntity =
- testPlanRunEntityList
- .stream()
- .sorted(
- byPassing
- .reversed()
- .thenComparing(byNonPassing))
- .findFirst();
-
- String buildId =
- testPlanRunEntity
- .map(entity -> entity.getTestBuildId())
- .orElse("");
- deviceBuildInfo.setCandidateBuildId(buildId);
- Long buildIdTimestamp =
- testPlanRunEntity
- .map(
- entity -> {
- return entity.getStartTimestamp();
- })
- .orElse(0L);
- deviceBuildInfo.setCandidateBuildIdTimestamp(buildIdTimestamp);
- } else {
- allPassIdLists.add(new ArrayList<>());
- deviceBuildInfo.setCandidateBuildId("No Test Results");
- }
- });
- Set<String> greenBuildIdList = FilterUtil.getCommonElements(allPassIdLists);
- if (greenBuildIdList.size() > 0) {
- String greenBuildId = greenBuildIdList.iterator().next();
- deviceBuildInfoList.forEach(
- deviceBuildInfo -> {
- // This is to get the timestamp for greenBuildId
- Optional<TestPlanRunEntity> testPlanRunEntity =
- allTestPlanRunEntityMap
- .get(
- branchKey
- + "-"
- + deviceBuildInfo
- .getDeviceBuildTarget())
- .stream()
- .filter(
- entity ->
- entity.getFailCount() == 0L
- && entity.getTestBuildId()
- .equalsIgnoreCase(
- greenBuildId))
- .findFirst();
- // Setting the greenBuildId value and timestamp to
- // deviceBuildInfo object
- deviceBuildInfo.setGreenBuildId(greenBuildId);
- Long buildIdTimestamp =
- testPlanRunEntity
- .map(entity -> entity.getStartTimestamp())
- .orElse(0L);
- deviceBuildInfo.setGreenBuildIdTimestamp(buildIdTimestamp);
- });
- }
- });
-
- request.setAttribute("plan", request.getParameter("plan"));
- request.setAttribute("greenBuildInfo", baseParamMap);
- RequestDispatcher dispatcher = request.getRequestDispatcher(GREEN_RELEASE_JSP);
- return dispatcher;
- }
-
- private RequestDispatcher getTestSuiteDispatcher(
- HttpServletRequest request, HttpServletResponse response) {
- String GREEN_RELEASE_JSP = "WEB-INF/jsp/show_green_suite_release.jsp";
-
- String testPlan = request.getParameter("plan");
-
- List<TestSuiteResultEntity> branchTargetInfoList =
- ofy().load()
- .type(TestSuiteResultEntity.class)
- .filter("suitePlan", testPlan)
- .project("branch")
- .distinct(true)
- .project("target")
- .distinct(true)
- .list();
-
- Map<String, List<String>> paramInfoMap = new HashMap<>();
- for (TestSuiteResultEntity testSuiteResultEntity : branchTargetInfoList) {
- String branch = testSuiteResultEntity.getBranch();
- String target = testSuiteResultEntity.getTarget();
- if (paramInfoMap.containsKey(branch)) {
- paramInfoMap.get(branch).add(target);
- } else {
- paramInfoMap.put(branch, new LinkedList<>(Arrays.asList(target)));
- }
- }
-
- Calendar cal = Calendar.getInstance();
- cal.add(Calendar.DATE, -7);
- Long oneWeekAgoTimestamp = cal.getTime().getTime() * 1000;
-
- Map<String, List<DeviceBuildInfo>> baseParamMap = getBasicParamMap(paramInfoMap);
- baseParamMap.forEach(
- (branchKey, deviceBuildInfoList) -> {
- List<List<String>> allPassIdLists = new ArrayList<>();
-
- deviceBuildInfoList.forEach(
- deviceBuildInfo -> {
- List<String> passBuildIdList =
- ofy().load()
- .type(TestSuiteResultEntity.class)
- .filter("suitePlan", testPlan)
- .filter("branch", branchKey)
- .filter(
- "target",
- deviceBuildInfo.getDeviceBuildTarget())
- .filter("failedTestCaseCount", 0)
- .filterKey(
- ">=",
- com.googlecode.objectify.Key.create(
- TestSuiteResultEntity.class,
- oneWeekAgoTimestamp))
- .project("buildId")
- .list()
- .stream()
- .map(entity -> entity.getBuildId())
- .collect(Collectors.toList());
- allPassIdLists.add(passBuildIdList);
-
- TestSuiteResultEntity candidateIdEntity =
- ofy().load()
- .type(TestSuiteResultEntity.class)
- .filter("suitePlan", testPlan)
- .filter("branch", branchKey)
- .filter(
- "target",
- deviceBuildInfo.getDeviceBuildTarget())
- .filterKey(
- ">=",
- com.googlecode.objectify.Key.create(
- TestSuiteResultEntity.class,
- oneWeekAgoTimestamp))
- .project("buildId")
- .order("__key__")
- .order("-passedTestCaseRatio")
- .first()
- .now();
- if (candidateIdEntity == null) {
- deviceBuildInfo.setCandidateBuildId("N/A");
- } else {
- deviceBuildInfo.setCandidateBuildId(
- candidateIdEntity.getBuildId());
- }
- });
- });
-
- request.setAttribute("plan", request.getParameter("plan"));
- request.setAttribute("greenBuildInfo", baseParamMap);
- RequestDispatcher dispatcher = request.getRequestDispatcher(GREEN_RELEASE_JSP);
- return dispatcher;
- }
-}