/* * 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 com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.KeyFactory; import com.googlecode.objectify.annotation.Cache; import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Ignore; import com.googlecode.objectify.annotation.OnLoad; import java.util.ArrayList; import java.util.List; import lombok.Data; import lombok.extern.slf4j.Slf4j; import static com.googlecode.objectify.ObjectifyService.ofy; @com.googlecode.objectify.annotation.Entity(name = "TestCaseRun") @Cache @Data @Slf4j /** Entity describing the execution of a test case. */ public class TestCaseRunEntity implements DashboardEntity { public static final String KIND = "TestCaseRun"; // Property keys public static final String TEST_CASE_NAME = "testCaseName"; public static final String RESULT = "result"; public static final String TEST_CASE_NAMES = "testCaseNames"; public static final String RESULTS = "results"; public static final String SYSTRACE_URL = "systraceUrl"; // Maximum number of test cases in the entity. private static final int SIZE_LIMIT = 500; @Id private Long id; private List results; private List testCaseNames; @Ignore public final List testCases; @Ignore private String systraceUrl; /** * Class describing an individual test case run. */ public static class TestCase { public final long parentId; public final int offset; public final String name; public final int result; /** * Create a test case run. * @param parentId The ID of the TestCaseRunEntity containing the test case. * @param offset The offset of the TestCase into the TestCaseRunEntity. * @param name The name of the test case. * @param result The result of the test case. */ public TestCase(long parentId, int offset, String name, int result) { this.parentId = parentId; this.offset = offset; this.name = name; this.result = result; } } /** * Create a TestCaseRunEntity. */ public TestCaseRunEntity() { this.results = new ArrayList<>(); this.testCaseNames = new ArrayList<>(); this.testCases = new ArrayList<>(); this.systraceUrl = null; } /** * Create a TestCaseRunEntity with the specified id. * @param id The entity id. */ public TestCaseRunEntity(long id) { this.id = id; this.results = new ArrayList<>(); this.testCaseNames = new ArrayList<>(); this.testCases = new ArrayList<>(); this.systraceUrl = null; } /** * Determine if the TestCaseRunEntity is full. * @return True if the entity is full, false otherwise. */ public boolean isFull() { return this.testCases.size() >= SIZE_LIMIT; } /** * Set the systrace url. * @param url The systrace url, or null. */ private void setSystraceUrl(String url) { this.systraceUrl = url; } /** * Get the systrace url. * returns The systrace url, or null. */ public String getSystraceUrl() { return this.systraceUrl; } /** * Called after the POJO is populated with data through objecitfy library */ @OnLoad private void onLoad() { if (testCaseNames.size() == results.size()) { for (int index = 0; index < testCaseNames.size(); index++) { String name = testCaseNames.get(index); int result = results.get(index).intValue(); this.testCases.add(new TestCase(this.id, this.testCases.size(), name, result)); } } } /** * Add a test case to the test case run entity. * @param name The name of the test case. * @param result The result of the test case. * @return true if added, false otherwise. */ public boolean addTestCase(String name, int result) { if (this.isFull()) { return false; } else { this.testCaseNames.add(name); this.results.add(result); return true; } } /** Saving function for the instance of this class */ @Override public com.googlecode.objectify.Key save() { return ofy().save().entity(this).now(); } public Entity toEntity() { Entity testCaseRunEntity; if (this.id >= 0) { testCaseRunEntity = new Entity(KeyFactory.createKey(KIND, id)); } else { testCaseRunEntity = new Entity(KIND); } if (this.testCases.size() > 0) { List testCaseNames = new ArrayList<>(); List results = new ArrayList<>(); for (TestCase testCase : this.testCases) { testCaseNames.add(testCase.name); results.add(testCase.result); } testCaseRunEntity.setUnindexedProperty(TEST_CASE_NAMES, testCaseNames); testCaseRunEntity.setUnindexedProperty(RESULTS, results); } if (systraceUrl != null) { testCaseRunEntity.setUnindexedProperty(SYSTRACE_URL, this.systraceUrl); } return testCaseRunEntity; } /** * Convert an Entity object to a TestCaseRunEntity. * * @param e The entity to process. * @return TestCaseRunEntity object with the properties from e, or null if incompatible. */ @SuppressWarnings("unchecked") public static TestCaseRunEntity fromEntity(Entity e) { if (!e.getKind().equals(KIND)) { log.warn("Wrong kind: " + e.getKey()); return null; } try { TestCaseRunEntity testCaseRun = new TestCaseRunEntity(e.getKey().getId()); if (e.hasProperty(TEST_CASE_NAMES) && e.hasProperty(RESULTS)) { List testCaseNames = (List) e.getProperty(TEST_CASE_NAMES); List results = (List) e.getProperty(RESULTS); if (testCaseNames.size() == results.size()) { for (int i = 0; i < testCaseNames.size(); i++) { testCaseRun.addTestCase(testCaseNames.get(i), results.get(i).intValue()); } } } if (e.hasProperty(TEST_CASE_NAME) && e.hasProperty(RESULT)) { testCaseRun.addTestCase( (String) e.getProperty(TEST_CASE_NAME), (int) (long) e.getProperty(RESULT)); } if (e.hasProperty(SYSTRACE_URL)) { String systraceUrl = (String) e.getProperty(SYSTRACE_URL); testCaseRun.setSystraceUrl(systraceUrl); } return testCaseRun; } catch (ClassCastException exception) { // Invalid cast log.warn("Error parsing test case run entity.", exception); } return null; } }