@@ -457,7 +457,7 @@ public void testAddOnSystemCapabilityListenerWithSubscriptionsNotSupportedAndCap
457457 // Add listener1
458458 // When the first listener is added, GetSystemCapability request should out because because capability is not cached
459459 OnSystemCapabilityListener onSystemCapabilityListener1 = mock (OnSystemCapabilityListener .class );
460- doAnswer (createOnSendGetSystemCapabilityAnswer (true , true )).when (internalInterface ).sendRPC (any (GetSystemCapability .class ));
460+ doAnswer (createOnSendGetSystemCapabilityAnswer (true , false )).when (internalInterface ).sendRPC (any (GetSystemCapability .class ));
461461 scm .addOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener1 );
462462 verify (internalInterface , times (1 )).sendRPC (any (GetSystemCapability .class ));
463463 verify (onSystemCapabilityListener1 , times (1 )).onCapabilityRetrieved (any (Object .class ));
@@ -490,6 +490,129 @@ public void testAddOnSystemCapabilityListenerWithSubscriptionsNotSupportedAndCap
490490 verify (internalInterface , times (1 )).sendRPC (any (GetSystemCapability .class ));
491491 }
492492
493+ public void testAddOnSystemCapabilityListenerThenGetCapabilityWhenSubscriptionsAreNotSupported () {
494+ SdlMsgVersion sdlMsgVersion = new SdlMsgVersion (5 , 0 ); // This version doesn't support capability subscriptions
495+ sdlMsgVersion .setPatchVersion (0 );
496+ ISdl internalInterface = mock (ISdl .class );
497+ when (internalInterface .getSdlMsgVersion ()).thenReturn (sdlMsgVersion );
498+ SystemCapabilityManager scm = new SystemCapabilityManager (internalInterface );
499+ scm .setCapability (SystemCapabilityType .VIDEO_STREAMING , videoStreamingCapability );
500+
501+
502+ // Add listener1
503+ // When the first listener is added, GetSystemCapability request should go out with subscribe=false
504+ OnSystemCapabilityListener onSystemCapabilityListener1 = mock (OnSystemCapabilityListener .class );
505+ doAnswer (createOnSendGetSystemCapabilityAnswer (true , false )).when (internalInterface ).sendRPC (any (GetSystemCapability .class ));
506+ scm .addOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener1 );
507+ verify (internalInterface , times (0 )).sendRPC (any (GetSystemCapability .class ));
508+ verify (onSystemCapabilityListener1 , times (1 )).onCapabilityRetrieved (any (Object .class ));
509+
510+
511+ // Get Capability (should notify listener1 again)
512+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
513+ verify (internalInterface , times (1 )).sendRPC (any (GetSystemCapability .class ));
514+ verify (onSystemCapabilityListener1 , times (2 )).onCapabilityRetrieved (any (Object .class ));
515+
516+
517+ // Add listener2
518+ OnSystemCapabilityListener onSystemCapabilityListener2 = mock (OnSystemCapabilityListener .class );
519+ scm .addOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener2 );
520+ verify (onSystemCapabilityListener2 , times (1 )).onCapabilityRetrieved (any (Object .class ));
521+
522+
523+ // Get Capability (should notify listener1 & listener2 again)
524+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
525+ verify (internalInterface , times (2 )).sendRPC (any (GetSystemCapability .class ));
526+ verify (onSystemCapabilityListener1 , times (3 )).onCapabilityRetrieved (any (Object .class ));
527+ verify (onSystemCapabilityListener2 , times (2 )).onCapabilityRetrieved (any (Object .class ));
528+
529+
530+ // Add listener3
531+ OnSystemCapabilityListener onSystemCapabilityListener3 = mock (OnSystemCapabilityListener .class );
532+ scm .addOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener3 );
533+ verify (onSystemCapabilityListener3 , times (1 )).onCapabilityRetrieved (any (Object .class ));
534+
535+
536+ // Get Capability (should notify listener1 & listener2 & listener3 again)
537+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
538+ verify (internalInterface , times (3 )).sendRPC (any (GetSystemCapability .class ));
539+ verify (onSystemCapabilityListener1 , times (4 )).onCapabilityRetrieved (any (Object .class ));
540+ verify (onSystemCapabilityListener2 , times (3 )).onCapabilityRetrieved (any (Object .class ));
541+ verify (onSystemCapabilityListener3 , times (2 )).onCapabilityRetrieved (any (Object .class ));
542+
543+
544+ // Remove listener1
545+ scm .removeOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener1 );
546+
547+
548+ // Get Capability (should notify listener2 & listener3 again)
549+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
550+ verify (internalInterface , times (4 )).sendRPC (any (GetSystemCapability .class ));
551+ verify (onSystemCapabilityListener1 , times (4 )).onCapabilityRetrieved (any (Object .class ));
552+ verify (onSystemCapabilityListener2 , times (4 )).onCapabilityRetrieved (any (Object .class ));
553+ verify (onSystemCapabilityListener3 , times (3 )).onCapabilityRetrieved (any (Object .class ));
554+
555+
556+ // Remove listener2
557+ scm .removeOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener2 );
558+
559+
560+ // Get Capability (should notify listener3 again)
561+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
562+ verify (internalInterface , times (5 )).sendRPC (any (GetSystemCapability .class ));
563+ verify (onSystemCapabilityListener1 , times (4 )).onCapabilityRetrieved (any (Object .class ));
564+ verify (onSystemCapabilityListener2 , times (4 )).onCapabilityRetrieved (any (Object .class ));
565+ verify (onSystemCapabilityListener3 , times (4 )).onCapabilityRetrieved (any (Object .class ));
566+
567+
568+ // Remove listener3
569+ scm .removeOnSystemCapabilityListener (SystemCapabilityType .VIDEO_STREAMING , onSystemCapabilityListener3 );
570+ verify (internalInterface , times (5 )).sendRPC (any (GetSystemCapability .class ));
571+
572+
573+ // Get Capability (should not notify any listener again because they are all removed)
574+ scm .getCapability (SystemCapabilityType .VIDEO_STREAMING , null , true );
575+ verify (internalInterface , times (6 )).sendRPC (any (GetSystemCapability .class ));
576+ verify (onSystemCapabilityListener1 , times (4 )).onCapabilityRetrieved (any (Object .class ));
577+ verify (onSystemCapabilityListener2 , times (4 )).onCapabilityRetrieved (any (Object .class ));
578+ verify (onSystemCapabilityListener3 , times (4 )).onCapabilityRetrieved (any (Object .class ));
579+ }
580+
581+ public void testGetAndAddListenerForDisplaysCapability () {
582+ ISdl internalInterface ;
583+ SystemCapabilityManager scm ;
584+ OnSystemCapabilityListener onSystemCapabilityListener ;
585+ DisplayCapabilities retrievedCapability ;
586+
587+
588+ // Test case 1 (capability cached, listener not null, forceUpdate true)
589+ // Force updating DISPLAYS capability should call onError()
590+ internalInterface = mock (ISdl .class );
591+ scm = new SystemCapabilityManager (internalInterface );
592+ onSystemCapabilityListener = mock (OnSystemCapabilityListener .class );
593+ doAnswer (createOnSendGetSystemCapabilityAnswer (true , null )).when (internalInterface ).sendRPC (any (GetSystemCapability .class ));
594+ scm .setCapability (SystemCapabilityType .DISPLAYS , new DisplayCapabilities ());
595+ retrievedCapability = (DisplayCapabilities ) scm .getCapability (SystemCapabilityType .DISPLAYS , onSystemCapabilityListener , true );
596+ assertNotNull (retrievedCapability );
597+ verify (internalInterface , times (0 )).sendRPC (any (GetSystemCapability .class ));
598+ verify (onSystemCapabilityListener , times (0 )).onCapabilityRetrieved (any (Object .class ));
599+ verify (onSystemCapabilityListener , times (1 )).onError (any (String .class ));
600+
601+
602+ // Test case 2 (Add listener)
603+ // When the first DISPLAYS listener is added, GetSystemCapability request should not go out
604+ OnSystemCapabilityListener onSystemCapabilityListener1 = mock (OnSystemCapabilityListener .class );
605+ scm .addOnSystemCapabilityListener (SystemCapabilityType .DISPLAYS , onSystemCapabilityListener1 );
606+ verify (internalInterface , times (0 )).sendRPC (any (GetSystemCapability .class ));
607+ verify (onSystemCapabilityListener1 , times (1 )).onCapabilityRetrieved (any (Object .class ));
608+
609+
610+ // Test case 3 (Remove listener)
611+ // When the last DISPLAYS listener is removed, GetSystemCapability request should not go out
612+ scm .removeOnSystemCapabilityListener (SystemCapabilityType .DISPLAYS , onSystemCapabilityListener1 );
613+ verify (internalInterface , times (0 )).sendRPC (any (GetSystemCapability .class ));
614+ }
615+
493616 public void testListConversion (){
494617 SystemCapabilityManager systemCapabilityManager = createSampleManager ();
495618 Object capability = systemCapabilityManager .getCapability (SystemCapabilityType .SOFTBUTTON );
0 commit comments