Skip to content

Commit f2f80fd

Browse files
zhu-xiaoweixiaoweii
andauthored
fix: sessionId in first open and session start events (#68)
Co-authored-by: xiaoweii <xiaoweii@amazom.com>
1 parent f9d9e57 commit f2f80fd

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,26 @@ public Session(final String sessionID, final Long startTime, final Long pauseTim
9696
* Get the session object from preferences, if exists and not expired return it.
9797
* otherwise create a new session.
9898
*
99-
* @param context The {@link ClickstreamContext}.
99+
* @param context The {@link ClickstreamContext}.
100+
* @param previousSession The previous session for check whether is new session.
100101
* @return new Session object.
101102
*/
102-
public static Session getInstance(final ClickstreamContext context) {
103-
// get session from preference
104-
Session storedSession = PreferencesUtil.getSession(context.getSystem().getPreferences());
105-
int sessionIndex = 1;
106-
if (storedSession != null) {
107-
if (System.currentTimeMillis() - storedSession.getPauseTime() <
108-
context.getClickstreamConfiguration().getSessionTimeoutDuration()) {
109-
return storedSession;
103+
public static Session getInstance(final ClickstreamContext context, Session previousSession) {
104+
Session session = previousSession;
105+
if (session == null) {
106+
session = PreferencesUtil.getSession(context.getSystem().getPreferences());
107+
}
108+
if (session != null) {
109+
if (session.getPauseTime() == null ||
110+
System.currentTimeMillis() - session.getPauseTime() <
111+
context.getClickstreamConfiguration().getSessionTimeoutDuration()) {
112+
return session;
110113
} else {
111-
sessionIndex = storedSession.sessionIndex + 1;
114+
return new Session(context, session.getSessionIndex() + 1);
112115
}
116+
} else {
117+
return new Session(context, 1);
113118
}
114-
return new Session(context, sessionIndex);
115119
}
116120

117121
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public SessionClient(@NonNull final ClickstreamContext clickstreamContext) {
4646
throw new IllegalArgumentException("A valid AnalyticsClient must be provided!");
4747
}
4848
this.clickstreamContext = clickstreamContext;
49-
session = Session.getInstance(clickstreamContext);
49+
session = Session.getInstance(clickstreamContext, null);
5050
this.clickstreamContext.getAnalyticsClient().setSession(session);
5151
}
5252

@@ -58,7 +58,7 @@ public SessionClient(@NonNull final ClickstreamContext clickstreamContext) {
5858
* @return is new session.
5959
*/
6060
public synchronized boolean initialSession() {
61-
session = Session.getInstance(clickstreamContext);
61+
session = Session.getInstance(clickstreamContext, session);
6262
this.clickstreamContext.getAnalyticsClient().setSession(session);
6363
if (session.isNewSession()) {
6464
final AnalyticsEvent event =

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
import software.aws.solution.clickstream.util.ReflectUtil;
4949

5050
import java.util.ArrayList;
51+
import java.util.HashSet;
5152
import java.util.List;
53+
import java.util.Set;
5254
import java.util.concurrent.ExecutorService;
5355
import java.util.concurrent.ThreadPoolExecutor;
5456

@@ -131,6 +133,40 @@ public void testUserEngagementSuccess() throws Exception {
131133
}
132134
}
133135

136+
137+
/**
138+
* test first open screen view and session start events will have the same sessionId.
139+
*
140+
* @throws Exception exception.
141+
*/
142+
@Test
143+
public void testEventsHaveSameSessionId() throws Exception {
144+
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);
145+
Activity activity = mock(Activity.class);
146+
Bundle bundle = mock(Bundle.class);
147+
callbacks.onActivityCreated(activity, bundle);
148+
callbacks.onActivityStarted(activity);
149+
callbacks.onActivityResumed(activity);
150+
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
151+
try (Cursor cursor = dbUtil.queryAllEvents()) {
152+
List<String> eventList = new ArrayList<>();
153+
Set<String> sessionIdSet = new HashSet<>();
154+
while (cursor.moveToNext()) {
155+
String eventString = cursor.getString(2);
156+
JSONObject jsonObject = new JSONObject(eventString);
157+
String eventName = jsonObject.getString("event_type");
158+
eventList.add(eventName);
159+
sessionIdSet.add(jsonObject.getJSONObject("attributes").getString("_session_id"));
160+
}
161+
assertEquals(Event.PresetEvent.FIRST_OPEN, eventList.get(0));
162+
assertEquals(Event.PresetEvent.APP_START, eventList.get(1));
163+
assertEquals(Event.PresetEvent.SESSION_START, eventList.get(2));
164+
assertEquals(Event.PresetEvent.SCREEN_VIEW, eventList.get(3));
165+
assertEquals(Event.PresetEvent.APP_END, eventList.get(4));
166+
assertEquals(1, sessionIdSet.size());
167+
}
168+
}
169+
134170
/**
135171
* test record user engagement event after view screen less than 1 second.
136172
*

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,9 @@ public void testDelete() {
116116
@Test
117117
public void testGetTotalDbSize() {
118118
AnalyticsEvent analyticsEvent = AnalyticsEventTest.getAnalyticsClient().createEvent("testEvent");
119-
int eventLength = analyticsEvent.toJSONObject().toString().length();
119+
int eventLength1 = analyticsEvent.toJSONObject().toString().length();
120120
Uri uri1 = dbUtil.saveEvent(analyticsEvent);
121+
int eventLength2 = analyticsEvent.toJSONObject().toString().length();
121122
Uri uri2 = dbUtil.saveEvent(analyticsEvent);
122123
int idInserted1 = Integer.parseInt(uri1.getLastPathSegment());
123124
int idInserted2 = Integer.parseInt(uri2.getLastPathSegment());
@@ -127,7 +128,7 @@ public void testGetTotalDbSize() {
127128
assertNotNull(c);
128129
assertEquals(c.getCount(), 2);
129130
c.close();
130-
Assert.assertEquals(dbUtil.getTotalSize(), eventLength * 2);
131+
Assert.assertEquals(dbUtil.getTotalSize(), eventLength1 + eventLength2);
131132
}
132133

133134
/**

0 commit comments

Comments
 (0)