dest.setExt(new Extensions()); dest.getExt().setProtocol(new ProtocolExtension()); dest.getExt().getProtocol().setDevModel(device.getModel()); dest.getExt().getProtocol().setDevMake(device.getOemName()); dest.getExt().setUser(new UserExtension()); dest.getExt().getUser().setLocalId(UserIdContext.getPrefixedUserId(src.getUserId())); dest.getExt().getUser().setLocale(device.getLocale().replace("_", "-")); dest.getExt().setOs(new OsExtension()); dest.getExt().getOs().setName(device.getOsName()); dest.getExt().getOs().setVer(device.getOsVersion() + "-" + device.getOsBuild() + "-" + device.getOsApiLevel()); dest.getExt().setApp(new AppExtension()); dest.getExt().getApp().setVer(device.getAppVersion()); dest.getExt().getApp().setId("a" + COMMON_SCHEMA_PREFIX_SEPARATOR + device.getAppNamespace()); dest.getExt().setNet(new NetExtension()); dest.getExt().getNet().setProvider(device.getCarrierName()); dest.getExt().setSdk(new SdkExtension()); dest.getExt().getSdk().setLibVer(device.getSdkName() + "-" + device.getSdkVersion()); dest.getExt().setLoc(new LocExtension()); String timezoneOffset = String.format(Locale.US, "%s%02d:%02d", device.getTimeZoneOffset() >= 0 ? "+" : "-", Math.abs(device.getTimeZoneOffset() / 60), Math.abs(device.getTimeZoneOffset() % 60));
if (getMetadata() != null) { writer.key(METADATA).object(); getMetadata().write(writer); writer.endObject(); if (getProtocol() != null) { writer.key(PROTOCOL).object(); getProtocol().write(writer); writer.endObject(); if (getUser() != null) { writer.key(USER).object(); getUser().write(writer); writer.endObject(); if (getDevice() != null) { writer.key(DEVICE).object(); getDevice().write(writer); writer.endObject(); if (getOs() != null) { writer.key(OS).object(); getOs().write(writer); writer.endObject(); if (getApp() != null) { writer.key(APP).object(); getApp().write(writer); writer.endObject();
MetadataExtension metadata = new MetadataExtension(); metadata.read(object.getJSONObject(METADATA)); setMetadata(metadata); ProtocolExtension protocol = new ProtocolExtension(); protocol.read(object.getJSONObject(PROTOCOL)); setProtocol(protocol); UserExtension user = new UserExtension(); user.read(object.getJSONObject(USER)); setUser(user); DeviceExtension device = new DeviceExtension(); device.read(object.getJSONObject(DEVICE)); setDevice(device); OsExtension os = new OsExtension(); os.read(object.getJSONObject(OS)); setOs(os); AppExtension app = new AppExtension(); app.read(object.getJSONObject(APP)); setApp(app); NetExtension net = new NetExtension(); net.read(object.getJSONObject(NET)); setNet(net); SdkExtension sdk = new SdkExtension();
@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 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()); }
logBeforeSetProperty.setExt(new Extensions()); logBeforeSetProperty.getExt().setApp(new AppExtension()); logBeforeSetProperty.getExt().setUser(new UserExtension()); logBeforeSetProperty.getExt().setDevice(new DeviceExtension()); logAfterSetProperty.setExt(new Extensions()); logAfterSetProperty.getExt().setApp(new AppExtension()); logAfterSetProperty.getExt().setUser(new UserExtension()); logAfterSetProperty.getExt().setDevice(new DeviceExtension()); assertNull(logBeforeSetProperty.getExt().getApp().getVer()); assertNull(logBeforeSetProperty.getExt().getApp().getLocale()); assertNull(logBeforeSetProperty.getExt().getApp().getName()); assertNull(logBeforeSetProperty.getExt().getUser().getLocalId()); assertNull(logBeforeSetProperty.getExt().getDevice().getLocalId()); assertEquals("appVersion", logAfterSetProperty.getExt().getApp().getVer()); assertEquals("appLocale", logAfterSetProperty.getExt().getApp().getLocale()); assertEquals("appName", logAfterSetProperty.getExt().getApp().getName()); assertEquals("c:alice", logAfterSetProperty.getExt().getUser().getLocalId()); assertEquals("a:mockDeviceId", logAfterSetProperty.getExt().getDevice().getLocalId());
@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()); }
public void onPreparingLog(@NonNull Log log, @NonNull String groupName) { if (shouldOverridePartAProperties(log)) { AppExtension app = ((CommonSchemaLog) log).getExt().getApp(); UserExtension user = ((CommonSchemaLog) log).getExt().getUser(); DeviceExtension device = ((CommonSchemaLog) log).getExt().getDevice();
@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 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()); }
@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());
public Object answer(InvocationOnMock invocation) { ProtocolExtension protocol = new ProtocolExtension(); Extensions ext = new Extensions(); ext.setProtocol(protocol); CommonSchemaLog log = new CommonSchemaEventLog(); assertEquals(Collections.singletonList(authenticationProvider1.getTicketKeyHash()), sentLogs.get(0).getExt().getProtocol().getTicketKeys()); assertEquals(Collections.singletonList(authenticationProvider2.getTicketKeyHash()), sentLogs.get(1).getExt().getProtocol().getTicketKeys());
Extensions ext1 = new Extensions(); ext1.setSdk(new SdkExtension()); log1.setExt(ext1); Extensions ext2 = new Extensions(); ext2.setSdk(new SdkExtension()); log2.setExt(ext2); assertNotNull(log1.getExt().getSdk().getEpoch()); assertEquals(log1.getExt().getSdk().getEpoch(), log2.getExt().getSdk().getEpoch()); assertEquals(Long.valueOf(1), log1.getExt().getSdk().getSeq()); assertEquals(Long.valueOf(2), log2.getExt().getSdk().getSeq()); assertEquals(installId, log1.getExt().getSdk().getInstallId()); assertEquals(installId, log2.getExt().getSdk().getInstallId()); CommonSchemaLog log3 = new MockCommonSchemaLog(); log3.setIKey("t2"); Extensions ext3 = new Extensions(); ext3.setSdk(new SdkExtension()); log3.setExt(ext3); when(logSerializer.toCommonSchemaLog(any(Log.class))).thenReturn(Collections.singletonList(log3)); listener.onPreparedLog(originalLog, TEST_GROUP, PERSISTENCE_CRITICAL); assertEquals(Long.valueOf(PERSISTENCE_CRITICAL), log3.getFlags()); assertEquals(Long.valueOf(1), log3.getExt().getSdk().getSeq()); assertNotNull(log3.getExt().getSdk().getEpoch()); assertNotEquals(log1.getExt().getSdk().getEpoch(), log3.getExt().getSdk().getEpoch());
dest.setExt(new Extensions()); dest.getExt().setMetadata(metadata);
/** * Add ticket to common schema logs. */ private static void addTicketToLog(@NonNull Log log) { /* Decorate only common schema logs when an authentication provider was registered. */ if (sAuthenticationProvider != null && log instanceof CommonSchemaLog) { /* Add ticket reference to log. */ CommonSchemaLog csLog = (CommonSchemaLog) log; String ticketKey = sAuthenticationProvider.getTicketKeyHash(); csLog.getExt().getProtocol().setTicketKeys(Collections.singletonList(ticketKey)); /* * Check if we should try to refresh token if soon expired. * Known corner case: if already expired and refresh takes longer than batching log time, * then next logs will be anonymous until token refreshed. */ sAuthenticationProvider.checkTokenExpiry(); } }
@Test public void compareDifferentType() { TestUtils.compareSelfNullClass(new Extensions()); }
Extensions ext = new Extensions(); ext.setLoc(new LocExtension()); a.setExt(ext); checkNotEquals(a, b); b.setExt(new Extensions()); checkNotEquals(a, b); b.setExt(a.getExt());
@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 noNestingAccident() throws JSONException { MockCommonSchemaLog log = new MockCommonSchemaLog(); log.setExt(new Extensions()); List<TypedProperty> properties = new ArrayList<>(); LongTypedProperty a = new LongTypedProperty(); assertEquals(expectedMetadata.toString(), log.getExt().getMetadata().getMetadata().toString());
@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()); }