Skip to content

Commit b2811de

Browse files
authored
fix: db insert error when no space left (#85)
1 parent 0549134 commit b2811de

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

clickstream/src/main/java/software/aws/solution/clickstream/client/EventRecorder.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import java.util.Locale;
3131
import java.util.concurrent.ExecutorService;
32+
import java.util.concurrent.Executors;
3233
import java.util.concurrent.LinkedBlockingQueue;
3334
import java.util.concurrent.ThreadPoolExecutor;
3435
import java.util.concurrent.TimeUnit;
@@ -101,6 +102,7 @@ public Uri recordEvent(@NonNull final AnalyticsEvent event) {
101102
}
102103
} else {
103104
LOG.error(String.format("Error to save event with EventType: %s", event.getEventType()));
105+
sendEventImmediately(event);
104106
}
105107
return uri;
106108
}
@@ -207,5 +209,21 @@ String[] getBatchOfEvents(final Cursor cursor) {
207209

208210
return new String[] {eventBuilder.toString(), lastEventId};
209211
}
212+
213+
/**
214+
* Method for send event immediately when event saved fail.
215+
* @param event AnalyticsEvent
216+
*/
217+
public void sendEventImmediately(AnalyticsEvent event) {
218+
Runnable task = () -> {
219+
NetRequest.uploadEvents("[" + event.toJSONObject().toString() + "]",
220+
clickstreamContext.getClickstreamConfiguration(),
221+
bundleSequenceId);
222+
bundleSequenceId += 1;
223+
clickstreamContext.getSystem().getPreferences()
224+
.putInt(KEY_BUNDLE_SEQUENCE_ID_PREF, bundleSequenceId);
225+
};
226+
Executors.newSingleThreadExecutor().execute(task);
227+
}
210228
}
211229

clickstream/src/main/java/software/aws/solution/clickstream/client/db/ClickstreamDBUtil.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@
1818
import android.content.ContentValues;
1919
import android.content.Context;
2020
import android.database.Cursor;
21+
import android.database.SQLException;
2122
import android.net.Uri;
2223

24+
import com.amazonaws.logging.Log;
25+
import com.amazonaws.logging.LogFactory;
2326
import software.aws.solution.clickstream.client.AnalyticsEvent;
27+
import software.aws.solution.clickstream.client.EventRecorder;
2428

2529
/**
2630
* Clickstream Database Util.
2731
*/
2832
public class ClickstreamDBUtil {
33+
private static final Log LOG = LogFactory.getLog(EventRecorder.class);
34+
2935
/**
3036
* ClickstreamDBBase is a basic helper for accessing the database.
3137
*/
@@ -58,7 +64,13 @@ public void closeDB() {
5864
* @return An Uri of the record inserted.
5965
*/
6066
public Uri saveEvent(final AnalyticsEvent event) {
61-
return clickstreamDBBase.insert(clickstreamDBBase.getContentUri(), generateContentValuesFromEvent(event));
67+
Uri uri = null;
68+
try {
69+
uri = clickstreamDBBase.insert(clickstreamDBBase.getContentUri(), generateContentValuesFromEvent(event));
70+
} catch (SQLException error) {
71+
LOG.warn("SQLException: " + error.getMessage());
72+
}
73+
return uri;
6274
}
6375

6476
private ContentValues generateContentValuesFromEvent(final AnalyticsEvent event) {

clickstream/src/test/java/software/aws/solution/clickstream/EventRecorderTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import static org.mockito.Mockito.mock;
7070
import static org.mockito.Mockito.times;
7171
import static org.mockito.Mockito.verify;
72+
import static org.mockito.Mockito.when;
7273

7374
@RunWith(RobolectricTestRunner.class)
7475
@Config(manifest = Config.NONE)
@@ -567,6 +568,23 @@ public void testRecordEventRequestUploadTimestamp() throws Exception {
567568
assertTrue(requestResult);
568569
}
569570

571+
/**
572+
* test save event failed and send event immediately.
573+
*
574+
* @throws Exception exception.
575+
*/
576+
@Test
577+
public void testSaveEventFailedAndWillSendEventImmediately() throws Exception {
578+
dbUtil = mock(ClickstreamDBUtil.class);
579+
ReflectUtil.modifyFiled(eventRecorder, "dbUtil", dbUtil);
580+
when(dbUtil.saveEvent(event)).thenReturn(null);
581+
eventRecorder.recordEvent(event);
582+
verify(log).error("Error to save event with EventType: testEvent");
583+
Thread.sleep(1500);
584+
int bundleSequenceId = (int) ReflectUtil.getFiled(eventRecorder, "bundleSequenceId");
585+
assertTrue(bundleSequenceId > 1);
586+
}
587+
570588
/**
571589
* common method to set request path.
572590
*

clickstream/src/test/java/software/aws/solution/clickstream/db/DBUtilTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
package software.aws.solution.clickstream.db;
1717

18+
import android.content.ContentValues;
1819
import android.database.Cursor;
20+
import android.database.SQLException;
1921
import android.net.Uri;
2022
import androidx.test.core.app.ApplicationProvider;
2123

@@ -28,13 +30,19 @@
2830
import org.robolectric.annotation.Config;
2931
import software.aws.solution.clickstream.AnalyticsEventTest;
3032
import software.aws.solution.clickstream.client.AnalyticsEvent;
33+
import software.aws.solution.clickstream.client.db.ClickstreamDBBase;
3134
import software.aws.solution.clickstream.client.db.ClickstreamDBUtil;
35+
import software.aws.solution.clickstream.util.ReflectUtil;
3236

3337
import java.util.Objects;
3438

3539
import static org.junit.Assert.assertEquals;
3640
import static org.junit.Assert.assertNotEquals;
3741
import static org.junit.Assert.assertNotNull;
42+
import static org.junit.Assert.assertNull;
43+
import static org.mockito.ArgumentMatchers.any;
44+
import static org.mockito.Mockito.doThrow;
45+
import static org.mockito.Mockito.mock;
3846

3947
@RunWith(RobolectricTestRunner.class)
4048
@Config(manifest = Config.NONE, sdk = 26)
@@ -63,6 +71,21 @@ public void testInsertSingleEvent() {
6371
assertNotEquals(idInserted, 0);
6472
}
6573

74+
/**
75+
* test insert single event failed.
76+
*
77+
* @throws Exception exception.
78+
*/
79+
@Test
80+
public void testInsertSingleEventFailed() throws Exception {
81+
ClickstreamDBBase clickstreamDBBase = mock(ClickstreamDBBase.class);
82+
ReflectUtil.modifyFiled(dbUtil, "clickstreamDBBase", clickstreamDBBase);
83+
doThrow(new SQLException("Mocked SQLException")).when(clickstreamDBBase).insert(any(Uri.class), any(
84+
ContentValues.class));
85+
Uri uri = dbUtil.saveEvent(analyticsEvent);
86+
assertNull(uri);
87+
}
88+
6689
/**
6790
* test query all.
6891
*/

0 commit comments

Comments
 (0)