1 /*
2  * Copyright (C) 2016 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 android.os.health.cts;
18 
19 import android.os.Parcel;
20 import android.os.health.HealthKeys;
21 import android.os.health.HealthStats;
22 import android.os.health.HealthStatsParceler;
23 import android.os.health.HealthStatsWriter;
24 import android.os.health.TimerStat;
25 import android.platform.test.annotations.AppModeSdkSandbox;
26 
27 import androidx.test.filters.SmallTest;
28 
29 import junit.framework.Assert;
30 import junit.framework.TestCase;
31 
32 import java.util.Map;
33 
34 /**
35  * Provides test cases for android.os.health.HealthStats and HealthStatsWriter.
36  */
37 @AppModeSdkSandbox(reason = "Allow test in the SDK sandbox (does not prevent other modes).")
38 public class HealthStatsTest extends TestCase {
39     @HealthKeys.Constant(type=HealthKeys.TYPE_TIMER)
40     public static final int TIMER_0 = 10;
41 
42     @HealthKeys.Constant(type=HealthKeys.TYPE_TIMER)
43     public static final int TIMER_1 = 11;
44 
45     @HealthKeys.Constant(type=HealthKeys.TYPE_MEASUREMENT)
46     public static final int MEASUREMENT_0 = 20;
47 
48     @HealthKeys.Constant(type=HealthKeys.TYPE_MEASUREMENT)
49     public static final int MEASUREMENT_1 = 21;
50 
51     @HealthKeys.Constant(type=HealthKeys.TYPE_MEASUREMENT)
52     public static final int MEASUREMENT_2 = 21;
53 
54     @HealthKeys.Constant(type=HealthKeys.TYPE_STATS)
55     public static final int STATS_0 = 30;
56 
57     @HealthKeys.Constant(type=HealthKeys.TYPE_TIMERS)
58     public static final int TIMERS_0 = 30;
59 
60     @HealthKeys.Constant(type=HealthKeys.TYPE_MEASUREMENTS)
61     public static final int MEASUREMENTS_0 = 40;
62 
63     @HealthKeys.Constant(type=HealthKeys.TYPE_MEASUREMENTS)
64     public static final int MEASUREMENTS_1 = 41;
65 
66 
67     public static final HealthKeys.Constants CONSTANTS
68             = new HealthKeys.Constants(HealthStatsTest.class);
69 
70     /**
71      * Check all the fields.
72      */
checkHealthStats(HealthStats readback)73     private void checkHealthStats(HealthStats readback) {
74         // Header fields
75         Assert.assertEquals("HealthStatsTest", readback.getDataType());
76 
77 
78         // TimerStat fields
79         Assert.assertEquals(2, readback.getTimerKeyCount());
80 
81         Assert.assertEquals(TIMER_0, readback.getTimerKeyAt(0));
82         Assert.assertTrue(readback.hasTimer(TIMER_0));
83         Assert.assertEquals(1, readback.getTimerCount(TIMER_0));
84         Assert.assertEquals(100, readback.getTimerTime(TIMER_0));
85 
86         Assert.assertEquals(TIMER_1, readback.getTimerKeyAt(1));
87         Assert.assertTrue(readback.hasTimer(TIMER_1));
88         Assert.assertEquals(Integer.MAX_VALUE, readback.getTimerCount(TIMER_1));
89         Assert.assertEquals(Long.MAX_VALUE, readback.getTimerTime(TIMER_1));
90 
91         Assert.assertEquals(Integer.MAX_VALUE, readback.getTimer(TIMER_1).getCount());
92         Assert.assertEquals(Long.MAX_VALUE, readback.getTimer(TIMER_1).getTime());
93 
94 
95         // Measurement fields
96         Assert.assertEquals(2, readback.getMeasurementKeyCount());
97 
98         Assert.assertEquals(MEASUREMENT_0, readback.getMeasurementKeyAt(0));
99         Assert.assertTrue(readback.hasMeasurement(MEASUREMENT_0));
100         Assert.assertEquals(300, readback.getMeasurement(MEASUREMENT_0));
101 
102         Assert.assertEquals(MEASUREMENT_1, readback.getMeasurementKeyAt(1));
103         Assert.assertTrue(readback.hasMeasurement(MEASUREMENT_1));
104         Assert.assertEquals(Long.MAX_VALUE, readback.getMeasurement(MEASUREMENT_1));
105 
106 
107         // Stats fields
108         Assert.assertEquals(1, readback.getStatsKeyCount());
109 
110         Assert.assertEquals(STATS_0, readback.getStatsKeyAt(0));
111         Assert.assertTrue(readback.hasStats(STATS_0));
112 
113         final Map<String,HealthStats> stats = readback.getStats(STATS_0);
114         Assert.assertEquals(1, stats.size());
115         final HealthStats child = stats.get("a");
116         Assert.assertEquals(0, child.getTimerKeyCount());
117         Assert.assertEquals(1, child.getMeasurementKeyCount());
118         Assert.assertEquals(Long.MIN_VALUE, child.getMeasurement(MEASUREMENT_2));
119         Assert.assertEquals(0, child.getStatsKeyCount());
120         Assert.assertEquals(0, child.getTimersKeyCount());
121 
122 
123         // Timers fields
124         Assert.assertEquals(1, readback.getTimersKeyCount());
125 
126         Assert.assertEquals(TIMERS_0, readback.getTimersKeyAt(0));
127         Assert.assertTrue(readback.hasTimers(TIMERS_0));
128         final Map<String,TimerStat> timers = readback.getTimers(TIMERS_0);
129         Assert.assertEquals(1, timers.size());
130         Assert.assertEquals(200, timers.get("b").getCount());
131         Assert.assertEquals(400, timers.get("b").getTime());
132 
133 
134         // Measurements fields
135         Map<String,Long> measurements;
136         Assert.assertEquals(2, readback.getMeasurementsKeyCount());
137 
138         Assert.assertEquals(MEASUREMENTS_0, readback.getMeasurementsKeyAt(0));
139         Assert.assertTrue(readback.hasMeasurements(MEASUREMENTS_0));
140         measurements = readback.getMeasurements(MEASUREMENTS_0);
141         Assert.assertEquals(1, measurements.size());
142         Assert.assertEquals(800L, measurements.get("Z").longValue());
143 
144         Assert.assertEquals(MEASUREMENTS_1, readback.getMeasurementsKeyAt(1));
145         measurements = readback.getMeasurements(MEASUREMENTS_1);
146         Assert.assertTrue(readback.hasMeasurements(MEASUREMENTS_1));
147         Assert.assertEquals(2, measurements.size());
148         Assert.assertEquals(900L, measurements.get("Y").longValue());
149         Assert.assertEquals(901L, measurements.get("X").longValue());
150     }
151 
152     /**
153      * Tests parceling empty HealthStats.
154      */
155     @SmallTest
testParcelEmpty()156     public void testParcelEmpty() throws Exception {
157         final HealthStatsWriter writer = new HealthStatsWriter(CONSTANTS);
158 
159         Parcel parcel = Parcel.obtain();
160         writer.flattenToParcel(parcel);
161 
162         parcel.setDataPosition(0);
163 
164         HealthStats readback = new HealthStats(parcel);
165 
166         // Check that there is no more data in the parcel
167         Assert.assertEquals(0, parcel.dataAvail());
168         parcel.recycle();
169 
170         Assert.assertEquals(0, readback.getTimerKeyCount());
171         Assert.assertEquals(0, readback.getMeasurementKeyCount());
172         Assert.assertEquals(0, readback.getStatsKeyCount());
173         Assert.assertEquals(0, readback.getTimersKeyCount());
174         Assert.assertEquals(0, readback.getMeasurementsKeyCount());
175     }
176 
177 
178     /**
179      * Tests parceling HealthStats.
180      */
181     @SmallTest
testParcelling()182     public void testParcelling() throws Exception {
183         final HealthStatsWriter writer = new HealthStatsWriter(CONSTANTS);
184 
185         // TimerStat
186         writer.addTimer(TIMER_0, 1, 100);
187         writer.addTimer(TIMER_1, Integer.MAX_VALUE, Long.MAX_VALUE);
188 
189         // Measurement
190         writer.addMeasurement(MEASUREMENT_0, 300);
191         writer.addMeasurement(MEASUREMENT_1, Long.MAX_VALUE);
192 
193         // Stats
194         HealthStatsWriter writer2 = new HealthStatsWriter(CONSTANTS);
195         writer2.addMeasurement(MEASUREMENT_2, Long.MIN_VALUE);
196         writer.addStats(STATS_0, "a", writer2);
197 
198         // Timers
199         writer.addTimers(TIMERS_0, "b", new TimerStat(200, 400));
200 
201         // Measurements
202         writer.addMeasurements(MEASUREMENTS_0, "Z", 800);
203         writer.addMeasurements(MEASUREMENTS_1, "Y", 900);
204         writer.addMeasurements(MEASUREMENTS_1, "X", 901);
205 
206 
207         // Parcel and unparcel it via HealthStatsWriter.writeToParcel.
208         Parcel parcel = Parcel.obtain();
209         writer.flattenToParcel(parcel);
210         parcel.setDataPosition(0);
211         HealthStats readback = new HealthStats(parcel);
212 
213         // Check that there is no more data in the parcel
214         Assert.assertEquals(0, parcel.dataAvail());
215         parcel.recycle();
216 
217         checkHealthStats(readback);
218     }
219 
220     /**
221      * Tests the HealthStatsParceler.
222      */
223     @SmallTest
testParceler()224     public void testParceler() throws Exception {
225         final HealthStatsWriter writer = new HealthStatsWriter(CONSTANTS);
226         writer.addMeasurement(MEASUREMENT_0, 300);
227 
228         final HealthStatsParceler parceler = new HealthStatsParceler(writer);
229 
230         final Parcel parcel = Parcel.obtain();
231         parceler.writeToParcel(parcel, 0);
232         parcel.setDataPosition(0);
233 
234         final HealthStatsParceler parceler2 = new HealthStatsParceler(parcel);
235 
236         // Check that there is no more data in the parcel
237         Assert.assertEquals(0, parcel.dataAvail());
238         parcel.recycle();
239 
240         final HealthStats readback = parceler2.getHealthStats();
241 
242         Assert.assertEquals(300, readback.getMeasurement(MEASUREMENT_0));
243 
244         // Should fail
245         try {
246             final Parcel parcel2 = Parcel.obtain();
247             parceler2.writeToParcel(parcel2, 0);
248             parcel2.recycle();
249             throw new Exception("Expected IndexOutOfBoundsException");
250         } catch (RuntimeException ex) {
251             // expected
252         }
253     }
254 }
255 
256