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