diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b1e5ece..4227e53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,10 +44,10 @@ jobs: run: ./gradlew :sqllin-driver:assemble -PonCICD - name: Run sqllin-driver macOS Arm64 Tests - run: ./gradlew :sqllin-driver-test:cleanMacosArm64Test :sqllin-driver-test:macosArm64Test --stacktrace + run: ./gradlew :sqllin-driver:cleanMacosArm64Test :sqllin-driver:macosArm64Test --stacktrace - name: Run sqllin-driver JVM Unit Tests on macOS Arm64 - run: ./gradlew :sqllin-driver-test:cleanJvmTest :sqllin-driver-test:jvmTest --stacktrace + run: ./gradlew :sqllin-driver:cleanJvmTest :sqllin-driver:jvmTest --stacktrace - name: Build sqllin-dsl run: ./gradlew :sqllin-dsl:assemble -PonCICD @@ -164,10 +164,10 @@ jobs: run: ./gradlew :sqllin-driver:linuxX64MainKlibrary :sqllin-driver:jvmJar - name: Run sqllin-driver Linux X64 Tests - run: ./gradlew :sqllin-driver-test:cleanLinuxX64Test :sqllin-driver-test:linuxX64Test --stacktrace + run: ./gradlew :sqllin-driver:cleanLinuxX64Test :sqllin-driver:linuxX64Test --stacktrace - name: Run sqllin-driver JVM Unit Tests on Linux X64 - run: ./gradlew :sqllin-driver-test:cleanJvmTest :sqllin-driver-test:jvmTest --stacktrace + run: ./gradlew :sqllin-driver:cleanJvmTest :sqllin-driver:jvmTest --stacktrace - name: Build sqllin-processor run: ./gradlew :sqllin-processor:assemble @@ -198,15 +198,6 @@ jobs: build-android-and-test: runs-on: ubuntu-latest timeout-minutes: 60 - strategy: - matrix: - include: - - api-level: 26 - target: default - device: pixel_2 - - api-level: 36 - target: google_apis - device: pixel_6 steps: - name: Checkout @@ -227,52 +218,30 @@ jobs: - name: Build Android run: ./gradlew :sqllin-driver:assembleAndroidMain :sqllin-dsl:assembleAndroidMain - - name: AVD Cache + - name: Cache Robolectric Android-All Jars uses: actions/cache@v4 - id: avd-cache with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ matrix.api-level }} - - - name: Create AVD and Generate Snapshot for Caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ matrix.api-level }} - target: ${{ matrix.target }} - arch: x86_64 - profile: ${{ matrix.device }} - emulator-build: 15368433 - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: echo "Generated AVD snapshot for caching." - - - name: Run Android Instrumented Tests - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ matrix.api-level }} - target: ${{ matrix.target }} - arch: x86_64 - profile: ${{ matrix.device }} - emulator-build: 15368433 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: ./gradlew :sqllin-driver-test:connectedAndroidDeviceTest --stacktrace & ./gradlew :sqllin-dsl-test:connectedAndroidDeviceTest --stacktrace + path: ~/.m2/repository/org/robolectric + key: ${{ runner.os }}-robolectric-${{ hashFiles('gradle/libs.versions.toml') }} + restore-keys: | + ${{ runner.os }}-robolectric- + + - name: Run sqllin-driver Android Unit Tests + run: ./gradlew :sqllin-driver:testAndroidHostTest --stacktrace + + - name: Run sqllin-dsl Android Unit Tests + run: ./gradlew :sqllin-dsl-test:testAndroidHostTest --stacktrace - name: Upload sqllin-driver Reports uses: actions/upload-artifact@v4 with: - name: Test-Reports-Android-driver-API${{ matrix.api-level }} + name: Test-Reports-Android-driver path: sqllin-driver/build/reports if: failure() - name: Upload sqllin-dsl Reports uses: actions/upload-artifact@v4 with: - name: Test-Reports-Android-dsl-API${{ matrix.api-level }} - path: sqllin-dsl/build/reports + name: Test-Reports-Android-dsl + path: sqllin-dsl-test/build/reports if: failure() diff --git a/.gitignore b/.gitignore index 44bd9a7..857e32e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ local.properties /sqllin-driver/build /sqllin-dsl/build /sqllin-processor/build -/sqllin-driver-test/build /sqllin-dsl-test/build /sample/build *.podspec diff --git a/CHANGELOG.md b/CHANGELOG.md index bdba5d0..71b6e19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ - Date format: YYYY-MM-dd +## 2.4.0 / 2026-xx-xx + +### All + +* Update `Kotlin`'s version to `2.4.20` +* Update `AGP`'s version to `9.4.0` +* Migrate the Android instrumented tests to `Robolectric`, they now run on the JVM as host unit tests against `API 26` and `API 37`, and no longer need an emulator +* Move the `sqllin-driver` tests back into the `sqllin-driver` module's `commonTest`, and remove the `sqllin-driver-test` module + +### sqllin-driver + +* Update `sqlite-jdbc`'s version to `3.53.4.0` + ## 2.3.0 / 2026-08-20 ### All diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..2a29db8 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,13 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b96cc4b9c59b5bff244af296e50d5ea3/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fdfa2f9fadcf75fb9616fde209d60b55/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b96cc4b9c59b5bff244af296e50d5ea3/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fdfa2f9fadcf75fb9616fde209d60b55/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/97b61e8788c7490a5f53d8951b11ea7a/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/feb8af2956f2e263086e0a8f9a1df390/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b96cc4b9c59b5bff244af296e50d5ea3/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fdfa2f9fadcf75fb9616fde209d60b55/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/eff42deed1d8947129a4e66cd07a89f4/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8fe418192094ee8db0da620bcb6b1629/redirect +toolchainVendor=JETBRAINS +toolchainVersion=25 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0886eca..367f112 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,14 +1,15 @@ [versions] -kotlin = "2.4.10" -agp = "9.3.1" +kotlin = "2.4.20" +agp = "9.4.0" ksp = "2.3.11" serialization = "1.11.0" coroutines = "1.11.0" androidx-annotation = "1.10.0" androidx-test = "1.7.0" -androidx-test-runner = "1.7.0" -sqlite-jdbc = "3.53.2.1" +robolectric = "4.17" +junit = "4.13.2" +sqlite-jdbc = "3.53.4.0" jvm-toolchain = "21" android-sdk-compile = "37" android-sdk-min = "24" @@ -24,8 +25,8 @@ kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-cor androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "androidx-annotation" } androidx-test-core = { group = "androidx.test", name = "core", version.ref = "androidx-test" } -androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidx-test-runner" } -androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidx-test" } +robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } +junit = { group = "junit", name = "junit", version.ref = "junit" } sqlite-jdbc = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite-jdbc" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 3c49385..60c10ad 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,6 @@ include(":sqllin-driver") include(":sqllin-dsl") include(":sqllin-processor") include(":sqllin-dsl-test") -include(":sqllin-driver-test") include(":sample") pluginManagement { @@ -13,6 +12,9 @@ pluginManagement { mavenCentral() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} dependencyResolutionManagement { @Suppress("UnstableApiUsage") diff --git a/sqllin-driver-test/build.gradle.kts b/sqllin-driver-test/build.gradle.kts deleted file mode 100644 index e71a424..0000000 --- a/sqllin-driver-test/build.gradle.kts +++ /dev/null @@ -1,100 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.konan.target.HostManager - -plugins { - alias(libs.plugins.kotlin.multiplatform) - alias(libs.plugins.android.library) -} - -version = "1.0" - -kotlin { - jvmToolchain(libs.versions.jvm.toolchain.get().toInt()) - android { - namespace = "com.ctrip.sqllin.driver.test" - compileSdk = libs.versions.android.sdk.compile.get().toInt() - minSdk = libs.versions.android.sdk.min.get().toInt() - withDeviceTest { - instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - } - - jvm { - compilerOptions.jvmTarget.set(JvmTarget.JVM_11) - } - - listOf( - iosArm64(), - iosSimulatorArm64(), - - macosArm64(), - - watchosArm32(), - watchosArm64(), - watchosSimulatorArm64(), - watchosDeviceArm64(), - - tvosArm64(), - tvosSimulatorArm64(), - - linuxX64(), - linuxArm64(), - - mingwX64(), - ).forEach { - it.setupNativeConfig() - } - - compilerOptions { - freeCompilerArgs.addAll("-Xexpect-actual-classes") - } - - sourceSets { - all { - languageSettings { - optIn("kotlin.RequiresOptIn") - } - } - commonMain { - dependencies { - implementation(project(":sqllin-driver")) - implementation(kotlin("test")) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.coroutines.test) - } - } - getByName("androidDeviceTest").dependencies { - implementation(libs.androidx.test.core) - implementation(libs.androidx.test.runner) - implementation(libs.androidx.test.rules) - } - } -} - -gradle.taskGraph.whenReady { - if (!project.hasProperty("onCICD")) - return@whenReady - tasks.forEach { - when { - it.name.contains("linux", true) -> it.enabled = HostManager.hostIsLinux - it.name.contains("mingw", true) -> it.enabled = HostManager.hostIsMingw - it.name.contains("ios", true) - || it.name.contains("macos", true) - || it.name.contains("watchos", true) - || it.name.contains("tvos", true) -> it.enabled = HostManager.hostIsMac - } - } -} - -fun KotlinNativeTarget.setupNativeConfig() { - binaries { - all { - linkerOpts += when { - HostManager.hostIsLinux -> listOf("-lsqlite3", "-L$rootDir/libs/linux", "-L/usr/lib/x86_64-linux-gnu", "-L/usr/lib", "-L/usr/lib64") - HostManager.hostIsMingw -> listOf("-Lc:\\msys64\\mingw64\\lib", "-L$rootDir\\libs\\windows", "-lsqlite3") - else -> listOf("-lsqlite3") - } - } - } -} diff --git a/sqllin-driver/build.gradle.kts b/sqllin-driver/build.gradle.kts index c410c16..d2c1986 100644 --- a/sqllin-driver/build.gradle.kts +++ b/sqllin-driver/build.gradle.kts @@ -8,8 +8,8 @@ plugins { alias(libs.plugins.vanniktech.maven.publish) } -val GROUP_ID: String by project -val VERSION: String by project +val GROUP_ID = project.property("GROUP_ID") as String +val VERSION = project.property("VERSION") as String group = GROUP_ID version = VERSION @@ -21,6 +21,9 @@ kotlin { namespace = "com.ctrip.sqllin.driver" compileSdk = libs.versions.android.sdk.compile.get().toInt() minSdk = libs.versions.android.sdk.min.get().toInt() + withHostTest { + isIncludeAndroidResources = true + } } jvm { @@ -59,15 +62,31 @@ kotlin { optIn("kotlin.RequiresOptIn") } } + commonTest.dependencies { + implementation(kotlin("test")) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.coroutines.test) + } androidMain.dependencies { implementation(libs.androidx.annotation) } + getByName("androidHostTest").dependencies { + implementation(libs.junit) + implementation(libs.androidx.test.core) + implementation(libs.robolectric) + } jvmMain.dependencies { implementation(libs.sqlite.jdbc) } } } +// Robolectric reflects into JDK internals when setting up newer Android SDKs, +// which the module system blocks by default since JDK 17. +tasks.withType().matching { it.name == "testAndroidHostTest" }.configureEach { + jvmArgs("--add-exports=java.base/jdk.internal.access=ALL-UNNAMED") +} + gradle.taskGraph.whenReady { if (!project.hasProperty("onCICD")) return@whenReady @@ -111,29 +130,29 @@ mavenPublishing { pom { name.set(artifactId) description.set("Low-level API for SQLite on Kotlin Multiplatform") - val githubURL: String by project + val githubURL = project.property("githubURL") as String url.set(githubURL) licenses { license { - val licenseName: String by project + val licenseName = project.property("licenseName") as String name.set(licenseName) - val licenseURL: String by project + val licenseURL = project.property("licenseURL") as String url.set(licenseURL) } } developers { developer { - val developerID: String by project + val developerID = project.property("developerID") as String id.set(developerID) - val developerName: String by project + val developerName = project.property("developerName") as String name.set(developerName) - val developerEmail: String by project + val developerEmail = project.property("developerEmail") as String email.set(developerEmail) } } scm { url.set(githubURL) - val scmURL: String by project + val scmURL = project.property("scmURL") as String connection.set(scmURL) developerConnection.set(scmURL) } diff --git a/sqllin-driver-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt b/sqllin-driver/src/androidHostTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt similarity index 70% rename from sqllin-driver-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt rename to sqllin-driver/src/androidHostTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt index 215ebef..84ca5ea 100644 --- a/sqllin-driver-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt +++ b/sqllin-driver/src/androidHostTest/kotlin/com/ctrip/sqllin/driver/test/AndroidTest.kt @@ -18,24 +18,26 @@ package com.ctrip.sqllin.driver.test import android.content.Context import androidx.test.core.app.ApplicationProvider -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner -import androidx.test.platform.app.InstrumentationRegistry import com.ctrip.sqllin.driver.toDatabasePath -import org.junit.After -import org.junit.Test import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import kotlin.test.AfterTest +import kotlin.test.Test /** - * Android instrumented test + * Android unit test that runs on the JVM via Robolectric. The `sdk` levels cover both + * the `SQLiteDatabase.OpenParams` code path (Android P and above) and the legacy one. * @author Yuang Qiao */ -@RunWith(AndroidJUnit4ClassRunner::class) +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [26, 37]) class AndroidTest { - private val commonTest = CommonBasicTest( - ApplicationProvider.getApplicationContext().toDatabasePath() - ) + private val context = ApplicationProvider.getApplicationContext() + + private val commonTest = CommonBasicTest(context.toDatabasePath()) @Test fun testCreateAndUpgrade() = commonTest.testCreateAndUpgrade() @@ -55,9 +57,8 @@ class AndroidTest { @Test fun testConcurrency() = commonTest.testConcurrency() - @After + @AfterTest fun setDown() { - val context = InstrumentationRegistry.getInstrumentation().targetContext context.deleteDatabase(SQL.DATABASE_NAME) } } diff --git a/sqllin-driver-test/src/appleTest/kotlin/com/ctrip/sqllin/driver/test/PlatformApple.kt b/sqllin-driver/src/appleTest/kotlin/com/ctrip/sqllin/driver/test/PlatformApple.kt similarity index 100% rename from sqllin-driver-test/src/appleTest/kotlin/com/ctrip/sqllin/driver/test/PlatformApple.kt rename to sqllin-driver/src/appleTest/kotlin/com/ctrip/sqllin/driver/test/PlatformApple.kt diff --git a/sqllin-driver-test/src/commonMain/kotlin/com/ctrip/sqllin/driver/test/CommonBasicTest.kt b/sqllin-driver/src/commonTest/kotlin/com/ctrip/sqllin/driver/test/CommonBasicTest.kt similarity index 100% rename from sqllin-driver-test/src/commonMain/kotlin/com/ctrip/sqllin/driver/test/CommonBasicTest.kt rename to sqllin-driver/src/commonTest/kotlin/com/ctrip/sqllin/driver/test/CommonBasicTest.kt diff --git a/sqllin-driver-test/src/commonMain/kotlin/com/ctrip/sqllin/driver/test/SQL.kt b/sqllin-driver/src/commonTest/kotlin/com/ctrip/sqllin/driver/test/SQL.kt similarity index 100% rename from sqllin-driver-test/src/commonMain/kotlin/com/ctrip/sqllin/driver/test/SQL.kt rename to sqllin-driver/src/commonTest/kotlin/com/ctrip/sqllin/driver/test/SQL.kt diff --git a/sqllin-driver-test/src/jvmTest/kotlin/com/ctrip/sqllin/driver/test/JvmTest.kt b/sqllin-driver/src/jvmTest/kotlin/com/ctrip/sqllin/driver/test/JvmTest.kt similarity index 100% rename from sqllin-driver-test/src/jvmTest/kotlin/com/ctrip/sqllin/driver/test/JvmTest.kt rename to sqllin-driver/src/jvmTest/kotlin/com/ctrip/sqllin/driver/test/JvmTest.kt diff --git a/sqllin-driver-test/src/linuxTest/kotlin/com/ctrip/sqllin/driver/test/PlatformLinux.kt b/sqllin-driver/src/linuxTest/kotlin/com/ctrip/sqllin/driver/test/PlatformLinux.kt similarity index 100% rename from sqllin-driver-test/src/linuxTest/kotlin/com/ctrip/sqllin/driver/test/PlatformLinux.kt rename to sqllin-driver/src/linuxTest/kotlin/com/ctrip/sqllin/driver/test/PlatformLinux.kt diff --git a/sqllin-driver-test/src/mingwTest/kotlin/com/ctrip/sqllin/driver/test/PlatformMingw.kt b/sqllin-driver/src/mingwTest/kotlin/com/ctrip/sqllin/driver/test/PlatformMingw.kt similarity index 100% rename from sqllin-driver-test/src/mingwTest/kotlin/com/ctrip/sqllin/driver/test/PlatformMingw.kt rename to sqllin-driver/src/mingwTest/kotlin/com/ctrip/sqllin/driver/test/PlatformMingw.kt diff --git a/sqllin-driver-test/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/NativeTest.kt b/sqllin-driver/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/NativeTest.kt similarity index 100% rename from sqllin-driver-test/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/NativeTest.kt rename to sqllin-driver/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/NativeTest.kt diff --git a/sqllin-driver-test/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/Platform.kt b/sqllin-driver/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/Platform.kt similarity index 100% rename from sqllin-driver-test/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/Platform.kt rename to sqllin-driver/src/nativeTest/kotlin/com/ctrip/sqllin/driver/test/Platform.kt diff --git a/sqllin-dsl-test/build.gradle.kts b/sqllin-dsl-test/build.gradle.kts index 287bdd4..7eb4e64 100644 --- a/sqllin-dsl-test/build.gradle.kts +++ b/sqllin-dsl-test/build.gradle.kts @@ -18,8 +18,8 @@ kotlin { namespace = "com.ctrip.sqllin.dsl.test" compileSdk = libs.versions.android.sdk.compile.get().toInt() minSdk = libs.versions.android.sdk.min.get().toInt() - withDeviceTest { - instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + withHostTest { + isIncludeAndroidResources = true } } @@ -67,14 +67,20 @@ kotlin { implementation(libs.kotlinx.coroutines.test) } } - getByName("androidDeviceTest").dependencies { + getByName("androidHostTest").dependencies { + implementation(libs.junit) implementation(libs.androidx.test.core) - implementation(libs.androidx.test.runner) - implementation(libs.androidx.test.rules) + implementation(libs.robolectric) } } } +// Robolectric reflects into JDK internals when setting up newer Android SDKs, +// which the module system blocks by default since JDK 17. +tasks.withType().matching { it.name == "testAndroidHostTest" }.configureEach { + jvmArgs("--add-exports=java.base/jdk.internal.access=ALL-UNNAMED") +} + gradle.taskGraph.whenReady { if (!project.hasProperty("onCICD")) return@whenReady diff --git a/sqllin-dsl-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt b/sqllin-dsl-test/src/androidHostTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt similarity index 89% rename from sqllin-dsl-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt rename to sqllin-dsl-test/src/androidHostTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt index 2dc174b..f25d179 100644 --- a/sqllin-dsl-test/src/androidDeviceTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt +++ b/sqllin-dsl-test/src/androidHostTest/kotlin/com/ctrip/sqllin/dsl/test/AndroidTest.kt @@ -2,25 +2,27 @@ package com.ctrip.sqllin.dsl.test import android.content.Context import androidx.test.core.app.ApplicationProvider -import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner -import androidx.test.platform.app.InstrumentationRegistry import com.ctrip.sqllin.driver.toDatabasePath import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config /** - * Android instrumented test + * Android unit test that runs on the JVM via Robolectric. The `sdk` levels cover both + * the `SQLiteDatabase.OpenParams` code path (Android P and above) and the legacy one. * @author Yuang Qiao */ -@RunWith(AndroidJUnit4ClassRunner::class) +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [26, 37]) class AndroidTest { - private val commonTest = CommonBasicTest( - ApplicationProvider.getApplicationContext().toDatabasePath() - ) + private val context = ApplicationProvider.getApplicationContext() + + private val commonTest = CommonBasicTest(context.toDatabasePath()) @Test fun testInsert() = commonTest.testInsert() @@ -156,13 +158,11 @@ class AndroidTest { @Before fun setUp() { - val context = InstrumentationRegistry.getInstrumentation().targetContext context.deleteDatabase(CommonBasicTest.DATABASE_NAME) } @After fun setDown() { - val context = InstrumentationRegistry.getInstrumentation().targetContext context.deleteDatabase(CommonBasicTest.DATABASE_NAME) } } \ No newline at end of file diff --git a/sqllin-dsl/build.gradle.kts b/sqllin-dsl/build.gradle.kts index a795658..cc05bb0 100644 --- a/sqllin-dsl/build.gradle.kts +++ b/sqllin-dsl/build.gradle.kts @@ -9,8 +9,8 @@ plugins { alias(libs.plugins.vanniktech.maven.publish) } -val GROUP_ID: String by project -val VERSION: String by project +val GROUP_ID = project.property("GROUP_ID") as String +val VERSION = project.property("VERSION") as String group = GROUP_ID version = VERSION @@ -93,29 +93,29 @@ mavenPublishing { pom { name.set(artifactId) description.set("SQL DSL APIs for SQLite on Kotlin Multiplatform") - val githubURL: String by project + val githubURL = project.property("githubURL") as String url.set(githubURL) licenses { license { - val licenseName: String by project + val licenseName = project.property("licenseName") as String name.set(licenseName) - val licenseURL: String by project + val licenseURL = project.property("licenseURL") as String url.set(licenseURL) } } developers { developer { - val developerID: String by project + val developerID = project.property("developerID") as String id.set(developerID) - val developerName: String by project + val developerName = project.property("developerName") as String name.set(developerName) - val developerEmail: String by project + val developerEmail = project.property("developerEmail") as String email.set(developerEmail) } } scm { url.set(githubURL) - val scmURL: String by project + val scmURL = project.property("scmURL") as String connection.set(scmURL) developerConnection.set(scmURL) } diff --git a/sqllin-processor/build.gradle.kts b/sqllin-processor/build.gradle.kts index 01d3ed3..09d1fff 100644 --- a/sqllin-processor/build.gradle.kts +++ b/sqllin-processor/build.gradle.kts @@ -3,8 +3,8 @@ plugins { alias(libs.plugins.vanniktech.maven.publish) } -val GROUP_ID: String by project -val VERSION: String by project +val GROUP_ID = project.property("GROUP_ID") as String +val VERSION = project.property("VERSION") as String group = GROUP_ID version = VERSION @@ -36,29 +36,29 @@ mavenPublishing { pom { name.set(artifactId) description.set("KSP code be used to generate the database column properties") - val githubURL: String by project + val githubURL = project.property("githubURL") as String url.set(githubURL) licenses { license { - val licenseName: String by project + val licenseName = project.property("licenseName") as String name.set(licenseName) - val licenseURL: String by project + val licenseURL = project.property("licenseURL") as String url.set(licenseURL) } } developers { developer { - val developerID: String by project + val developerID = project.property("developerID") as String id.set(developerID) - val developerName: String by project + val developerName = project.property("developerName") as String name.set(developerName) - val developerEmail: String by project + val developerEmail = project.property("developerEmail") as String email.set(developerEmail) } } scm { url.set(githubURL) - val scmURL: String by project + val scmURL = project.property("scmURL") as String connection.set(scmURL) developerConnection.set(scmURL) }