1 /*
2  * Copyright (c) 2017 Google Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you
5  * may not use this file except in compliance with the License. You may
6  * obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13  * implied. See the License for the specific language governing
14  * permissions and limitations under the License.
15  */
16 
17 package com.android.vts.util;
18 
19 import com.android.vts.entity.DeviceInfoEntity;
20 import com.android.vts.entity.TestRunEntity;
21 import com.google.gson.JsonObject;
22 import com.google.gson.JsonPrimitive;
23 import java.util.ArrayList;
24 import java.util.List;
25 import org.apache.commons.lang.StringUtils;
26 
27 /** Helper object for describing test results data. */
28 public class TestRunMetadata {
29     private static final String TEST_RUN = "testRun";
30     private static final String TEST_DETAILS = "testDetails";
31     private static final String DEVICE_INFO = "deviceInfo";
32     private static final String ABI_INFO = "abiInfo";
33     public final TestRunEntity testRun;
34 
35     private final List<DeviceInfoEntity> devices;
36     private String deviceInfo;
37     private String abiInfo;
38     private TestRunDetails details;
39 
40     /**
41      * Create a test metadata object.
42      *
43      * @param testName The name of the test.
44      * @param testRun The test run entity storing run information.
45      * @param devices The list of device entities describing the test run.
46      */
TestRunMetadata(String testName, TestRunEntity testRun, List<DeviceInfoEntity> devices)47     public TestRunMetadata(String testName, TestRunEntity testRun, List<DeviceInfoEntity> devices) {
48         this.testRun = testRun;
49         this.deviceInfo = "";
50         this.abiInfo = "";
51         this.details = null;
52         this.devices = devices;
53     }
54 
55     /**
56      * Create a test metadata object.
57      *
58      * @param testName The name of the test.
59      * @param testRun The test run entity storing run information.
60      */
TestRunMetadata(String testName, TestRunEntity testRun)61     public TestRunMetadata(String testName, TestRunEntity testRun) {
62         this(testName, testRun, new ArrayList<DeviceInfoEntity>());
63     }
64 
65     /**
66      * Add a device info to the test run metadata.
67      *
68      * @param device The entity to add.
69      */
addDevice(DeviceInfoEntity device)70     public void addDevice(DeviceInfoEntity device) {
71         this.devices.add(device);
72     }
73 
74     /** Get device information for the test run and add it to the metadata message. */
processDeviceInfo()75     private void processDeviceInfo() {
76         List<String> deviceInfoList = new ArrayList<>();
77         List<String> abiInfoList = new ArrayList<>();
78 
79         for (DeviceInfoEntity device : this.devices) {
80             String abi = "";
81             String abiName = device.getAbiName();
82             String abiBitness = device.getAbiBitness();
83             if (abiName.length() > 0) {
84                 abi += abiName;
85                 if (abiBitness.length() > 0) {
86                     abi += " (" + abiBitness + " bit)";
87                 }
88             }
89             abiInfoList.add(abi);
90             deviceInfoList.add(device.getFingerprint());
91         }
92         this.abiInfo = StringUtils.join(abiInfoList, ", ");
93         this.deviceInfo = StringUtils.join(deviceInfoList, ", ");
94     }
95 
96     /**
97      * Get the device info string in the test metadata.
98      *
99      * @return The string descriptor of the devices used in the test run.
100      */
getDeviceInfo()101     public String getDeviceInfo() {
102         return this.deviceInfo;
103     }
104 
105     /**
106      * Get the test run details (e.g. test case information) for the test run.
107      *
108      * @return The TestRunDetails object stored in the metadata, or null if not set.
109      */
getDetails()110     public TestRunDetails getDetails() {
111         return this.details;
112     }
113 
114     /**
115      * Add test case details to the metadata object.
116      *
117      * <p>Used for prefetching details on initial page load.
118      *
119      * @param details The TestRunDetails object storing test case results for the test run.
120      */
addDetails(TestRunDetails details)121     public void addDetails(TestRunDetails details) {
122         this.details = details;
123     }
124 
125     /**
126      * Serializes the test run metadata to json format.
127      *
128      * @return A JsonElement object representing the details object.
129      */
toJson()130     public JsonObject toJson() {
131         processDeviceInfo();
132         JsonObject json = new JsonObject();
133         json.add(DEVICE_INFO, new JsonPrimitive(this.deviceInfo));
134         json.add(ABI_INFO, new JsonPrimitive(this.abiInfo));
135         json.add(TEST_RUN, this.testRun.toJson());
136         if (this.details != null) {
137             json.add(TEST_DETAILS, this.details.toJson());
138         }
139         return json;
140     }
141 }
142