LogMakerTest.java revision a7c1b80f5ffda9866f570658460df5a67a84c08e
1/*
2 * Copyright (C) 2017 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 */
16package android.metrics;
17
18import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
19import junit.framework.TestCase;
20
21public class LogMakerTest extends TestCase {
22
23    public void testSerialize() {
24        LogMaker builder = new LogMaker(0);
25        builder.addTaggedData(1, "one");
26        builder.addTaggedData(2, "two");
27        Object[] out = builder.serialize();
28        assertEquals(1, out[0]);
29        assertEquals("one", out[1]);
30        assertEquals(2, out[2]);
31        assertEquals("two", out[3]);
32    }
33
34    public void testSerializeDeserialize() {
35        int category = 10;
36        int type = 11;
37        int subtype = 12;
38        long timestamp = 1484669007890L;
39        String packageName = "com.foo.bar";
40        String counterName = "sheep";
41        int bucket = 13;
42        int value = 14;
43
44        LogMaker builder = new LogMaker(category);
45        builder.setType(type);
46        builder.setSubtype(subtype);
47        builder.setTimestamp(timestamp);
48        builder.setPackageName(packageName);
49        builder.setCounterName(counterName);
50        builder.setCounterBucket(bucket);
51        builder.setCounterValue(value);
52        builder.addTaggedData(1, "one");
53        builder.addTaggedData(2, "two");
54
55        Object[] out = builder.serialize();
56        LogMaker parsed = new LogMaker(out);
57
58        assertEquals(category, parsed.getCategory());
59        assertEquals(type, parsed.getType());
60        assertEquals(subtype, parsed.getSubtype());
61        assertEquals(timestamp, parsed.getTimestamp());
62        assertEquals(packageName, parsed.getPackageName());
63        assertEquals(counterName, parsed.getCounterName());
64        assertEquals(bucket, parsed.getCounterBucket());
65        assertEquals(value, parsed.getCounterValue());
66        assertEquals("one", parsed.getTaggedData(1));
67        assertEquals("two", parsed.getTaggedData(2));
68    }
69
70    public void testIntBucket() {
71        LogMaker builder = new LogMaker(0);
72        builder.setCounterBucket(100);
73        assertEquals(100, builder.getCounterBucket());
74        assertEquals(false, builder.isLongCounterBucket());
75    }
76
77    public void testLongBucket() {
78        long longBucket = Long.MAX_VALUE;
79        LogMaker builder = new LogMaker(0);
80        builder.setCounterBucket(longBucket);
81        assertEquals(longBucket, builder.getCounterBucket());
82        assertEquals(true, builder.isLongCounterBucket());
83    }
84
85    public void testInvalidInputThrows() {
86        LogMaker builder = new LogMaker(0);
87        boolean threw = false;
88        try {
89            builder.addTaggedData(0, new Object());
90        } catch (IllegalArgumentException e) {
91            threw = true;
92        }
93        assertTrue(threw);
94        assertEquals(2, builder.serialize().length);
95    }
96
97    public void testValidInputTypes() {
98        LogMaker builder = new LogMaker(0);
99        builder.addTaggedData(1, "onetwothree");
100        builder.addTaggedData(2, 123);
101        builder.addTaggedData(3, 123L);
102        builder.addTaggedData(4, 123.0F);
103        builder.addTaggedData(5, null);
104        Object[] out = builder.serialize();
105        assertEquals("onetwothree", out[1]);
106        assertEquals(123, out[3]);
107        assertEquals(123L, out[5]);
108        assertEquals(123.0F, out[7]);
109    }
110
111    public void testCategoryDefault() {
112        LogMaker builder = new LogMaker(10);
113        Object[] out = builder.serialize();
114        assertEquals(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY, out[0]);
115        assertEquals(10, out[1]);
116    }
117
118    public void testClearData() {
119        LogMaker builder = new LogMaker(0);
120        builder.addTaggedData(1, "onetwothree");
121        builder.clearTaggedData(1);
122        assertEquals(null, builder.getTaggedData(1));
123    }
124
125    public void testClearFieldLeavesOtherFieldsIntact() {
126        LogMaker builder = new LogMaker(0);
127        builder.setPackageName("package.name");
128        builder.setSubtype(10);
129        builder.clearPackageName();
130        assertEquals(null, builder.getPackageName());
131        assertEquals(10, builder.getSubtype());
132    }
133
134    public void testSetAndClearCategory() {
135        LogMaker builder = new LogMaker(0);
136        builder.setCategory(MetricsEvent.MAIN_SETTINGS);
137        assertEquals(MetricsEvent.MAIN_SETTINGS, builder.getCategory());
138        builder.clearCategory();
139        assertEquals(MetricsEvent.VIEW_UNKNOWN, builder.getCategory());
140    }
141
142    public void testSetAndClearType() {
143        LogMaker builder = new LogMaker(0);
144        builder.setType(MetricsEvent.TYPE_OPEN);
145        assertEquals(MetricsEvent.TYPE_OPEN, builder.getType());
146        builder.clearType();
147        assertEquals(MetricsEvent.TYPE_UNKNOWN, builder.getType());
148    }
149
150    public void testSetAndClearSubtype() {
151        LogMaker builder = new LogMaker(0);
152        builder.setSubtype(1);
153        assertEquals(1, builder.getSubtype());
154        builder.clearSubtype();
155        assertEquals(0, builder.getSubtype());
156    }
157
158    public void testSetAndClearTimestamp() {
159        LogMaker builder = new LogMaker(0);
160        builder.setTimestamp(1);
161        assertEquals(1, builder.getTimestamp());
162        builder.clearTimestamp();
163        assertEquals(0, builder.getTimestamp());
164    }
165
166    public void testSetAndClearPackageName() {
167        LogMaker builder = new LogMaker(0);
168        builder.setPackageName("package.name");
169        assertEquals("package.name", builder.getPackageName());
170        builder.clearPackageName();
171        assertEquals(null, builder.getPackageName());
172    }
173
174    public void testGiantLogOmitted() {
175        LogMaker badBuilder = new LogMaker(0);
176        StringBuilder b = new StringBuilder();
177        for (int i = 0; i < 4000; i++) {
178            b.append("test, " + i);
179        }
180        badBuilder.addTaggedData(100, b.toString());
181        assertTrue(badBuilder.serialize().length < LogMaker.MAX_SERIALIZED_SIZE);
182    }
183
184    public void testIdentityEquality() {
185        LogMaker a = new LogMaker(0);
186        a.addTaggedData(1, "onetwothree");
187        a.addTaggedData(2, 123);
188        a.addTaggedData(3, 123L);
189
190        assertTrue("objects should be equal to themselves", a.isSubsetOf(a));
191    }
192
193    public void testExactEquality() {
194        LogMaker a = new LogMaker(0);
195        a.addTaggedData(1, "onetwothree");
196        a.addTaggedData(2, 123);
197        a.addTaggedData(3, 123L);
198        LogMaker b = new LogMaker(0);
199        b.addTaggedData(1, "onetwothree");
200        b.addTaggedData(2, 123);
201        b.addTaggedData(3, 123L);
202
203        assertTrue("deep equality should be true", a.isSubsetOf(b));
204        assertTrue("deep equality shoudl be true", b.isSubsetOf(a));
205    }
206
207    public void testSubsetEquality() {
208        LogMaker a = new LogMaker(0);
209        a.addTaggedData(1, "onetwothree");
210        a.addTaggedData(2, 123);
211        LogMaker b = new LogMaker(0);
212        b.addTaggedData(1, "onetwothree");
213        b.addTaggedData(2, 123);
214        b.addTaggedData(3, 123L);
215
216        assertTrue("a is a strict subset of b", a.isSubsetOf(b));
217        assertTrue("b is not a strict subset of a", !b.isSubsetOf(a));
218    }
219
220    public void testInequality() {
221        LogMaker a = new LogMaker(0);
222        a.addTaggedData(1, "onetwofour");
223        a.addTaggedData(2, 1234);
224        LogMaker b = new LogMaker(0);
225        b.addTaggedData(1, "onetwothree");
226        b.addTaggedData(2, 123);
227        b.addTaggedData(3, 123L);
228
229        assertTrue("a is not a subset of b", !a.isSubsetOf(b));
230        assertTrue("b is not a subset of a", !b.isSubsetOf(a));
231    }
232
233    public void testWildcardEquality() {
234        LogMaker empty = new LogMaker(0);
235        empty.clearTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY);  //dirty trick
236        LogMaker b = new LogMaker(0);
237        b.addTaggedData(1, "onetwothree");
238        b.addTaggedData(2, 123);
239        b.addTaggedData(3, 123L);
240
241        assertTrue("empty builder is a subset of anything", empty.isSubsetOf(b));
242    }
243
244    public void testNullEquality() {
245        LogMaker a = new LogMaker(0);
246        a.addTaggedData(1, "onetwofour");
247        a.addTaggedData(2, 1234);
248
249        assertTrue("a is not a subset of null", !a.isSubsetOf(null));
250    }
251
252    public void testMajorCategory() {
253        LogMaker a = new LogMaker(1);
254        LogMaker b = new LogMaker(2);
255        assertFalse(a.isSubsetOf(b));
256        assertFalse(b.isSubsetOf(a));
257    }
258}
259