~didrocks/ubuntuone-client/use_result_var

« back to all changes in this revision

Viewing changes to tests/platform/linux/test_credentials.py

  • Committer: Bazaar Package Importer
  • Author(s): Rodney Dawes
  • Date: 2011-02-23 18:34:09 UTC
  • mfrom: (1.1.45 upstream)
  • Revision ID: james.westby@ubuntu.com-20110223183409-535o7yo165wbjmca
Tags: 1.5.5-0ubuntu1
* New upstream release.
  - Subscribing to a RO share will not download content (LP: #712528)
  - Can't synchronize "~/Ubuntu One Music" (LP: #714976)
  - Syncdaemon needs to show progress in Unity launcher (LP: #702116)
  - Notifications say "your cloud" (LP: #715887)
  - No longer requires python-libproxy
  - Recommend unity and indicator libs by default

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
from ubuntuone.devtools.testcase import DBusTestCase as TestCase
25
25
from ubuntuone.devtools.handlers import MementoHandler
26
26
 
27
 
from ubuntuone.platform.linux.credentials import (dbus, logger, logging, ubuntu_sso,
28
 
    CredentialsManagement, TIMEOUT_INTERVAL,
 
27
from ubuntuone.platform.linux.credentials import (dbus, logger, logging,
 
28
    CredentialsManagement, CredentialsManagementTool, CredentialsError,
 
29
    ubuntu_sso,
29
30
    DBUS_BUS_NAME, DBUS_CREDENTIALS_PATH, DBUS_CREDENTIALS_IFACE,
30
31
    APP_NAME, HELP_TEXT_KEY, DESCRIPTION, TC_URL_KEY, TC_URL,
31
 
    PING_URL_KEY, PING_URL, WINDOW_ID_KEY,
 
32
    PING_URL_KEY, PING_URL, TIMEOUT_INTERVAL,
32
33
)
33
34
 
34
35
FAKED_CREDENTIALS = {
179
180
        self.sso_server = self.register_server(ubuntu_sso.DBUS_BUS_NAME,
180
181
                                ubuntu_sso.DBUS_CREDENTIALS_PATH,
181
182
                                FakedSSOService)  # faked SSO server
 
183
        self.args = {'window_id': '803'}
182
184
 
183
185
    def register_server(self, bus_name, object_path, service_class):
184
186
        """Register a service on the session bus."""
273
275
        self.assertEqual(sso_proxy.dbus_interface,
274
276
                         ubuntu_sso.DBUS_CREDENTIALS_IFACE)
275
277
 
276
 
    @inlineCallbacks
277
 
    def test_shutdown(self):
278
 
        """On shutdown, SSO backend signals are disconnected."""
279
 
        d = Deferred()
280
 
 
281
 
        self.proxy.shutdown(reply_handler=lambda: d.callback(None),
282
 
                            error_handler=d.errback)
283
 
        yield d
284
 
 
285
 
        # TODO: assert over params passed to remove_signal_receiver
286
 
 
287
278
 
288
279
class ArgsTestCase(CredentialsManagementTestCase):
289
280
    """Test case to check that proper arguments are passed to SSO backend."""
326
317
    def test_register(self):
327
318
        """The register method calls ubuntu_sso's method."""
328
319
        d = Deferred()
329
 
        self.proxy.register(reply_handler=lambda: d.callback(None),
 
320
        self.proxy.register(self.args, reply_handler=lambda: d.callback(None),
330
321
                            error_handler=d.errback)
331
322
        yield d
332
323
 
333
324
        self.assertEqual(self.sso_server._app_name, APP_NAME)
334
325
        params = {HELP_TEXT_KEY: DESCRIPTION, TC_URL_KEY: TC_URL,
335
 
                  PING_URL_KEY: PING_URL, WINDOW_ID_KEY: '0'}
 
326
                  PING_URL_KEY: PING_URL}
 
327
        params.update(self.args)
336
328
        self.assertEqual(self.sso_server._args, params)
337
329
 
338
330
    @inlineCallbacks
339
331
    def test_login(self):
340
332
        """The login method calls ubuntu_sso's method."""
341
333
        d = Deferred()
342
 
        self.proxy.login(reply_handler=lambda: d.callback(None),
 
334
        self.proxy.login(self.args, reply_handler=lambda: d.callback(None),
343
335
                         error_handler=d.errback)
344
336
        yield d
345
337
 
346
338
        self.assertEqual(self.sso_server._app_name, APP_NAME)
347
339
        params = {HELP_TEXT_KEY: DESCRIPTION, TC_URL_KEY: TC_URL,
348
 
                  PING_URL_KEY: PING_URL, WINDOW_ID_KEY: '0'}
 
340
                  PING_URL_KEY: PING_URL}
 
341
        params.update(self.args)
349
342
        self.assertEqual(self.sso_server._args, params)
350
343
 
351
344
 
449
442
 
450
443
        self.connect_signals(callback=('CredentialsFound', verify))
451
444
 
452
 
        self.proxy.register(reply_handler=lambda: d.callback(None),
 
445
        self.proxy.register(self.args, reply_handler=lambda: d.callback(None),
453
446
                            error_handler=d.errback)
454
447
        yield d
455
448
        yield self.do_test()
466
459
 
467
460
        self.connect_signals(callback=('CredentialsFound', verify))
468
461
 
469
 
        self.proxy.register(reply_handler=lambda: d.callback(None),
 
462
        self.proxy.register(self.args, reply_handler=lambda: d.callback(None),
470
463
                            error_handler=d.errback)
471
464
        yield d
472
465
        yield self.do_test()
483
476
 
484
477
        self.connect_signals(callback=('AuthorizationDenied', verify))
485
478
 
486
 
        self.proxy.register(reply_handler=lambda: d.callback(None),
 
479
        self.proxy.register(self.args, reply_handler=lambda: d.callback(None),
487
480
                            error_handler=d.errback)
488
481
        yield d
489
482
        yield self.do_test()
501
494
 
502
495
        self.connect_signals(callback=('CredentialsFound', verify))
503
496
 
504
 
        self.proxy.login(reply_handler=lambda: d.callback(None),
 
497
        self.proxy.login(self.args, reply_handler=lambda: d.callback(None),
505
498
                         error_handler=d.errback)
506
499
        yield d
507
500
        yield self.do_test()
518
511
 
519
512
        self.connect_signals(callback=('CredentialsFound', verify))
520
513
 
521
 
        self.proxy.login(reply_handler=lambda: d.callback(None),
 
514
        self.proxy.login(self.args, reply_handler=lambda: d.callback(None),
522
515
                         error_handler=d.errback)
523
516
        yield d
524
517
        yield self.do_test()
535
528
 
536
529
        self.connect_signals(callback=('AuthorizationDenied', verify))
537
530
 
538
 
        self.proxy.login(reply_handler=lambda: d.callback(None),
 
531
        self.proxy.login(self.args, reply_handler=lambda: d.callback(None),
539
532
                         error_handler=d.errback)
540
533
        yield d
541
534
        yield self.do_test()
606
599
 
607
600
    def test_find_credentials(self):
608
601
        """Keep proper track of on going requests."""
 
602
        d = Deferred()
 
603
 
 
604
        def verify(*args):
 
605
            """Make the check."""
 
606
            self.assertEqual(self.client.ref_count, 1)
 
607
            d.callback(True)
 
608
 
 
609
        self.patch(self.client, 'CredentialsNotFound', verify)
609
610
        self.client.find_credentials()
610
611
 
611
 
        self.assertEqual(self.client.ref_count, 1)
 
612
        return d
612
613
 
613
614
    def test_clear_credentials(self):
614
615
        """Keep proper track of on going requests."""
 
616
        d = Deferred()
 
617
 
 
618
        def verify(*args):
 
619
            """Make the check."""
 
620
            self.assertEqual(self.client.ref_count, 1)
 
621
            d.callback(True)
 
622
 
 
623
        self.patch(self.client, 'CredentialsCleared', verify)
615
624
        self.client.clear_credentials()
616
625
 
617
 
        self.assertEqual(self.client.ref_count, 1)
 
626
        return d
618
627
 
619
628
    def test_store_credentials(self):
620
629
        """Keep proper track of on going requests."""
621
 
        self.client.store_credentials(FAKED_CREDENTIALS)
622
 
 
623
 
        self.assertEqual(self.client.ref_count, 1)
 
630
        d = Deferred()
 
631
 
 
632
        def verify(*args):
 
633
            """Make the check."""
 
634
            self.assertEqual(self.client.ref_count, 1)
 
635
            d.callback(True)
 
636
 
 
637
        self.patch(self.client, 'CredentialsStored', verify)
 
638
        self.client.store_credentials(self.args)
 
639
 
 
640
        return d
624
641
 
625
642
    def test_register(self):
626
643
        """Keep proper track of on going requests."""
627
 
        self.client.register()
628
 
 
629
 
        self.assertEqual(self.client.ref_count, 1)
 
644
        d = Deferred()
 
645
 
 
646
        def verify(*args):
 
647
            """Make the check."""
 
648
            self.assertEqual(self.client.ref_count, 1)
 
649
            d.callback(True)
 
650
 
 
651
        self.patch(self.client, 'CredentialsFound', verify)
 
652
        self.client.register(self.args)
 
653
 
 
654
        return d
630
655
 
631
656
    def test_login(self):
632
657
        """Keep proper track of on going requests."""
633
 
        self.client.login()
634
 
 
635
 
        self.assertEqual(self.client.ref_count, 1)
 
658
        d = Deferred()
 
659
 
 
660
        def verify(*args):
 
661
            """Make the check."""
 
662
            self.assertEqual(self.client.ref_count, 1)
 
663
            d.callback(True)
 
664
 
 
665
        self.patch(self.client, 'CredentialsFound', verify)
 
666
        self.client.login(self.args)
 
667
 
 
668
        return d
636
669
 
637
670
    def test_several_requests(self):
638
671
        """Requests can be nested."""
639
 
        self.client.login()
640
 
        self.client.clear_credentials()
641
 
        self.client.find_credentials()
642
 
        self.client.register()
643
 
        self.client.store_credentials(FAKED_CREDENTIALS)
644
 
 
645
 
        self.assertEqual(self.client.ref_count, 5)
 
672
        d = Deferred()
 
673
 
 
674
        self.ref_count = 0
 
675
        def parallel_counter(*args):
 
676
            """Make the check."""
 
677
            self.ref_count += 1
 
678
            if self.ref_count == 5:
 
679
                self.assertEqual(self.client.ref_count, self.ref_count)
 
680
                d.callback(True)
 
681
 
 
682
        self.patch(self.client, 'CredentialsFound', parallel_counter)
 
683
 
 
684
        self.client.login(self.args)
 
685
        self.client.register(self.args)
 
686
        self.client.login(self.args)
 
687
        self.client.register(self.args)
 
688
        self.client.register(self.args)
 
689
 
 
690
        return d
646
691
 
647
692
    def test_credentials_found(self):
648
693
        """Ref counter is decreased when a signal is sent."""
743
788
    def test_on_zero_ref_count_shutdown(self):
744
789
        """When ref count reaches 0, queue shutdown op."""
745
790
        self.client.timeout_func = self._set_called
746
 
        self.client.find_credentials()
 
791
        self.client.login(self.args)
747
792
        self.client.CredentialsFound(FAKED_CREDENTIALS)
748
793
 
749
794
        self.assertEqual(self._called,
750
 
                         ((TIMEOUT_INTERVAL, self.client.shutdown_func), {}))
 
795
                         ((TIMEOUT_INTERVAL, self.client.shutdown), {}))
751
796
 
752
797
    def test_on_non_zero_ref_count_do_not_shutdown(self):
753
798
        """If ref count is not 0, do not queue shutdown op."""
754
799
        self.client.timeout_func = self._set_called
755
 
        self.client.find_credentials()
 
800
        self.client.login(self.args)
756
801
 
757
802
        self.assertEqual(self._called, False)
 
803
 
 
804
    def test_on_non_zero_ref_count_after_zero_do_not_shutdown(self):
 
805
        """If the shutdown was queued, do not quit if counter is not zero."""
 
806
 
 
807
        def fake_timeout_func(interval, func):
 
808
            """Start a new request when the timer is started."""
 
809
            self.client._ref_count = 1
 
810
            assert self.client.ref_count > 0
 
811
            func()
 
812
 
 
813
        self.client.timeout_func = fake_timeout_func
 
814
        self.client.shutdown_func = self._set_called
 
815
 
 
816
        self.client.ref_count = 0  # trigger timer and possible shutdown
 
817
 
 
818
        self.assertEqual(self._called, False, 'shutdown_func was not called')
 
819
 
 
820
    def test_zero_ref_count_after_zero_do_shutdown(self):
 
821
        """If the shutdown was queued, do quit if counter is zero."""
 
822
 
 
823
        def fake_timeout_func(interval, func):
 
824
            """Start a new request when the timer is started."""
 
825
            assert self.client.ref_count == 0
 
826
            func()
 
827
 
 
828
        self.client.timeout_func = fake_timeout_func
 
829
        self.client.shutdown_func = self._set_called
 
830
 
 
831
        self.client.ref_count = 0  # trigger timer and possible shutdown
 
832
 
 
833
        self.assertEqual(self._called, ((), {}), 'shutdown_func was called')
 
834
 
 
835
 
 
836
class CredentialsTestCase(BaseTestCase):
 
837
    """Test suite for the Credentials class."""
 
838
 
 
839
    def setUp(self):
 
840
        super(CredentialsTestCase, self).setUp()
 
841
        FakedSSOService.error_dict = None
 
842
        self.creds_server = self.register_server(DBUS_BUS_NAME,
 
843
                                DBUS_CREDENTIALS_PATH,
 
844
                                CredentialsManagement)  # real service
 
845
 
 
846
        self.client = CredentialsManagementTool()
 
847
 
 
848
    @inlineCallbacks
 
849
    def test_find_credentials_no_credentials(self):
 
850
        """Find credentials when credentials does not exist."""
 
851
        result = yield self.client.find_credentials()
 
852
 
 
853
        self.assertEqual(result, {})
 
854
 
 
855
    @inlineCallbacks
 
856
    def test_find_credentials_with_credentials(self):
 
857
        """Find credentials when credentials exists."""
 
858
        yield self.client.store_credentials(FAKED_CREDENTIALS)
 
859
 
 
860
        result = yield self.client.find_credentials()
 
861
 
 
862
        self.assertEqual(result, FAKED_CREDENTIALS)
 
863
 
 
864
    @inlineCallbacks
 
865
    def test_find_credentials_error(self):
 
866
        """Find credentials and error."""
 
867
        FakedSSOService.error_dict = {'failure': 'really'}
 
868
 
 
869
        try:
 
870
            yield self.client.find_credentials()
 
871
        except CredentialsError, e:
 
872
            self.assertEqual(e[0], FakedSSOService.error_dict)
 
873
        else:
 
874
            self.fail('Must not succeed!')
 
875
 
 
876
    @inlineCallbacks
 
877
    def test_clear_credentials(self):
 
878
        """Clear credentials."""
 
879
        yield self.client.store_credentials({'test': 'me'})
 
880
        yield self.client.clear_credentials()
 
881
 
 
882
        result = yield self.client.find_credentials()
 
883
 
 
884
        self.assertEqual(result, {})
 
885
 
 
886
    @inlineCallbacks
 
887
    def test_clear_credentials_error(self):
 
888
        """Clear credentials and error."""
 
889
        FakedSSOService.error_dict = {'failure': 'really'}
 
890
 
 
891
        try:
 
892
            yield self.client.clear_credentials()
 
893
        except CredentialsError, e:
 
894
            self.assertEqual(e[0], FakedSSOService.error_dict)
 
895
        else:
 
896
            self.fail('Must not succeed!')
 
897
 
 
898
    @inlineCallbacks
 
899
    def test_store_credentials(self):
 
900
        """Store credentials."""
 
901
        token = {'test': 'me'}
 
902
        yield self.client.store_credentials(token)
 
903
 
 
904
        result = yield self.client.find_credentials()
 
905
 
 
906
        self.assertEqual(result, token)
 
907
 
 
908
    @inlineCallbacks
 
909
    def test_store_credentials_error(self):
 
910
        """Store credentials and error."""
 
911
        FakedSSOService.error_dict = {'failure': 'really'}
 
912
 
 
913
        try:
 
914
            yield self.client.store_credentials({'test': 'me'})
 
915
        except CredentialsError, e:
 
916
            self.assertEqual(e[0], FakedSSOService.error_dict)
 
917
        else:
 
918
            self.fail('Must not succeed!')
 
919
 
 
920
    @inlineCallbacks
 
921
    def test_register(self):
 
922
        """Register."""
 
923
        result = yield self.client.register()
 
924
 
 
925
        self.assertEqual(result, FAKED_CREDENTIALS)
 
926
 
 
927
    @inlineCallbacks
 
928
    def test_register_auth_denied(self):
 
929
        """Register and auth_denied."""
 
930
        yield self.client.store_credentials({})  # trigger AuthorizationDenied
 
931
        result = yield self.client.register()
 
932
 
 
933
        self.assertEqual(result, None)
 
934
 
 
935
    @inlineCallbacks
 
936
    def test_register_error(self):
 
937
        """Register and error."""
 
938
        FakedSSOService.error_dict = {'failure': 'really'}
 
939
 
 
940
        try:
 
941
            yield self.client.register()
 
942
        except CredentialsError, e:
 
943
            self.assertEqual(e[0], FakedSSOService.error_dict)
 
944
        else:
 
945
            self.fail('Must not succeed!')
 
946
 
 
947
    @inlineCallbacks
 
948
    def test_login(self):
 
949
        """Login."""
 
950
        result = yield self.client.login()
 
951
 
 
952
        self.assertEqual(result, FAKED_CREDENTIALS)
 
953
 
 
954
    @inlineCallbacks
 
955
    def test_login_auth_denied(self):
 
956
        """Login and auth denied."""
 
957
        yield self.client.store_credentials({})  # trigger AuthorizationDenied
 
958
        result = yield self.client.login()
 
959
 
 
960
        self.assertEqual(result, None)
 
961
 
 
962
    @inlineCallbacks
 
963
    def test_login_error(self):
 
964
        """Login and error."""
 
965
        FakedSSOService.error_dict = {'failure': 'really'}
 
966
 
 
967
        try:
 
968
            yield self.client.login()
 
969
        except CredentialsError, e:
 
970
            self.assertEqual(e[0], FakedSSOService.error_dict)
 
971
        else:
 
972
            self.fail('Must not succeed!')
 
973