1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.test.metrics; 6 7 import androidx.test.filters.MediumTest; 8 9 import org.junit.Assert; 10 import org.junit.Test; 11 import org.junit.runner.RunWith; 12 13 import org.chromium.base.metrics.RecordHistogram; 14 import org.chromium.base.test.BaseJUnit4ClassRunner; 15 import org.chromium.base.test.util.Batch; 16 import org.chromium.base.test.util.HistogramWatcher; 17 18 /** 19 * Tests the {@link HistogramWatcher} test util before native load. 20 * 21 * Contains exclusive tests that aren't run in all scenarios. 22 * 23 * Both histogram snapshots are taken through CachingUmaRecorder, so the deltas are calculated 24 * across buckets of a single value, since CachingUmaRecorder stores the raw values. 25 */ 26 @RunWith(BaseJUnit4ClassRunner.class) 27 @Batch(Batch.PER_CLASS) 28 public class HistogramWatcherWithoutNativeTest extends HistogramWatcherTestBase { 29 @Test 30 @MediumTest testSingleRecordMissing_failure()31 public void testSingleRecordMissing_failure() { 32 doTestSingleRecordMissing_failure(TestScenario.WITHOUT_NATIVE); 33 } 34 35 @Test 36 @MediumTest testFourTimesHistograms_success()37 public void testFourTimesHistograms_success() { 38 doTestFourTimesHistograms_success(TestScenario.WITHOUT_NATIVE); 39 } 40 41 @Test 42 @MediumTest testExtraRecord_failure()43 public void testExtraRecord_failure() { 44 doTestExtraRecord_failure(TestScenario.WITHOUT_NATIVE); 45 } 46 47 @Test 48 @MediumTest testExtraRecordAllowed_success()49 public void testExtraRecordAllowed_success() { 50 doTestExtraRecordAllowed_success(TestScenario.WITHOUT_NATIVE); 51 } 52 53 @Test 54 @MediumTest testExtraRecordAllowed_failure()55 public void testExtraRecordAllowed_failure() { 56 doTestExtraRecordAllowed_failure(TestScenario.WITHOUT_NATIVE); 57 } 58 59 @Test 60 @MediumTest testExtraRecordAllowedAny_success()61 public void testExtraRecordAllowedAny_success() { 62 doTestExtraRecordAllowedAny_success(TestScenario.WITHOUT_NATIVE); 63 } 64 65 @Test 66 @MediumTest testExtraRecordAllowedAny_failure()67 public void testExtraRecordAllowedAny_failure() { 68 doTestExtraRecordAllowedAny_failure(TestScenario.WITHOUT_NATIVE); 69 } 70 71 @Test 72 @MediumTest testMissingRecord_failure()73 public void testMissingRecord_failure() { 74 doTestMissingLastRecord_failure(TestScenario.WITHOUT_NATIVE); 75 } 76 77 @Test 78 @MediumTest testExpectNoRecords_failure()79 public void testExpectNoRecords_failure() { 80 doTestExpectNoRecords_failure(TestScenario.WITHOUT_NATIVE); 81 } 82 83 @Test 84 @MediumTest testExpectAnyRecords_missing_failure()85 public void testExpectAnyRecords_missing_failure() { 86 doTestExpectAnyRecords_missing_failure(TestScenario.WITHOUT_NATIVE); 87 } 88 89 @Test 90 @MediumTest testExpectAnyRecords_extras_failure()91 public void testExpectAnyRecords_extras_failure() { 92 doTestExpectAnyRecords_extras_failure(TestScenario.WITHOUT_NATIVE); 93 } 94 95 @Test 96 @MediumTest testExpectAnyRecords_success()97 public void testExpectAnyRecords_success() { 98 doTestExpectAnyRecords_success(TestScenario.WITHOUT_NATIVE); 99 } 100 101 @Test 102 @MediumTest testMultipleHistograms_success()103 public void testMultipleHistograms_success() { 104 doTestMultipleHistograms_success(TestScenario.WITHOUT_NATIVE); 105 } 106 107 @Test 108 @MediumTest testMultipleHistograms_failure()109 public void testMultipleHistograms_failure() { 110 doTestMultipleHistograms_failure(TestScenario.WITHOUT_NATIVE); 111 } 112 113 @Test 114 @MediumTest testExpectIntRecords_success()115 public void testExpectIntRecords_success() { 116 doTestExpectIntRecords_success(TestScenario.WITHOUT_NATIVE); 117 } 118 119 @Test 120 @MediumTest testExpectIntRecords_failure()121 public void testExpectIntRecords_failure() { 122 doTestExpectIntRecords_failure(TestScenario.WITHOUT_NATIVE); 123 } 124 125 @Test 126 @MediumTest testIgnoreOtherHistograms_success()127 public void testIgnoreOtherHistograms_success() { 128 doTestIgnoreOtherHistograms_success(TestScenario.WITHOUT_NATIVE); 129 } 130 131 @Test 132 @MediumTest testMissingFirstRecord_failure()133 public void testMissingFirstRecord_failure() { 134 doTestMissingFirstRecord_failure(TestScenario.WITHOUT_NATIVE); 135 } 136 137 @Test 138 @MediumTest testMissingMiddleRecord_failure()139 public void testMissingMiddleRecord_failure() { 140 doTestMissingMiddleRecord_failure(TestScenario.WITHOUT_NATIVE); 141 } 142 143 // Exclusive tests 144 145 @Test 146 @MediumTest testCustomMessage()147 public void testCustomMessage() { 148 // Arrange 149 mWatcher = HistogramWatcher.newSingleRecordWatcher(BOOLEAN_HISTOGRAM, true); 150 151 // Act 152 RecordHistogram.recordBooleanHistogram(BOOLEAN_HISTOGRAM, false); 153 154 // Assert 155 String customMessage = "Test Custom Message"; 156 try { 157 mWatcher.assertExpected(customMessage); 158 } catch (AssertionError e) { 159 assertContains(customMessage, e.getMessage()); 160 assertContains(BOOLEAN_HISTOGRAM, e.getMessage()); 161 assertContains("1 record(s) expected: [1]", e.getMessage()); 162 assertContains("1 record(s) seen: [0]", e.getMessage()); 163 return; 164 } 165 Assert.fail("Expected AssertionError"); 166 } 167 168 @Test 169 @MediumTest testOutOfOrderExpectations_success()170 public void testOutOfOrderExpectations_success() { 171 // Arrange 172 mWatcher = 173 HistogramWatcher.newBuilder() 174 .expectIntRecord(TIMES_HISTOGRAM_1, 8000) 175 .expectIntRecord(TIMES_HISTOGRAM_1, 6000) 176 .expectIntRecord(TIMES_HISTOGRAM_1, 7000) 177 .build(); 178 179 // Act 180 RecordHistogram.recordTimesHistogram(TIMES_HISTOGRAM_1, 6000); 181 RecordHistogram.recordTimesHistogram(TIMES_HISTOGRAM_1, 7000); 182 RecordHistogram.recordTimesHistogram(TIMES_HISTOGRAM_1, 8000); 183 184 // Assert 185 mWatcher.assertExpected(); 186 } 187 188 @Test 189 @MediumTest testOutOfOrderExpectations_failure()190 public void testOutOfOrderExpectations_failure() { 191 // Arrange 192 mWatcher = 193 HistogramWatcher.newBuilder() 194 .expectIntRecord(TIMES_HISTOGRAM_1, 8000) 195 .expectIntRecord(TIMES_HISTOGRAM_1, 6000) 196 .expectIntRecord(TIMES_HISTOGRAM_1, 7000) 197 .build(); 198 199 // Act 200 RecordHistogram.recordTimesHistogram(TIMES_HISTOGRAM_1, 7000); 201 RecordHistogram.recordTimesHistogram(TIMES_HISTOGRAM_1, 8000); 202 203 // Assert 204 try { 205 mWatcher.assertExpected(); 206 } catch (AssertionError e) { 207 assertContains(TIMES_HISTOGRAM_1, e.getMessage()); 208 assertContains("3 record(s) expected: [6000, 7000, 8000]", e.getMessage()); 209 assertContains("2 record(s) seen: [7000, 8000]", e.getMessage()); 210 return; 211 } 212 Assert.fail("Expected AssertionError"); 213 } 214 215 @Test 216 @MediumTest testZeroCountExpectations_failure()217 public void testZeroCountExpectations_failure() { 218 try { 219 mWatcher = 220 HistogramWatcher.newBuilder() 221 .expectIntRecordTimes(TIMES_HISTOGRAM_1, 1, 0) 222 .build(); 223 } catch (IllegalArgumentException e) { 224 assertContains("zero", e.getMessage()); 225 return; 226 } 227 Assert.fail("Expected IllegalArgumentException"); 228 } 229 230 @Test 231 @MediumTest testNegativeCountExpectations_failure()232 public void testNegativeCountExpectations_failure() { 233 try { 234 mWatcher = 235 HistogramWatcher.newBuilder() 236 .expectIntRecordTimes(TIMES_HISTOGRAM_1, 1, -1) 237 .build(); 238 } catch (IllegalArgumentException e) { 239 assertContains("negative", e.getMessage()); 240 return; 241 } 242 Assert.fail("Expected IllegalArgumentException"); 243 } 244 245 @Test 246 @MediumTest testTryWithResources_success()247 public void testTryWithResources_success() { 248 try (HistogramWatcher ignored = HistogramWatcher.newSingleRecordWatcher(ENUM_HISTOGRAM)) { 249 RecordHistogram.recordEnumeratedHistogram(ENUM_HISTOGRAM, 0, 10); 250 } 251 } 252 253 @Test 254 @MediumTest testTryWithResources_failure()255 public void testTryWithResources_failure() { 256 try (HistogramWatcher ignored = HistogramWatcher.newSingleRecordWatcher(ENUM_HISTOGRAM)) { 257 } catch (AssertionError e) { 258 assertContains(ENUM_HISTOGRAM, e.getMessage()); 259 return; 260 } 261 Assert.fail("Expected AssertionError"); 262 } 263 } 264