summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-03-27 06:54:17 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-03-27 06:54:17 +0000
commit9526d652e75d6aeb498ad5f3272e426c2b8d01a0 (patch)
treec73e3a2130025297f62924dba914cd622c97bd86 /src
parent6d1ab6db5ba7b4f1d18d87548fceae4012542c53 (diff)
parentbad18d984ff5cf173daa4d4888fae7674c95b6b0 (diff)
downloaddashboard-9526d652e75d6aeb498ad5f3272e426c2b8d01a0.tar.gz
Merge "New Test Suite Page for test suite data."
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/android/vts/config/ObjectifyListener.java16
-rw-r--r--src/main/java/com/android/vts/config/ObjectifyWebFilter.java4
-rw-r--r--src/main/java/com/android/vts/entity/TestLogSummaryEntity.java91
-rw-r--r--src/main/java/com/android/vts/entity/TestSuiteResultEntity.java131
-rw-r--r--src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java92
-rw-r--r--src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java76
-rw-r--r--src/main/java/com/android/vts/servlet/ShowReleaseServlet.java66
-rw-r--r--src/main/java/com/android/vts/util/DatastoreHelper.java4
-rw-r--r--src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp (renamed from src/main/webapp/WEB-INF/jsp/show_green_release.jsp)9
-rw-r--r--src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp75
-rw-r--r--src/main/webapp/WEB-INF/jsp/show_release.jsp29
-rw-r--r--src/main/webapp/WEB-INF/jsp/show_suite_release.jsp64
-rw-r--r--src/main/webapp/WEB-INF/web.xml35
13 files changed, 503 insertions, 189 deletions
diff --git a/src/main/java/com/android/vts/config/ObjectifyListener.java b/src/main/java/com/android/vts/config/ObjectifyListener.java
index 8857764..cee9dd1 100644
--- a/src/main/java/com/android/vts/config/ObjectifyListener.java
+++ b/src/main/java/com/android/vts/config/ObjectifyListener.java
@@ -16,18 +16,18 @@
package com.android.vts.config;
-import com.android.vts.entity.TestLogSummaryEntity;
+import com.android.vts.entity.TestSuiteResultEntity;
+import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
-import javax.servlet.annotation.WebListener;
import java.util.logging.Level;
import java.util.logging.Logger;
/** The @WebListener annotation for registering a class as a listener of a web application. */
-@WebListener
+// @WebListener
/**
* Initializing Objectify Service at the container start up before any web components like servlet
* get initialized.
@@ -36,13 +36,15 @@ public class ObjectifyListener implements ServletContextListener {
private static final Logger logger = Logger.getLogger(ObjectifyListener.class.getName());
- /** Receives notification that the web application initialization process is starting.
- * This function will register Entity classes for objectify.
+ /**
+ * Receives notification that the web application initialization process is starting. This
+ * function will register Entity classes for objectify.
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
- ObjectifyService.init();
- ObjectifyService.register(TestLogSummaryEntity.class);
+ ObjectifyFactory objectifyFactory = ObjectifyService.factory();
+ objectifyFactory.register(TestSuiteResultEntity.class);
+ objectifyFactory.begin();
logger.log(Level.INFO, "Value Initialized from context.");
}
diff --git a/src/main/java/com/android/vts/config/ObjectifyWebFilter.java b/src/main/java/com/android/vts/config/ObjectifyWebFilter.java
index 3813d0b..d008291 100644
--- a/src/main/java/com/android/vts/config/ObjectifyWebFilter.java
+++ b/src/main/java/com/android/vts/config/ObjectifyWebFilter.java
@@ -18,10 +18,8 @@ package com.android.vts.config;
import com.googlecode.objectify.ObjectifyFilter;
-import javax.servlet.annotation.WebFilter;
-
/** Annotation used to declare a servlet filter. */
-@WebFilter(urlPatterns = {"/*"})
+// @WebFilter(urlPatterns = {"/*"})
/**
* Servlet filter for objectify library. Objectify requires a filter to clean up any thread-local
* transaction contexts and pending asynchronous operations that remain at the end of a request.
diff --git a/src/main/java/com/android/vts/entity/TestLogSummaryEntity.java b/src/main/java/com/android/vts/entity/TestLogSummaryEntity.java
deleted file mode 100644
index 787295c..0000000
--- a/src/main/java/com/android/vts/entity/TestLogSummaryEntity.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * 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.entity;
-
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.Date;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Entity Class for saving Test Log Summary */
-@Cache
-@Entity
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-public class TestLogSummaryEntity {
-
- /** Test Log Summary id */
- @Id Long id;
-
- /** Test Log Summary branch information */
- @Index @Getter @Setter String branch;
-
- /** Test Log Summary build target information */
- @Index @Getter @Setter String target;
-
- /** Test Log Summary build ID information */
- @Index @Getter @Setter String build_id;
-
- /** Test Log Summary system finrgerprint information */
- @Getter @Setter String system_fingerprint;
-
- /** Test Log Summary vendor fingerprint information */
- @Getter @Setter String vendor_fingerprint;
-
- /** Test Log Summary test count for success information */
- @Index @Getter @Setter int pass;
-
- /** Test Log Summary test count for failure information */
- @Index @Getter @Setter int fail;
-
- /** When this record was created or updated */
- @Index @Getter Date updated;
-
- /** Construction function for TestLogSummaryEntity Class */
- public TestLogSummaryEntity(
- Long id,
- String branch,
- String target,
- String build_id,
- String system_fingerprint,
- String vendor_fingerprint,
- int pass,
- int fail) {
- this.id = id;
- this.branch = branch;
- this.target = target;
- this.build_id = build_id;
- this.system_fingerprint = system_fingerprint;
- this.vendor_fingerprint = vendor_fingerprint;
- this.pass = pass;
- this.fail = fail;
- }
-
- /** Saving function for the instance of this class */
- private void save() {
- this.updated = new Date();
- ofy().defer().save().entity(this);
- }
-}
diff --git a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java
new file mode 100644
index 0000000..9a2dd48
--- /dev/null
+++ b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * 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.entity;
+
+import com.googlecode.objectify.annotation.Cache;
+import com.googlecode.objectify.annotation.Entity;
+import com.googlecode.objectify.annotation.Id;
+import com.googlecode.objectify.annotation.Index;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+import static com.googlecode.objectify.ObjectifyService.ofy;
+
+/** Entity Class for saving Test Log Summary */
+@Cache
+@Entity
+@EqualsAndHashCode(of = "id")
+@NoArgsConstructor
+public class TestSuiteResultEntity {
+
+ /** Test Suite start time field */
+ @Id Long startTime;
+
+ /** Test Suite end time field */
+ @Getter @Setter Long endTime;
+
+ /** Test Suite about field */
+ @Getter @Setter String about;
+
+ /** Test Suite suite plan field */
+ @Index @Getter @Setter String suitePlan;
+
+ /** Test Suite suite version field */
+ @Getter @Setter String suiteVersion;
+
+ /** Test Suite suite build number field */
+ @Getter @Setter String suiteBuildNumber;
+
+ /** Test Suite test finished module count field */
+ @Getter @Setter int modulesDone;
+
+ /** Test Suite total number of module field */
+ @Getter @Setter int modulesTotal;
+
+ /** Test Suite branch field */
+ @Index @Getter @Setter String branch;
+
+ /** Test Suite build target field */
+ @Index @Getter @Setter String target;
+
+ /** Test Suite build ID field */
+ @Index @Getter @Setter String buildId;
+
+ /** Test Suite system fingerprint field */
+ @Getter @Setter String buildSystemFingerprint;
+
+ /** Test Suite vendor fingerprint field */
+ @Getter @Setter String buildVendorFingerprint;
+
+ /** Test Suite test count for success field */
+ @Index @Getter @Setter int passedTestCaseCount;
+
+ /** Test Suite test count for failure field */
+ @Index @Getter @Setter int failedTestCaseCount;
+
+ /** When this record was created or updated */
+ @Index @Getter Date updated;
+
+ /** Construction function for TestSuiteResultEntity Class */
+ public TestSuiteResultEntity(
+ Long startTime,
+ Long endTime,
+ String about,
+ String suitePlan,
+ String suiteVersion,
+ String suiteBuildNumber,
+ int modulesDone,
+ int modulesTotal,
+ String branch,
+ String target,
+ String buildId,
+ String buildSystemFingerprint,
+ String buildVendorFingerprint,
+ int passedTestCaseCount,
+ int failedTestCaseCount) {
+ this.startTime = startTime;
+ this.endTime = endTime;
+ this.about = about;
+ this.suitePlan = suitePlan;
+ this.suiteVersion = suiteVersion;
+ this.suiteBuildNumber = suiteBuildNumber;
+ this.modulesDone = modulesDone;
+ this.modulesTotal = modulesTotal;
+ this.branch = branch;
+ this.target = target;
+ this.buildId = buildId;
+ this.buildSystemFingerprint = buildSystemFingerprint;
+ this.buildVendorFingerprint = buildVendorFingerprint;
+ this.passedTestCaseCount = passedTestCaseCount;
+ this.failedTestCaseCount = failedTestCaseCount;
+ }
+
+ /** Saving function for the instance of this class */
+ public void save() {
+ this.updated = new Date();
+ ofy().defer().save().entity(this);
+ }
+
+ public List<? extends TestSuiteResultEntity> getTestSuitePlans() {
+ return ofy().load().type(this.getClass()).project("suitePlan").distinct(true).list();
+ }
+}
diff --git a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
index 9564ed2..c719947 100644
--- a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
+++ b/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
@@ -18,33 +18,24 @@ package com.android.vts.servlet;
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.*;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.SortDirection;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.HashMap;
-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 javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+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 String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_green_release.jsp";
private static final int MAX_RUNS_PER_PAGE = 9999;
/** Helper class for displaying each device build info on the green build page. */
@@ -185,6 +176,30 @@ public class ShowGreenReleaseServlet extends BaseServlet {
@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";
+
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Map<String, List<String>> paramInfoMap =
@@ -219,7 +234,7 @@ public class ShowGreenReleaseServlet extends BaseServlet {
put(
"device",
new String[] {
- deviceBuildInfo.getDeviceBuildTarget()
+ deviceBuildInfo.getDeviceBuildTarget()
});
}
};
@@ -283,11 +298,14 @@ public class ShowGreenReleaseServlet extends BaseServlet {
+ deviceBuildInfo.getDeviceBuildTarget(),
testPlanRunEntityList);
- // The passBuildIdList containing all passed buildId List for device
- List<String> passBuildIdList = testPlanRunEntityList.stream()
- .filter(entity -> entity.failCount == 0L)
- .map(entity -> entity.testBuildId)
- .collect(Collectors.toList());
+ // The passBuildIdList containing all passed buildId List for
+ // device
+ List<String> passBuildIdList =
+ testPlanRunEntityList
+ .stream()
+ .filter(entity -> entity.failCount == 0L)
+ .map(entity -> entity.testBuildId)
+ .collect(Collectors.toList());
allPassIdLists.add(passBuildIdList);
logger.log(Level.INFO, "passBuildIdList => " + passBuildIdList);
@@ -341,7 +359,7 @@ public class ShowGreenReleaseServlet extends BaseServlet {
branchKey
+ "-"
+ deviceBuildInfo
- .getDeviceBuildTarget())
+ .getDeviceBuildTarget())
.stream()
.filter(
entity ->
@@ -361,14 +379,24 @@ public class ShowGreenReleaseServlet extends BaseServlet {
}
});
+
request.setAttribute("plan", request.getParameter("plan"));
request.setAttribute("greenBuildInfo", baseParamMap);
- response.setStatus(HttpServletResponse.SC_OK);
- RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
- try {
- dispatcher.forward(request, response);
- } catch (ServletException e) {
- logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
- }
+ 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> testSuiteResultEntityList =
+ ofy().load().type(TestSuiteResultEntity.class).filter("suitePlan", testPlan).list();
+
+ request.setAttribute("testSuiteResultEntityList", testSuiteResultEntityList);
+ RequestDispatcher dispatcher = request.getRequestDispatcher(GREEN_RELEASE_JSP);
+ return dispatcher;
}
}
diff --git a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
index 357ef27..1cdfcc3 100644
--- a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
+++ b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
@@ -19,36 +19,28 @@ 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.DatastoreHelper;
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.Query;
+import com.google.appengine.api.datastore.*;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
+import org.apache.commons.lang.StringUtils;
+
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+
+import static com.googlecode.objectify.ObjectifyService.ofy;
public class ShowPlanReleaseServlet extends BaseServlet {
- private static final String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_plan_release.jsp";
private static final int MAX_RUNS_PER_PAGE = 90;
@Override
@@ -99,7 +91,31 @@ public class ShowPlanReleaseServlet extends BaseServlet {
@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 Excpetion caught : ", e);
+ }
+ }
+
+ private RequestDispatcher getTestPlanDispatcher(
+ HttpServletRequest request, HttpServletResponse response) {
+ String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_plan_release.jsp";
+
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
+
Long startTime = null; // time in microseconds
Long endTime = null; // time in microseconds
if (request.getParameter("startTime") != null) {
@@ -144,8 +160,7 @@ public class ShowPlanReleaseServlet extends BaseServlet {
FilterUtil.getTimeFilter(
testPlanKey, TestPlanRunEntity.KIND, startTime, endTime, typeFilter);
Map<String, String[]> parameterMap = request.getParameterMap();
- List<Filter> userTestFilters =
- FilterUtil.getUserTestFilters(parameterMap);
+ List<Filter> userTestFilters = FilterUtil.getUserTestFilters(parameterMap);
userTestFilters.add(0, testPlanRunFilter);
Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(parameterMap);
@@ -247,12 +262,23 @@ public class ShowPlanReleaseServlet extends BaseServlet {
request.setAttribute("endTime", new Gson().toJson(endTime));
request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
- response.setStatus(HttpServletResponse.SC_OK);
+
RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
- try {
- dispatcher.forward(request, response);
- } catch (ServletException e) {
- logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
- }
+ return dispatcher;
+ }
+
+ private RequestDispatcher getTestSuiteDispatcher(
+ HttpServletRequest request, HttpServletResponse response) {
+ String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_suite_release.jsp";
+
+ String testPlan = request.getParameter("plan");
+
+ List<TestSuiteResultEntity> testSuiteResultEntityList =
+ ofy().load().type(TestSuiteResultEntity.class).filter("suitePlan", testPlan).list();
+
+ request.setAttribute("plan", request.getParameter("plan"));
+ request.setAttribute("testSuiteResultEntityList", testSuiteResultEntityList);
+ RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
+ return dispatcher;
}
}
diff --git a/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java
index d631161..648beb8 100644
--- a/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java
+++ b/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java
@@ -17,12 +17,17 @@
package com.android.vts.servlet;
import com.android.vts.entity.TestPlanEntity;
+import com.android.vts.entity.TestSuiteResultEntity;
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.Query;
import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
+
+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.ArrayList;
import java.util.Comparator;
@@ -30,14 +35,12 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import java.util.stream.Collectors;
+
+import static com.googlecode.objectify.ObjectifyService.ofy;
/** Represents the servlet that is invoked on loading the release page. */
public class ShowReleaseServlet extends BaseServlet {
- private static final String RELEASE_JSP = "WEB-INF/jsp/show_release.jsp";
@Override
public PageType getNavParentType() {
@@ -52,6 +55,28 @@ public class ShowReleaseServlet extends BaseServlet {
@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 Excpetion caught : ", e);
+ }
+ }
+
+ private RequestDispatcher getTestPlanDispatcher(
+ HttpServletRequest request, HttpServletResponse response) {
+ String RELEASE_JSP = "WEB-INF/jsp/show_release.jsp";
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Set<String> planSet = new HashSet<>();
@@ -64,14 +89,31 @@ public class ShowReleaseServlet extends BaseServlet {
List<String> plans = new ArrayList<>(planSet);
plans.sort(Comparator.naturalOrder());
- response.setStatus(HttpServletResponse.SC_OK);
request.setAttribute("isAdmin", UserServiceFactory.getUserService().isUserAdmin());
request.setAttribute("planNames", plans);
RequestDispatcher dispatcher = request.getRequestDispatcher(RELEASE_JSP);
- try {
- dispatcher.forward(request, response);
- } catch (ServletException e) {
- logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
- }
+ return dispatcher;
+ }
+
+ private RequestDispatcher getTestSuiteDispatcher(
+ HttpServletRequest request, HttpServletResponse response) {
+ String RELEASE_JSP = "WEB-INF/jsp/show_release.jsp";
+
+ List<TestSuiteResultEntity> suiteResultEntityList =
+ ofy().load()
+ .type(TestSuiteResultEntity.class)
+ .project("suitePlan")
+ .distinct(true)
+ .list();
+
+ List<String> plans =
+ suiteResultEntityList
+ .stream()
+ .map(suiteEntity -> suiteEntity.getSuitePlan())
+ .collect(Collectors.toList());
+ request.setAttribute("isAdmin", UserServiceFactory.getUserService().isUserAdmin());
+ request.setAttribute("planNames", plans);
+ RequestDispatcher dispatcher = request.getRequestDispatcher(RELEASE_JSP);
+ return dispatcher;
}
}
diff --git a/src/main/java/com/android/vts/util/DatastoreHelper.java b/src/main/java/com/android/vts/util/DatastoreHelper.java
index 6d71b02..364ed04 100644
--- a/src/main/java/com/android/vts/util/DatastoreHelper.java
+++ b/src/main/java/com/android/vts/util/DatastoreHelper.java
@@ -96,7 +96,7 @@ public class DatastoreHelper {
* @return boolean True if there are newer data points.
* @throws IOException
*/
- public static boolean hasNewer(Key parentKey, String kind, Long lowerBound) throws IOException {
+ public static boolean hasNewer(Key parentKey, String kind, Long lowerBound) {
if (lowerBound == null || lowerBound <= 0) return false;
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key startKey = KeyFactory.createKey(parentKey, kind, lowerBound);
@@ -116,7 +116,7 @@ public class DatastoreHelper {
* @return boolean True if there are older data points.
* @throws IOException
*/
- public static boolean hasOlder(Key parentKey, String kind, Long upperBound) throws IOException {
+ public static boolean hasOlder(Key parentKey, String kind, Long upperBound) {
if (upperBound == null || upperBound <= 0) return false;
Key endKey = KeyFactory.createKey(parentKey, kind, upperBound);
Filter endFilter =
diff --git a/src/main/webapp/WEB-INF/jsp/show_green_release.jsp b/src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp
index 0355f53..1bb00dd 100644
--- a/src/main/webapp/WEB-INF/jsp/show_green_release.jsp
+++ b/src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp
@@ -27,7 +27,6 @@
<script src='js/plan_runs.js'></script>
<script src='js/search_header.js'></script>
<script type='text/javascript'>
- var search;
$(document).ready(function() {
});
@@ -35,7 +34,12 @@
<body>
<div class='wide container'>
- <div class='row' id='release-container'>
+ <div class="row">
+ <div class="col s12">
+ <h4 id="test-plan-section-header">Test Plans</h4>
+ </div>
+ </div>
+ <div class='row' id='test-plan-green-release-container'>
<table class="bordered highlight">
<thead>
<tr>
@@ -93,6 +97,7 @@
</tbody>
</table>
</div>
+
</div>
<%@ include file="footer.jsp" %>
</body>
diff --git a/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp
new file mode 100644
index 0000000..b1214cb
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp
@@ -0,0 +1,75 @@
+<%--
+ ~ 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.
+ --%>
+<%@ page contentType='text/html;charset=UTF-8' language='java' %>
+<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
+<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
+
+<html>
+ <%@ include file="header.jsp" %>
+ <link rel='stylesheet' href='/css/show_plan_release.css'>
+ <link rel='stylesheet' href='/css/plan_runs.css'>
+ <link rel='stylesheet' href='/css/search_header.css'>
+ <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
+ <script src='js/time.js'></script>
+ <script src='js/plan_runs.js'></script>
+ <script src='js/search_header.js'></script>
+ <script type='text/javascript'>
+ $(document).ready(function() {
+
+ });
+ </script>
+
+ <body>
+ <div class='wide container'>
+ <div class="row">
+ <div class="col s12">
+ <h4 id="test-suite-section-header">Test Suites</h4>
+ </div>
+ </div>
+
+ <div class='row' id='test-suite-green-release-container'>
+ <div class="col s12">
+ <table class="bordered highlight">
+ <thead>
+ <tr>
+ <th>Branch</th>
+ <th>Target</th>
+ <th>Build ID</th>
+ <th>Suite Plan</th>
+ <th>System Fingerprint</th>
+ <th>Vendor Fingerprint</th>
+ </tr>
+ </thead>
+ <tbody>
+ <c:forEach var="testSuiteResultEntity" items="${testSuiteResultEntityList}">
+ <tr>
+ <td><c:out value="${testSuiteResultEntity.branch}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.target}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildId}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.suitePlan}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildSystemFingerprint}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildVendorFingerprint}"></c:out></td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ </div>
+ <%@ include file="footer.jsp" %>
+ </body>
+</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_release.jsp b/src/main/webapp/WEB-INF/jsp/show_release.jsp
index 99aec7f..b7dd01d 100644
--- a/src/main/webapp/WEB-INF/jsp/show_release.jsp
+++ b/src/main/webapp/WEB-INF/jsp/show_release.jsp
@@ -20,32 +20,51 @@
<html>
<link rel='stylesheet' href='/css/show_release.css'>
<%@ include file='header.jsp' %>
- <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js'></script>
+ <script type='text/javascript'>
+ $(document).ready(function() {
+ $("li.tab").each(function( index ) {
+ $(this).click(function() {
+ window.open($(this).children().attr("href"), '_self');
+ });
+ });
+ });
+ </script>
<body>
<div class='container'>
<div class='row'>
<div class='col s12'>
- <h4 id='section-header'>Test Plans</h4>
+
+ <ul class="tabs">
+ <li class="tab col s6" id="planTabLink">
+ <a class="${testType == 'plan' ? 'active' : 'inactive'}" href="${requestScope['javax.servlet.forward.servlet_path']}?type=plan"><h5>Test Plans</h5></a>
+ </li>
+ <li class="tab col s6" id="suiteTabLink">
+ <a class="${testType == 'suite' ? 'active' : 'inactive'}" href="${requestScope['javax.servlet.forward.servlet_path']}?type=suite"><h5>Suite Test Plans</h5></a>
+ </li>
+ </ul>
+
</div>
</div>
<div class='row' id='options'>
+ <c:set var="typeParam" scope="session" value="${testType == 'suite' ? '&type=suite' : '&type=plan'}"/>
+
<c:forEach items='${planNames}' var='plan'>
<c:choose>
<c:when test="${isAdmin}">
<div class="col s11 center">
- <a href='/show_plan_release?plan=${plan}'>
+ <a href='/show_plan_release?plan=${plan}${typeParam}'>
<div class='col s12 card hoverable option valign-wrapper waves-effect'>
<span class='entry valign'>${plan}</span>
</div>
</a>
</div>
<div class="col s1 center btn-container" style="margin-top: 9px;">
- <a href='/show_green_release?plan=${plan}' class="waves-effect waves-light btn">Green</a>
+ <a href='/show_green_release?plan=${plan}${typeParam}' class="waves-effect waves-light btn">Green</a>
</div>
</c:when>
<c:otherwise>
<div class="col s12 center">
- <a href='/show_plan_release?plan=${plan}'>
+ <a href='/show_plan_release?plan=${plan}${typeParam}'>
<div class='col s12 card hoverable option valign-wrapper waves-effect'>
<span class='entry valign'>${plan}</span>
</div>
diff --git a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp
new file mode 100644
index 0000000..5cb5fca
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp
@@ -0,0 +1,64 @@
+<%--
+ ~ 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.
+ --%>
+<%@ page contentType='text/html;charset=UTF-8' language='java' %>
+<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
+<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
+
+<html>
+ <link rel='stylesheet' href='/css/show_release.css'>
+ <%@ include file='header.jsp' %>
+ <body>
+ <div class='container'>
+
+ <div class="row">
+ <div class="col s12">
+ <h4 id="test-suite-section-header">Test Suites</h4>
+ </div>
+ </div>
+
+ <div class='row' id='test-suite-green-release-container'>
+ <div class="col s12">
+ <table class="bordered highlight">
+ <thead>
+ <tr>
+ <th>Branch</th>
+ <th>Target</th>
+ <th>Build ID</th>
+ <th>Suite Plan</th>
+ <th>System Fingerprint</th>
+ <th>Vendor Fingerprint</th>
+ </tr>
+ </thead>
+ <tbody>
+ <c:forEach var="testSuiteResultEntity" items="${testSuiteResultEntityList}">
+ <tr>
+ <td><c:out value="${testSuiteResultEntity.branch}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.target}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildId}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.suitePlan}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildSystemFingerprint}"></c:out></td>
+ <td><c:out value="${testSuiteResultEntity.buildVendorFingerprint}"></c:out></td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ </div>
+ <%@ include file='footer.jsp' %>
+ </body>
+</html>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 4c13bd7..a63f3ad 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -15,6 +15,21 @@ Copyright 2016 Google Inc. All Rights Reserved.
limitations under the License.
-->
+<listener>
+ <listener-class>
+ com.android.vts.config.ObjectifyListener
+ </listener-class>
+</listener>
+
+<filter>
+ <filter-name>ObjectifyFilter</filter-name>
+ <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
+</filter>
+<filter-mapping>
+ <filter-name>ObjectifyFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+</filter-mapping>
+
<servlet>
<servlet-name>dashboard_main</servlet-name>
<servlet-class>com.android.vts.servlet.DashboardMainServlet</servlet-class>
@@ -91,27 +106,27 @@ Copyright 2016 Google Inc. All Rights Reserved.
</servlet>
<servlet>
- <servlet-name>test_data</servlet-name>
+ <servlet-name>test_data_api</servlet-name>
<servlet-class>com.android.vts.api.TestDataForDevServlet</servlet-class>
</servlet>
<servlet>
- <servlet-name>datastore</servlet-name>
+ <servlet-name>datastore_api</servlet-name>
<servlet-class>com.android.vts.api.DatastoreRestServlet</servlet-class>
</servlet>
<servlet>
- <servlet-name>test_run</servlet-name>
+ <servlet-name>test_run_api</servlet-name>
<servlet-class>com.android.vts.api.TestRunRestServlet</servlet-class>
</servlet>
<servlet>
- <servlet-name>favorites</servlet-name>
+ <servlet-name>favorites_api</servlet-name>
<servlet-class>com.android.vts.api.UserFavoriteRestServlet</servlet-class>
</servlet>
<servlet>
- <servlet-name>bigtable_legacy</servlet-name>
+ <servlet-name>bigtable_legacy_api</servlet-name>
<servlet-class>com.android.vts.api.BigtableLegacyJsonServlet</servlet-class>
</servlet>
@@ -221,27 +236,27 @@ Copyright 2016 Google Inc. All Rights Reserved.
</servlet-mapping>
<servlet-mapping>
- <servlet-name>bigtable_legacy</servlet-name>
+ <servlet-name>bigtable_legacy_api</servlet-name>
<url-pattern>/api/bigtable/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
- <servlet-name>test_data</servlet-name>
+ <servlet-name>test_data_api</servlet-name>
<url-pattern>/api/test_data/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
- <servlet-name>datastore</servlet-name>
+ <servlet-name>datastore_api</servlet-name>
<url-pattern>/api/datastore/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
- <servlet-name>test_run</servlet-name>
+ <servlet-name>test_run_api</servlet-name>
<url-pattern>/api/test_run/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
- <servlet-name>favorites</servlet-name>
+ <servlet-name>favorites_api</servlet-name>
<url-pattern>/api/favorites/*</url-pattern>
</servlet-mapping>