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