Fix large message size calculation to use bytes.

This commit is contained in:
Greyson Parrelli
2024-12-18 16:07:30 -05:00
parent e434cda40a
commit 16bb4d10d1
12 changed files with 225 additions and 119 deletions

View File

@@ -0,0 +1,80 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.core.util
import okio.utf8Size
import org.junit.Assert.assertTrue
import org.junit.Test
class StringExtensionsTest {
@Test
fun `splitByByteLength fuzzing`() {
val characterSet = "日月木山川田水火金土空海花風雨雪星森犬猫鳥魚虫人子女男友学校車電話本書時分先生愛夢楽音話語映画新古長短高低東西南北春夏秋冬雨雲星夜朝昼電気手足目耳口心頭体家国町村道橋山川本店仕事時間会話思考知識感情自動車飛行機船馬牛羊豚鶏鳥猫犬虎龍"
for (stringSize in 2100..2500) {
for (byteLimit in 2000..2500) {
val builder = StringBuilder()
repeat(stringSize) {
builder.append(characterSet.random())
}
val (trimmed, _) = builder.toString().splitByByteLength(byteLimit)
assertTrue(trimmed.utf8Size() <= byteLimit)
}
}
}
@Test
fun idk() {
val myString = """
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
すべての人間は生まれながらにして自由であり、尊厳と権利において平等である。彼らは理性と良心を授けられており、互いに兄弟愛の精神をもって行動しなければならない。
一方、現代社会において、技術の進歩は人々の生活を大きく変えつつある。情報の流通は瞬時に行われ、距離や時間の壁を越えて人々がつながる世界が現実となっている。しかし、これに伴い新たな課題も生じており、個人のプライバシーや倫理の問題が議論の中心となっている。
経済の発展と共に、都市化が進む一方で、自然環境の破壊も深刻な問題となっている。持続可能な社会を目指すためには、私たち一人ひとりが責任を持ち、資源を大切にする意識を持つことが重要である。
文化や伝統は社会の根底を支えるものであり、時代が変わってもその価値は変わらない。古くから伝わる知恵や習慣は、現代においても新たな意味を持ち続けるだろう。
""".trimIndent()
val (trimmed, _) = myString.splitByByteLength(2048)
assertTrue(trimmed.utf8Size() <= 2048)
}
}

View File

@@ -0,0 +1,42 @@
package org.signal.core.util
import okio.utf8Size
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
@Suppress("ClassName")
@RunWith(Parameterized::class)
class StringExtensions_splitByByteLength(
private val testInput: String,
private val byteLength: Int,
private val expected: Pair<String, String?>
) {
@Test
fun testModelInList() {
val actual = testInput.splitByByteLength(byteLength)
assertEquals(expected, actual)
assertTrue(actual.first.utf8Size() <= byteLength)
}
companion object {
@JvmStatic
@Parameterized.Parameters(name = "{index}: splitByByteLength(input={0}, byteLength={1})")
fun data(): List<Array<Any>> {
return listOf<Array<Any>>(
arrayOf("1234567890", 0, "" to "1234567890"),
arrayOf("1234567890", 3, "123" to "4567890"),
arrayOf("1234567890", 10, "1234567890" to null),
arrayOf("1234567890", 15, "1234567890" to null),
arrayOf("大いなる力には大いなる責任が伴う", 0, "" to "大いなる力には大いなる責任が伴う"),
arrayOf("大いなる力には大いなる責任が伴う", 8, "大い" to "なる力には大いなる責任が伴う"),
arrayOf("大いなる力には大いなる責任が伴う", 47, "大いなる力には大いなる責任が伴" to ""),
arrayOf("大いなる力には大いなる責任が伴う", 48, "大いなる力には大いなる責任が伴う" to null),
arrayOf("大いなる力には大いなる責任が伴う", 100, "大いなる力には大いなる責任が伴う" to null)
).toList()
}
}
}