OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.content.browser.crypto; | 5 package org.chromium.content.browser.crypto; |
6 | 6 |
7 import android.os.Bundle; | 7 import android.os.Bundle; |
8 import android.support.test.filters.MediumTest; | 8 import android.support.test.filters.MediumTest; |
9 import android.test.InstrumentationTestCase; | 9 |
| 10 import org.junit.Assert; |
| 11 import org.junit.Before; |
| 12 import org.junit.Test; |
| 13 import org.junit.runner.RunWith; |
10 | 14 |
11 import org.chromium.base.ThreadUtils; | 15 import org.chromium.base.ThreadUtils; |
| 16 import org.chromium.base.test.BaseJUnit4ClassRunner; |
12 import org.chromium.content.browser.crypto.CipherFactory.CipherDataObserver; | 17 import org.chromium.content.browser.crypto.CipherFactory.CipherDataObserver; |
13 | 18 |
14 import java.io.IOException; | 19 import java.io.IOException; |
15 import java.security.GeneralSecurityException; | 20 import java.security.GeneralSecurityException; |
16 import java.util.Arrays; | 21 import java.util.Arrays; |
17 | 22 |
18 import javax.crypto.Cipher; | 23 import javax.crypto.Cipher; |
19 | 24 |
20 /** | 25 /** |
21 * Functional tests for the {@link CipherFactory}. Confirms that saving and rest
oring data works, as | 26 * Functional tests for the {@link CipherFactory}. Confirms that saving and rest
oring data works, as |
22 * well as that {@link Cipher} instances properly encrypt and decrypt data. | 27 * well as that {@link Cipher} instances properly encrypt and decrypt data. |
23 * | 28 * |
24 * Tests that confirm that the class is thread-safe would require putting potent
ially flaky hooks | 29 * Tests that confirm that the class is thread-safe would require putting potent
ially flaky hooks |
25 * throughout the class to simulate artificial blockages. | 30 * throughout the class to simulate artificial blockages. |
26 */ | 31 */ |
27 public class CipherFactoryTest extends InstrumentationTestCase { | 32 @RunWith(BaseJUnit4ClassRunner.class) |
| 33 public class CipherFactoryTest { |
28 private static final byte[] INPUT_DATA = {1, 16, 84}; | 34 private static final byte[] INPUT_DATA = {1, 16, 84}; |
29 | 35 |
30 /** Generates non-random byte[] for testing. */ | 36 /** Generates non-random byte[] for testing. */ |
31 private static class DeterministicParameterGenerator extends ByteArrayGenera
tor { | 37 private static class DeterministicParameterGenerator extends ByteArrayGenera
tor { |
32 @Override | 38 @Override |
33 public byte[] getBytes(int numBytes) throws IOException, GeneralSecurity
Exception { | 39 public byte[] getBytes(int numBytes) throws IOException, GeneralSecurity
Exception { |
34 return getBytes(numBytes, (byte) 0); | 40 return getBytes(numBytes, (byte) 0); |
35 } | 41 } |
36 | 42 |
37 /** | 43 /** |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 @Override | 76 @Override |
71 public void run() { | 77 public void run() { |
72 // Do nothing. | 78 // Do nothing. |
73 } | 79 } |
74 }; | 80 }; |
75 | 81 |
76 /** | 82 /** |
77 * Overrides the {@link ByteArrayGenerator} used by the {@link CipherFactory
} to ensure | 83 * Overrides the {@link ByteArrayGenerator} used by the {@link CipherFactory
} to ensure |
78 * deterministic results. | 84 * deterministic results. |
79 */ | 85 */ |
80 @Override | 86 @Before |
81 protected void setUp() throws Exception { | 87 public void setUp() throws Exception { |
82 super.setUp(); | |
83 mNumberProvider = new DeterministicParameterGenerator(); | 88 mNumberProvider = new DeterministicParameterGenerator(); |
84 CipherFactory.getInstance().setRandomNumberProviderForTests(mNumberProvi
der); | 89 CipherFactory.getInstance().setRandomNumberProviderForTests(mNumberProvi
der); |
85 } | 90 } |
86 | 91 |
87 /** | 92 /** |
88 * {@link Cipher} instances initialized using the same parameters work in ex
actly the same way. | 93 * {@link Cipher} instances initialized using the same parameters work in ex
actly the same way. |
89 */ | 94 */ |
| 95 @Test |
90 @MediumTest | 96 @MediumTest |
91 public void testCipherUse() throws Exception { | 97 public void testCipherUse() throws Exception { |
92 // Check encryption. | 98 // Check encryption. |
93 Cipher aEncrypt = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_M
ODE); | 99 Cipher aEncrypt = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_M
ODE); |
94 Cipher bEncrypt = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_M
ODE); | 100 Cipher bEncrypt = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_M
ODE); |
95 byte[] output = sameOutputDifferentCiphers(INPUT_DATA, aEncrypt, bEncryp
t); | 101 byte[] output = sameOutputDifferentCiphers(INPUT_DATA, aEncrypt, bEncryp
t); |
96 | 102 |
97 // Check decryption. | 103 // Check decryption. |
98 Cipher aDecrypt = CipherFactory.getInstance().getCipher(Cipher.DECRYPT_M
ODE); | 104 Cipher aDecrypt = CipherFactory.getInstance().getCipher(Cipher.DECRYPT_M
ODE); |
99 Cipher bDecrypt = CipherFactory.getInstance().getCipher(Cipher.DECRYPT_M
ODE); | 105 Cipher bDecrypt = CipherFactory.getInstance().getCipher(Cipher.DECRYPT_M
ODE); |
100 byte[] decrypted = sameOutputDifferentCiphers(output, aDecrypt, bDecrypt
); | 106 byte[] decrypted = sameOutputDifferentCiphers(output, aDecrypt, bDecrypt
); |
101 assertTrue(Arrays.equals(decrypted, INPUT_DATA)); | 107 Assert.assertTrue(Arrays.equals(decrypted, INPUT_DATA)); |
102 } | 108 } |
103 | 109 |
104 /** | 110 /** |
105 * Restoring a {@link Bundle} containing the same parameters already in use
by the | 111 * Restoring a {@link Bundle} containing the same parameters already in use
by the |
106 * {@link CipherFactory} should keep the same keys. | 112 * {@link CipherFactory} should keep the same keys. |
107 */ | 113 */ |
| 114 @Test |
108 @MediumTest | 115 @MediumTest |
109 public void testSameBundleRestoration() throws Exception { | 116 public void testSameBundleRestoration() throws Exception { |
110 // Create two bundles with the same saved state. | 117 // Create two bundles with the same saved state. |
111 Bundle aBundle = new Bundle(); | 118 Bundle aBundle = new Bundle(); |
112 Bundle bBundle = new Bundle(); | 119 Bundle bBundle = new Bundle(); |
113 | 120 |
114 byte[] sameIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte)
100); | 121 byte[] sameIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte)
100); |
115 aBundle.putByteArray(CipherFactory.BUNDLE_IV, sameIv); | 122 aBundle.putByteArray(CipherFactory.BUNDLE_IV, sameIv); |
116 bBundle.putByteArray(CipherFactory.BUNDLE_IV, sameIv); | 123 bBundle.putByteArray(CipherFactory.BUNDLE_IV, sameIv); |
117 | 124 |
118 byte[] sameKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte
) 200); | 125 byte[] sameKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte
) 200); |
119 aBundle.putByteArray(CipherFactory.BUNDLE_KEY, sameKey); | 126 aBundle.putByteArray(CipherFactory.BUNDLE_KEY, sameKey); |
120 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, sameKey); | 127 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, sameKey); |
121 | 128 |
122 // Restore using the first bundle, then the second. Both should succeed. | 129 // Restore using the first bundle, then the second. Both should succeed. |
123 assertTrue(CipherFactory.getInstance().restoreFromBundle(aBundle)); | 130 Assert.assertTrue(CipherFactory.getInstance().restoreFromBundle(aBundle)
); |
124 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 131 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
125 assertTrue(CipherFactory.getInstance().restoreFromBundle(bBundle)); | 132 Assert.assertTrue(CipherFactory.getInstance().restoreFromBundle(bBundle)
); |
126 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 133 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
127 | 134 |
128 // Make sure the CipherFactory instances are using the same key. | 135 // Make sure the CipherFactory instances are using the same key. |
129 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); | 136 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); |
130 } | 137 } |
131 | 138 |
132 /** | 139 /** |
133 * Restoring a {@link Bundle} containing a different set of parameters from
those already in use | 140 * Restoring a {@link Bundle} containing a different set of parameters from
those already in use |
134 * by the {@link CipherFactory} should fail. Any Ciphers created after the f
ailed restoration | 141 * by the {@link CipherFactory} should fail. Any Ciphers created after the f
ailed restoration |
135 * attempt should use the already-existing keys. | 142 * attempt should use the already-existing keys. |
136 */ | 143 */ |
| 144 @Test |
137 @MediumTest | 145 @MediumTest |
138 public void testDifferentBundleRestoration() throws Exception { | 146 public void testDifferentBundleRestoration() throws Exception { |
139 // Restore one set of parameters. | 147 // Restore one set of parameters. |
140 Bundle aBundle = new Bundle(); | 148 Bundle aBundle = new Bundle(); |
141 byte[] aIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50
); | 149 byte[] aIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50
); |
142 byte[] aKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 1
00); | 150 byte[] aKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 1
00); |
143 aBundle.putByteArray(CipherFactory.BUNDLE_IV, aIv); | 151 aBundle.putByteArray(CipherFactory.BUNDLE_IV, aIv); |
144 aBundle.putByteArray(CipherFactory.BUNDLE_KEY, aKey); | 152 aBundle.putByteArray(CipherFactory.BUNDLE_KEY, aKey); |
145 assertTrue(CipherFactory.getInstance().restoreFromBundle(aBundle)); | 153 Assert.assertTrue(CipherFactory.getInstance().restoreFromBundle(aBundle)
); |
146 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 154 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
147 | 155 |
148 // Restore using a different set of parameters. | 156 // Restore using a different set of parameters. |
149 Bundle bBundle = new Bundle(); | 157 Bundle bBundle = new Bundle(); |
150 byte[] bIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 15
0); | 158 byte[] bIv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 15
0); |
151 byte[] bKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 2
00); | 159 byte[] bKey = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 2
00); |
152 bBundle.putByteArray(CipherFactory.BUNDLE_IV, bIv); | 160 bBundle.putByteArray(CipherFactory.BUNDLE_IV, bIv); |
153 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, bKey); | 161 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, bKey); |
154 assertFalse(CipherFactory.getInstance().restoreFromBundle(bBundle)); | 162 Assert.assertFalse(CipherFactory.getInstance().restoreFromBundle(bBundle
)); |
155 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 163 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
156 | 164 |
157 // Make sure they're using the same (original) key by encrypting the sam
e data. | 165 // Make sure they're using the same (original) key by encrypting the sam
e data. |
158 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); | 166 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); |
159 } | 167 } |
160 | 168 |
161 /** | 169 /** |
162 * Restoration from a {@link Bundle} missing data should fail. | 170 * Restoration from a {@link Bundle} missing data should fail. |
163 */ | 171 */ |
| 172 @Test |
164 @MediumTest | 173 @MediumTest |
165 public void testIncompleteBundleRestoration() throws Exception { | 174 public void testIncompleteBundleRestoration() throws Exception { |
166 // Make sure we handle the null case. | 175 // Make sure we handle the null case. |
167 assertFalse(CipherFactory.getInstance().restoreFromBundle(null)); | 176 Assert.assertFalse(CipherFactory.getInstance().restoreFromBundle(null)); |
168 | 177 |
169 // Try restoring without the key. | 178 // Try restoring without the key. |
170 Bundle aBundle = new Bundle(); | 179 Bundle aBundle = new Bundle(); |
171 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; | 180 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; |
172 aBundle.putByteArray(CipherFactory.BUNDLE_IV, iv); | 181 aBundle.putByteArray(CipherFactory.BUNDLE_IV, iv); |
173 assertFalse(CipherFactory.getInstance().restoreFromBundle(aBundle)); | 182 Assert.assertFalse(CipherFactory.getInstance().restoreFromBundle(aBundle
)); |
174 | 183 |
175 // Try restoring without the initialization vector. | 184 // Try restoring without the initialization vector. |
176 Bundle bBundle = new Bundle(); | 185 Bundle bBundle = new Bundle(); |
177 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); | 186 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); |
178 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, key); | 187 bBundle.putByteArray(CipherFactory.BUNDLE_KEY, key); |
179 assertFalse(CipherFactory.getInstance().restoreFromBundle(bBundle)); | 188 Assert.assertFalse(CipherFactory.getInstance().restoreFromBundle(bBundle
)); |
180 } | 189 } |
181 | 190 |
182 /** | 191 /** |
183 * Parameters should only be saved when they're needed by the {@link CipherF
actory}. Restoring | 192 * Parameters should only be saved when they're needed by the {@link CipherF
actory}. Restoring |
184 * parameters from a {@link Bundle} before this point should result in {@lin
k Cipher}s using the | 193 * parameters from a {@link Bundle} before this point should result in {@lin
k Cipher}s using the |
185 * restored parameters instead of any generated ones. | 194 * restored parameters instead of any generated ones. |
186 */ | 195 */ |
| 196 @Test |
187 @MediumTest | 197 @MediumTest |
188 public void testRestorationSucceedsBeforeCipherCreated() throws Exception { | 198 public void testRestorationSucceedsBeforeCipherCreated() throws Exception { |
189 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; | 199 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; |
190 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); | 200 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); |
191 Bundle bundle = new Bundle(); | 201 Bundle bundle = new Bundle(); |
192 bundle.putByteArray(CipherFactory.BUNDLE_IV, iv); | 202 bundle.putByteArray(CipherFactory.BUNDLE_IV, iv); |
193 bundle.putByteArray(CipherFactory.BUNDLE_KEY, key); | 203 bundle.putByteArray(CipherFactory.BUNDLE_KEY, key); |
194 | 204 |
195 // The keys should be initialized only after restoration. | 205 // The keys should be initialized only after restoration. |
196 assertNull(CipherFactory.getInstance().getCipherData(false)); | 206 Assert.assertNull(CipherFactory.getInstance().getCipherData(false)); |
197 assertTrue(CipherFactory.getInstance().restoreFromBundle(bundle)); | 207 Assert.assertTrue(CipherFactory.getInstance().restoreFromBundle(bundle))
; |
198 assertNotNull(CipherFactory.getInstance().getCipherData(false)); | 208 Assert.assertNotNull(CipherFactory.getInstance().getCipherData(false)); |
199 } | 209 } |
200 | 210 |
201 /** | 211 /** |
202 * If the {@link CipherFactory} has already generated parameters, restoratio
ns of different data | 212 * If the {@link CipherFactory} has already generated parameters, restoratio
ns of different data |
203 * should fail. All {@link Cipher}s should use the generated parameters. | 213 * should fail. All {@link Cipher}s should use the generated parameters. |
204 */ | 214 */ |
| 215 @Test |
205 @MediumTest | 216 @MediumTest |
206 public void testRestorationDiscardsAfterOtherCipherAlreadyCreated() throws E
xception { | 217 public void testRestorationDiscardsAfterOtherCipherAlreadyCreated() throws E
xception { |
207 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; | 218 byte[] iv = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 50)
; |
208 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); | 219 byte[] key = mNumberProvider.getBytes(CipherFactory.NUM_BYTES, (byte) 10
0); |
209 Bundle bundle = new Bundle(); | 220 Bundle bundle = new Bundle(); |
210 bundle.putByteArray(CipherFactory.BUNDLE_IV, iv); | 221 bundle.putByteArray(CipherFactory.BUNDLE_IV, iv); |
211 bundle.putByteArray(CipherFactory.BUNDLE_KEY, key); | 222 bundle.putByteArray(CipherFactory.BUNDLE_KEY, key); |
212 | 223 |
213 // The keys should be initialized after creating the cipher, so the keys
shouldn't match. | 224 // The keys should be initialized after creating the cipher, so the keys
shouldn't match. |
214 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 225 Cipher aCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
215 assertFalse(CipherFactory.getInstance().restoreFromBundle(bundle)); | 226 Assert.assertFalse(CipherFactory.getInstance().restoreFromBundle(bundle)
); |
216 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); | 227 Cipher bCipher = CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MO
DE); |
217 | 228 |
218 // B's cipher should use the keys generated for A. | 229 // B's cipher should use the keys generated for A. |
219 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); | 230 sameOutputDifferentCiphers(INPUT_DATA, aCipher, bCipher); |
220 } | 231 } |
221 | 232 |
222 /** | 233 /** |
223 * Data saved out to the {@link Bundle} should match what is held by the {@l
ink CipherFactory}. | 234 * Data saved out to the {@link Bundle} should match what is held by the {@l
ink CipherFactory}. |
224 */ | 235 */ |
| 236 @Test |
225 @MediumTest | 237 @MediumTest |
226 public void testSavingToBundle() throws Exception { | 238 public void testSavingToBundle() throws Exception { |
227 // Nothing should get saved out before Cipher data exists. | 239 // Nothing should get saved out before Cipher data exists. |
228 Bundle initialBundle = new Bundle(); | 240 Bundle initialBundle = new Bundle(); |
229 CipherFactory.getInstance().saveToBundle(initialBundle); | 241 CipherFactory.getInstance().saveToBundle(initialBundle); |
230 assertFalse(initialBundle.containsKey(CipherFactory.BUNDLE_IV)); | 242 Assert.assertFalse(initialBundle.containsKey(CipherFactory.BUNDLE_IV)); |
231 assertFalse(initialBundle.containsKey(CipherFactory.BUNDLE_KEY)); | 243 Assert.assertFalse(initialBundle.containsKey(CipherFactory.BUNDLE_KEY)); |
232 | 244 |
233 // Check that Cipher data gets saved if it exists. | 245 // Check that Cipher data gets saved if it exists. |
234 CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MODE); | 246 CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MODE); |
235 Bundle afterBundle = new Bundle(); | 247 Bundle afterBundle = new Bundle(); |
236 CipherFactory.getInstance().saveToBundle(afterBundle); | 248 CipherFactory.getInstance().saveToBundle(afterBundle); |
237 assertTrue(afterBundle.containsKey(CipherFactory.BUNDLE_IV)); | 249 Assert.assertTrue(afterBundle.containsKey(CipherFactory.BUNDLE_IV)); |
238 assertTrue(afterBundle.containsKey(CipherFactory.BUNDLE_KEY)); | 250 Assert.assertTrue(afterBundle.containsKey(CipherFactory.BUNDLE_KEY)); |
239 | 251 |
240 // Confirm the saved keys match by restoring it. | 252 // Confirm the saved keys match by restoring it. |
241 assertTrue(CipherFactory.getInstance().restoreFromBundle(afterBundle)); | 253 Assert.assertTrue(CipherFactory.getInstance().restoreFromBundle(afterBun
dle)); |
242 } | 254 } |
243 | 255 |
244 /** | 256 /** |
245 * Checks that an observer is notified when cipher data is created. | 257 * Checks that an observer is notified when cipher data is created. |
246 */ | 258 */ |
| 259 @Test |
247 @MediumTest | 260 @MediumTest |
248 public void testCipherFactoryObserver() throws Exception { | 261 public void testCipherFactoryObserver() throws Exception { |
249 TestCipherDataObserver observer = new TestCipherDataObserver(); | 262 TestCipherDataObserver observer = new TestCipherDataObserver(); |
250 CipherFactory.getInstance().addCipherDataObserver(observer); | 263 CipherFactory.getInstance().addCipherDataObserver(observer); |
251 assertEquals(0, observer.getTimesNotified()); | 264 Assert.assertEquals(0, observer.getTimesNotified()); |
252 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); | 265 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); |
253 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 266 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
254 assertEquals(1, observer.getTimesNotified()); | 267 Assert.assertEquals(1, observer.getTimesNotified()); |
255 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); | 268 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); |
256 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 269 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
257 assertEquals(1, observer.getTimesNotified()); | 270 Assert.assertEquals(1, observer.getTimesNotified()); |
258 CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MODE); | 271 CipherFactory.getInstance().getCipher(Cipher.ENCRYPT_MODE); |
259 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 272 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
260 assertEquals(1, observer.getTimesNotified()); | 273 Assert.assertEquals(1, observer.getTimesNotified()); |
261 CipherFactory.getInstance().removeCipherDataObserver(observer); | 274 CipherFactory.getInstance().removeCipherDataObserver(observer); |
262 } | 275 } |
263 | 276 |
264 /** | 277 /** |
265 * Verifies that if the observer is attached after cipher data has already b
een | 278 * Verifies that if the observer is attached after cipher data has already b
een |
266 * created the observer doesn't fire. | 279 * created the observer doesn't fire. |
267 */ | 280 */ |
| 281 @Test |
268 @MediumTest | 282 @MediumTest |
269 public void testCipherFactoryObserverTooLate() throws Exception { | 283 public void testCipherFactoryObserverTooLate() throws Exception { |
270 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); | 284 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); |
271 // Ensures that cipher finishes initializing before running the rest of
the test. | 285 // Ensures that cipher finishes initializing before running the rest of
the test. |
272 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 286 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
273 TestCipherDataObserver observer = new TestCipherDataObserver(); | 287 TestCipherDataObserver observer = new TestCipherDataObserver(); |
274 CipherFactory.getInstance().addCipherDataObserver(observer); | 288 CipherFactory.getInstance().addCipherDataObserver(observer); |
275 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 289 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
276 assertEquals(0, observer.getTimesNotified()); | 290 Assert.assertEquals(0, observer.getTimesNotified()); |
277 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); | 291 CipherFactory.getInstance().getCipher(Cipher.DECRYPT_MODE); |
278 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); | 292 ThreadUtils.runOnUiThreadBlocking(mEmptyRunnable); |
279 assertEquals(0, observer.getTimesNotified()); | 293 Assert.assertEquals(0, observer.getTimesNotified()); |
280 } | 294 } |
281 | 295 |
282 /** | 296 /** |
283 * Confirm that the two {@link Cipher}s are functionally equivalent. | 297 * Confirm that the two {@link Cipher}s are functionally equivalent. |
284 * @return The input after it has been operated on (e.g. decrypted or encryp
ted). | 298 * @return The input after it has been operated on (e.g. decrypted or encryp
ted). |
285 */ | 299 */ |
286 private byte[] sameOutputDifferentCiphers(byte[] input, Cipher aCipher, Ciph
er bCipher) | 300 private byte[] sameOutputDifferentCiphers(byte[] input, Cipher aCipher, Ciph
er bCipher) |
287 throws Exception { | 301 throws Exception { |
288 assertNotNull(aCipher); | 302 Assert.assertNotNull(aCipher); |
289 assertNotNull(bCipher); | 303 Assert.assertNotNull(bCipher); |
290 assertNotSame(aCipher, bCipher); | 304 Assert.assertNotSame(aCipher, bCipher); |
291 | 305 |
292 byte[] aOutput = aCipher.doFinal(input); | 306 byte[] aOutput = aCipher.doFinal(input); |
293 byte[] bOutput = bCipher.doFinal(input); | 307 byte[] bOutput = bCipher.doFinal(input); |
294 | 308 |
295 assertNotNull(aOutput); | 309 Assert.assertNotNull(aOutput); |
296 assertNotNull(bOutput); | 310 Assert.assertNotNull(bOutput); |
297 assertTrue(Arrays.equals(aOutput, bOutput)); | 311 Assert.assertTrue(Arrays.equals(aOutput, bOutput)); |
298 | 312 |
299 return aOutput; | 313 return aOutput; |
300 } | 314 } |
301 } | 315 } |
OLD | NEW |