From 0cba47008a9f2022f285df51781b1afbfbfb29eb Mon Sep 17 00:00:00 2001 From: Gustavo Fao Valvassori Date: Fri, 11 Sep 2026 18:19:05 -0300 Subject: [PATCH 1/5] local test server --- .github/scripts/test-artifact-server.js | 71 +++++++++++++++++++ .github/workflows/build_mac.yml | 10 +-- .gitignore | 3 +- TESTING.md | 12 ++++ kmmbridge-test/src/main/kotlin/Extensions.kt | 13 +--- .../test/TestUploadArtifactManager.kt | 9 +-- .../touchlab/kmmbridge/ArtifactManagerTest.kt | 6 +- .../co/touchlab/kmmbridge/BasePluginTest.kt | 4 -- .../kmmbridge/NonKmmBridgeTasksTest.kt | 4 +- .../co/touchlab/kmmbridge/SpmLocalDevTest.kt | 8 +-- 10 files changed, 99 insertions(+), 41 deletions(-) create mode 100644 .github/scripts/test-artifact-server.js diff --git a/.github/scripts/test-artifact-server.js b/.github/scripts/test-artifact-server.js new file mode 100644 index 00000000..176d444c --- /dev/null +++ b/.github/scripts/test-artifact-server.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node +/** + * Throwaway stand-in for Touchlab's private test-artifact server (api.touchlab.dev). + * + * Implements just the two endpoints KMMBridge's TestUploadArtifactManager needs: + * POST /store -> stores the request body, returns {"url": "/infoadmin/streamTestZip/.zip"} + * GET /file/.zip -> serves the stored bytes back + * + * Used by build_mac.yml so CI (including fork PRs, which never get repo secrets) + * can exercise the real upload/download round-trip. + */ +const http = require("http"); +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const crypto = require("crypto"); + +const STORAGE_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "kmmbridge-test-artifacts-")); + +function log(message) { + process.stderr.write(`[test-artifact-server] ${message}\n`); +} + +const server = http.createServer((req, res) => { + log(`${req.method} ${req.url}`); + + if (req.method === "POST" && req.url === "/store") { + const chunks = []; + req.on("data", (chunk) => chunks.push(chunk)); + req.on("end", () => { + const body = Buffer.concat(chunks); + const fileId = `${crypto.randomUUID()}.zip`; + fs.writeFileSync(path.join(STORAGE_DIR, fileId), body); + + const reply = JSON.stringify({ url: `/file/${fileId}` }); + res.writeHead(200, { + "Content-Type": "application/json", + "Content-Length": Buffer.byteLength(reply), + }); + res.end(reply); + }); + return; + } + + const prefix = "/file/"; + if (req.method === "GET" && req.url.startsWith(prefix)) { + const fileId = req.url.slice(prefix.length); + const filePath = path.join(STORAGE_DIR, fileId); + if (fileId.includes("..") || !fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { + res.writeHead(404); + res.end(); + return; + } + + const data = fs.readFileSync(filePath); + res.writeHead(200, { + "Content-Type": "application/octet-stream", + "Content-Length": data.length, + }); + res.end(data); + return; + } + + res.writeHead(404); + res.end(); +}); + +const port = process.argv[2] ? parseInt(process.argv[2], 10) : 8089; +server.listen(port, "127.0.0.1", () => { + console.log(`[test-artifact-server] listening on 127.0.0.1:${port}, storage=${STORAGE_DIR}`); +}); diff --git a/.github/workflows/build_mac.yml b/.github/workflows/build_mac.yml index 782b7d64..55f0da1b 100644 --- a/.github/workflows/build_mac.yml +++ b/.github/workflows/build_mac.yml @@ -19,11 +19,11 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - - name: Write Faktory Server Code - run: echo ${{ secrets.TOUCHLAB_TEST_ARTIFACT_CODE }} > kmmbridge/TOUCHLAB_TEST_ARTIFACT_CODE - - - name: Read Faktory Server Code - run: cat kmmbridge/TOUCHLAB_TEST_ARTIFACT_CODE + - name: Start local test artifact server + run: | + nohup node .github/scripts/test-artifact-server.js 8089 > /tmp/test-artifact-server.log 2>&1 & + disown + npx --yes wait-on tcp:127.0.0.1:8089 - name: Local Publish For Tests run: ./gradlew publishToMavenLocal --no-daemon --stacktrace --build-cache -PRELEASE_SIGNING_ENABLED=false -PVERSION_NAME=9.9.9 diff --git a/.gitignore b/.gitignore index 9ab56bd5..c06071e0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,4 @@ build *.xcbkptlist !/.idea/codeStyles/* !/.idea/inspectionProfiles/* -.kotlin -TOUCHLAB_TEST_ARTIFACT_CODE \ No newline at end of file +.kotlin \ No newline at end of file diff --git a/TESTING.md b/TESTING.md index 8e6544c0..8e455ecb 100644 --- a/TESTING.md +++ b/TESTING.md @@ -8,6 +8,18 @@ To do that, we need to locally publish KMMBridge, then point tests projects at t * A sample app project is copied to that folder * A command line process is run, generally running Gradle to perform whatever task we intend to test +## Starting the local test artifact server + +`ArtifactManagerTest`, `SpmLocalDevTest`, and `NonKmmBridgeTasksTest` upload/download through a mock +artifact server hardcoded to `http://127.0.0.1:8089` (see `kmmbridge-test`'s `TestUploadArtifactManager`). +Before running these tests, start it in a separate terminal: + +```shell +node .github/scripts/test-artifact-server.js 8089 +``` + +Leave it running for the duration of your test run. + ## Publishing KMMBridge locally We want to publish KMMBridge as version `9.9.9`. This is a fake local version, just for testing. To do that, run the following on the root folder of KMMBridge: diff --git a/kmmbridge-test/src/main/kotlin/Extensions.kt b/kmmbridge-test/src/main/kotlin/Extensions.kt index 0287ecc5..dc189647 100644 --- a/kmmbridge-test/src/main/kotlin/Extensions.kt +++ b/kmmbridge-test/src/main/kotlin/Extensions.kt @@ -1,8 +1,6 @@ -import co.touchlab.kmmbridge.findStringProperty import co.touchlab.kmmbridge.test.TestArtifactManager import co.touchlab.kmmbridge.test.TestUploadArtifactManager import co.touchlab.kmmbridge.test.kmmBridgeExtension -import org.gradle.api.GradleException import org.gradle.api.Project @Suppress("unused") @@ -17,16 +15,7 @@ fun Project.testArtifacts() { */ @Suppress("unused") fun Project.testUploadArtifacts() { - val server = findStringProperty("TOUCHLAB_TEST_ARTIFACT_SERVER") - val code = findStringProperty("TOUCHLAB_TEST_ARTIFACT_CODE") - - if (server == null || code == null) { - throw GradleException("TODO: Figure out a way for forks to not fail builds. But not today...") - } - - val am = TestUploadArtifactManager(server, code) - val artifactManager = kmmBridgeExtension.artifactManager - artifactManager.set(am) + artifactManager.set(TestUploadArtifactManager()) artifactManager.finalizeValue() } diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt index a908631c..aa6ebaba 100644 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt +++ b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt @@ -16,16 +16,17 @@ import org.gradle.api.Task * Simple artifact manager that posts files to our server (Touchlab). This isn't designed for general usage. Just for * our tests. If there is more general demand for this functionality, reach out and we'll discuss ways of making it work. */ -internal class TestUploadArtifactManager(private val server: String, private val code: String) : ArtifactManager { +internal class TestUploadArtifactManager() : ArtifactManager { + private val server: String = "http://127.0.0.1:8089" + override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { val body: RequestBody = zipFilePath.asRequestBody("application/octet-stream".toMediaTypeOrNull()) val uploadRequest = Request .Builder() .url( - "https://$server/infoadmin/storeTestZip", + "$server/store", ).post(body) - .addHeader("code", code) .addHeader("Content-Type", "application/octet-stream") .build() @@ -46,7 +47,7 @@ internal class TestUploadArtifactManager(private val server: String, private val val uploadResponseString = response.body!!.string() val url = Gson().fromJson(uploadResponseString, UploadReply::class.java).url - return "https://$server$url" + return "$server$url" } data class UploadReply(var url: String) diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt index f4c653e6..19c75668 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt @@ -14,8 +14,6 @@ class ArtifactManagerTest : BasePluginTest() { val result = ProcessHelper.runSh( "./gradlew kmmBridgePublish " + - "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE} " + "--stacktrace", workingDir = testProjectDir, ) @@ -31,8 +29,6 @@ class ArtifactManagerTest : BasePluginTest() { ProcessHelper.runSh( "./gradlew clean kmmBridgePublish " + "-PENABLE_PUBLISHING=true " + - "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE} " + "--stacktrace", workingDir = testProjectDir, ) @@ -40,7 +36,7 @@ class ArtifactManagerTest : BasePluginTest() { assertTrue(urlFile.exists()) val urlValue = urlFile.readText() - assertTrue(urlValue.startsWith("https://api.touchlab.dev/infoadmin/streamTestZip")) + assertTrue(urlValue.startsWith("http://127.0.0.1:8089/file")) assertEquals(0, result.status) } } diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt index c244e02f..026e127f 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt @@ -16,14 +16,10 @@ abstract class BasePluginTest { internal lateinit var settingsFile: File internal lateinit var buildFile: File - @Suppress("ktlint:standard:property-naming") - internal lateinit var TOUCHLAB_TEST_ARTIFACT_CODE: String - abstract fun testProjectPath(): String @BeforeEach fun setup() { - TOUCHLAB_TEST_ARTIFACT_CODE = File("TOUCHLAB_TEST_ARTIFACT_CODE").readText().lines().first() FileUtils.copyDirectory(testProjectSource, testProjectDir) ProcessHelper.runSh("git init;git add .;git commit -m 'arst'", workingDir = testProjectDir) settingsFile = File(testProjectDir, "settings.gradle.kts") diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt index 71c8d459..063993de 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt @@ -13,9 +13,7 @@ class NonKmmBridgeTasksTest : BasePluginTest() { fun runBasicBuild() { val result = ProcessHelper.runSh( - "./gradlew linkDebugFrameworkIosSimulatorArm64 " + - "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + "./gradlew linkDebugFrameworkIosSimulatorArm64", workingDir = testProjectDir, ) logExecResult(result) diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt index 6b34f66f..1f4e5506 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt @@ -10,9 +10,7 @@ class SpmLocalDevTest : BasePluginTest() { fun runSpmDevBuild() { val result = ProcessHelper.runSh( - "./gradlew spmDevBuild --stacktrace " + - "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + "./gradlew spmDevBuild --stacktrace", workingDir = testProjectDir, ) logExecResult(result) @@ -27,9 +25,7 @@ class SpmLocalDevTest : BasePluginTest() { ProcessHelper.runSh("rm -rdf .git", workingDir = testProjectDir) val result = ProcessHelper.runSh( - "./gradlew spmDevBuild --stacktrace " + - "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + "./gradlew spmDevBuild --stacktrace", workingDir = testProjectDir, ) logExecResult(result) From 529903c4de35f678900df368225e341d51487bb7 Mon Sep 17 00:00:00 2001 From: Gustavo Fao Valvassori Date: Fri, 11 Sep 2026 18:26:15 -0300 Subject: [PATCH 2/5] ktlint --- .../co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt index aa6ebaba..35e55721 100644 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt +++ b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt @@ -16,7 +16,7 @@ import org.gradle.api.Task * Simple artifact manager that posts files to our server (Touchlab). This isn't designed for general usage. Just for * our tests. If there is more general demand for this functionality, reach out and we'll discuss ways of making it work. */ -internal class TestUploadArtifactManager() : ArtifactManager { +internal class TestUploadArtifactManager : ArtifactManager { private val server: String = "http://127.0.0.1:8089" override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { From 6a2c17e640d2559414f3d85a0eb862f7ea83664c Mon Sep 17 00:00:00 2001 From: Gustavo Fao Valvassori Date: Mon, 14 Sep 2026 10:03:56 -0300 Subject: [PATCH 3/5] removing server and only testing locally --- .github/scripts/test-artifact-server.js | 71 ------------------- .github/workflows/build_mac.yml | 6 -- kmmbridge-test/src/main/kotlin/Extensions.kt | 11 --- .../test/TestUploadArtifactManager.kt | 54 -------------- .../touchlab/kmmbridge/ArtifactManagerTest.kt | 8 +-- test-projects/basic/.gitignore | 3 +- test-projects/basic/Package.swift | 24 ------- .../basic/allshared/build.gradle.kts | 4 +- 8 files changed, 8 insertions(+), 173 deletions(-) delete mode 100644 .github/scripts/test-artifact-server.js delete mode 100644 kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt delete mode 100644 test-projects/basic/Package.swift diff --git a/.github/scripts/test-artifact-server.js b/.github/scripts/test-artifact-server.js deleted file mode 100644 index 176d444c..00000000 --- a/.github/scripts/test-artifact-server.js +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env node -/** - * Throwaway stand-in for Touchlab's private test-artifact server (api.touchlab.dev). - * - * Implements just the two endpoints KMMBridge's TestUploadArtifactManager needs: - * POST /store -> stores the request body, returns {"url": "/infoadmin/streamTestZip/.zip"} - * GET /file/.zip -> serves the stored bytes back - * - * Used by build_mac.yml so CI (including fork PRs, which never get repo secrets) - * can exercise the real upload/download round-trip. - */ -const http = require("http"); -const fs = require("fs"); -const os = require("os"); -const path = require("path"); -const crypto = require("crypto"); - -const STORAGE_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "kmmbridge-test-artifacts-")); - -function log(message) { - process.stderr.write(`[test-artifact-server] ${message}\n`); -} - -const server = http.createServer((req, res) => { - log(`${req.method} ${req.url}`); - - if (req.method === "POST" && req.url === "/store") { - const chunks = []; - req.on("data", (chunk) => chunks.push(chunk)); - req.on("end", () => { - const body = Buffer.concat(chunks); - const fileId = `${crypto.randomUUID()}.zip`; - fs.writeFileSync(path.join(STORAGE_DIR, fileId), body); - - const reply = JSON.stringify({ url: `/file/${fileId}` }); - res.writeHead(200, { - "Content-Type": "application/json", - "Content-Length": Buffer.byteLength(reply), - }); - res.end(reply); - }); - return; - } - - const prefix = "/file/"; - if (req.method === "GET" && req.url.startsWith(prefix)) { - const fileId = req.url.slice(prefix.length); - const filePath = path.join(STORAGE_DIR, fileId); - if (fileId.includes("..") || !fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { - res.writeHead(404); - res.end(); - return; - } - - const data = fs.readFileSync(filePath); - res.writeHead(200, { - "Content-Type": "application/octet-stream", - "Content-Length": data.length, - }); - res.end(data); - return; - } - - res.writeHead(404); - res.end(); -}); - -const port = process.argv[2] ? parseInt(process.argv[2], 10) : 8089; -server.listen(port, "127.0.0.1", () => { - console.log(`[test-artifact-server] listening on 127.0.0.1:${port}, storage=${STORAGE_DIR}`); -}); diff --git a/.github/workflows/build_mac.yml b/.github/workflows/build_mac.yml index 55f0da1b..650c1f1e 100644 --- a/.github/workflows/build_mac.yml +++ b/.github/workflows/build_mac.yml @@ -19,12 +19,6 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - - name: Start local test artifact server - run: | - nohup node .github/scripts/test-artifact-server.js 8089 > /tmp/test-artifact-server.log 2>&1 & - disown - npx --yes wait-on tcp:127.0.0.1:8089 - - name: Local Publish For Tests run: ./gradlew publishToMavenLocal --no-daemon --stacktrace --build-cache -PRELEASE_SIGNING_ENABLED=false -PVERSION_NAME=9.9.9 diff --git a/kmmbridge-test/src/main/kotlin/Extensions.kt b/kmmbridge-test/src/main/kotlin/Extensions.kt index dc189647..5613a3e9 100644 --- a/kmmbridge-test/src/main/kotlin/Extensions.kt +++ b/kmmbridge-test/src/main/kotlin/Extensions.kt @@ -1,5 +1,4 @@ import co.touchlab.kmmbridge.test.TestArtifactManager -import co.touchlab.kmmbridge.test.TestUploadArtifactManager import co.touchlab.kmmbridge.test.kmmBridgeExtension import org.gradle.api.Project @@ -9,13 +8,3 @@ fun Project.testArtifacts() { artifactManager.set(TestArtifactManager()) artifactManager.finalizeValue() } - -/** - * This is for Touchlab use. See the code for more details. - */ -@Suppress("unused") -fun Project.testUploadArtifacts() { - val artifactManager = kmmBridgeExtension.artifactManager - artifactManager.set(TestUploadArtifactManager()) - artifactManager.finalizeValue() -} diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt deleted file mode 100644 index 35e55721..00000000 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt +++ /dev/null @@ -1,54 +0,0 @@ -package co.touchlab.kmmbridge.test - -import co.touchlab.kmmbridge.artifactmanager.ArtifactManager -import com.google.gson.Gson -import java.io.File -import java.time.Duration -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody -import okhttp3.RequestBody.Companion.asRequestBody -import org.gradle.api.GradleException -import org.gradle.api.Task - -/** - * Simple artifact manager that posts files to our server (Touchlab). This isn't designed for general usage. Just for - * our tests. If there is more general demand for this functionality, reach out and we'll discuss ways of making it work. - */ -internal class TestUploadArtifactManager : ArtifactManager { - private val server: String = "http://127.0.0.1:8089" - - override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { - val body: RequestBody = zipFilePath.asRequestBody("application/octet-stream".toMediaTypeOrNull()) - val uploadRequest = - Request - .Builder() - .url( - "$server/store", - ).post(body) - .addHeader("Content-Type", "application/octet-stream") - .build() - - val okHttpClient = - OkHttpClient - .Builder() - .callTimeout(Duration.ofMinutes(5)) - .connectTimeout(Duration.ofMinutes(2)) - .writeTimeout(Duration.ofMinutes(5)) - .readTimeout(Duration.ofMinutes(2)) - .build() - - val response = okHttpClient.newCall(uploadRequest).execute() - if (response.code >= 400) { - throw GradleException("Test zip upload failed. Code: ${response.code}, message: ${response.message}") - } - - val uploadResponseString = response.body!!.string() - val url = Gson().fromJson(uploadResponseString, UploadReply::class.java).url - - return "$server$url" - } - - data class UploadReply(var url: String) -} diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt index 19c75668..71d01007 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt @@ -24,7 +24,8 @@ class ArtifactManagerTest : BasePluginTest() { @Test fun runKmmBridgePublish() { val urlFile = File(testProjectDir, "allshared/build/kmmbridge/url") - assertFalse(urlFile.exists()) + if (urlFile.exists()) urlFile.delete() + val result = ProcessHelper.runSh( "./gradlew clean kmmBridgePublish " + @@ -34,9 +35,8 @@ class ArtifactManagerTest : BasePluginTest() { ) logExecResult(result) - assertTrue(urlFile.exists()) - val urlValue = urlFile.readText() - assertTrue(urlValue.startsWith("http://127.0.0.1:8089/file")) assertEquals(0, result.status) + assertTrue(urlFile.exists()) + assertEquals("test://0.1.8", urlFile.readText()) } } diff --git a/test-projects/basic/.gitignore b/test-projects/basic/.gitignore index c0448de0..adb5c9ff 100644 --- a/test-projects/basic/.gitignore +++ b/test-projects/basic/.gitignore @@ -16,4 +16,5 @@ build !/.idea/inspectionProfiles/* .kotlin -.swiftpm \ No newline at end of file +.swiftpm +Package.swift \ No newline at end of file diff --git a/test-projects/basic/Package.swift b/test-projects/basic/Package.swift deleted file mode 100644 index c3ef24ca..00000000 --- a/test-projects/basic/Package.swift +++ /dev/null @@ -1,24 +0,0 @@ -// swift-tools-version:5.8 -import PackageDescription - -let packageName = "allshared" - -let package = Package( - name: packageName, - platforms: [ - .iOS(.v14) - ], - products: [ - .library( - name: packageName, - targets: [packageName] - ), - ], - targets: [ - .binaryTarget( - name: packageName, - path: "./allshared/build/XCFrameworks/debug/\(packageName).xcframework" - ) - , - ] -) \ No newline at end of file diff --git a/test-projects/basic/allshared/build.gradle.kts b/test-projects/basic/allshared/build.gradle.kts index 726ab837..2eed5a38 100644 --- a/test-projects/basic/allshared/build.gradle.kts +++ b/test-projects/basic/allshared/build.gradle.kts @@ -18,8 +18,8 @@ kotlin { } kmmbridge { - testUploadArtifacts() - spm(swiftToolVersion = "5.8") { + testArtifacts() + spm(swiftToolVersion = "5.8", spmDirectory = "../") { iOS { v("14") } } } From 4c0fbacb15b094149e84f392b2d4ef217f5364f1 Mon Sep 17 00:00:00 2001 From: Gustavo Fao Valvassori Date: Mon, 14 Sep 2026 10:06:23 -0300 Subject: [PATCH 4/5] reverted changes to TESTING.md --- TESTING.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/TESTING.md b/TESTING.md index 8e455ecb..8e6544c0 100644 --- a/TESTING.md +++ b/TESTING.md @@ -8,18 +8,6 @@ To do that, we need to locally publish KMMBridge, then point tests projects at t * A sample app project is copied to that folder * A command line process is run, generally running Gradle to perform whatever task we intend to test -## Starting the local test artifact server - -`ArtifactManagerTest`, `SpmLocalDevTest`, and `NonKmmBridgeTasksTest` upload/download through a mock -artifact server hardcoded to `http://127.0.0.1:8089` (see `kmmbridge-test`'s `TestUploadArtifactManager`). -Before running these tests, start it in a separate terminal: - -```shell -node .github/scripts/test-artifact-server.js 8089 -``` - -Leave it running for the duration of your test run. - ## Publishing KMMBridge locally We want to publish KMMBridge as version `9.9.9`. This is a fake local version, just for testing. To do that, run the following on the root folder of KMMBridge: From e54caa91f5f5e06e14c3230e5c1bf980823681ca Mon Sep 17 00:00:00 2001 From: Gustavo Fao Valvassori Date: Mon, 14 Sep 2026 13:32:54 -0300 Subject: [PATCH 5/5] ktlint and added package.swift back --- .../touchlab/kmmbridge/ArtifactManagerTest.kt | 1 - test-projects/basic/.gitignore | 3 +-- test-projects/basic/Package.swift | 24 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 test-projects/basic/Package.swift diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt index 71d01007..761f1bda 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt @@ -2,7 +2,6 @@ package co.touchlab.kmmbridge import java.io.File import kotlin.test.assertEquals -import kotlin.test.assertFalse import kotlin.test.assertTrue import org.junit.jupiter.api.Test diff --git a/test-projects/basic/.gitignore b/test-projects/basic/.gitignore index adb5c9ff..c0448de0 100644 --- a/test-projects/basic/.gitignore +++ b/test-projects/basic/.gitignore @@ -16,5 +16,4 @@ build !/.idea/inspectionProfiles/* .kotlin -.swiftpm -Package.swift \ No newline at end of file +.swiftpm \ No newline at end of file diff --git a/test-projects/basic/Package.swift b/test-projects/basic/Package.swift new file mode 100644 index 00000000..c3ef24ca --- /dev/null +++ b/test-projects/basic/Package.swift @@ -0,0 +1,24 @@ +// swift-tools-version:5.8 +import PackageDescription + +let packageName = "allshared" + +let package = Package( + name: packageName, + platforms: [ + .iOS(.v14) + ], + products: [ + .library( + name: packageName, + targets: [packageName] + ), + ], + targets: [ + .binaryTarget( + name: packageName, + path: "./allshared/build/XCFrameworks/debug/\(packageName).xcframework" + ) + , + ] +) \ No newline at end of file