Skip to content

Commit 980c965

Browse files
committed
[ECO-5380] Create separated unit test file for ObjectMessage
1. Added three different unit tests covering edge cases 2. Updated doc for byteSize String extension method
1 parent d3f370f commit 980c965

3 files changed

Lines changed: 74 additions & 38 deletions

File tree

live-objects/src/main/kotlin/io/ably/lib/objects/Utils.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ internal fun serverError(errorMessage: String) = ablyException(errorMessage, Err
3737
/**
3838
* Calculates the byte size of a string.
3939
* For non-ASCII, the byte size can be 2–4x the character count. For ASCII, there is no difference.
40+
* e.g. "Hello" has a byte size of 5, while "你" has a byte size of 3 and "😊" has a byte size of 4.
4041
*/
4142
internal val String.byteSize: Int
4243
get() = this.toByteArray(Charsets.UTF_8).size
Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
package io.ably.lib.objects.unit
22

3-
import io.ably.lib.objects.*
4-
import io.ably.lib.objects.ObjectMessage
5-
import io.ably.lib.objects.size
6-
import io.ably.lib.types.AblyException
7-
import io.mockk.every
8-
import io.mockk.mockk
93
import kotlinx.coroutines.test.runTest
104
import org.junit.Test
11-
import kotlin.test.assertEquals
12-
import kotlin.test.assertFailsWith
135
import kotlin.test.assertNotNull
146

157
class LiveObjectTest {
@@ -19,34 +11,4 @@ class LiveObjectTest {
1911
val objects = channel.objects
2012
assertNotNull(objects)
2113
}
22-
23-
@Test
24-
fun testObjectMessageSizeWithinLimit() = runTest {
25-
val mockAdapter = mockk<LiveObjectsAdapter>()
26-
every { mockAdapter.maxMessageSizeLimit() } returns 65536L // 64 kb
27-
assertEquals(65536L, mockAdapter.maxMessageSizeLimit())
28-
29-
// Create ObjectMessage with dummy data that results in size 60 kb which is within the limit
30-
val objectMessage = ObjectMessage(
31-
clientId = CharArray(60 * 1024) { ('a'..'z').random() }.concatToString()
32-
)
33-
assertEquals(60 * 1024L, objectMessage.size()) // 60 kb (61,440 characters)
34-
// Doesn't throw exception, so test doesn't fail
35-
mockAdapter.ensureMessageSizeWithinLimit(arrayOf(objectMessage))
36-
37-
// Create ObjectMessage with dummy data that results in size 5kb
38-
val objectMessage2 = ObjectMessage(
39-
clientId = CharArray(5 * 1024) { ('a'..'z').random() }.concatToString()
40-
)
41-
assertEquals(5 * 1024L, objectMessage2.size()) // 5 kb
42-
43-
val exception = assertFailsWith<AblyException> {
44-
// both messages together with size of 65kb exceed the limit
45-
mockAdapter.ensureMessageSizeWithinLimit(arrayOf(objectMessage, objectMessage2))
46-
}
47-
// Assert on error code and message
48-
assertEquals(40009, exception.errorInfo.code)
49-
val expectedMessage = "ObjectMessage size 66560 exceeds maximum allowed size of 65536 bytes"
50-
assertEquals(expectedMessage, exception.errorInfo.message)
51-
}
5214
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.ably.lib.objects.unit
2+
3+
import io.ably.lib.objects.*
4+
import io.ably.lib.objects.ObjectData
5+
import io.ably.lib.objects.ObjectMapOp
6+
import io.ably.lib.objects.ObjectMessage
7+
import io.ably.lib.objects.ObjectOperation
8+
import io.ably.lib.objects.ObjectOperationAction
9+
import io.ably.lib.objects.ObjectValue
10+
import io.ably.lib.objects.ensureMessageSizeWithinLimit
11+
import io.ably.lib.objects.size
12+
import io.ably.lib.types.AblyException
13+
import io.mockk.every
14+
import io.mockk.mockk
15+
import kotlinx.coroutines.test.runTest
16+
import org.junit.Test
17+
import kotlin.test.assertEquals
18+
import kotlin.test.assertFailsWith
19+
20+
class ObjectMessageSizeTest {
21+
22+
@Test
23+
fun testObjectMessageSizeWithinLimit() = runTest {
24+
val mockAdapter = mockk<LiveObjectsAdapter>()
25+
every { mockAdapter.maxMessageSizeLimit() } returns 65536L // 64 kb
26+
assertEquals(65536L, mockAdapter.maxMessageSizeLimit())
27+
28+
// Create ObjectMessage with dummy data that results in size 60 kb which is within the limit
29+
val objectMessage = ObjectMessage(
30+
clientId = CharArray(60 * 1024) { ('a'..'z').random() }.concatToString()
31+
)
32+
assertEquals(60 * 1024L, objectMessage.size()) // 60 kb (61,440 characters)
33+
// Doesn't throw exception, so test doesn't fail
34+
mockAdapter.ensureMessageSizeWithinLimit(arrayOf(objectMessage))
35+
}
36+
37+
@Test
38+
fun testObjectMessageSizeForUnicodeCharacters() = runTest {
39+
val objectMessage = ObjectMessage(
40+
operation = ObjectOperation(
41+
objectId = "",
42+
action = ObjectOperationAction.MapCreate,
43+
mapOp = ObjectMapOp(
44+
key = "",
45+
data = ObjectData(
46+
value = ObjectValue("你😊") // 你 -> 3 bytes, 😊 -> 4 bytes
47+
),
48+
),
49+
)
50+
)
51+
assertEquals(7, objectMessage.size())
52+
}
53+
54+
@Test
55+
fun testObjectMessageSizeAboveLimit() = runTest {
56+
val mockAdapter = mockk<LiveObjectsAdapter>()
57+
every { mockAdapter.maxMessageSizeLimit() } returns 65536L // 64 kb
58+
59+
// Create ObjectMessage with dummy data that results in size 65kb
60+
val objectMessage = ObjectMessage(
61+
clientId = CharArray(65 * 1024) { ('a'..'z').random() }.concatToString()
62+
)
63+
assertEquals(65 * 1024L, objectMessage.size())
64+
65+
val exception = assertFailsWith<AblyException> {
66+
mockAdapter.ensureMessageSizeWithinLimit(arrayOf(objectMessage))
67+
}
68+
// Assert on error code and message
69+
assertEquals(40009, exception.errorInfo.code)
70+
val expectedMessage = "ObjectMessage size 66560 exceeds maximum allowed size of 65536 bytes"
71+
assertEquals(expectedMessage, exception.errorInfo.message)
72+
}
73+
}

0 commit comments

Comments
 (0)