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 testSetAndClearPid() {
175        LogMaker builder = new LogMaker(0);
176        builder.setProcessId(1);
177        assertEquals(1, builder.getProcessId());
178        builder.clearProcessId();
179        assertEquals(-1, builder.getProcessId());
180    }
181
182    public void testSetAndClearUid() {
183        LogMaker builder = new LogMaker(0);
184        builder.setUid(1);
185        assertEquals(1, builder.getUid());
186        builder.clearUid();
187        assertEquals(-1, builder.getUid());
188    }
189
190    public void testGiantLogOmitted() {
191        LogMaker badBuilder = new LogMaker(0);
192        StringBuilder b = new StringBuilder();
193        for (int i = 0; i < 4000; i++) {
194            b.append("test, " + i);
195        }
196        badBuilder.addTaggedData(100, b.toString());
197        assertTrue(badBuilder.serialize().length < LogMaker.MAX_SERIALIZED_SIZE);
198    }
199
200    public void testIdentityEquality() {
201        LogMaker a = new LogMaker(0);
202        a.addTaggedData(1, "onetwothree");
203        a.addTaggedData(2, 123);
204        a.addTaggedData(3, 123L);
205
206        assertTrue("objects should be equal to themselves", a.isSubsetOf(a));
207    }
208
209    public void testExactEquality() {
210        LogMaker a = new LogMaker(0);
211        a.addTaggedData(1, "onetwothree");
212        a.addTaggedData(2, 123);
213        a.addTaggedData(3, 123L);
214        LogMaker b = new LogMaker(0);
215        b.addTaggedData(1, "onetwothree");
216        b.addTaggedData(2, 123);
217        b.addTaggedData(3, 123L);
218
219        assertTrue("deep equality should be true", a.isSubsetOf(b));
220        assertTrue("deep equality shoudl be true", b.isSubsetOf(a));
221    }
222
223    public void testSubsetEquality() {
224        LogMaker a = new LogMaker(0);
225        a.addTaggedData(1, "onetwothree");
226        a.addTaggedData(2, 123);
227        LogMaker b = new LogMaker(0);
228        b.addTaggedData(1, "onetwothree");
229        b.addTaggedData(2, 123);
230        b.addTaggedData(3, 123L);
231
232        assertTrue("a is a strict subset of b", a.isSubsetOf(b));
233        assertTrue("b is not a strict subset of a", !b.isSubsetOf(a));
234    }
235
236    public void testInequality() {
237        LogMaker a = new LogMaker(0);
238        a.addTaggedData(1, "onetwofour");
239        a.addTaggedData(2, 1234);
240        LogMaker b = new LogMaker(0);
241        b.addTaggedData(1, "onetwothree");
242        b.addTaggedData(2, 123);
243        b.addTaggedData(3, 123L);
244
245        assertTrue("a is not a subset of b", !a.isSubsetOf(b));
246        assertTrue("b is not a subset of a", !b.isSubsetOf(a));
247    }
248
249    public void testWildcardEquality() {
250        LogMaker empty = new LogMaker(0);
251        empty.clearTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY);  //dirty trick
252        LogMaker b = new LogMaker(0);
253        b.addTaggedData(1, "onetwothree");
254        b.addTaggedData(2, 123);
255        b.addTaggedData(3, 123L);
256
257        assertTrue("empty builder is a subset of anything", empty.isSubsetOf(b));
258    }
259
260    public void testNullEquality() {
261        LogMaker a = new LogMaker(0);
262        a.addTaggedData(1, "onetwofour");
263        a.addTaggedData(2, 1234);
264
265        assertTrue("a is not a subset of null", !a.isSubsetOf(null));
266    }
267
268    public void testMajorCategory() {
269        LogMaker a = new LogMaker(1);
270        LogMaker b = new LogMaker(2);
271        assertFalse(a.isSubsetOf(b));
272        assertFalse(b.isSubsetOf(a));
273    }
274
275    public void testConstructFromNull() {
276        new LogMaker(null);
277        // no promises, just don't throw
278    }
279
280    public void testConstructFromNullKey() {
281        Object[] items = new Object[2];
282        items[0] = null;
283        items[1] = "foo";
284        new LogMaker(items);
285        // no promises, just don't throw
286    }
287
288    public void testConstructFromNullField() {
289        Object[] items = new Object[2];
290        items[0] = 10;
291        items[1] = null;
292        new LogMaker(items);
293        // no promises, just don't throw
294    }
295
296    public void testConstructFromTruncatedArray() {
297        Object[] items = new Object[1];
298        items[0] = 10;
299        new LogMaker(items);
300        // no promises, just don't throw
301    }
302}
303