summaryrefslogtreecommitdiff
path: root/src/main/java/com/android/vts/entity/TestRunEntity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/android/vts/entity/TestRunEntity.java')
-rw-r--r--src/main/java/com/android/vts/entity/TestRunEntity.java497
1 files changed, 0 insertions, 497 deletions
diff --git a/src/main/java/com/android/vts/entity/TestRunEntity.java b/src/main/java/com/android/vts/entity/TestRunEntity.java
deleted file mode 100644
index 0d5f1ec..0000000
--- a/src/main/java/com/android/vts/entity/TestRunEntity.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Copyright (c) 2017 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.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.util.TimeUtil;
-import com.android.vts.util.UrlUtil;
-import com.android.vts.util.UrlUtil.LinkDisplay;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.OnLoad;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Supplier;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Stream;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import org.apache.commons.lang3.math.NumberUtils;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestRun")
-@Cache
-@NoArgsConstructor
-/** Entity describing test run information. */
-public class TestRunEntity implements DashboardEntity {
- protected static final Logger logger = Logger.getLogger(TestRunEntity.class.getName());
-
- /** Enum for classifying test run types. */
- public enum TestRunType {
- OTHER(0),
- PRESUBMIT(1),
- POSTSUBMIT(2);
-
- private final int value;
-
- private TestRunType(int value) {
- this.value = value;
- }
-
- /**
- * Get the ordinal representation of the type.
- *
- * @return The value associated with the test run type.
- */
- public int getNumber() {
- return value;
- }
-
- /**
- * Convert an ordinal value to a TestRunType.
- *
- * @param value The orginal value to parse.
- * @return a TestRunType value.
- */
- public static TestRunType fromNumber(int value) {
- if (value == 1) {
- return TestRunType.PRESUBMIT;
- } else if (value == 2) {
- return TestRunType.POSTSUBMIT;
- } else {
- return TestRunType.OTHER;
- }
- }
-
- /**
- * Determine the test run type based on the build ID.
- *
- * <p>Postsubmit runs are expected to have integer build IDs, while presubmit runs are
- * integers prefixed by the character P. All other runs (e.g. local builds) are classified
- * as OTHER.
- *
- * @param buildId The build ID.
- * @return the TestRunType.
- */
- public static TestRunType fromBuildId(String buildId) {
- if (buildId.toLowerCase().startsWith("p")) {
- if (NumberUtils.isParsable(buildId.substring(1))) {
- return TestRunType.PRESUBMIT;
- } else {
- return TestRunType.OTHER;
- }
- } else if (NumberUtils.isParsable(buildId)) {
- return TestRunType.POSTSUBMIT;
- } else {
- return TestRunType.OTHER;
- }
- }
- }
-
- public static final String KIND = "TestRun";
-
- // Property keys
- public static final String TEST_NAME = "testName";
- public static final String TYPE = "type";
- public static final String START_TIMESTAMP = "startTimestamp";
- public static final String END_TIMESTAMP = "endTimestamp";
- public static final String TEST_BUILD_ID = "testBuildId";
- public static final String HOST_NAME = "hostName";
- public static final String PASS_COUNT = "passCount";
- public static final String FAIL_COUNT = "failCount";
- public static final String HAS_CODE_COVERAGE = "hasCodeCoverage";
- public static final String HAS_COVERAGE = "hasCoverage";
- public static final String TEST_CASE_IDS = "testCaseIds";
- public static final String LOG_LINKS = "logLinks";
- public static final String API_COVERAGE_KEY_LIST = "apiCoverageKeyList";
- public static final String TOTAL_API_COUNT = "totalApiCount";
- public static final String COVERED_API_COUNT = "coveredApiCount";
-
- @Ignore private Key key;
-
- @Id @Getter @Setter private Long id;
-
- @Parent @Getter @Setter private com.googlecode.objectify.Key<?> testRunParent;
-
- @Index @Getter @Setter private long type;
-
- @Index @Getter @Setter private long startTimestamp;
-
- @Index @Getter @Setter private long endTimestamp;
-
- @Index @Getter @Setter private String testBuildId;
-
- @Index @Getter @Setter private String testName;
-
- @Index @Getter @Setter private String hostName;
-
- @Index @Getter @Setter private long passCount;
-
- @Index @Getter @Setter private long failCount;
-
- @Index private boolean hasCoverage;
-
- @Index @Getter @Setter private boolean hasCodeCoverage;
-
- @Ignore private com.googlecode.objectify.Key<CodeCoverageEntity> codeCoverageEntityKey;
-
- @Index @Getter @Setter private long coveredLineCount;
-
- @Index @Getter @Setter private long totalLineCount;
-
- @Getter @Setter private List<Long> testCaseIds;
-
- @Getter @Setter private List<String> logLinks;
-
- /**
- * Create a TestRunEntity object describing a test run.
- *
- * @param parentKey The key to the parent TestEntity.
- * @param type The test run type (e.g. presubmit, postsubmit, other)
- * @param startTimestamp The time in microseconds when the test run started.
- * @param endTimestamp The time in microseconds when the test run ended.
- * @param testBuildId The build ID of the VTS test build.
- * @param hostName The name of host machine.
- * @param passCount The number of passing test cases in the run.
- * @param failCount The number of failing test cases in the run.
- */
- public TestRunEntity(
- Key parentKey,
- long type,
- long startTimestamp,
- long endTimestamp,
- String testBuildId,
- String hostName,
- long passCount,
- long failCount,
- boolean hasCodeCoverage,
- List<Long> testCaseIds,
- List<String> logLinks) {
- this.id = startTimestamp;
- this.key = KeyFactory.createKey(parentKey, KIND, startTimestamp);
- this.type = type;
- this.startTimestamp = startTimestamp;
- this.endTimestamp = endTimestamp;
- this.testBuildId = testBuildId;
- this.hostName = hostName;
- this.passCount = passCount;
- this.failCount = failCount;
- this.hasCodeCoverage = hasCodeCoverage;
- this.testName = parentKey.getName();
- this.testCaseIds = testCaseIds;
- this.logLinks = logLinks;
-
- this.testRunParent = com.googlecode.objectify.Key.create(TestEntity.class, testName);
- this.codeCoverageEntityKey = getCodeCoverageEntityKey();
- }
-
- /**
- * Called after the POJO is populated with data through objecitfy library
- */
- @OnLoad
- private void onLoad() {
- if (Objects.isNull(this.hasCodeCoverage)) {
- this.hasCodeCoverage = this.hasCoverage;
- this.save();
- }
- }
-
- public Entity toEntity() {
- Entity testRunEntity = new Entity(this.key);
- testRunEntity.setProperty(TEST_NAME, this.testName);
- testRunEntity.setProperty(TYPE, this.type);
- testRunEntity.setProperty(START_TIMESTAMP, this.startTimestamp);
- testRunEntity.setUnindexedProperty(END_TIMESTAMP, this.endTimestamp);
- testRunEntity.setProperty(TEST_BUILD_ID, this.testBuildId.toLowerCase());
- testRunEntity.setProperty(HOST_NAME, this.hostName.toLowerCase());
- testRunEntity.setProperty(PASS_COUNT, this.passCount);
- testRunEntity.setProperty(FAIL_COUNT, this.failCount);
- testRunEntity.setProperty(HAS_CODE_COVERAGE, this.hasCodeCoverage);
- testRunEntity.setUnindexedProperty(TEST_CASE_IDS, this.testCaseIds);
- if (this.logLinks != null && this.logLinks.size() > 0) {
- testRunEntity.setUnindexedProperty(LOG_LINKS, this.logLinks);
- }
- return testRunEntity;
- }
-
- /** Saving function for the instance of this class */
- @Override
- public com.googlecode.objectify.Key<TestRunEntity> save() {
- return ofy().save().entity(this).now();
- }
-
- /**
- * Get key info from appengine based library.
- */
- public Key getKey() {
- Key parentKey = KeyFactory.createKey(TestEntity.KIND, testName);
- return KeyFactory.createKey(parentKey, KIND, startTimestamp);
- }
-
- /** Getter hasCodeCoverage value */
- public boolean getHasCodeCoverage() {
- return this.hasCodeCoverage;
- }
-
- /** Getter DateTime string from startTimestamp */
- public String getStartDateTime() {
- return TimeUtil.getDateTimeString(this.startTimestamp);
- }
-
- /** Getter DateTime string from startTimestamp */
- public String getEndDateTime() {
- return TimeUtil.getDateTimeString(this.endTimestamp);
- }
-
- /** find TestRun entity by ID and test name */
- public static TestRunEntity getByTestNameId(String testName, long id) {
- com.googlecode.objectify.Key testKey =
- com.googlecode.objectify.Key.create(TestEntity.class, testName);
- return ofy().load().type(TestRunEntity.class).parent(testKey).id(id).now();
- }
-
- /** Get CodeCoverageEntity Key to generate Key by combining key info */
- private com.googlecode.objectify.Key getCodeCoverageEntityKey() {
- com.googlecode.objectify.Key testRunKey = this.getOfyKey();
- return com.googlecode.objectify.Key.create(
- testRunKey, CodeCoverageEntity.class, this.startTimestamp);
- }
-
- /** Get ApiCoverageEntity Key from the parent key */
- public com.googlecode.objectify.Key getOfyKey() {
- com.googlecode.objectify.Key testKey =
- com.googlecode.objectify.Key.create(
- TestEntity.class, this.testName);
- com.googlecode.objectify.Key testRunKey =
- com.googlecode.objectify.Key.create(
- testKey, TestRunEntity.class, this.startTimestamp);
- return testRunKey;
- }
-
- /** Get ApiCoverageEntity from key info */
- public Optional<List<ApiCoverageEntity>> getApiCoverageEntityList() {
- com.googlecode.objectify.Key testRunKey = this.getOfyKey();
- List<ApiCoverageEntity> apiCoverageEntityList =
- ofy().load().type(ApiCoverageEntity.class).ancestor(testRunKey).list();
- return Optional.ofNullable(apiCoverageEntityList);
- }
-
- /**
- * Get CodeCoverageEntity instance from codeCoverageEntityKey value.
- */
- public CodeCoverageEntity getCodeCoverageEntity() {
- if (this.hasCodeCoverage) {
- CodeCoverageEntity codeCoverageEntity =
- ofy().load()
- .type(CodeCoverageEntity.class)
- .filterKey(this.codeCoverageEntityKey)
- .first()
- .now();
- if (Objects.isNull(codeCoverageEntity)) {
- codeCoverageEntity =
- new CodeCoverageEntity(
- this.getKey(), coveredLineCount, totalLineCount);
- codeCoverageEntity.save();
- return codeCoverageEntity;
- } else {
- return codeCoverageEntity;
- }
- } else {
- logger.log(
- Level.WARNING,
- "The hasCodeCoverage value is false. Please check the code coverage entity key");
- return null;
- }
- }
-
- /**
- * Convert an Entity object to a TestRunEntity.
- *
- * @param e The entity to process.
- * @return TestRunEntity object with the properties from e processed, or null if incompatible.
- */
- @SuppressWarnings("unchecked")
- public static TestRunEntity fromEntity(Entity e) {
- if (!e.getKind().equals(KIND)
- || !e.hasProperty(TYPE)
- || !e.hasProperty(START_TIMESTAMP)
- || !e.hasProperty(END_TIMESTAMP)
- || !e.hasProperty(TEST_BUILD_ID)
- || !e.hasProperty(HOST_NAME)
- || !e.hasProperty(PASS_COUNT)
- || !e.hasProperty(FAIL_COUNT)) {
- logger.log(Level.WARNING, "Missing test run attributes in entity: " + e.toString());
- return null;
- }
- try {
- long type = (long) e.getProperty(TYPE);
- long startTimestamp = (long) e.getProperty(START_TIMESTAMP);
- long endTimestamp = (long) e.getProperty(END_TIMESTAMP);
- String testBuildId = (String) e.getProperty(TEST_BUILD_ID);
- String hostName = (String) e.getProperty(HOST_NAME);
- long passCount = (long) e.getProperty(PASS_COUNT);
- long failCount = (long) e.getProperty(FAIL_COUNT);
- boolean hasCodeCoverage = false;
- if (e.hasProperty(HAS_CODE_COVERAGE)) {
- hasCodeCoverage = (boolean) e.getProperty(HAS_CODE_COVERAGE);
- } else {
- hasCodeCoverage = (boolean) e.getProperty(HAS_COVERAGE);
- }
- List<Long> testCaseIds = (List<Long>) e.getProperty(TEST_CASE_IDS);
- if (Objects.isNull(testCaseIds)) {
- testCaseIds = new ArrayList<>();
- }
- List<String> links = new ArrayList<>();
- if (e.hasProperty(LOG_LINKS)) {
- links = (List<String>) e.getProperty(LOG_LINKS);
- }
- return new TestRunEntity(
- e.getKey().getParent(),
- type,
- startTimestamp,
- endTimestamp,
- testBuildId,
- hostName,
- passCount,
- failCount,
- hasCodeCoverage,
- testCaseIds,
- links);
- } catch (ClassCastException exception) {
- // Invalid cast
- logger.log(Level.WARNING, "Error parsing test run entity.", exception);
- }
- return null;
- }
-
- /** Get JsonFormat logLinks */
- public JsonElement getJsonLogLinks() {
- List<String> logLinks = this.getLogLinks();
- List<JsonElement> links = new ArrayList<>();
- if (logLinks != null && logLinks.size() > 0) {
- for (String rawUrl : logLinks) {
- UrlUtil.LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
- if (validatedLink == null) {
- logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
- continue;
- }
- String[] logInfo = new String[] {validatedLink.name, validatedLink.url};
- links.add(new Gson().toJsonTree(logInfo));
- }
- }
- return new Gson().toJsonTree(links);
- }
-
- public JsonObject toJson() {
- Map<String, TestCoverageStatusEntity> testCoverageStatusMap = TestCoverageStatusEntity
- .getTestCoverageStatusMap();
-
- JsonObject json = new JsonObject();
- json.add(TEST_NAME, new JsonPrimitive(this.testName));
- json.add(TEST_BUILD_ID, new JsonPrimitive(this.testBuildId));
- json.add(HOST_NAME, new JsonPrimitive(this.hostName));
- json.add(PASS_COUNT, new JsonPrimitive(this.passCount));
- json.add(FAIL_COUNT, new JsonPrimitive(this.failCount));
- json.add(START_TIMESTAMP, new JsonPrimitive(this.startTimestamp));
- json.add(END_TIMESTAMP, new JsonPrimitive(this.endTimestamp));
-
- // Overwrite the coverage value with newly update value from user decision
- if (this.hasCodeCoverage) {
- CodeCoverageEntity codeCoverageEntity = this.getCodeCoverageEntity();
- if (testCoverageStatusMap.containsKey(this.testName)) {
- TestCoverageStatusEntity testCoverageStatusEntity =
- testCoverageStatusMap.get(this.testName);
-
- if (testCoverageStatusEntity.getUpdatedCoveredLineCount() > 0) {
- codeCoverageEntity.setCoveredLineCount(
- testCoverageStatusEntity.getUpdatedCoveredLineCount());
- }
- if (testCoverageStatusEntity.getUpdatedTotalLineCount() > 0) {
- codeCoverageEntity.setTotalLineCount(
- testCoverageStatusEntity.getUpdatedTotalLineCount());
- }
- }
-
- long totalLineCount = codeCoverageEntity.getTotalLineCount();
- long coveredLineCount = codeCoverageEntity.getCoveredLineCount();
- if (totalLineCount > 0 && coveredLineCount >= 0) {
- json.add(CodeCoverageEntity.COVERED_LINE_COUNT, new JsonPrimitive(coveredLineCount));
- json.add(CodeCoverageEntity.TOTAL_LINE_COUNT, new JsonPrimitive(totalLineCount));
- }
- }
-
- Optional<List<ApiCoverageEntity>> apiCoverageEntityOptionList =
- this.getApiCoverageEntityList();
- if (apiCoverageEntityOptionList.isPresent()) {
- List<ApiCoverageEntity> apiCoverageEntityList = apiCoverageEntityOptionList.get();
- Supplier<Stream<ApiCoverageEntity>> apiCoverageStreamSupplier =
- () -> apiCoverageEntityList.stream();
- int totalHalApi =
- apiCoverageStreamSupplier.get().mapToInt(data -> data.getHalApi().size()).sum();
- if (totalHalApi > 0) {
- int coveredHalApi =
- apiCoverageStreamSupplier
- .get()
- .mapToInt(data -> data.getCoveredHalApi().size())
- .sum();
- JsonArray apiCoverageKeyArray =
- apiCoverageStreamSupplier
- .get()
- .map(data -> new JsonPrimitive(data.getUrlSafeKey()))
- .collect(JsonArray::new, JsonArray::add, JsonArray::addAll);
-
- json.add(API_COVERAGE_KEY_LIST, apiCoverageKeyArray);
- json.add(COVERED_API_COUNT, new JsonPrimitive(coveredHalApi));
- json.add(TOTAL_API_COUNT, new JsonPrimitive(totalHalApi));
- }
- }
-
- List<String> logLinks = this.getLogLinks();
- if (logLinks != null && logLinks.size() > 0) {
- List<JsonElement> links = new ArrayList<>();
- for (String rawUrl : logLinks) {
- LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
- if (validatedLink == null) {
- logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
- continue;
- }
- String[] logInfo = new String[] {validatedLink.name, validatedLink.url};
- links.add(new Gson().toJsonTree(logInfo));
- }
- if (links.size() > 0) {
- json.add(this.LOG_LINKS, new Gson().toJsonTree(links));
- }
- }
- return json;
- }
-}