From 78b3bbb44e8258bf7d7095116b4ff23855203511 Mon Sep 17 00:00:00 2001 From: Young Gyu Park Date: Tue, 11 Sep 2018 15:50:48 +0900 Subject: Newly added entities for code coverage. Test: go/vts-web-staging Bug: 113356010 Change-Id: I50c5e8900da3c5e68f88244cc924aa9be8fcee23 --- .../com/android/vts/config/ObjectifyListener.java | 3 +- .../com/android/vts/entity/ApiCoverageEntity.java | 16 +++ .../com/android/vts/entity/CodeCoverageEntity.java | 126 +++++++++++++++++++++ .../android/vts/entity/CodeCoverageFileEntity.java | 101 +++++++++++++++++ .../android/vts/api/CoverageRestServletTest.java | 98 +++++++--------- .../android/vts/entity/CodeCoverageEntityTest.java | 46 ++++++++ .../vts/entity/CodeCoverageFileEntityTest.java | 42 +++++++ 7 files changed, 371 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/android/vts/entity/CodeCoverageEntity.java create mode 100644 src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java create mode 100644 src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java create mode 100644 src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java (limited to 'src') diff --git a/src/main/java/com/android/vts/config/ObjectifyListener.java b/src/main/java/com/android/vts/config/ObjectifyListener.java index 2c73e1f..2610ab8 100644 --- a/src/main/java/com/android/vts/config/ObjectifyListener.java +++ b/src/main/java/com/android/vts/config/ObjectifyListener.java @@ -17,6 +17,7 @@ package com.android.vts.config; import com.android.vts.entity.ApiCoverageEntity; +import com.android.vts.entity.CodeCoverageEntity; import com.android.vts.entity.CoverageEntity; import com.android.vts.entity.DeviceInfoEntity; import com.android.vts.entity.ProfilingPointEntity; @@ -33,7 +34,6 @@ import com.android.vts.entity.TestStatusEntity; import com.android.vts.entity.TestSuiteFileEntity; import com.android.vts.entity.TestSuiteResultEntity; import com.android.vts.entity.UserEntity; -import com.googlecode.objectify.Key; import com.googlecode.objectify.ObjectifyService; import java.util.Arrays; @@ -74,6 +74,7 @@ public class ObjectifyListener implements ServletContextListener { public void contextInitialized(ServletContextEvent servletContextEvent) { ObjectifyService.init(); ObjectifyService.register(ApiCoverageEntity.class); + ObjectifyService.register(CodeCoverageEntity.class); ObjectifyService.register(CoverageEntity.class); ObjectifyService.register(DeviceInfoEntity.class); ObjectifyService.register(TestCoverageStatusEntity.class); diff --git a/src/main/java/com/android/vts/entity/ApiCoverageEntity.java b/src/main/java/com/android/vts/entity/ApiCoverageEntity.java index beb772d..0a41743 100644 --- a/src/main/java/com/android/vts/entity/ApiCoverageEntity.java +++ b/src/main/java/com/android/vts/entity/ApiCoverageEntity.java @@ -127,6 +127,22 @@ public class ApiCoverageEntity { this.coveredHalApi = coveredHalApi; } + /** + * Constructor function for ApiCoverageEntity Class with objectify Key. + */ + public ApiCoverageEntity(Key testRunKey, String halPackageName, + int halVersionMajor, int halVersionMinor, String halInterfaceName, + List halApi, List coveredHalApi) { + this.parent = testRunKey; + + this.halPackageName = halPackageName; + this.halMajorVersion = halVersionMajor; + this.halMinorVersion = halVersionMinor; + this.halInterfaceName = halInterfaceName; + this.halApi = halApi; + this.coveredHalApi = coveredHalApi; + } + /** * Get objectify Key from datastore Key type */ diff --git a/src/main/java/com/android/vts/entity/CodeCoverageEntity.java b/src/main/java/com/android/vts/entity/CodeCoverageEntity.java new file mode 100644 index 0000000..63034ef --- /dev/null +++ b/src/main/java/com/android/vts/entity/CodeCoverageEntity.java @@ -0,0 +1,126 @@ +/* + * 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.UrlUtil; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.google.appengine.api.datastore.KeyFactory; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.googlecode.objectify.Key; + +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 com.googlecode.objectify.annotation.Parent; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.googlecode.objectify.ObjectifyService.ofy; + +/** Entity Class for CodeCoverageEntity */ +@Cache +@Entity(name = "CodeCoverage") +@EqualsAndHashCode(of = "id") +@NoArgsConstructor +@JsonAutoDetect(fieldVisibility = Visibility.ANY) +@JsonIgnoreProperties({"id", "parent"}) +public class CodeCoverageEntity { + protected static final Logger logger = Logger.getLogger(CodeCoverageEntity.class.getName()); + + public static final String KIND = "CodeCoverage"; + + public static final String COVERED_LINE_COUNT = "coveredLineCount"; + public static final String TOTAL_LINE_COUNT = "totalLineCount"; + + /** CodeCoverageEntity id field */ + @Id @Getter @Setter long id; + + @Parent @Getter Key parent; + + @Index @Getter @Setter private long coveredLineCount; + + @Index @Getter @Setter private long totalLineCount; + + /** When this record was created or updated */ + @Index Date updated; + + /** Constructor function for ApiCoverageEntity Class */ + public CodeCoverageEntity( + com.google.appengine.api.datastore.Key testRunKey, + long coveredLineCount, + long totalLineCount) { + + this.parent = getParentKey(testRunKey); + + this.coveredLineCount = coveredLineCount; + this.totalLineCount = totalLineCount; + } + + /** Constructor function for ApiCoverageEntity Class with objectify key*/ + public CodeCoverageEntity(Key testRunKey, long coveredLineCount, long totalLineCount) { + this.parent = testRunKey; + this.coveredLineCount = coveredLineCount; + this.totalLineCount = totalLineCount; + } + + /** Get objectify Key from datastore Key type */ + private Key getParentKey(com.google.appengine.api.datastore.Key testRunKey) { + Key testParentKey = Key.create(TestEntity.class, testRunKey.getParent().getName()); + return Key.create(testParentKey, TestRunEntity.class, testRunKey.getId()); + } + + /** Get UrlSafeKey from ApiCoverageEntity Information */ + public String getUrlSafeKey() { + Key uuidKey = Key.create(this.parent, CodeCoverageEntity.class, this.id); + return uuidKey.toUrlSafe(); + } + + /** Saving function for the instance of this class */ + public Key save() { + this.id = this.getParent().getId(); + this.updated = new Date(); + return ofy().save().entity(this).now(); + } + + public com.google.appengine.api.datastore.Entity toEntity() { + com.google.appengine.api.datastore.Key testKey = + KeyFactory.createKey(TestEntity.KIND, this.getParent().getParent().getName()); + com.google.appengine.api.datastore.Key testRunKey = + KeyFactory.createKey(testKey, TestRunEntity.KIND, this.getParent().getId()); + com.google.appengine.api.datastore.Key codeCoverageKey = + KeyFactory.createKey(testRunKey, KIND, this.getParent().getId()); + + com.google.appengine.api.datastore.Entity codeCoverageEntity = + new com.google.appengine.api.datastore.Entity(codeCoverageKey); + codeCoverageEntity.setProperty(COVERED_LINE_COUNT, this.coveredLineCount); + codeCoverageEntity.setProperty(TOTAL_LINE_COUNT, this.totalLineCount); + codeCoverageEntity.setIndexedProperty("updated", new Date()); + return codeCoverageEntity; + } +} diff --git a/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java b/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java new file mode 100644 index 0000000..cb6d06c --- /dev/null +++ b/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java @@ -0,0 +1,101 @@ +/* + * 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.Key; + +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 com.googlecode.objectify.annotation.Parent; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +import static com.googlecode.objectify.ObjectifyService.ofy; + +/** Entity Class for CodeCoverageFile */ +@Cache +@Entity(name = "CodeCoverageFile") +@EqualsAndHashCode(of = "id") +@NoArgsConstructor +public class CodeCoverageFileEntity { + + /** CodeCoverageFileEntity testName field */ + @Id + @Getter @Setter long id; + + @Parent + @Getter @Setter private Key coverageParent; + + /** CodeCoverageFileEntity filePath field */ + @Getter @Setter String filePath; + + /** CodeCoverageFileEntity group field */ + @Getter @Setter String group; + + /** CodeCoverageFileEntity lineCoverage field */ + @Getter @Setter List lineCoverage; + + /** CodeCoverageFileEntity coveredCount field */ + @Getter @Setter long coveredCount; + + /** CodeCoverageFileEntity totalCount field */ + @Getter @Setter long totalCount; + + /** CodeCoverageFileEntity projectName field */ + @Getter @Setter String projectName; + + /** CodeCoverageFileEntity projectVersion field */ + @Getter @Setter String projectVersion; + + /** CodeCoverageFileEntity isIgnored field */ + @Index + @Getter @Setter Boolean isIgnored; + + /** Constructor function for CodeCoverageFileEntity Class */ + public CodeCoverageFileEntity( + long id, + Key coverageParent, + String filePath, + String group, + List lineCoverage, + long coveredCount, + long totalCount, + String projectName, + String projectVersion) { + this.id = id; + this.coverageParent = coverageParent; + this.filePath = filePath; + this.group = group; + this.lineCoverage = lineCoverage; + this.coveredCount = coveredCount; + this.totalCount = totalCount; + this.projectName = projectName; + this.projectVersion = projectVersion; + } + + /** Saving function for the instance of this class */ + public void save() { + this.isIgnored = false; + ofy().save().entity(this).now(); + } +} diff --git a/src/test/java/com/android/vts/api/CoverageRestServletTest.java b/src/test/java/com/android/vts/api/CoverageRestServletTest.java index ed3d0d2..f900f79 100644 --- a/src/test/java/com/android/vts/api/CoverageRestServletTest.java +++ b/src/test/java/com/android/vts/api/CoverageRestServletTest.java @@ -21,81 +21,47 @@ import static org.mockito.Mockito.when; import static com.googlecode.objectify.ObjectifyService.factory; import com.android.vts.entity.ApiCoverageEntity; +import com.android.vts.entity.TestEntity; +import com.android.vts.entity.TestRunEntity; import com.android.vts.util.ObjectifyTestBase; -import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; -import com.google.appengine.tools.development.testing.LocalServiceTestHelper; -import com.google.cloud.datastore.Datastore; -import com.google.cloud.datastore.DatastoreOptions; import com.google.gson.Gson; import com.google.gson.internal.LinkedTreeMap; -import com.googlecode.objectify.ObjectifyFactory; -import com.googlecode.objectify.ObjectifyService; -import com.googlecode.objectify.util.Closeable; +import com.googlecode.objectify.Key; import java.io.IOException; -import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Arrays; -import java.util.Properties; +import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; public class CoverageRestServletTest extends ObjectifyTestBase { - private final LocalServiceTestHelper helper = - new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); - - protected Closeable session; - private Gson gson; - @Mock HttpServletRequest request; - - @Mock HttpServletResponse response; - - @BeforeClass - public static void setUpBeforeClass() {} + @Mock + private HttpServletRequest request; - @Before - public void setUp() throws Exception { - InputStream configIs = - this.getClass().getClassLoader().getResourceAsStream("config.properties"); - - Properties prop = new Properties(); - prop.load(configIs); + @Mock + private HttpServletResponse response; + /** It be executed before each @Test method */ + @BeforeEach + void setUpExtra() { gson = new Gson(); - MockitoAnnotations.initMocks(this); - - this.helper.setUp(); - - Datastore datastore = - DatastoreOptions.newBuilder() - .setProjectId(prop.getProperty("testProjectID")) - .build() - .getService(); - - ObjectifyService.init(new ObjectifyFactory(datastore)); - ObjectifyService.register(ApiCoverageEntity.class); - ObjectifyService.begin(); - - this.session = ObjectifyService.begin(); - } - - @After - public void tearDown() { - this.session.close(); - this.helper.tearDown(); + /******** + System.getenv().forEach((k,v) -> { + System.out.println("key => " + k); + System.out.println("value => " + v); + }); + *********/ } @Test @@ -103,14 +69,26 @@ public class CoverageRestServletTest extends ObjectifyTestBase { factory().register(ApiCoverageEntity.class); + List halApi = Arrays.asList("allocate", "dumpDebugInfo"); + List coveredHalApi = Arrays.asList("allocate", "dumpDebugInfo"); + + Key testParentKey = Key.create(TestEntity.class, "test1"); + Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1); + ApiCoverageEntity apiCoverageEntity = + new ApiCoverageEntity( + testRunParentKey, + "android.hardware.graphics.allocator", + 4, + 1, + "IAllocator", + halApi, + coveredHalApi); + apiCoverageEntity.save(); + + String key = apiCoverageEntity.getUrlSafeKey(); + when(request.getPathInfo()).thenReturn("/api/data"); - String key = - "partition_id+%7B%0A++project_id%3A+%22android-vts-staging%22%0A%7D%0Apath+%7B%0A" - + "++kind%3A+%22Test%22%0A++name%3A+%22VtsHalGraphicsMapperV2_0TargetProfiling" - + "%22%0A%7D%0Apath+%7B%0A++kind%3A+%22TestRun%22%0A++id%3A+1534552828906226%0A%7D%0A" - + "path+%7B%0A++kind%3A+%22ApiCoverage%22%0A" - + "++name%3A+%221f529291-f1c3-4d9b-ba60-48525fe7c376%22%0A%7D%0A"; when(request.getParameter("key")).thenReturn(key); StringWriter sw = new StringWriter(); @@ -124,11 +102,11 @@ public class CoverageRestServletTest extends ObjectifyTestBase { LinkedTreeMap resultMap = gson.fromJson(result, LinkedTreeMap.class); - assertEquals(resultMap.get("id"), "1f529291-f1c3-4d9b-ba60-48525fe7c376"); assertEquals(resultMap.get("halInterfaceName"), "IAllocator"); assertEquals(resultMap.get("halPackageName"), "android.hardware.graphics.allocator"); assertEquals(resultMap.get("halApi"), Arrays.asList("allocate", "dumpDebugInfo")); assertEquals(resultMap.get("coveredHalApi"), Arrays.asList("allocate", "dumpDebugInfo")); } + } diff --git a/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java b/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java new file mode 100644 index 0000000..47631c0 --- /dev/null +++ b/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java @@ -0,0 +1,46 @@ +package com.android.vts.entity; + +import com.android.vts.util.ObjectifyTestBase; +import com.google.appengine.api.datastore.Entity; +import com.googlecode.objectify.Key; +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; +import static org.junit.Assert.assertTrue; + +public class CodeCoverageEntityTest extends ObjectifyTestBase { + + @Test + public void saveTest() { + factory().register(CodeCoverageEntity.class); + + Key testParentKey = Key.create(TestEntity.class, "test1"); + Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1); + + CodeCoverageEntity codeCoverageEntity = new CodeCoverageEntity(testRunParentKey, 1000, 3500); + codeCoverageEntity.save(); + + assertEquals(codeCoverageEntity.getCoveredLineCount(), 1000); + assertEquals(codeCoverageEntity.getTotalLineCount(), 3500); + } + + @Test + public void getUrlSafeKeyTest() { + factory().register(CodeCoverageEntity.class); + + Key testParentKey = Key.create(TestEntity.class, "test1"); + Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1); + + CodeCoverageEntity codeCoverageEntity = new CodeCoverageEntity(testRunParentKey, 1000, 3500); + codeCoverageEntity.save(); + + String urlKey = + "kind%3A+%22Test%22%0A++name%3A+%22test1%22%0A%7D%0Apath+%7B%0A++kind%3A+%22TestRun%22%0A++id%3A+1%0A%7D%0Apath+%7B%0A++kind%3A+%22CodeCoverage%22%0A++id%3A+1%0A%7D%0A"; + assertTrue(codeCoverageEntity.getUrlSafeKey().endsWith(urlKey)); + } + +} diff --git a/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java b/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java new file mode 100644 index 0000000..1bbdd9e --- /dev/null +++ b/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java @@ -0,0 +1,42 @@ +package com.android.vts.entity; + +import com.android.vts.util.ObjectifyTestBase; +import com.googlecode.objectify.Key; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.googlecode.objectify.ObjectifyService.factory; +import static com.googlecode.objectify.ObjectifyService.ofy; +import static org.junit.Assert.assertEquals; + +public class CodeCoverageFileEntityTest extends ObjectifyTestBase { + + @Test + public void saveTest() { + + factory().register(CodeCoverageFileEntity.class); + + Key testParentKey = Key.create(TestEntity.class, "test1"); + Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1); + + List lineCoverage = Arrays.asList(-1L, -1L, -1L, 4L, 2L, 0L); + CodeCoverageFileEntity codeCoverageFileEntity = new CodeCoverageFileEntity( + 10000, + testRunParentKey, + "audio/12.0/DevicesFile.h", + "", + lineCoverage, + 10020, + 40030, + "platform/hardware/interfaces", + "e8d6e9385a64b742ad1952c6d9"); + codeCoverageFileEntity.save(); + + CodeCoverageFileEntity loadCodeCoverageFileEntity = ofy().load().type(CodeCoverageFileEntity.class).first().now(); + + assertEquals(loadCodeCoverageFileEntity, codeCoverageFileEntity); + } + +} -- cgit v1.2.3