diff options
9 files changed, 73 insertions, 399 deletions
diff --git a/src/main/java/com/android/vts/api/CoverageRestServlet.java b/src/main/java/com/android/vts/api/CoverageRestServlet.java index 165db8d..aebd3e5 100644 --- a/src/main/java/com/android/vts/api/CoverageRestServlet.java +++ b/src/main/java/com/android/vts/api/CoverageRestServlet.java @@ -106,10 +106,8 @@ public class CoverageRestServlet extends BaseApiServlet { List<List<String>> allCoveredHalApiList = new ArrayList(); Key<TestPlanRunEntity> key = Key.create(urlSafeKey); - System.out.println("urlSafekey => " + urlSafeKey); TestPlanRunEntity testPlanRunEntity = ofy().load().key(key).safe(); - System.out.println("testPlanRunEntity => " + testPlanRunEntity); for (Key<TestRunEntity> testRunKey : testPlanRunEntity.getTestRuns()) { List<ApiCoverageEntity> apiCoverageEntityList = ofy().load().type(ApiCoverageEntity.class).ancestor(testRunKey).list(); diff --git a/src/main/java/com/android/vts/api/DatastoreRestServlet.java b/src/main/java/com/android/vts/api/DatastoreRestServlet.java index 5ddf18d..fb5ac65 100644 --- a/src/main/java/com/android/vts/api/DatastoreRestServlet.java +++ b/src/main/java/com/android/vts/api/DatastoreRestServlet.java @@ -87,6 +87,7 @@ public class DatastoreRestServlet extends BaseApiServlet { return; } + String resultMsg = ""; // Verify service account access token. if (postMessage.hasAccessToken()) { String accessToken = postMessage.getAccessToken(); @@ -109,15 +110,21 @@ public class DatastoreRestServlet extends BaseApiServlet { } response.setStatus(HttpServletResponse.SC_OK); + resultMsg = "Success!!"; } else { log.warn("service_client_id didn't match!"); log.debug("SERVICE_CLIENT_ID => " + tokenInfo.getIssuedTo()); + resultMsg = "Your SERVICE_CLIENT_ID is incorrect!"; response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } } else { log.error("postMessage do not contain any accessToken!"); + resultMsg = "Your message do not have access token!"; response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write("{'result_msg': " + resultMsg + "}"); } /** @@ -446,13 +453,6 @@ public class DatastoreRestServlet extends BaseApiServlet { Map<com.googlecode.objectify.Key<TestRunEntity>, TestRunEntity> testRunEntityMap = ofy().load().keys(() -> testRunKeyList.iterator()); - testRunKeyList.forEach( - (v) -> { - log.debug("TestRunEntity key value => " + v); - }); - log.debug("testRunEntityMap value => " + testRunEntityMap.values()); - log.debug("testRunEntityMap keySet => " + testRunEntityMap.keySet()); - long passCount = 0; long failCount = 0; long startTimestamp = -1; diff --git a/src/main/java/com/android/vts/api/TestRunRestServlet.java b/src/main/java/com/android/vts/api/TestRunRestServlet.java index 2c724ac..90fd3f9 100644 --- a/src/main/java/com/android/vts/api/TestRunRestServlet.java +++ b/src/main/java/com/android/vts/api/TestRunRestServlet.java @@ -16,20 +16,10 @@ package com.android.vts.api; -import com.android.vts.entity.CodeCoverageEntity; import com.android.vts.entity.TestCaseRunEntity; import com.android.vts.entity.TestEntity; import com.android.vts.entity.TestRunEntity; -import com.android.vts.util.FilterUtil; import com.android.vts.util.TestRunDetails; -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.EntityNotFoundException; -import com.google.appengine.api.datastore.FetchOptions; -import com.google.appengine.api.datastore.Key; -import com.google.appengine.api.datastore.KeyFactory; -import com.google.appengine.api.datastore.Query; import com.google.gson.Gson; import java.io.IOException; import java.io.PrintWriter; @@ -38,7 +28,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.logging.Logger; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -108,10 +97,7 @@ public class TestRunRestServlet extends BaseApiServlet { } Map<com.googlecode.objectify.Key<TestCaseRunEntity>, TestCaseRunEntity> testCaseRunEntityKeyMap = ofy().load().keys(() -> testCaseKeyList.iterator()); - for (Map.Entry<com.googlecode.objectify.Key<TestCaseRunEntity>, TestCaseRunEntity> entry : - testCaseRunEntityKeyMap.entrySet()) { - details.addTestCase(entry.getValue()); - } + testCaseRunEntityKeyMap.forEach((key, value) -> details.addTestCase(value)); } return details; } diff --git a/src/main/java/com/android/vts/config/ObjectifyListener.java b/src/main/java/com/android/vts/config/ObjectifyListener.java index 5f35abd..02e0215 100644 --- a/src/main/java/com/android/vts/config/ObjectifyListener.java +++ b/src/main/java/com/android/vts/config/ObjectifyListener.java @@ -28,6 +28,7 @@ import com.android.vts.entity.ProfilingPointEntity; import com.android.vts.entity.ProfilingPointRunEntity; import com.android.vts.entity.ProfilingPointSummaryEntity; import com.android.vts.entity.RoleEntity; +import com.android.vts.entity.TestAcknowledgmentEntity; import com.android.vts.entity.TestCaseRunEntity; import com.android.vts.entity.TestCoverageStatusEntity; import com.android.vts.entity.TestEntity; diff --git a/src/main/java/com/android/vts/entity/TestCaseRunEntity.java b/src/main/java/com/android/vts/entity/TestCaseRunEntity.java index 30776d4..85a6c43 100644 --- a/src/main/java/com/android/vts/entity/TestCaseRunEntity.java +++ b/src/main/java/com/android/vts/entity/TestCaseRunEntity.java @@ -138,7 +138,9 @@ public class TestCaseRunEntity implements DashboardEntity { private void onLoad() { if (testCaseNames.size() == results.size()) { for (int index = 0; index < testCaseNames.size(); index++) { - this.addTestCase(testCaseNames.get(index), results.get(index).intValue()); + String name = testCaseNames.get(index); + int result = results.get(index).intValue(); + this.testCases.add(new TestCase(this.id, this.testCases.size(), name, result)); } } } diff --git a/src/main/java/com/android/vts/util/DatastoreHelper.java b/src/main/java/com/android/vts/util/DatastoreHelper.java index 3764c7a..782887b 100644 --- a/src/main/java/com/android/vts/util/DatastoreHelper.java +++ b/src/main/java/com/android/vts/util/DatastoreHelper.java @@ -166,372 +166,6 @@ public class DatastoreHelper { } /** - * Upload data from a test report message - * - * @param report The test report containing data to upload. - */ - public static void insertTestReport(TestReportMessage report) { - - List<Entity> testEntityList = new ArrayList<>(); - List<Entity> branchEntityList = new ArrayList<>(); - List<Entity> buildTargetEntityList = new ArrayList<>(); - List<Entity> coverageEntityList = new ArrayList<>(); - List<Entity> profilingPointRunEntityList = new ArrayList<>(); - - if (!report.hasStartTimestamp() - || !report.hasEndTimestamp() - || !report.hasTest() - || !report.hasHostInfo() - || !report.hasBuildInfo()) { - // missing information - return; - } - long startTimestamp = report.getStartTimestamp(); - long endTimestamp = report.getEndTimestamp(); - String testName = report.getTest().toStringUtf8(); - String testBuildId = report.getBuildInfo().getId().toStringUtf8(); - String hostName = report.getHostInfo().getHostname().toStringUtf8(); - - TestEntity testEntity = new TestEntity(testName); - - Key testRunKey = - KeyFactory.createKey( - testEntity.getOldKey(), TestRunEntity.KIND, report.getStartTimestamp()); - - long passCount = 0; - long failCount = 0; - long coveredLineCount = 0; - long totalLineCount = 0; - - Set<Key> buildTargetKeys = new HashSet<>(); - Set<Key> branchKeys = new HashSet<>(); - List<TestCaseRunEntity> testCases = new ArrayList<>(); - List<Key> profilingPointKeys = new ArrayList<>(); - List<String> links = new ArrayList<>(); - - // Process test cases - for (TestCaseReportMessage testCase : report.getTestCaseList()) { - String testCaseName = testCase.getName().toStringUtf8(); - TestCaseResult result = testCase.getTestResult(); - // Track global pass/fail counts - if (result == TestCaseResult.TEST_CASE_RESULT_PASS) { - ++passCount; - } else if (result != TestCaseResult.TEST_CASE_RESULT_SKIP) { - ++failCount; - } - if (testCase.getSystraceCount() > 0 - && testCase.getSystraceList().get(0).getUrlCount() > 0) { - String systraceLink = testCase.getSystraceList().get(0).getUrl(0).toStringUtf8(); - links.add(systraceLink); - } - - // Process coverage data for test case - for (CoverageReportMessage coverage : testCase.getCoverageList()) { - CoverageEntity coverageEntity = - CoverageEntity.fromCoverageReport(testRunKey, testCaseName, coverage); - if (coverageEntity == null) { - logger.log(Level.WARNING, "Invalid coverage report in test run " + testRunKey); - } else { - coveredLineCount += coverageEntity.getCoveredCount(); - totalLineCount += coverageEntity.getTotalCount(); - coverageEntityList.add(coverageEntity.toEntity()); - } - } - - // Process profiling data for test case - for (ProfilingReportMessage profiling : testCase.getProfilingList()) { - ProfilingPointRunEntity profilingPointRunEntity = - ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling); - if (profilingPointRunEntity == null) { - logger.log(Level.WARNING, "Invalid profiling report in test run " + testRunKey); - } else { - profilingPointRunEntityList.add(profilingPointRunEntity.toEntity()); - profilingPointKeys.add(profilingPointRunEntity.getKey()); - testEntity.setHasProfilingData(true); - } - } - - int lastIndex = testCases.size() - 1; - if (lastIndex < 0 || testCases.get(lastIndex).isFull()) { - testCases.add(new TestCaseRunEntity()); - ++lastIndex; - } - TestCaseRunEntity testCaseEntity = testCases.get(lastIndex); - testCaseEntity.addTestCase(testCaseName, result.getNumber()); - } - - List<Entity> testCasePuts = new ArrayList<>(); - for (TestCaseRunEntity testCaseEntity : testCases) { - testCasePuts.add(testCaseEntity.toEntity()); - } - List<Key> testCaseKeys = datastore.put(testCasePuts); - - List<Long> testCaseIds = new ArrayList<>(); - for (Key key : testCaseKeys) { - testCaseIds.add(key.getId()); - } - - // Process device information - long testRunType = 0; - for (AndroidDeviceInfoMessage device : report.getDeviceInfoList()) { - DeviceInfoEntity deviceInfoEntity = - DeviceInfoEntity.fromDeviceInfoMessage(testRunKey, device); - if (deviceInfoEntity == null) { - logger.log(Level.WARNING, "Invalid device info in test run " + testRunKey); - } else { - // Run type on devices must be the same, else set to OTHER - TestRunType runType = TestRunType.fromBuildId(deviceInfoEntity.getBuildId()); - if (runType == null) { - testRunType = TestRunType.OTHER.getNumber(); - } else { - testRunType = runType.getNumber(); - } - testEntityList.add(deviceInfoEntity.toEntity()); - BuildTargetEntity target = new BuildTargetEntity(deviceInfoEntity.getBuildFlavor()); - if (buildTargetKeys.add(target.key)) { - buildTargetEntityList.add(target.toEntity()); - } - BranchEntity branch = new BranchEntity(deviceInfoEntity.getBranch()); - if (branchKeys.add(branch.key)) { - branchEntityList.add(branch.toEntity()); - } - } - } - - // Overall run type should be determined by the device builds unless test build is OTHER - if (testRunType == TestRunType.OTHER.getNumber()) { - testRunType = TestRunType.fromBuildId(testBuildId).getNumber(); - } else if (TestRunType.fromBuildId(testBuildId) == TestRunType.OTHER) { - testRunType = TestRunType.OTHER.getNumber(); - } - - // Process global coverage data - for (CoverageReportMessage coverage : report.getCoverageList()) { - CoverageEntity coverageEntity = - CoverageEntity.fromCoverageReport(testRunKey, new String(), coverage); - if (coverageEntity == null) { - logger.log(Level.WARNING, "Invalid coverage report in test run " + testRunKey); - } else { - coveredLineCount += coverageEntity.getCoveredCount(); - totalLineCount += coverageEntity.getTotalCount(); - coverageEntityList.add(coverageEntity.toEntity()); - } - } - - // Process global API coverage data - for (ApiCoverageReportMessage apiCoverage : report.getApiCoverageList()) { - HalInterfaceMessage halInterfaceMessage = apiCoverage.getHalInterface(); - List<String> halApiList = apiCoverage.getHalApiList().stream().map(h -> h.toStringUtf8()) - .collect( - Collectors.toList()); - List<String> coveredHalApiList = apiCoverage.getCoveredHalApiList().stream() - .map(h -> h.toStringUtf8()).collect( - Collectors.toList()); - ApiCoverageEntity apiCoverageEntity = new ApiCoverageEntity( - testRunKey, - halInterfaceMessage.getHalPackageName().toStringUtf8(), - halInterfaceMessage.getHalVersionMajor(), - halInterfaceMessage.getHalVersionMinor(), - halInterfaceMessage.getHalInterfaceName().toStringUtf8(), - halApiList, - coveredHalApiList - ); - com.googlecode.objectify.Key apiCoverageEntityKey = apiCoverageEntity.save(); - if (apiCoverageEntityKey == null) { - logger.log(Level.WARNING, "Invalid API coverage report in test run " + testRunKey); - } - } - - // Process global profiling data - for (ProfilingReportMessage profiling : report.getProfilingList()) { - ProfilingPointRunEntity profilingPointRunEntity = - ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling); - if (profilingPointRunEntity == null) { - logger.log(Level.WARNING, "Invalid profiling report in test run " + testRunKey); - } else { - profilingPointRunEntityList.add(profilingPointRunEntity.toEntity()); - profilingPointKeys.add(profilingPointRunEntity.getKey()); - testEntity.setHasProfilingData(true); - } - } - - // Process log data - for (LogMessage log : report.getLogList()) { - if (log.hasUrl()) { - links.add(log.getUrl().toStringUtf8()); - } - } - // Process url resource - for (UrlResourceMessage resource : report.getLinkResourceList()) { - if (resource.hasUrl()) { - links.add(resource.getUrl().toStringUtf8()); - } - } - - boolean hasCodeCoverage = totalLineCount > 0 && coveredLineCount >= 0; - TestRunEntity testRunEntity = - new TestRunEntity( - testEntity.getOldKey(), - testRunType, - startTimestamp, - endTimestamp, - testBuildId, - hostName, - passCount, - failCount, - hasCodeCoverage, - testCaseIds, - links); - testEntityList.add(testRunEntity.toEntity()); - - CodeCoverageEntity codeCoverageEntity = new CodeCoverageEntity( - testRunEntity.getKey(), - coveredLineCount, - totalLineCount); - testEntityList.add(codeCoverageEntity.toEntity()); - - Entity test = testEntity.toEntity(); - - if (datastoreTransactionalRetry(test, testEntityList)) { - List<List<Entity>> auxiliaryEntityList = - Arrays.asList( - profilingPointRunEntityList, - coverageEntityList, - branchEntityList, - buildTargetEntityList); - int indexCount = 0; - for (List<Entity> entityList : auxiliaryEntityList) { - switch (indexCount) { - case 0: - case 1: - if (entityList.size() > MAX_ENTITY_SIZE_PER_TRANSACTION) { - List<List<Entity>> partitionedList = - Lists.partition(entityList, MAX_ENTITY_SIZE_PER_TRANSACTION); - partitionedList.forEach( - subEntityList -> { - datastoreTransactionalRetry( - new Entity(NULL_ENTITY_KIND), subEntityList); - }); - } else { - datastoreTransactionalRetry(new Entity(NULL_ENTITY_KIND), entityList); - } - break; - case 2: - case 3: - datastoreTransactionalRetryWithXG( - new Entity(NULL_ENTITY_KIND), entityList, true); - break; - default: - break; - } - indexCount++; - } - - if (testRunEntity.getType() == TestRunType.POSTSUBMIT.getNumber()) { - VtsAlertJobServlet.addTask(testRunKey); - if (testRunEntity.getHasCodeCoverage()) { - VtsCoverageAlertJobServlet.addTask(testRunKey); - } - if (profilingPointKeys.size() > 0) { - VtsProfilingStatsJobServlet.addTasks(profilingPointKeys); - } - } else { - logger.log( - Level.WARNING, - "The alert email was not sent as testRunEntity type is not POSTSUBMIT!" + - " \n " + " testRunEntity type => " + testRunEntity.getType()); - } - } - } - - /** - * Upload data from a test plan report message - * - * @param report The test plan report containing data to upload. - */ - public static void insertTestPlanReport(TestPlanReportMessage report) { - List<Entity> testEntityList = new ArrayList<>(); - - List<String> testModules = report.getTestModuleNameList(); - List<Long> testTimes = report.getTestModuleStartTimestampList(); - if (testModules.size() != testTimes.size() || !report.hasTestPlanName()) { - logger.log(Level.WARNING, "TestPlanReportMessage is missing information."); - return; - } - - String testPlanName = report.getTestPlanName(); - Entity testPlanEntity = new TestPlanEntity(testPlanName).toEntity(); - List<Key> testRunKeys = new ArrayList<>(); - for (int i = 0; i < testModules.size(); i++) { - String test = testModules.get(i); - long time = testTimes.get(i); - Key parentKey = KeyFactory.createKey(TestEntity.KIND, test); - Key testRunKey = KeyFactory.createKey(parentKey, TestRunEntity.KIND, time); - testRunKeys.add(testRunKey); - } - Map<Key, Entity> testRuns = datastore.get(testRunKeys); - long passCount = 0; - long failCount = 0; - long startTimestamp = -1; - long endTimestamp = -1; - String testBuildId = null; - long type = 0; - Set<DeviceInfoEntity> deviceInfoEntitySet = new HashSet<>(); - for (Key testRunKey : testRuns.keySet()) { - TestRunEntity testRun = TestRunEntity.fromEntity(testRuns.get(testRunKey)); - if (testRun == null) { - continue; // not a valid test run - } - passCount += testRun.getPassCount(); - failCount += testRun.getFailCount(); - if (startTimestamp < 0 || testRunKey.getId() < startTimestamp) { - startTimestamp = testRunKey.getId(); - } - if (endTimestamp < 0 || testRun.getEndTimestamp() > endTimestamp) { - endTimestamp = testRun.getEndTimestamp(); - } - type = testRun.getType(); - testBuildId = testRun.getTestBuildId(); - Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testRunKey); - for (Entity deviceInfoEntity : datastore.prepare(deviceInfoQuery).asIterable()) { - DeviceInfoEntity device = DeviceInfoEntity.fromEntity(deviceInfoEntity); - if (device == null) { - continue; // invalid entity - } - deviceInfoEntitySet.add(device); - } - } - if (startTimestamp < 0 || testBuildId == null || type == 0) { - logger.log(Level.WARNING, "Couldn't infer test run information from runs."); - return; - } - TestPlanRunEntity testPlanRun = - new TestPlanRunEntity( - testPlanEntity.getKey(), - testPlanName, - type, - startTimestamp, - endTimestamp, - testBuildId, - passCount, - failCount, - 0L, - 0L, - testRunKeys); - - // Create the device infos. - for (DeviceInfoEntity device : deviceInfoEntitySet) { - testEntityList.add(device.copyWithParent(testPlanRun.key).toEntity()); - } - testEntityList.add(testPlanRun.toEntity()); - - // Add the task to calculate total number API list. - testPlanRun.addCoverageApiTask(); - - datastoreTransactionalRetry(testPlanEntity, testEntityList); - } - - /** * Datastore Transactional process for data insertion with MAX_WRITE_RETRIES times and withXG of * false value * diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index da48606..0300f9e 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -6,10 +6,7 @@ </Console> </Appenders> <Loggers> - <Logger name="com.android.vts" level="trace"> - <AppenderRef ref="Console"/> - </Logger> - <Root level="error"> + <Root level="trace"> <AppenderRef ref="Console"/> </Root> </Loggers> diff --git a/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java b/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java new file mode 100644 index 0000000..d4abd38 --- /dev/null +++ b/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java @@ -0,0 +1,59 @@ +/* + * 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.android.vts.util.ObjectifyTestBase; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.googlecode.objectify.ObjectifyService.factory; +import static org.junit.Assert.assertEquals; + +public class TestCaseRunEntityTest extends ObjectifyTestBase { + + @Test + public void saveTest() { + + factory().register(TestCaseRunEntity.class); + + List<Integer> results = Arrays.asList(1, 1, 1, 1, 1, 1, 1); + List<String> testCaseNames = + Arrays.asList( + "AudioEffectsFactoryTest.EnumerateEffects(default)_32bit", + "AudioEffectsFactoryTest.CreateEffect(default)_32bit", + "AudioEffectsFactoryTest.GetDescriptor(default)_32bit", + "AudioEffectsFactoryTest.DebugDumpArgument(default)_32bit", + "AudioEffectTest.Close(default)_32bit", + "AudioEffectTest.GetDescriptor(default)_32bit", + "AudioEffectTest.GetSetConfig(default)_32bit"); + + TestCaseRunEntity testCaseRunEntity = new TestCaseRunEntity(); + for (int index = 0; index < results.size(); index++) { + String testCaseName = testCaseNames.get(index); + int result = results.get(index); + testCaseRunEntity.addTestCase(testCaseName, result); + } + TestCaseRunEntity loadedTestCaseRunEntity = saveClearLoad(testCaseRunEntity); + + assertEquals(loadedTestCaseRunEntity.getTestCases().size(), results.size()); + assertEquals( + (Integer) loadedTestCaseRunEntity.getTestCases().get(0).result, results.get(0)); + assertEquals(loadedTestCaseRunEntity.getTestCases().get(0).name, testCaseNames.get(0)); + } +} diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml index efa1e35..98cfd73 100644 --- a/src/test/resources/log4j2-test.xml +++ b/src/test/resources/log4j2-test.xml @@ -6,10 +6,7 @@ </Console> </Appenders> <Loggers> - <Logger name="com.android.vts" level="trace"> - <AppenderRef ref="Console"/> - </Logger> - <Root level="error"> + <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> |