@Override public void read(JSONObject object) throws JSONException { /* Override abstract log JSON since it's Common Schema and not App Center schema. */ /* Read top level PART A simple fields. */ setVer(object.getString(VER)); setName(object.getString(NAME)); setTimestamp(JSONDateUtils.toDate(object.getString(TIME))); if (object.has(POP_SAMPLE)) { setPopSample(object.getDouble(POP_SAMPLE)); } setIKey(object.optString(IKEY, null)); setFlags(JSONUtils.readLong(object, FLAGS)); setCV(object.optString(CV, null)); /* Read extensions. */ if (object.has(EXT)) { Extensions extensions = new Extensions(); extensions.read(object.getJSONObject(EXT)); setExt(extensions); } /* Read Parts B&C. */ if (object.has(DATA)) { Data data = new Data(); data.read(object.getJSONObject(DATA)); setData(data); } }
@Test public void compareDifferentType() { TestUtils.compareSelfNullClass(new Extensions()); }
@Test public void checkPartAConversionDoesNotInstantiateExtensionObjectAgain() { Log log = mock(Log.class); when(log.getDevice()).thenReturn(getDevice(0)); MockCommonSchemaLog commonSchemaLog = new MockCommonSchemaLog(); Extensions extensions = new Extensions(); commonSchemaLog.setExt(extensions); PartAUtils.addPartAFromLog(log, commonSchemaLog, "T1UUID1-T2UUID2"); assertEquals(extensions, commonSchemaLog.getExt()); }
@Override public Object answer(InvocationOnMock invocation) { ProtocolExtension protocol = new ProtocolExtension(); Extensions ext = new Extensions(); ext.setProtocol(protocol); CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(ext); sentLogs.add(log); /* Call the listener after conversion of common schema for authentication decoration. */ AnalyticsTransmissionTarget.getChannelListener().onPreparingLog(log, "test"); return null; } }).when(mChannel).enqueue(any(Log.class), anyString(), anyInt());
@Test public void invalidBaseDataRemovesBaseType() { MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); properties.add(typedProperty("baseType", "Some.Type")); properties.add(typedProperty("baseData", "value")); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check everything removed. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void overrideMetadataToNull() throws JSONException { MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); LongTypedProperty a = new LongTypedProperty(); a.setName("a.b.c"); a.setValue(1); properties.add(a); StringTypedProperty b = new StringTypedProperty(); b.setName("a.b"); b.setValue("2"); properties.add(b); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check data. */ JSONObject aData = new JSONObject(); aData.put("b", "2"); JSONObject expectedData = new JSONObject(); expectedData.put("a", aData); assertEquals(expectedData.toString(), log.getData().getProperties().toString()); /* Check metadata is null */ assertNull(log.getExt().getMetadata()); }
@Test public void baseTypeOverriddenToBeInvalid() { MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); properties.add(typedProperty("baseType", "Some.Type")); properties.add(typedProperty("baseType.something", "test")); properties.add(typedProperty("baseData.something", "test")); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check only string base type was kept. */ assertEquals(2, log.getData().getProperties().length()); assertEquals("Some.Type", log.getData().getProperties().optString("baseType")); assertNull(log.getExt().getMetadata()); } }
@Test public void invalidBaseTypeRemovesBaseData() { MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); LongTypedProperty a = new LongTypedProperty(); a.setName("baseType"); a.setValue(3); properties.add(a); properties.add(typedProperty("baseData.something", "value")); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check everything removed. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void longTypedPropertyReuseExtensions() throws JSONException { MockCommonSchemaLog log = new MockCommonSchemaLog(); Extensions ext = new Extensions(); log.setExt(ext); List<TypedProperty> properties = new ArrayList<>(); LongTypedProperty property = new LongTypedProperty(); property.setName("a"); property.setValue(10000000000L); properties.add(property); CommonSchemaDataUtils.addCommonSchemaData(properties, log); assertEquals(1, log.getData().getProperties().length()); assertEquals(10000000000L, log.getData().getProperties().getLong("a")); /* Check metadata. */ JSONObject expectedMetadata = new JSONObject(); JSONObject a = new JSONObject(); a.put("a", DATA_TYPE_INT64); expectedMetadata.put(METADATA_FIELDS, a); assertSame(ext, log.getExt()); assertNotNull(log.getExt().getMetadata()); assertEquals(expectedMetadata.toString(), log.getExt().getMetadata().getMetadata().toString()); }
@Test public void invalidBaseData() { /* When using invalid base data. */ MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); StringTypedProperty a = new StringTypedProperty(); a.setName("baseData"); a.setValue("myData"); properties.add(a); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check data and metadata is missing type. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void baseDataMissing() { /* When using invalid base data. */ MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); StringTypedProperty a = new StringTypedProperty(); a.setName("baseType"); a.setValue("Some.Type"); properties.add(a); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check data and metadata is missing type. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void invalidBaseType() { /* When using invalid base type. */ MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); LongTypedProperty a = new LongTypedProperty(); a.setName("baseType"); a.setValue(1); properties.add(a); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check data and metadata is missing type. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void baseTypeMissing() { /* When using invalid base data. */ MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); StringTypedProperty a = new StringTypedProperty(); a.setName("baseData.test"); a.setValue("test"); properties.add(a); CommonSchemaDataUtils.addCommonSchemaData(properties, log); /* Check data and metadata is missing type. */ assertEquals(0, log.getData().getProperties().length()); assertNull(log.getExt().getMetadata()); }
@Test public void collectDeviceId() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setDevice(new DeviceExtension()); /* Mock context. */ mockStatic(Secure.class); when(Secure.getString(any(ContentResolver.class), anyString())).thenReturn("mockDeviceId"); /* Get property configurator and collect device ID. */ PropertyConfigurator pc = Analytics.getTransmissionTarget("test").getPropertyConfigurator(); pc.collectDeviceId(); /* Simulate what the pipeline does to convert from App Center to Common Schema. */ log.addTransmissionTarget("test"); log.setTag(Analytics.getTransmissionTarget("test")); pc.onPreparingLog(log, "groupName"); /* Assert device ID is collected. */ assertEquals("a:mockDeviceId", log.getExt().getDevice().getLocalId()); }
@Test public void collectDeviceIdSavedWhenDisabled() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setDevice(new DeviceExtension()); /* Mock context. */ mockStatic(Secure.class); when(Secure.getString(any(ContentResolver.class), anyString())).thenReturn("mockDeviceId"); /* Disable Analytics. */ Analytics.setEnabled(false).get(); /* Get property configurator and collect device ID. */ PropertyConfigurator pc = Analytics.getTransmissionTarget("test").getPropertyConfigurator(); pc.collectDeviceId(); /* Simulate what the pipeline does to convert from App Center to Common Schema. */ log.addTransmissionTarget("test"); log.setTag(Analytics.getTransmissionTarget("test")); /* Enable and simulate log preparing. */ Analytics.setEnabled(true).get(); pc.onPreparingLog(log, "groupName"); /* Assert device ID is collected. */ assertEquals("a:mockDeviceId", log.getExt().getDevice().getLocalId()); }
@Test public void setNonPrefixUserId() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setUser(new UserExtension()); /* Get property configurator and set properties. */ PropertyConfigurator pc = Analytics.getTransmissionTarget("test").getPropertyConfigurator(); pc.setUserId("bob"); /* Simulate what the pipeline does to convert from App Center to Common Schema. */ log.addTransmissionTarget("test"); log.setTag(Analytics.getTransmissionTarget("test")); pc.onPreparingLog(log, "groupName"); /* Check prefix was added. */ assertEquals("c:bob", log.getExt().getUser().getLocalId()); }
@Test public void setInvalidUserId() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setApp(new AppExtension()); log.getExt().setUser(new UserExtension()); /* Get property configurator and set properties. */ PropertyConfigurator pc = Analytics.getTransmissionTarget("test").getPropertyConfigurator(); pc.setUserId("x:bob"); /* Simulate what the pipeline does to convert from App Center to Common Schema. */ log.addTransmissionTarget("test"); log.setTag(Analytics.getTransmissionTarget("test")); pc.onPreparingLog(log, "groupName"); /* Assert property not set on common schema. */ assertNull(log.getExt().getUser().getLocalId()); /* Set user id with just the prefix. */ pc.setUserId("c:"); /* Assert property not set on common schema. */ assertNull(log.getExt().getUser().getLocalId()); /* Set empty user id. */ pc.setUserId(""); /* Assert property not set on common schema. */ assertNull(log.getExt().getUser().getLocalId()); }
@Test public void setCommonSchemaProperties() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setApp(new AppExtension()); log.getExt().setUser(new UserExtension()); /* Get property configurator and set properties. */ PropertyConfigurator pc = Analytics.getTransmissionTarget("test").getPropertyConfigurator(); pc.setAppVersion("appVersion"); pc.setAppName("appName"); pc.setAppLocale("appLocale"); pc.setUserId("c:bob"); /* Simulate what the pipeline does to convert from App Center to Common Schema. */ log.addTransmissionTarget("test"); log.setTag(Analytics.getTransmissionTarget("test")); pc.onPreparingLog(log, "groupName"); /* Assert properties set on common schema. */ assertEquals("appVersion", log.getExt().getApp().getVer()); assertEquals("appName", log.getExt().getApp().getName()); assertEquals("appLocale", log.getExt().getApp().getLocale()); assertEquals("c:bob", log.getExt().getUser().getLocalId()); }
@Test public void grandparentsHaveNoPropertiesSet() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setApp(new AppExtension()); log.getExt().setUser(new UserExtension()); /* Set up empty chain of parents. */ AnalyticsTransmissionTarget grandparent = Analytics.getTransmissionTarget("grandparent"); AnalyticsTransmissionTarget parent = grandparent.getTransmissionTarget("parent"); AnalyticsTransmissionTarget child = parent.getTransmissionTarget("child"); /* Simulate channel callbacks. */ log.addTransmissionTarget("child"); log.setTag(child); grandparent.getPropertyConfigurator().onPreparingLog(log, "groupName"); parent.getPropertyConfigurator().onPreparingLog(log, "groupName"); child.getPropertyConfigurator().onPreparingLog(log, "groupName"); /* Assert properties not set on common schema for child. */ assertNull(log.getExt().getApp().getVer()); assertNull(log.getExt().getApp().getName()); assertNull(log.getExt().getApp().getLocale()); assertNull(log.getExt().getUser().getLocalId()); }
@Test public void inheritCommonSchemaPropertiesFromGrandparent() { CommonSchemaLog log = new CommonSchemaEventLog(); log.setExt(new Extensions()); log.getExt().setApp(new AppExtension()); log.getExt().setUser(new UserExtension()); /* Set properties on parent to override unset properties on child */ AnalyticsTransmissionTarget grandparent = Analytics.getTransmissionTarget("grandparent"); grandparent.getPropertyConfigurator().setAppVersion("appVersion"); grandparent.getPropertyConfigurator().setAppName("appName"); grandparent.getPropertyConfigurator().setAppLocale("appLocale"); grandparent.getPropertyConfigurator().setUserId("c:alice"); /* Set up hierarchy. */ AnalyticsTransmissionTarget parent = grandparent.getTransmissionTarget("parent"); AnalyticsTransmissionTarget child = parent.getTransmissionTarget("child"); /* Simulate channel callbacks. */ log.addTransmissionTarget("child"); log.setTag(child); grandparent.getPropertyConfigurator().onPreparingLog(log, "groupName"); parent.getPropertyConfigurator().onPreparingLog(log, "groupName"); child.getPropertyConfigurator().onPreparingLog(log, "groupName"); /* Assert properties set on common schema. */ assertEquals("appVersion", log.getExt().getApp().getVer()); assertEquals("appName", log.getExt().getApp().getName()); assertEquals("appLocale", log.getExt().getApp().getLocale()); assertEquals("c:alice", log.getExt().getUser().getLocalId()); }