Skip to content

Commit c308c69

Browse files
authored
Storage customization fix (#228)
* add subject to file index key * add unit test --------- Co-authored-by: Wenxi Zeng <[email protected]>
1 parent 1ccea75 commit c308c69

File tree

5 files changed

+40
-7
lines changed

5 files changed

+40
-7
lines changed

android/src/main/java/com/segment/analytics/kotlin/android/Storage.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ class AndroidStorage(
2121
private val store: Store,
2222
writeKey: String,
2323
private val ioDispatcher: CoroutineDispatcher,
24-
directory: String? = null
24+
directory: String? = null,
25+
subject: String? = null
2526
) : Subscriber, Storage {
2627

2728
private val sharedPreferences: SharedPreferences =
2829
context.getSharedPreferences("analytics-android-$writeKey", Context.MODE_PRIVATE)
2930
override val storageDirectory: File = context.getDir(directory ?: "segment-disk-queue", Context.MODE_PRIVATE)
3031
internal val eventsFile =
31-
EventsFileManager(storageDirectory, writeKey, AndroidKVS(sharedPreferences))
32+
EventsFileManager(storageDirectory, writeKey, AndroidKVS(sharedPreferences), subject)
3233

3334
override suspend fun subscribeToStore() {
3435
store.subscribe(

core/src/main/java/com/segment/analytics/kotlin/core/utilities/EventsFileManager.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@ import java.io.FileOutputStream
3434
class EventsFileManager(
3535
val directory: File,
3636
private val writeKey: String,
37-
private val kvs: KVS
37+
private val kvs: KVS,
38+
subject: String? = null
3839
) {
3940

4041
init {
4142
createDirectory(directory)
4243
registerShutdownHook()
4344
}
4445

45-
private val fileIndexKey = "segment.events.file.index.$writeKey"
46+
private val fileIndexKey = if(subject == null) "segment.events.file.index.$writeKey" else "segment.events.file.index.$writeKey.$subject"
4647

4748
private var os: FileOutputStream? = null
4849

core/src/main/java/com/segment/analytics/kotlin/core/utilities/StorageImpl.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ class StorageImpl(
2020
private val store: Store,
2121
writeKey: String,
2222
private val ioDispatcher: CoroutineDispatcher,
23-
directory: String? = null
23+
directory: String? = null,
24+
subject: String? = null
2425
) : Subscriber, Storage {
2526

2627
override val storageDirectory = File(directory ?: "/tmp/analytics-kotlin/$writeKey")
2728
private val storageDirectoryEvents = File(storageDirectory, "events")
2829

2930
internal val propertiesFile = PropertiesFile(storageDirectory, writeKey)
30-
internal val eventsFile = EventsFileManager(storageDirectoryEvents, writeKey, propertiesFile)
31+
internal val eventsFile = EventsFileManager(storageDirectoryEvents, writeKey, propertiesFile, subject)
3132

3233
init {
3334
propertiesFile.load()

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/EventsFileManagerTest.kt

+20
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,26 @@ internal class EventsFileManagerTest{
5757
assertEquals(expectedContents, actualContents)
5858
}
5959

60+
@Test
61+
fun `check if filename includes subject`() = runTest {
62+
val file = EventsFileManager(directory, "123", kvStore, "test")
63+
val trackEvent = TrackEvent(
64+
event = "clicked",
65+
properties = buildJsonObject { put("behaviour", "good") })
66+
.apply {
67+
messageId = "qwerty-1234"
68+
anonymousId = "anonId"
69+
integrations = emptyJsonObject
70+
context = emptyJsonObject
71+
timestamp = epochTimestamp
72+
}
73+
val eventString = EncodeDefaultsJson.encodeToString(trackEvent)
74+
file.storeEvent(eventString)
75+
file.rollover()
76+
77+
assertEquals(1, kvStore.getInt("segment.events.file.index.123.test", -1))
78+
}
79+
6080
@Test
6181
fun `storeEvent stores in existing file if available`() = runTest {
6282
val file = EventsFileManager(directory, "123", kvStore)

samples/kotlin-android-app/src/main/java/com/segment/analytics/next/MainApplication.kt

+11-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.segment.analytics.kotlin.core.platform.Plugin
1313
import com.segment.analytics.kotlin.core.platform.policies.CountBasedFlushPolicy
1414
import com.segment.analytics.kotlin.core.platform.policies.FrequencyFlushPolicy
1515
import com.segment.analytics.kotlin.core.utilities.*
16+
import java.net.HttpURLConnection
1617

1718
class MainApplication : Application() {
1819
companion object {
@@ -22,7 +23,7 @@ class MainApplication : Application() {
2223
override fun onCreate() {
2324
super.onCreate()
2425

25-
analytics = Analytics(BuildConfig.SEGMENT_WRITE_KEY, applicationContext) {
26+
analytics = Analytics("tteOFND0bb5ugJfALOJWpF0wu1tcxYgr", applicationContext) {
2627
this.collectDeviceId = true
2728
this.trackApplicationLifecycleEvents = true
2829
this.trackDeepLinks = true
@@ -32,6 +33,15 @@ class MainApplication : Application() {
3233
UnmeteredFlushPolicy(applicationContext) // Flush if network is not metered
3334
)
3435
this.flushPolicies = listOf(UnmeteredFlushPolicy(applicationContext))
36+
this.requestFactory = object : RequestFactory() {
37+
override fun upload(apiHost: String): HttpURLConnection {
38+
val connection: HttpURLConnection = openConnection("https://$apiHost/b")
39+
connection.setRequestProperty("Content-Type", "text/plain")
40+
connection.doOutput = true
41+
connection.setChunkedStreamingMode(0)
42+
return connection
43+
}
44+
}
3545
}
3646
analytics.add(AndroidRecordScreenPlugin())
3747
analytics.add(object : Plugin {

0 commit comments

Comments
 (0)