@@ -42,6 +42,7 @@ of this software and associated documentation files (the "Software"), to deal
4242import org .junit .runner .RunWith ;
4343
4444import static org .junit .Assert .assertEquals ;
45+ import static org .junit .Assert .assertNotNull ;
4546import static org .mockito .Mockito .mock ;
4647import static org .mockito .Mockito .when ;
4748
@@ -296,6 +297,141 @@ public void testGetMetricsWithOverride_2() throws UnsupportedEncodingException,
296297 TestUtils .bothJSONObjEqual (json , calculatedJSON );
297298 }
298299
300+ // MetricProvider override tests
301+
302+ @ Test
303+ public void testMetricProviderOverride_fullOverride () {
304+ MockedMetricProvider override = new MockedMetricProvider ();
305+ DeviceInfo deviceInfo = new DeviceInfo (override );
306+
307+ assertEquals ("A" , deviceInfo .mp .getOS ());
308+ assertEquals ("B" , deviceInfo .mp .getOSVersion ());
309+ assertEquals ("C" , deviceInfo .mp .getDevice ());
310+ assertEquals ("D" , deviceInfo .mp .getManufacturer ());
311+ assertEquals ("E" , deviceInfo .mp .getResolution (TestUtils .getContext ()));
312+ assertEquals ("F" , deviceInfo .mp .getDensity (TestUtils .getContext ()));
313+ assertEquals ("G" , deviceInfo .mp .getCarrier (TestUtils .getContext ()));
314+ assertEquals ("66" , deviceInfo .mp .getTimezoneOffset ());
315+ assertEquals ("H" , deviceInfo .mp .getLocale ());
316+ assertEquals (Countly .DEFAULT_APP_VERSION , deviceInfo .mp .getAppVersion (TestUtils .getContext ()));
317+ assertEquals ("J" , deviceInfo .mp .getStore (TestUtils .getContext ()));
318+ assertEquals ("K" , deviceInfo .mp .getDeviceType (TestUtils .getContext ()));
319+ assertEquals ("42" , deviceInfo .mp .getTotalRAM ());
320+ assertEquals ("12" , deviceInfo .mp .getRamCurrent (TestUtils .getContext ()));
321+ assertEquals ("48" , deviceInfo .mp .getRamTotal ());
322+ assertEquals ("N" , deviceInfo .mp .getCpu ());
323+ assertEquals ("O" , deviceInfo .mp .getOpenGL (TestUtils .getContext ()));
324+ assertEquals ("6" , deviceInfo .mp .getBatteryLevel (TestUtils .getContext ()));
325+ assertEquals ("S" , deviceInfo .mp .getOrientation (TestUtils .getContext ()));
326+ assertEquals ("T" , deviceInfo .mp .isRooted ());
327+ assertEquals ("U" , deviceInfo .mp .isOnline (TestUtils .getContext ()));
328+ assertEquals ("V" , deviceInfo .mp .isMuted (TestUtils .getContext ()));
329+ assertEquals ("Z" , deviceInfo .mp .hasHinge (TestUtils .getContext ()));
330+ assertEquals ("88" , deviceInfo .mp .getRunningTime ());
331+
332+ DiskMetric diskMetric = deviceInfo .mp .getDiskSpaces (TestUtils .getContext ());
333+ assertEquals ("45" , diskMetric .totalMb );
334+ assertEquals ("23" , diskMetric .usedMb );
335+ }
336+
337+ @ Test
338+ public void testMetricProviderOverride_partialOverride () {
339+ MetricProvider partial = new MetricProvider () {
340+ @ Override public String getOS () { return "CustomOS" ; }
341+ @ Override public String getDevice () { return "CustomDevice" ; }
342+ };
343+ DeviceInfo deviceInfo = new DeviceInfo (partial );
344+
345+ // overridden values
346+ assertEquals ("CustomOS" , deviceInfo .mp .getOS ());
347+ assertEquals ("CustomDevice" , deviceInfo .mp .getDevice ());
348+
349+ // non-overridden values should fall back to SDK defaults
350+ assertEquals (android .os .Build .VERSION .RELEASE , deviceInfo .mp .getOSVersion ());
351+ assertEquals (android .os .Build .MODEL , regularDeviceInfo .mp .getDevice ());
352+ assertEquals (android .os .Build .MANUFACTURER , deviceInfo .mp .getManufacturer ());
353+ assertNotNull (deviceInfo .mp .getLocale ());
354+ assertNotNull (deviceInfo .mp .getTimezoneOffset ());
355+ assertNotNull (deviceInfo .mp .getAppVersion (TestUtils .getContext ()));
356+ }
357+
358+ @ Test
359+ public void testMetricProviderOverride_nullOverride () {
360+ DeviceInfo deviceInfo = new DeviceInfo (null );
361+
362+ // all values should be SDK defaults, no crash
363+ assertEquals ("Android" , deviceInfo .mp .getOS ());
364+ assertEquals (android .os .Build .VERSION .RELEASE , deviceInfo .mp .getOSVersion ());
365+ assertEquals (android .os .Build .MODEL , deviceInfo .mp .getDevice ());
366+ assertEquals (android .os .Build .MANUFACTURER , deviceInfo .mp .getManufacturer ());
367+ assertNotNull (deviceInfo .mp .getLocale ());
368+ assertNotNull (deviceInfo .mp .getTimezoneOffset ());
369+ }
370+
371+ @ Test
372+ public void testMetricProviderOverride_emptyOverride () {
373+ MetricProvider emptyOverride = new MetricProvider () {};
374+ DeviceInfo deviceInfo = new DeviceInfo (emptyOverride );
375+
376+ // empty override should behave same as null override
377+ assertEquals ("Android" , deviceInfo .mp .getOS ());
378+ assertEquals (android .os .Build .VERSION .RELEASE , deviceInfo .mp .getOSVersion ());
379+ assertEquals (android .os .Build .MODEL , deviceInfo .mp .getDevice ());
380+ assertNotNull (deviceInfo .mp .getLocale ());
381+ }
382+
383+ @ Test
384+ public void testMetricProviderOverride_diskSpacesOverride () {
385+ MetricProvider diskOverride = new MetricProvider () {
386+ @ Override public DiskMetric getDiskSpaces (Context context ) {
387+ return new DiskMetric ("100" , "50" );
388+ }
389+ };
390+ DeviceInfo deviceInfo = new DeviceInfo (diskOverride );
391+
392+ DiskMetric diskMetric = deviceInfo .mp .getDiskSpaces (TestUtils .getContext ());
393+ assertEquals ("100" , diskMetric .totalMb );
394+ assertEquals ("50" , diskMetric .usedMb );
395+
396+ // other metrics should be defaults
397+ assertEquals ("Android" , deviceInfo .mp .getOS ());
398+ }
399+
400+ @ Test
401+ public void testMetricProviderOverride_timezoneAndRamOverride () {
402+ MetricProvider override = new MetricProvider () {
403+ @ Override public String getTimezoneOffset () { return "120" ; }
404+ @ Override public String getTotalRAM () { return "8192" ; }
405+ @ Override public String getRamTotal () { return "8192" ; }
406+ @ Override public String getRamCurrent (Context context ) { return "4096" ; }
407+ };
408+ DeviceInfo deviceInfo = new DeviceInfo (override );
409+
410+ assertEquals ("120" , deviceInfo .mp .getTimezoneOffset ());
411+ assertEquals ("8192" , deviceInfo .mp .getTotalRAM ());
412+ assertEquals ("8192" , deviceInfo .mp .getRamTotal ());
413+ assertEquals ("4096" , deviceInfo .mp .getRamCurrent (TestUtils .getContext ()));
414+ }
415+
416+ @ Test
417+ public void testMetricProviderOverride_metricsJson () throws UnsupportedEncodingException , JSONException {
418+ MetricProvider partial = new MetricProvider () {
419+ @ Override public String getOS () { return "CustomOS" ; }
420+ @ Override public String getDevice () { return "CustomDevice" ; }
421+ @ Override public String getManufacturer () { return "CustomMfg" ; }
422+ };
423+ DeviceInfo deviceInfo = new DeviceInfo (partial );
424+
425+ String calculatedMetrics = URLDecoder .decode (deviceInfo .getMetrics (TestUtils .getContext (), null , new ModuleLog ()), "UTF-8" );
426+ JSONObject json = new JSONObject (calculatedMetrics );
427+
428+ assertEquals ("CustomOS" , json .getString ("_os" ));
429+ assertEquals ("CustomDevice" , json .getString ("_device" ));
430+ assertEquals ("CustomMfg" , json .getString ("_manufacturer" ));
431+ // non-overridden should still be present with defaults
432+ assertEquals (android .os .Build .VERSION .RELEASE , json .getString ("_os_version" ));
433+ }
434+
299435 @ Test
300436 public void getAppVersionWithOverride () {
301437 Map <String , String > metricOverride = new HashMap <>();
0 commit comments