Skip to content

Commit 1dea014

Browse files
committed
Add tests for BuildVariantConfigFromFile.kt
1 parent 8605177 commit 1dea014

7 files changed

Lines changed: 265 additions & 81 deletions

File tree

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/buildreporter/BuildTelemetryCollector.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import io.embrace.android.gradle.plugin.gradle.GradleVersion
66
import io.embrace.android.gradle.plugin.gradle.GradleVersion.Companion.isAtLeast
77
import io.embrace.android.gradle.plugin.gradle.getProperty
88
import io.embrace.android.gradle.plugin.instrumentation.config.model.VariantConfig
9-
import io.embrace.android.gradle.plugin.system.SystemWrapper
9+
import io.embrace.android.gradle.plugin.system.JavaSystemWrapper
1010
import io.embrace.embrace_gradle_plugin.BuildConfig
1111
import org.gradle.api.Project
1212
import org.gradle.api.internal.StartParameterInternal
@@ -20,7 +20,7 @@ import java.util.UUID
2020
*/
2121
class BuildTelemetryCollector {
2222

23-
private val systemWrapper = SystemWrapper()
23+
private val systemWrapper = JavaSystemWrapper()
2424

2525
fun collect(
2626
project: Project,

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/config/variant/BuildVariantConfigFromFile.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package io.embrace.android.gradle.plugin.config.variant
33
import com.squareup.moshi.Moshi
44
import io.embrace.android.gradle.plugin.instrumentation.config.model.EmbraceVariantConfig
55
import io.embrace.android.gradle.plugin.model.AndroidCompactedVariantData
6+
import io.embrace.android.gradle.plugin.system.JavaSystemWrapper
7+
import io.embrace.android.gradle.plugin.system.SystemWrapper
68
import okio.buffer
79
import okio.source
810
import org.gradle.api.file.Directory
@@ -24,6 +26,7 @@ fun buildVariantConfig(
2426
variantBuildTypeConfigurationFileFinder(variantInfo, projectDirectory),
2527
defaultConfigurationFileFinder(projectDirectory)
2628
),
29+
systemWrapper: SystemWrapper = JavaSystemWrapper(),
2730
): EmbraceVariantConfig? {
2831
if (configFileFinders.isEmpty()) {
2932
error("No config file finders found. Local configuration will not be applied.")
@@ -32,23 +35,23 @@ fun buildVariantConfig(
3235
configFileFinders.forEach { fileFinder ->
3336
val file = fileFinder.fetchFile()
3437
if (file != null) {
35-
return buildVariantConfiguration(file)
38+
return buildVariantConfiguration(file, systemWrapper)
3639
}
3740
}
3841

3942
return null
4043
}
4144

42-
private fun buildVariantConfiguration(configFile: File): EmbraceVariantConfig? {
45+
private fun buildVariantConfiguration(configFile: File, systemWrapper: SystemWrapper): EmbraceVariantConfig? {
4346
return try {
4447
var configuration = readConfigurationFromFile(configFile) ?: return null
4548

46-
val apiTokenFromEnv = getApiTokenFromEnv(configuration)
49+
val apiTokenFromEnv = getApiTokenFromEnv(configuration, systemWrapper)
4750
if (apiTokenFromEnv != null) {
4851
configuration = configuration.copy(apiToken = apiTokenFromEnv)
4952
}
5053

51-
val appIdFromEnv = getAppIdFromEnv(configuration)
54+
val appIdFromEnv = getAppIdFromEnv(configuration, systemWrapper)
5255
if (appIdFromEnv != null) {
5356
configuration = configuration.copy(appId = appIdFromEnv)
5457
}
@@ -63,8 +66,8 @@ private fun buildVariantConfiguration(configFile: File): EmbraceVariantConfig? {
6366
}
6467
}
6568

66-
private fun getApiTokenFromEnv(config: EmbraceVariantConfig): String? {
67-
val apiTokenFromEnv = System.getenv("EMBRACE_API_TOKEN")
69+
private fun getApiTokenFromEnv(config: EmbraceVariantConfig, systemWrapper: SystemWrapper): String? {
70+
val apiTokenFromEnv = systemWrapper.getEnvironmentVariable("EMBRACE_API_TOKEN")
6871

6972
if (config.apiToken.isNullOrEmpty() && !apiTokenFromEnv.isNullOrEmpty()) {
7073
return apiTokenFromEnv
@@ -79,8 +82,8 @@ private fun getApiTokenFromEnv(config: EmbraceVariantConfig): String? {
7982
return null
8083
}
8184

82-
private fun getAppIdFromEnv(config: EmbraceVariantConfig): String? {
83-
val appIdFromEnv = System.getenv("EMBRACE_APP_ID")
85+
private fun getAppIdFromEnv(config: EmbraceVariantConfig, systemWrapper: SystemWrapper): String? {
86+
val appIdFromEnv = systemWrapper.getEnvironmentVariable("EMBRACE_APP_ID")
8487

8588
if (config.appId.isNullOrEmpty() && !appIdFromEnv.isNullOrEmpty()) {
8689
return appIdFromEnv
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.embrace.android.gradle.plugin.system
2+
3+
interface SystemWrapper {
4+
fun getProperty(key: String): String?
5+
fun getEnvironmentVariable(name: String): String?
6+
}
7+
8+
class JavaSystemWrapper : SystemWrapper {
9+
override fun getProperty(key: String): String? {
10+
return try {
11+
System.getProperty(key)
12+
} catch (_: Exception) {
13+
null
14+
}
15+
}
16+
17+
override fun getEnvironmentVariable(name: String): String? {
18+
return try {
19+
System.getenv(name)
20+
} catch (_: Exception) {
21+
null
22+
}
23+
}
24+
}

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/system/SystemWrapper.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.embrace.android.gradle.fakes
2+
3+
import io.embrace.android.gradle.plugin.system.SystemWrapper
4+
5+
class FakeSystemWrapper : SystemWrapper {
6+
private val properties = mutableMapOf<String, String>()
7+
private val env = mutableMapOf<String, String>()
8+
9+
fun setEnvironmentVariable(name: String, value: String) {
10+
env[name] = value
11+
}
12+
13+
override fun getProperty(key: String): String? = properties[key]
14+
15+
override fun getEnvironmentVariable(name: String): String? = env[name]
16+
}
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
package io.embrace.android.gradle.plugin.config.variant
2+
3+
import io.embrace.android.gradle.fakes.FakeConfigFileDirectory
4+
import io.embrace.android.gradle.fakes.FakeSystemWrapper
5+
import io.embrace.android.gradle.plugin.model.AndroidCompactedVariantData
6+
import org.junit.AfterClass
7+
import org.junit.Assert.assertEquals
8+
import org.junit.Assert.assertNull
9+
import org.junit.BeforeClass
10+
import org.junit.Test
11+
import java.io.File
12+
import java.nio.file.Files
13+
import kotlin.io.path.pathString
14+
15+
class BuildVariantConfigFromFileTest {
16+
17+
@Test(expected = IllegalStateException::class)
18+
fun `build with no config file finders should throw exception`() {
19+
buildVariantConfig(
20+
fakeVariantInfo,
21+
projectDirectory,
22+
emptyList()
23+
)
24+
}
25+
26+
@Test
27+
fun `config file not found by config finder does not throw exception`() {
28+
val variantConfiguration = buildVariantConfig(
29+
fakeVariantInfo,
30+
projectDirectory,
31+
listOf(VariantConfigurationFileFinder(projectDirectory, listOf()))
32+
)
33+
34+
assertNull(variantConfiguration)
35+
}
36+
37+
@Test(expected = IllegalArgumentException::class)
38+
fun `bad config file throws exception`() {
39+
configFile.writeText("not a json")
40+
buildVariantConfig(
41+
fakeVariantInfo,
42+
projectDirectory,
43+
listOf(fileFinder)
44+
)
45+
}
46+
47+
@Test
48+
fun `variantConfiguration is built correctly`() {
49+
val json = """
50+
{
51+
"app_id": "abcde",
52+
"api_token": "12345678901234567890123456789012",
53+
"ndk_enabled": true
54+
}
55+
""".trimIndent()
56+
configFile.writeText(json)
57+
58+
val variantConfiguration = buildVariantConfig(
59+
fakeVariantInfo,
60+
projectDirectory,
61+
listOf(fileFinder)
62+
)
63+
64+
assertEquals("abcde", variantConfiguration?.appId)
65+
assertEquals("12345678901234567890123456789012", variantConfiguration?.apiToken)
66+
assertEquals(true, variantConfiguration?.ndkEnabled)
67+
}
68+
69+
@Test
70+
fun `apiToken is read from environment variable when it is not set in config file`() {
71+
val json = """
72+
{
73+
"app_id": "abcde",
74+
"ndk_enabled": true
75+
}
76+
""".trimIndent()
77+
configFile.writeText(json)
78+
79+
val fakeSystemWrapper = FakeSystemWrapper().apply {
80+
setEnvironmentVariable("EMBRACE_API_TOKEN", "env12345678901234567890123456789")
81+
}
82+
83+
val variantConfiguration = buildVariantConfig(
84+
fakeVariantInfo,
85+
projectDirectory,
86+
listOf(fileFinder),
87+
fakeSystemWrapper
88+
)
89+
90+
assertEquals("env12345678901234567890123456789", variantConfiguration?.apiToken)
91+
}
92+
93+
@Test
94+
fun `apiToken is not read from environment variable when it is set in config file`() {
95+
val json = """
96+
{
97+
"api_token": "config78901234567890123456789012"
98+
}
99+
""".trimIndent()
100+
configFile.writeText(json)
101+
102+
val fakeSystemWrapper = FakeSystemWrapper().apply {
103+
setEnvironmentVariable("EMBRACE_API_TOKEN", "env12345678901234567890123456789")
104+
}
105+
106+
val variantConfiguration = buildVariantConfig(
107+
fakeVariantInfo,
108+
projectDirectory,
109+
listOf(fileFinder),
110+
fakeSystemWrapper
111+
)
112+
113+
assertEquals("config78901234567890123456789012", variantConfiguration?.apiToken)
114+
}
115+
116+
@Test
117+
fun `appId is read from environment variable when it is not set in config file`() {
118+
val json = """
119+
{
120+
"api_token": "config78901234567890123456789012",
121+
"ndk_enabled": true
122+
}
123+
""".trimIndent()
124+
configFile.writeText(json)
125+
126+
val fakeSystemWrapper = FakeSystemWrapper().apply {
127+
setEnvironmentVariable("EMBRACE_APP_ID", "env12")
128+
}
129+
130+
val variantConfiguration = buildVariantConfig(
131+
fakeVariantInfo,
132+
projectDirectory,
133+
listOf(fileFinder),
134+
fakeSystemWrapper
135+
)
136+
137+
assertEquals("env12", variantConfiguration?.appId)
138+
}
139+
140+
@Test
141+
fun `appId is not read from environment variable when it is set in config file`() {
142+
val json = """
143+
{
144+
"app_id": "confg"
145+
}
146+
""".trimIndent()
147+
configFile.writeText(json)
148+
149+
val fakeSystemWrapper = FakeSystemWrapper().apply {
150+
setEnvironmentVariable("EMBRACE_APP_ID", "env12")
151+
}
152+
153+
val variantConfiguration = buildVariantConfig(
154+
fakeVariantInfo,
155+
projectDirectory,
156+
listOf(fileFinder),
157+
fakeSystemWrapper
158+
)
159+
160+
assertEquals("confg", variantConfiguration?.appId)
161+
}
162+
163+
companion object {
164+
private lateinit var configFile: File
165+
private lateinit var fileFinder: VariantConfigurationFileFinder
166+
private lateinit var projectDirectory: FakeConfigFileDirectory
167+
168+
/**
169+
* Creates a fake project directory with a subdirectory `src` that contains the Embrace config file.
170+
* We can update the config file directly in the tests to simulate different scenarios.
171+
*/
172+
private fun createFakeProjectDirectory(): FakeConfigFileDirectory {
173+
val tempDirectory = Files.createTempDirectory("test")
174+
Files.createDirectories(tempDirectory.resolve("src"))
175+
return FakeConfigFileDirectory(tempDirectory.pathString, true).apply {
176+
subDirectoriesWithConfigFiles.add("src")
177+
}
178+
}
179+
180+
private fun getConfigFileForProjectDirectory(projectDirectory: FakeConfigFileDirectory): File {
181+
val dirPath = projectDirectory.asFile.toPath()
182+
return dirPath.resolve("src").resolve("embrace-config.json").toFile()
183+
}
184+
185+
// Create the fake project directory and config file finder before running the tests.
186+
@JvmStatic
187+
@BeforeClass
188+
fun setup() {
189+
projectDirectory = createFakeProjectDirectory()
190+
configFile = getConfigFileForProjectDirectory(projectDirectory)
191+
fileFinder = VariantConfigurationFileFinder(projectDirectory, listOf("src"))
192+
}
193+
194+
// Clean up the temporary directory after all tests have run.
195+
@JvmStatic
196+
@AfterClass
197+
fun tearDown() {
198+
// Clean up the temporary directory after tests
199+
projectDirectory.asFile.deleteRecursively()
200+
}
201+
}
202+
203+
private val fakeVariantInfo = AndroidCompactedVariantData(
204+
name = "variant-name",
205+
flavorName = "flavor-name",
206+
buildTypeName = "buildType-name",
207+
isBuildTypeDebuggable = false,
208+
versionName = "1.0",
209+
productFlavors = listOf("product-flavor", "2nd-product-flavor"),
210+
sourceMapPath = "source"
211+
)
212+
}

0 commit comments

Comments
 (0)