1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may 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 implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.compatibility.common.util;
18 
19 import com.android.tradefed.build.IBuildInfo;
20 
21 import java.util.concurrent.ConcurrentHashMap;
22 
23 /**
24  * A simple in-memory store for metrics results. This should be used for hostside metrics reporting.
25  */
26 public class MetricsStore {
27 
28     // needs concurrent version as there can be multiple client accessing this.
29     // But there is no additional protection for the same key as that should not happen.
30     private static final ConcurrentHashMap<String, ReportLog> mMap =
31             new ConcurrentHashMap<String, ReportLog>();
32 
33     private static final String START_TIME_TAG = "START_TIME_MS";
34 
MetricsStore()35     private MetricsStore() {}
36 
37     /**
38      * Stores a result. Existing result with the same key will be replaced.
39      * Note that key is generated in the form of start_time#class#method name.
40      * So there should be no concurrent test for the same (serial, class, method).
41      * @param buildInfo
42      * @param abi
43      * @param classMethodName
44      * @param reportLog Contains the result to be stored
45      */
storeResult(IBuildInfo buildInfo, String abi, String classMethodName, ReportLog reportLog)46     public static void storeResult(IBuildInfo buildInfo, String abi, String classMethodName,
47             ReportLog reportLog) {
48         String startTime = buildInfo.getBuildAttributes().get(START_TIME_TAG);
49         mMap.put(generateTestKey(startTime, abi, classMethodName), reportLog);
50     }
51 
52     /**
53      * retrieves a metric result for the given condition and remove it from the internal
54      * storage. If there is no result for the given condition, it will return null.
55      */
removeResult(IBuildInfo buildInfo, String abi, String classMethodName)56     public static ReportLog removeResult(IBuildInfo buildInfo, String abi, String classMethodName) {
57         String startTime = buildInfo.getBuildAttributes().get(START_TIME_TAG);
58         return mMap.remove(generateTestKey(startTime, abi, classMethodName));
59     }
60 
61     /**
62      * @return test key in the form of start_time#abi#class_name#method_name
63      */
generateTestKey(String startTime, String abi, String classMethodName)64     private static String generateTestKey(String startTime, String abi, String classMethodName) {
65         return String.format("%s#%s#%s", startTime, abi, classMethodName);
66     }
67 }
68