Skip to content

Commit d781028

Browse files
committed
add unit test for event stream
1 parent b048c4e commit d781028

File tree

4 files changed

+287
-17
lines changed

4 files changed

+287
-17
lines changed

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

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ interface EventStream {
3131

3232
fun close()
3333

34-
fun finishAndClose()
34+
fun finishAndClose(withRename: ((name: String) -> String)? = null)
3535

3636
fun readAsStream(source: String): InputStream?
3737
}
@@ -80,29 +80,21 @@ class InMemoryEventStream: EventStream {
8080
currFile = null
8181
}
8282

83-
override fun finishAndClose() {
83+
override fun finishAndClose(withRename: ((name: String) -> String)?) {
8484
currFile ?: return
8585

8686
currFile?.let {
87-
val nameWithoutExtension = removeFileExtension(it.name)
88-
directory.remove(it.name)
89-
directory[nameWithoutExtension] = it
87+
withRename?.let { rename ->
88+
directory.remove(it.name)
89+
directory[rename(it.name)] = it
90+
}
9091
}
9192

9293
currFile = null
9394
}
9495

9596
override fun readAsStream(source: String): InputStream? = directory[source]?.toStream()
9697

97-
private fun removeFileExtension(fileName: String): String {
98-
val lastDotIndex = fileName.lastIndexOf('.')
99-
return if (lastDotIndex != -1 && lastDotIndex > 0) {
100-
fileName.substring(0, lastDotIndex)
101-
} else {
102-
fileName
103-
}
104-
}
105-
10698
class InMemoryFile(val name: String) {
10799
val fileStream: StringBuilder = StringBuilder()
108100

@@ -176,12 +168,14 @@ class FileEventStream(
176168
currFile = null
177169
}
178170

179-
override fun finishAndClose() {
171+
override fun finishAndClose(withRename: ((name: String) -> String)?) {
180172
fs?.close()
181173
fs = null
182174

183175
currFile?.let {
184-
it.renameTo(File(directory, it.nameWithoutExtension))
176+
withRename?.let { rename ->
177+
it.renameTo(File(directory, rename(it.name)))
178+
}
185179
}
186180

187181
currFile = null

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,13 @@ fun createDirectory(location: File) {
1212
if (!(location.exists() || location.mkdirs() || location.isDirectory)) {
1313
throw IOException("Could not create directory at $location")
1414
}
15+
}
16+
17+
fun removeFileExtension(fileName: String): String {
18+
val lastDotIndex = fileName.lastIndexOf('.')
19+
return if (lastDotIndex != -1 && lastDotIndex > 0) {
20+
fileName.substring(0, lastDotIndex)
21+
} else {
22+
fileName
23+
}
1524
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ open class StorageImpl(
152152
if (!eventStream.isOpened) return
153153

154154
eventStream.write(end)
155-
eventStream.finishAndClose()
155+
eventStream.finishAndClose {
156+
removeFileExtension(it)
157+
}
156158
incrementFileIndex()
157159
}
158160

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
package com.segment.analytics.kotlin.core.utilities
2+
3+
import org.junit.jupiter.api.AfterEach
4+
import org.junit.jupiter.api.Assertions.*
5+
import org.junit.jupiter.api.BeforeEach
6+
import org.junit.jupiter.api.Nested
7+
import org.junit.jupiter.api.Test
8+
import java.io.File
9+
import java.util.UUID
10+
11+
class EventStreamTest {
12+
13+
@Nested
14+
inner class InMemoryEventStreamTest {
15+
16+
private lateinit var eventStream: EventStream;
17+
18+
@BeforeEach
19+
fun setup() {
20+
eventStream = InMemoryEventStream()
21+
}
22+
23+
@Test
24+
fun lengthTest() {
25+
val str1 = "abc"
26+
val str2 = "defgh"
27+
28+
assertEquals(0, eventStream.length)
29+
30+
eventStream.openOrCreate("test")
31+
eventStream.write(str1)
32+
assertEquals(str1.length, eventStream.length)
33+
34+
eventStream.write(str2)
35+
assertEquals(str1.length + str2.length, eventStream.length)
36+
}
37+
38+
@Test
39+
fun isOpenTest() {
40+
assertFalse(eventStream.isOpened)
41+
42+
eventStream.openOrCreate("test")
43+
assertTrue(eventStream.isOpened)
44+
45+
eventStream.close()
46+
assertFalse(eventStream.isOpened)
47+
}
48+
49+
@Test
50+
fun openOrCreateTest() {
51+
var actual = eventStream.openOrCreate("test")
52+
assertTrue(actual)
53+
54+
actual = eventStream.openOrCreate("test")
55+
assertFalse(actual)
56+
}
57+
58+
@Test
59+
fun writeAndReadStreamTest() {
60+
val file = "test"
61+
eventStream.openOrCreate(file)
62+
val str1 = "abc"
63+
val str2 = "defgh"
64+
65+
assertEquals(0, eventStream.length)
66+
67+
eventStream.write(str1)
68+
assertEquals(str1.toByteArray(), eventStream.readAsStream(file)!!.readBytes())
69+
eventStream.write(str2)
70+
assertEquals((str1 + str2).toByteArray(), eventStream.readAsStream(file)!!.readBytes())
71+
}
72+
73+
@Test
74+
fun readTest() {
75+
val files = arrayOf("test1.tmp", "test2", "test3.tmp")
76+
77+
eventStream.openOrCreate("test1")
78+
79+
// open test2 without finish test1
80+
eventStream.openOrCreate("test2")
81+
eventStream.finishAndClose {
82+
removeFileExtension(it)
83+
}
84+
85+
// open test3 after finish test2
86+
eventStream.openOrCreate("test3")
87+
// open test3 again
88+
eventStream.openOrCreate("test3")
89+
90+
val actual = HashSet<String>(eventStream.read())
91+
assertEquals(files.size, actual.size)
92+
assertTrue(actual.contains(files[0]))
93+
assertTrue(actual.contains(files[1]))
94+
assertTrue(actual.contains(files[2]))
95+
}
96+
97+
@Test
98+
fun removeTest() {
99+
eventStream.openOrCreate("test")
100+
eventStream.finishAndClose {
101+
removeFileExtension(it)
102+
}
103+
eventStream.remove("test")
104+
val newFile = eventStream.openOrCreate("test")
105+
106+
assertTrue(newFile)
107+
}
108+
109+
@Test
110+
fun closeTest() {
111+
eventStream.openOrCreate("test")
112+
assertTrue(eventStream.isOpened)
113+
114+
eventStream.close()
115+
assertFalse(eventStream.isOpened)
116+
}
117+
118+
@Test
119+
fun finishAndCloseTest() {
120+
eventStream.openOrCreate("test")
121+
eventStream.finishAndClose {
122+
removeFileExtension(it)
123+
}
124+
125+
val files = eventStream.read()
126+
assertEquals(1, files.size)
127+
assertEquals("test", files[0])
128+
assertFalse(eventStream.isOpened)
129+
}
130+
}
131+
132+
@Nested
133+
inner class FileEventStreamTest {
134+
private lateinit var eventStream: EventStream
135+
136+
private lateinit var dir: File
137+
138+
@BeforeEach
139+
fun setup() {
140+
dir = File(UUID.randomUUID().toString())
141+
eventStream = FileEventStream(dir)
142+
}
143+
144+
@AfterEach
145+
fun tearDown() {
146+
dir.deleteRecursively()
147+
}
148+
149+
150+
@Test
151+
fun lengthTest() {
152+
val str1 = "abc"
153+
val str2 = "defgh"
154+
155+
assertEquals(0, eventStream.length)
156+
157+
eventStream.openOrCreate("test")
158+
eventStream.write(str1)
159+
assertEquals(str1.length, eventStream.length)
160+
161+
eventStream.write(str2)
162+
assertEquals(str1.length + str2.length, eventStream.length)
163+
}
164+
165+
@Test
166+
fun isOpenTest() {
167+
assertFalse(eventStream.isOpened)
168+
169+
eventStream.openOrCreate("test")
170+
assertTrue(eventStream.isOpened)
171+
172+
eventStream.close()
173+
assertFalse(eventStream.isOpened)
174+
}
175+
176+
@Test
177+
fun openOrCreateTest() {
178+
var actual = eventStream.openOrCreate("test")
179+
assertTrue(actual)
180+
181+
actual = eventStream.openOrCreate("test")
182+
assertFalse(actual)
183+
}
184+
185+
@Test
186+
fun writeAndReadStreamTest() {
187+
val str1 = "abc"
188+
val str2 = "defgh"
189+
190+
eventStream.openOrCreate("test")
191+
assertEquals(0, eventStream.length)
192+
var files = eventStream.read()
193+
assertEquals(1, files.size)
194+
eventStream.write(str1)
195+
eventStream.close()
196+
assertEquals(str1.toByteArray(), eventStream.readAsStream(files[0])!!.readBytes())
197+
198+
eventStream.openOrCreate("test")
199+
assertEquals(str1.length, eventStream.length)
200+
files = eventStream.read()
201+
assertEquals(1, files.size)
202+
eventStream.write(str2)
203+
eventStream.close()
204+
assertEquals((str1 + str2).toByteArray(), eventStream.readAsStream(files[0])!!.readBytes())
205+
}
206+
207+
@Test
208+
fun readTest() {
209+
val files = arrayOf("test1.tmp", "test2", "test3.tmp")
210+
211+
eventStream.openOrCreate("test1")
212+
213+
// open test2 without finish test1
214+
eventStream.openOrCreate("test2")
215+
eventStream.finishAndClose {
216+
removeFileExtension(it)
217+
}
218+
219+
// open test3 after finish test2
220+
eventStream.openOrCreate("test3")
221+
// open test3 again
222+
eventStream.openOrCreate("test3")
223+
224+
val actual = HashSet<String>(eventStream.read())
225+
assertEquals(files.size, actual.size)
226+
assertTrue(actual.contains(files[0]))
227+
assertTrue(actual.contains(files[1]))
228+
assertTrue(actual.contains(files[2]))
229+
}
230+
231+
@Test
232+
fun removeTest() {
233+
eventStream.openOrCreate("test")
234+
eventStream.finishAndClose {
235+
removeFileExtension(it)
236+
}
237+
eventStream.remove("test")
238+
val newFile = eventStream.openOrCreate("test")
239+
240+
assertTrue(newFile)
241+
}
242+
243+
@Test
244+
fun closeTest() {
245+
eventStream.openOrCreate("test")
246+
assertTrue(eventStream.isOpened)
247+
248+
eventStream.close()
249+
assertFalse(eventStream.isOpened)
250+
}
251+
252+
@Test
253+
fun finishAndCloseTest() {
254+
eventStream.openOrCreate("test")
255+
eventStream.finishAndClose {
256+
removeFileExtension(it)
257+
}
258+
259+
val files = eventStream.read()
260+
assertEquals(1, files.size)
261+
assertEquals("test", files[0])
262+
assertFalse(eventStream.isOpened)
263+
}
264+
}
265+
}

0 commit comments

Comments
 (0)