Skip to content

Commit da102b8

Browse files
Merge pull request #780 from adobe/feature/disqualification
Feature/disqualification -> dev
2 parents bfc1a1e + af33a30 commit da102b8

File tree

64 files changed

+5234
-221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+5234
-221
lines changed

code/core/api/core.api

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public abstract interface class com/adobe/marketing/mobile/AdobeCallbackWithErro
99
public class com/adobe/marketing/mobile/AdobeError : java/io/Serializable {
1010
public static final field CALLBACK_NULL Lcom/adobe/marketing/mobile/AdobeError;
1111
public static final field CALLBACK_TIMEOUT Lcom/adobe/marketing/mobile/AdobeError;
12+
public static final field DATABASE_ERROR Lcom/adobe/marketing/mobile/AdobeError;
1213
public static final field EXTENSION_NOT_INITIALIZED Lcom/adobe/marketing/mobile/AdobeError;
1314
public static final field INVALID_REQUEST Lcom/adobe/marketing/mobile/AdobeError;
1415
public static final field INVALID_RESPONSE Lcom/adobe/marketing/mobile/AdobeError;
@@ -56,6 +57,23 @@ public class com/adobe/marketing/mobile/EventHistoryRequest {
5657
public fun getToDate ()J
5758
}
5859

60+
public final class com/adobe/marketing/mobile/EventHistoryResult {
61+
public static final field $stable I
62+
public final field count I
63+
public final field newestOccurrence Ljava/lang/Long;
64+
public final field oldestOccurrence Ljava/lang/Long;
65+
public fun <init> (ILjava/lang/Long;Ljava/lang/Long;)V
66+
public synthetic fun <init> (ILjava/lang/Long;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
67+
public final fun component1 ()I
68+
public final fun component2 ()Ljava/lang/Long;
69+
public final fun component3 ()Ljava/lang/Long;
70+
public final fun copy (ILjava/lang/Long;Ljava/lang/Long;)Lcom/adobe/marketing/mobile/EventHistoryResult;
71+
public static synthetic fun copy$default (Lcom/adobe/marketing/mobile/EventHistoryResult;ILjava/lang/Long;Ljava/lang/Long;ILjava/lang/Object;)Lcom/adobe/marketing/mobile/EventHistoryResult;
72+
public fun equals (Ljava/lang/Object;)Z
73+
public fun hashCode ()I
74+
public fun toString ()Ljava/lang/String;
75+
}
76+
5977
public abstract interface class com/adobe/marketing/mobile/EventHistoryResultHandler {
6078
public abstract fun call (Ljava/lang/Object;)V
6179
}
@@ -138,9 +156,11 @@ public abstract class com/adobe/marketing/mobile/ExtensionApi {
138156
public abstract fun createSharedState (Ljava/util/Map;Lcom/adobe/marketing/mobile/Event;)V
139157
public abstract fun createXDMSharedState (Ljava/util/Map;Lcom/adobe/marketing/mobile/Event;)V
140158
public abstract fun dispatch (Lcom/adobe/marketing/mobile/Event;)V
159+
public abstract fun getHistoricalEvents ([Lcom/adobe/marketing/mobile/EventHistoryRequest;ZLcom/adobe/marketing/mobile/AdobeCallbackWithError;)V
141160
public abstract fun getHistoricalEvents ([Lcom/adobe/marketing/mobile/EventHistoryRequest;ZLcom/adobe/marketing/mobile/EventHistoryResultHandler;)V
142161
public abstract fun getSharedState (Ljava/lang/String;Lcom/adobe/marketing/mobile/Event;ZLcom/adobe/marketing/mobile/SharedStateResolution;)Lcom/adobe/marketing/mobile/SharedStateResult;
143162
public abstract fun getXDMSharedState (Ljava/lang/String;Lcom/adobe/marketing/mobile/Event;ZLcom/adobe/marketing/mobile/SharedStateResolution;)Lcom/adobe/marketing/mobile/SharedStateResult;
163+
public abstract fun recordHistoricalEvent (Lcom/adobe/marketing/mobile/Event;Lcom/adobe/marketing/mobile/AdobeCallbackWithError;)V
144164
public abstract fun registerEventListener (Ljava/lang/String;Ljava/lang/String;Lcom/adobe/marketing/mobile/ExtensionEventListener;)V
145165
public abstract fun startEvents ()V
146166
public abstract fun stopEvents ()V

code/core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,5 @@ dependencies {
6060
androidTestImplementation(project(":testutils"))
6161
testImplementation("org.robolectric:robolectric:4.7")
6262
testImplementation(project(":testutils"))
63+
testImplementation(BuildConstants.Dependencies.MOCKK)
6364
}

code/core/src/androidTest/java/com/adobe/marketing/mobile/internal/eventhub/history/AndroidEventHistoryDatabaseTests.kt

Lines changed: 114 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.adobe.marketing.mobile.internal.util.SQLiteDatabaseHelper
2121
import com.adobe.marketing.mobile.services.MockAppContextService
2222
import com.adobe.marketing.mobile.services.ServiceProviderModifier
2323
import org.junit.Assert.assertEquals
24+
import org.junit.Assert.assertFalse
2425
import org.junit.Assert.assertNotNull
2526
import org.junit.Assert.assertTrue
2627
import org.junit.Assert.fail
@@ -33,6 +34,7 @@ import java.io.File
3334
class AndroidEventHistoryDatabaseTests {
3435
private lateinit var androidEventHistoryDatabase: EventHistoryDatabase
3536
private lateinit var context: Context
37+
private lateinit var databaseFile: File
3638

3739
@Before
3840
fun beforeEach() {
@@ -43,9 +45,10 @@ class AndroidEventHistoryDatabaseTests {
4345
ServiceProviderModifier.setAppContextService(mockAppContextService)
4446

4547
// Make sure databases directory exist
46-
context.applicationContext.getDatabasePath(DATABASE_NAME).parentFile?.mkdirs()
48+
databaseFile = context.applicationContext.getDatabasePath(DATABASE_NAME)
49+
databaseFile.parentFile?.mkdirs()
4750
TestUtils.deleteAllFilesInCacheDir(context)
48-
context.applicationContext.getDatabasePath(DATABASE_NAME).delete()
51+
databaseFile.delete()
4952

5053
try {
5154
androidEventHistoryDatabase = AndroidEventHistoryDatabase()
@@ -81,8 +84,8 @@ class AndroidEventHistoryDatabaseTests {
8184
// verify
8285
assertNotNull(result)
8386
assertEquals(1, result?.count)
84-
assertEquals(timestamp, result?.oldestTimestamp)
85-
assertEquals(timestamp, result?.newestTimeStamp)
87+
assertEquals(timestamp, result?.oldestOccurrence)
88+
assertEquals(timestamp, result?.newestOccurrence)
8689
}
8790

8891
@Test
@@ -109,8 +112,8 @@ class AndroidEventHistoryDatabaseTests {
109112

110113
// verify
111114
assertEquals(11, result?.count)
112-
assertEquals(startTimestamp, result?.oldestTimestamp)
113-
assertEquals(endTimestamp, result?.newestTimeStamp)
115+
assertEquals(startTimestamp, result?.oldestOccurrence)
116+
assertEquals(endTimestamp, result?.newestOccurrence)
114117
}
115118

116119
@Test
@@ -146,7 +149,7 @@ class AndroidEventHistoryDatabaseTests {
146149
@Test
147150
fun testInsert_DatabasesDirectoryAbsent() {
148151
// delete databases dir
149-
deleteFile(context.getDatabasePath(DATABASE_NAME).parentFile, true)
152+
deleteFile(databaseFile.parentFile, true)
150153

151154
// create new event history database
152155
val eventHistoryDatabase = AndroidEventHistoryDatabase()
@@ -156,13 +159,24 @@ class AndroidEventHistoryDatabaseTests {
156159
assertEquals(1, res?.count)
157160
}
158161

162+
@Test
163+
fun testInsert_DatabasesDeleted() {
164+
// create new event history database
165+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
166+
167+
// delete databases dir
168+
databaseFile.delete()
169+
170+
assertFalse(eventHistoryDatabase.insert(222222222, System.currentTimeMillis()))
171+
}
172+
159173
@Test
160174
fun testInsert_MigrationFromCacheDirectory() {
161175
// create event history database in cache directory
162176
createEventHistoryDatabaseInCacheDirectory()
163177

164178
// delete any existing event history database
165-
context.getDatabasePath(DATABASE_NAME).delete()
179+
databaseFile.delete()
166180

167181
// create new event history database
168182
val eventHistoryDatabase = AndroidEventHistoryDatabase()
@@ -182,7 +196,7 @@ class AndroidEventHistoryDatabaseTests {
182196
createEventHistoryDatabaseInCacheDirectory()
183197

184198
// delete databases dir
185-
deleteFile(context.getDatabasePath(DATABASE_NAME).parentFile, true)
199+
deleteFile(databaseFile.parentFile, true)
186200

187201
// create new event history database
188202
val eventHistoryDatabase = AndroidEventHistoryDatabase()
@@ -196,6 +210,92 @@ class AndroidEventHistoryDatabaseTests {
196210
assertEquals(1, query2?.count)
197211
}
198212

213+
@Test
214+
fun testQuery_noRecordExists() {
215+
// create new event history database
216+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
217+
218+
// query for a record that does not exist
219+
val res = eventHistoryDatabase.query(222222222, 0, System.currentTimeMillis())
220+
221+
assertNotNull(res)
222+
assertEquals(0, res?.count)
223+
assertEquals(null, res?.oldestOccurrence)
224+
assertEquals(null, res?.newestOccurrence)
225+
}
226+
@Test
227+
fun testQuery_DatabasesDeleted() {
228+
// create new event history database
229+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
230+
assertTrue(eventHistoryDatabase.insert(222222222, System.currentTimeMillis()))
231+
232+
// corrupt the databases dir
233+
databaseFile.delete()
234+
235+
val res = eventHistoryDatabase.query(222222222, 0, System.currentTimeMillis())
236+
assertNotNull(res)
237+
assertEquals(-1, res?.count)
238+
assertEquals(null, res?.oldestOccurrence)
239+
assertEquals(null, res?.newestOccurrence)
240+
}
241+
242+
@Test
243+
fun testQuery_CorruptDatabases() {
244+
// create new event history database
245+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
246+
assertTrue(eventHistoryDatabase.insert(222222222, System.currentTimeMillis()))
247+
248+
// corrupt the databases dir
249+
corruptDatabase()
250+
251+
val res = eventHistoryDatabase.query(222222222, 0, System.currentTimeMillis())
252+
assertNotNull(res)
253+
assertEquals(-1, res?.count)
254+
assertEquals(null, res?.oldestOccurrence)
255+
assertEquals(null, res?.newestOccurrence)
256+
}
257+
258+
@Test
259+
fun testDelete_DatabasesDeleted() {
260+
// create new event history database
261+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
262+
assertTrue(eventHistoryDatabase.insert(222222222, System.currentTimeMillis()))
263+
264+
// corrupt the databases dir
265+
databaseFile.delete()
266+
267+
val res = eventHistoryDatabase.delete(222222222, 0, System.currentTimeMillis())
268+
assertEquals(-1, res)
269+
}
270+
271+
@Test
272+
fun testDelete_CorruptDatabases() {
273+
// create new event history database
274+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
275+
assertTrue(eventHistoryDatabase.insert(222222222, System.currentTimeMillis()))
276+
277+
// corrupt the databases dir
278+
corruptDatabase()
279+
280+
val res = eventHistoryDatabase.delete(222222222, 0, System.currentTimeMillis())
281+
assertNotNull(res)
282+
assertEquals(-1, res)
283+
}
284+
285+
@Test
286+
fun testDelete_AlreadyDeletedRecord() {
287+
// create new event history database
288+
val eventHistoryDatabase = AndroidEventHistoryDatabase()
289+
val currentTimestamp = System.currentTimeMillis()
290+
assertTrue(eventHistoryDatabase.insert(222222222, currentTimestamp))
291+
292+
val res1 = eventHistoryDatabase.delete(222222222, 0, currentTimestamp)
293+
assertEquals(1, res1)
294+
295+
val res2 = eventHistoryDatabase.delete(222222222, 0, currentTimestamp)
296+
assertEquals(0, res2)
297+
}
298+
199299
@Throws(Exception::class)
200300
private fun createEventHistoryDatabaseInCacheDirectory() {
201301
val cacheDatabaseFile = File(context.cacheDir, DATABASE_NAME_1X)
@@ -218,6 +318,11 @@ class AndroidEventHistoryDatabaseTests {
218318
cacheDatabase.insert(TABLE_NAME, null, contentValues)
219319
}
220320

321+
private fun corruptDatabase() {
322+
// Write invalid data to corrupt the database
323+
databaseFile.writeBytes(ByteArray(10) { 0 })
324+
}
325+
221326
companion object {
222327
private const val DATABASE_NAME = "com.adobe.module.core.eventhistory"
223328
private const val DATABASE_NAME_1X = "EventHistory"

0 commit comments

Comments
 (0)