blob: 85a6c43958469f2cf02a10b07c5c9b7fdd55c658 [file] [log] [blame]
/*
* 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<Integer> results;
private List<String> testCaseNames;
@Ignore
public final List<TestCase> 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<TestCaseRunEntity> 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<String> testCaseNames = new ArrayList<>();
List<Integer> 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<String> testCaseNames = (List<String>) e.getProperty(TEST_CASE_NAMES);
List<Long> results = (List<Long>) 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;
}
}