Updated on 2026-08-14

This commit is contained in:
Tangem 2025-06-09 17:03:21 +04:00
parent ce86d3f87c
commit 0551a8f2fe
4 changed files with 77 additions and 2 deletions

View file

@ -18,6 +18,10 @@ android {
}
}
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
dependencies {
/** Project */
@ -84,7 +88,8 @@ dependencies {
ksp(deps.room.compiler)
testImplementation(deps.test.coroutine)
testImplementation(deps.test.junit)
testImplementation(deps.test.junit5)
testRuntimeOnly(deps.test.junit5.engine)
testImplementation(deps.test.mockk)
testImplementation(deps.test.truth)
}

View file

@ -115,7 +115,8 @@ class AppLogsStore @Inject constructor(
BufferedWriter(FileWriter(logFile, true)).use { writer ->
writer.append(formatter.print(DateTime.now()))
writer.append(": $tag ")
messages.forEach(writer::append)
messages.map(LogsSanitizer::sanitize)
.forEach(writer::append)
writer.newLine()
}
}

View file

@ -0,0 +1,16 @@
package com.tangem.datasource.local.logs
/**
* Logs sanitizer
*
[REDACTED_AUTHOR]
*/
internal object LogsSanitizer {
private val HEX_REGEX = Regex("(0[xX])?(?:[A-Fa-f0-9]{2}-?){4,}")
private const val HIDDEN_TEXT = "******"
fun sanitize(value: String): String {
return HEX_REGEX.replace(input = value, replacement = HIDDEN_TEXT)
}
}

View file

@ -0,0 +1,53 @@
package com.tangem.datasource.local.logs
import com.google.common.truth.Truth
import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.MethodSource
/**
[REDACTED_AUTHOR]
*/
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class LogsSanitizerTest {
@ParameterizedTest
@MethodSource("provideTestModels")
fun sanitize(model: TestModel) {
// Act
val actual = LogsSanitizer.sanitize(model.input)
// Assert
val expected = model.expected
Truth.assertThat(actual).isEqualTo(expected)
}
private fun provideTestModels() = listOf(
TestModel(input = "dead-beef-cafe-babe", expected = HIDDEN_TEXT),
TestModel(input = "[dead-beef-cafe-babe]", expected = "[$HIDDEN_TEXT]"),
TestModel(input = "0xdead-beef-cafe-babe", expected = HIDDEN_TEXT),
TestModel(input = "0XaA-Bb-Cc-Dd-Ee-Ff", expected = HIDDEN_TEXT),
TestModel(input = "A1B2C3D4E5F6", expected = HIDDEN_TEXT),
TestModel(input = "deadbeefcafebabe", expected = HIDDEN_TEXT),
TestModel(input = "deadbeefcafebabe", expected = HIDDEN_TEXT),
TestModel(
input = "Values: 12345678 and ABCDEF12 and cafe9876",
expected = "Values: $HIDDEN_TEXT and $HIDDEN_TEXT and $HIDDEN_TEXT",
),
TestModel(
input = "Chunks: DEADBEEF CAFEBABE F00DBABE",
expected = "Chunks: $HIDDEN_TEXT $HIDDEN_TEXT $HIDDEN_TEXT",
),
TestModel(
input = "Normal log message without secrets",
expected = "Normal log message without secrets",
),
)
data class TestModel(val input: String, val expected: String)
private companion object {
const val HIDDEN_TEXT = "******"
}
}