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