Skip to content

Commit c292958

Browse files
committed
[MOB-9235] Cleanup
1 parent 57965a0 commit c292958

File tree

5 files changed

+63
-13
lines changed

5 files changed

+63
-13
lines changed

iterableapi/src/main/java/com/iterable/iterableapi/IterableDataEncryptor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class IterableDataEncryptor {
107107

108108
class DecryptionException(message: String, cause: Throwable? = null) : Exception(message, cause)
109109

110-
fun clearKeyAndData(sharedPrefs: SharedPreferences) {
110+
fun resetKeys() {
111111
try {
112112
keyStore.deleteEntry(ITERABLE_KEY_ALIAS)
113113
generateKey()

iterableapi/src/main/java/com/iterable/iterableapi/IterableKeychain.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ class IterableKeychain {
5555
.remove(KEY_AUTH_TOKEN)
5656
.apply()
5757

58-
encryptor.clearKeyAndData(sharedPrefs)
58+
encryptor.resetKeys()
5959
decryptionFailureHandler?.onDecryptionFailed(e ?: Exception("Unknown decryption error"))
6060
}
6161

6262
private fun secureGet(key: String): String? {
6363
return try {
6464
sharedPrefs.getString(key, null)?.let { encryptor.decrypt(it) }
65-
} catch (e: IterableDataEncryptor.DecryptionException) {
65+
} catch (e: Exception) {
6666
handleDecryptionError(e)
6767
null
6868
}

iterableapi/src/test/java/com/iterable/iterableapi/IterableDataEncryptorTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,12 @@ public void testDecryptTamperedData() {
130130
}
131131

132132
@Test
133-
public void testClearKeyAndData() {
133+
public void testResetKeys() {
134134
String originalText = "test data";
135135
String encrypted = encryptor.encrypt(originalText);
136136

137137
// Clear the key
138-
encryptor.clearKeyAndData(sharedPreferences);
138+
encryptor.resetKeys();
139139

140140
// Try to decrypt the data encrypted with the old key
141141
try {
@@ -180,7 +180,7 @@ public void testKeyRegeneration() throws Exception {
180180
String encrypted1 = encryptor1.encrypt(testData);
181181

182182
// Delete the key
183-
encryptor1.clearKeyAndData(sharedPreferences);
183+
encryptor1.resetKeys();
184184

185185
// Create second encryptor which should generate a new key
186186
IterableDataEncryptor encryptor2 = new IterableDataEncryptor();
@@ -279,7 +279,7 @@ public void testDecryptionAfterKeyLoss() {
279279
String encrypted = encryptor.encrypt(testData);
280280

281281
// Clear the key and generate a new one
282-
encryptor.clearKeyAndData(sharedPreferences);
282+
encryptor.resetKeys();
283283

284284
try {
285285
encryptor.decrypt(encrypted);

iterableapi/src/test/java/com/iterable/iterableapi/IterableKeychainEncryptedDataMigratorTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,24 @@ public void testMigrationTimeout() throws InterruptedException {
248248
verify(mockEditor, times(2)).apply();
249249
}
250250

251+
@Test
252+
public void testNullEncryptedPrefs() throws InterruptedException {
253+
// Test behavior when encrypted prefs creation fails
254+
CountDownLatch latch = new CountDownLatch(1);
255+
AtomicReference<Throwable> error = new AtomicReference<>();
256+
257+
migrator.setMockEncryptedPrefs(null);
258+
migrator.setMigrationCompletionCallback(throwable -> {
259+
error.set(throwable);
260+
latch.countDown();
261+
return null;
262+
});
263+
264+
migrator.attemptMigration();
265+
266+
assertTrue(latch.await(5, TimeUnit.SECONDS));
267+
assertNotNull("Should have received an error", error.get());
268+
assertTrue(error.get().getMessage().contains("Failed to create or obtain encrypted preferences"));
269+
}
270+
251271
}

iterableapi/src/test/java/com/iterable/iterableapi/IterableKeychainTest.kt

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,15 @@ class IterableKeychainTest {
7474

7575
// Setup encrypt/decrypt behavior
7676
`when`(mockEncryptor.encrypt(any())).thenAnswer { invocation ->
77-
"encrypted_${invocation.arguments[0]}"
77+
val input = invocation.arguments[0] as String?
78+
input?.let { "encrypted_$it" }
7879
}
80+
7981
`when`(mockEncryptor.decrypt(any())).thenAnswer { invocation ->
80-
val encrypted = invocation.arguments[0] as String
81-
if (encrypted.startsWith("encrypted_")) {
82+
val encrypted = invocation.arguments[0] as String?
83+
if (encrypted == null) {
84+
null
85+
} else if (encrypted.startsWith("encrypted_")) {
8286
encrypted.substring("encrypted_".length)
8387
} else {
8488
throw IterableDataEncryptor.DecryptionException("Invalid encrypted value")
@@ -148,9 +152,12 @@ class IterableKeychainTest {
148152

149153
@Test
150154
fun testDecryptionFailure() {
151-
// Setup mock to simulate decryption failure
155+
// Setup mock to throw runtime exception instead
156+
`when`(mockEncryptor.decrypt(any())).thenAnswer {
157+
throw RuntimeException("Test decryption failed")
158+
}
152159
`when`(mockSharedPrefs.getString(eq("iterable-email"), isNull()))
153-
.thenReturn("corrupted_encrypted_value")
160+
.thenReturn("any_encrypted_value")
154161

155162
val result = keychain.getEmail()
156163

@@ -160,12 +167,35 @@ class IterableKeychainTest {
160167
verify(mockEditor).remove("iterable-auth-token")
161168
verify(mockEditor).apply()
162169

163-
// Verify failure handler was called
170+
// Verify failure handler was called with any exception
164171
verify(mockDecryptionFailureHandler).onDecryptionFailed(any())
172+
173+
// Verify encryptor keys were reset
174+
verify(mockEncryptor).resetKeys()
165175

166176
assertNull(result)
167177
}
168178

179+
@Test
180+
fun testDecryptionFailureForAllOperations() {
181+
// Setup mock to throw runtime exception
182+
`when`(mockEncryptor.decrypt(any())).thenAnswer {
183+
throw RuntimeException("Test decryption failed")
184+
}
185+
`when`(mockSharedPrefs.getString(any(), isNull())).thenReturn("any_encrypted_value")
186+
187+
// Test all getter methods
188+
assertNull(keychain.getEmail())
189+
assertNull(keychain.getUserId())
190+
assertNull(keychain.getAuthToken())
191+
192+
// Verify failure handler was called exactly once for each operation
193+
verify(mockDecryptionFailureHandler, times(3)).onDecryptionFailed(any())
194+
195+
// Verify keys were reset for each failure
196+
verify(mockEncryptor, times(3)).resetKeys()
197+
}
198+
169199
@Test
170200
fun testSaveNullValues() {
171201
keychain.saveEmail(null)

0 commit comments

Comments
 (0)