@@ -74,3 +74,84 @@ def test_with_nonsense_key(self):
74
74
self .assertRaises (crypto .Error , crypt .pkcs12_key_as_pem ,
75
75
credentials .private_key ,
76
76
credentials .private_key_password )
77
+
78
+
79
+ class Test__verify_signature (unittest .TestCase ):
80
+
81
+ def test_success_single_cert (self ):
82
+ cert_value = 'cert-value'
83
+ certs = {None : cert_value }
84
+ message = object ()
85
+ signature = object ()
86
+
87
+ verifier = mock .MagicMock ()
88
+ verifier .verify = mock .MagicMock (name = 'verify' , return_value = True )
89
+ with mock .patch ('oauth2client.crypt.Verifier' ) as Verifier :
90
+ Verifier .from_string = mock .MagicMock (name = 'from_string' ,
91
+ return_value = verifier )
92
+ result = crypt ._verify_signature (message , signature , certs )
93
+ self .assertEqual (result , None )
94
+
95
+ # Make sure our mocks were called as expected.
96
+ Verifier .from_string .assert_called_once_with (cert_value ,
97
+ is_x509_cert = True )
98
+ verifier .verify .assert_called_once_with (message , signature )
99
+
100
+ def test_success_multiple_certs (self ):
101
+ cert_value1 = 'cert-value1'
102
+ cert_value2 = 'cert-value2'
103
+ cert_value3 = 'cert-value3'
104
+ certs = _MockOrderedDict (cert_value1 , cert_value2 , cert_value3 )
105
+ message = object ()
106
+ signature = object ()
107
+
108
+ verifier = mock .MagicMock ()
109
+ # Use side_effect to force all 3 cert values to be used by failing
110
+ # to verify on the first two.
111
+ verifier .verify = mock .MagicMock (name = 'verify' ,
112
+ side_effect = [False , False , True ])
113
+ with mock .patch ('oauth2client.crypt.Verifier' ) as Verifier :
114
+ Verifier .from_string = mock .MagicMock (name = 'from_string' ,
115
+ return_value = verifier )
116
+ result = crypt ._verify_signature (message , signature , certs )
117
+ self .assertEqual (result , None )
118
+
119
+ # Make sure our mocks were called three times.
120
+ expected_from_string_calls = [
121
+ mock .call (cert_value1 , is_x509_cert = True ),
122
+ mock .call (cert_value2 , is_x509_cert = True ),
123
+ mock .call (cert_value3 , is_x509_cert = True ),
124
+ ]
125
+ self .assertEqual (Verifier .from_string .mock_calls ,
126
+ expected_from_string_calls )
127
+ expected_verify_calls = [mock .call (message , signature )] * 3
128
+ self .assertEqual (verifier .verify .mock_calls ,
129
+ expected_verify_calls )
130
+
131
+ def test_failure (self ):
132
+ cert_value = 'cert-value'
133
+ certs = {None : cert_value }
134
+ message = object ()
135
+ signature = object ()
136
+
137
+ verifier = mock .MagicMock ()
138
+ verifier .verify = mock .MagicMock (name = 'verify' , return_value = False )
139
+ with mock .patch ('oauth2client.crypt.Verifier' ) as Verifier :
140
+ Verifier .from_string = mock .MagicMock (name = 'from_string' ,
141
+ return_value = verifier )
142
+ self .assertRaises (crypt .AppIdentityError , crypt ._verify_signature ,
143
+ message , signature , certs )
144
+
145
+ # Make sure our mocks were called as expected.
146
+ Verifier .from_string .assert_called_once_with (cert_value ,
147
+ is_x509_cert = True )
148
+ verifier .verify .assert_called_once_with (message , signature )
149
+
150
+
151
+ class _MockOrderedDict (object ):
152
+
153
+ def __init__ (self , * values ):
154
+ self ._values = values
155
+
156
+ def values (self ):
157
+ return self ._values
0 commit comments