• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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