From 517ace7b9bb03b8e701b8b6eb619fd785772020a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Overg=C3=A5rd=20Nielsen?= Date: Fri, 26 Jan 2024 13:13:09 +0100 Subject: [PATCH] Switch to integration tests (#1461) * Allow tests to be run as integration tests * Adapt flutter driver tests to new structure * Drop flavor_helpers.dart Use copyFile function variable instead, and override runtime in driver tests * Drop lib symlinks in tests Use package imports over ../lib relative imports * Use a group per test file * Remove test symlink as well * Check both dart defined and shell defined env .. to support both flutter drive and dart test * Fix CI * Simplify dartdoc_options.yaml a bit * Switch to integration_test * bump compileSdkVersion to 33 for android integration tests * Disable realm_map_test on Android integration tests (TEST) * Run android flutter tests on ubuntu-latest - faster, cheaper, and more runners * Enable gradle caching * Only drop Decimal128 tests on Android (TEMPORARY) * Re-create platforms * Allow network again for macos * Publish Test Report from flutter integration test * Remember to set org to io.realm when creating platforms projects * Move copyFile * Fix line-length in app_test.dart * default differentiator to 'local' * Add full directories as assets --- .github/workflows/ci.yml | 39 +++- .github/workflows/flutter-desktop-tests.yml | 20 +- common/topic.md | 1 - dartdoc_options.yaml | 10 - flavor_helpers.dart | 6 - flutter/realm_flutter/data | 1 - flutter/realm_flutter/realm_flutter.iml | 19 -- flutter/realm_flutter/tests/.metadata | 36 ++- .../tests/android/app/build.gradle | 35 ++- .../android/app/src/debug/AndroidManifest.xml | 6 +- .../android/app/src/main/AndroidManifest.xml | 16 +- .../src/main/java/io/tests/MainActivity.java | 6 - .../kotlin/io/realm/tests/MainActivity.kt | 6 + .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 6 +- .../realm_flutter/tests/android/build.gradle | 11 +- .../tests/android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 1 - .../tests/android/settings.gradle | 34 ++- .../tests/data/realm_files/old-format.realm | Bin 4096 -> 0 bytes .../realm_flutter/tests/flavor_helpers.dart | 9 - .../tests/integration_test/all_tests.dart | 70 ++++++ flutter/realm_flutter/tests/ios/.gitignore | 1 + .../tests/ios/Flutter/AppFrameworkInfo.plist | 2 +- flutter/realm_flutter/tests/ios/Podfile | 9 +- flutter/realm_flutter/tests/ios/Podfile.lock | 22 -- .../ios/Runner.xcodeproj/project.pbxproj | 207 ++++++++++++------ .../xcshareddata/xcschemes/Runner.xcscheme | 13 +- .../contents.xcworkspacedata | 3 - .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 1418 bytes .../realm_flutter/tests/ios/Runner/Info.plist | 4 +- .../tests/ios/RunnerTests/RunnerTests.swift | 12 + flutter/realm_flutter/tests/lib | 1 - .../realm_flutter/tests/linux/CMakeLists.txt | 9 +- .../tests/linux/flutter/CMakeLists.txt | 2 +- flutter/realm_flutter/tests/macos/Podfile | 7 +- .../macos/Runner.xcodeproj/project.pbxproj | 198 +++++++++++++++-- .../xcshareddata/xcschemes/Runner.xcscheme | 11 + .../AppIcon.appiconset/app_icon_1024.png | Bin 46993 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 3276 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 1429 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 5933 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 1243 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 14800 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 1874 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 4 + .../macos/Runner/Configs/AppInfo.xcconfig | 2 +- .../macos/Runner/MainFlutterWindow.swift | 2 +- .../tests/macos/Runner/Release.entitlements | 2 + .../tests/macos/RunnerTests/RunnerTests.swift | 12 + flutter/realm_flutter/tests/pubspec.yaml | 14 +- flutter/realm_flutter/tests/test | 1 - flutter/realm_flutter/tests/test/data | 1 + .../realm_flutter/tests/test_driver/app.dart | 34 --- .../tests/test_driver/app_test.dart | 42 ---- .../tests/test_driver/const.dart | 5 - .../tests/test_driver/realm_test.dart | 79 ------- .../tests/windows/CMakeLists.txt | 31 ++- .../tests/windows/flutter/CMakeLists.txt | 10 +- .../tests/windows/runner/CMakeLists.txt | 25 ++- .../tests/windows/runner/Runner.rc | 6 +- .../tests/windows/runner/flutter_window.cpp | 10 + .../tests/windows/runner/main.cpp | 2 +- .../tests/windows/runner/runner.exe.manifest | 2 +- .../tests/windows/runner/utils.cpp | 13 +- .../tests/windows/runner/win32_window.cpp | 55 ++++- .../tests/windows/runner/win32_window.h | 20 +- flutter/realm_flutter/topic.md | 0 lib/src/cli/atlas_apps/baas_client.dart | 2 +- test/app_test.dart | 8 +- test/asymmetric_test.dart | 6 +- test/baas_helper.dart | 110 +++++----- test/backlinks_test.dart | 6 +- test/client_reset_test.dart | 8 +- test/configuration_test.dart | 16 +- test/credentials_test.dart | 6 +- test/decimal128_test.dart | 6 +- test/dynamic_realm_test.dart | 6 +- test/embedded_test.dart | 10 +- test/geospatial_test.dart | 6 +- test/indexed_test.dart | 8 +- test/list_test.dart | 6 +- test/manual_test.dart | 6 +- test/migration_test.dart | 12 +- test/realm_logger_test.dart | 8 +- test/realm_map_test.dart | 16 +- test/realm_object_test.dart | 6 +- test/realm_set_test.dart | 6 +- test/realm_test.dart | 8 +- test/realm_value_test.dart | 6 +- test/results_test.dart | 6 +- test/session_test.dart | 8 +- test/subscription_test.dart | 10 +- test/test.dart | 47 ++-- test/user_test.dart | 6 +- topic.md | 0 110 files changed, 936 insertions(+), 629 deletions(-) delete mode 120000 common/topic.md delete mode 100644 flavor_helpers.dart delete mode 120000 flutter/realm_flutter/data delete mode 100644 flutter/realm_flutter/realm_flutter.iml delete mode 100644 flutter/realm_flutter/tests/android/app/src/main/java/io/tests/MainActivity.java create mode 100644 flutter/realm_flutter/tests/android/app/src/main/kotlin/io/realm/tests/MainActivity.kt delete mode 100644 flutter/realm_flutter/tests/data/realm_files/old-format.realm delete mode 100644 flutter/realm_flutter/tests/flavor_helpers.dart create mode 100644 flutter/realm_flutter/tests/integration_test/all_tests.dart delete mode 100644 flutter/realm_flutter/tests/ios/Podfile.lock create mode 100644 flutter/realm_flutter/tests/ios/RunnerTests/RunnerTests.swift delete mode 120000 flutter/realm_flutter/tests/lib create mode 100644 flutter/realm_flutter/tests/macos/RunnerTests/RunnerTests.swift delete mode 120000 flutter/realm_flutter/tests/test create mode 120000 flutter/realm_flutter/tests/test/data delete mode 100644 flutter/realm_flutter/tests/test_driver/app.dart delete mode 100644 flutter/realm_flutter/tests/test_driver/app_test.dart delete mode 100644 flutter/realm_flutter/tests/test_driver/const.dart delete mode 100644 flutter/realm_flutter/tests/test_driver/realm_test.dart delete mode 100644 flutter/realm_flutter/topic.md delete mode 100644 topic.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d3d96e5d..999703a2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -321,9 +321,23 @@ jobs: - name: Run tests on iOS Simulator run: | - flutter drive --target=test_driver/app.dart --dart-define=testName="" --suppress-analytics --debug + flutter test integration_test/all_tests.dart \ + --dart-define=BAAS_BAASAAS_API_KEY=$BAAS_BAASAAS_API_KEY \ + --dart-define=BAAS_DIFFERENTIATOR=$BAAS_DIFFERENTIATOR \ + --file-reporter=json:test-results.json \ + --suppress-analytics working-directory: ./flutter/realm_flutter/tests + - name: Publish Test Report + uses: dorny/test-reporter@v1.7.0 + if: success() || failure() + with: + name: Test Results Flutter iOS + path: test-results.json + reporter: dart-json + only-summary: true + working-directory: ./flutter/realm_flutter/tests + cleanup-cluster-flutter-ios: name: Cleanup Cluster for Flutter iOS uses: ./.github/workflows/terminate-baas.yml @@ -342,7 +356,7 @@ jobs: differentiator: fa${{ github.run_id }}${{ github.run_attempt }} flutter-tests-android: - runs-on: macos-latest + runs-on: ubuntu-latest name: Flutter Tests Android timeout-minutes: 45 needs: @@ -358,6 +372,15 @@ jobs: with: submodules: 'recursive' + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Gradle cache + uses: gradle/gradle-build-action@v2 + - name: Set up Java uses: actions/setup-java@v3 with: @@ -411,7 +434,17 @@ jobs: ndk: 21.0.6113669 arch: x86 cmake: 3.10.2.4988404 - script: flutter build apk --debug --target=test_driver/app.dart && flutter install --debug && flutter drive --target=test_driver/app.dart --dart-define=testName="" --suppress-analytics --debug + script: flutter test integration_test/all_tests.dart --dart-define=BAAS_BAASAAS_API_KEY=$BAAS_BAASAAS_API_KEY --dart-define=BAAS_DIFFERENTIATOR=$BAAS_DIFFERENTIATOR --file-reporter=json:test-results.json --suppress-analytics + working-directory: ./flutter/realm_flutter/tests + + - name: Publish Test Report + uses: dorny/test-reporter@v1.7.0 + if: success() || failure() + with: + name: Test Results Flutter Android + path: test-results.json + reporter: dart-json + only-summary: true working-directory: ./flutter/realm_flutter/tests cleanup-cluster-flutter-android: diff --git a/.github/workflows/flutter-desktop-tests.yml b/.github/workflows/flutter-desktop-tests.yml index c808d1e59..f643ab1f6 100644 --- a/.github/workflows/flutter-desktop-tests.yml +++ b/.github/workflows/flutter-desktop-tests.yml @@ -72,5 +72,23 @@ jobs: if: ${{ contains(inputs.os, 'macos') }} - name: Run tests - run: ${{ inputs.os == 'linux' && 'xvfb-run' || '' }} flutter drive -d ${{ inputs.os }} --target=test_driver/app.dart --suppress-analytics --dart-entrypoint-args="" --debug # -a="Some test name" + run: | + ${{ inputs.os == 'linux' && 'xvfb-run' || '' }} \ + flutter test integration_test/all_tests.dart \ + --dart-define=BAAS_BAASAAS_API_KEY=$BAAS_BAASAAS_API_KEY \ + --dart-define=BAAS_DIFFERENTIATOR=$BAAS_DIFFERENTIATOR \ + --device-id=${{ inputs.os }} \ + --file-reporter=json:test-results.json \ + --suppress-analytics + shell: bash working-directory: ./flutter/realm_flutter/tests + + - name: Publish Test Report + uses: dorny/test-reporter@v1.7.0 + if: success() || failure() + with: + name: Test Results Flutter ${{ inputs.os }} ${{ inputs.architecture }} + path: test-results.json + reporter: dart-json + only-summary: true + working-directory: ./flutter/realm_flutter/tests diff --git a/common/topic.md b/common/topic.md deleted file mode 120000 index d95abdf64..000000000 --- a/common/topic.md +++ /dev/null @@ -1 +0,0 @@ -../topic.md \ No newline at end of file diff --git a/dartdoc_options.yaml b/dartdoc_options.yaml index 683be5f02..1614f7b99 100644 --- a/dartdoc_options.yaml +++ b/dartdoc_options.yaml @@ -1,20 +1,10 @@ dartdoc: categories: "Configuration": - markdown: topic.md - name: Configuration "Annotations": - markdown: topic.md - name: Annotations "Realm": - markdown: topic.md - name: Realm "Application": - markdown: topic.md - name: Application "Sync": - markdown: topic.md - name: Sync categoryOrder: ["Realm", "Configuration", "Annotations", "Application", "Sync"] examplePathPrefix: 'example' # nodoc: ['generator/flutter/ffigen/scripts/src/test/*.g.dart'] diff --git a/flavor_helpers.dart b/flavor_helpers.dart deleted file mode 100644 index 565c5205e..000000000 --- a/flavor_helpers.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'dart:io'; -import 'package:path/path.dart' as p; - -Future copyBundledFile(String fromPath, String toPath) async { - await File(p.join('test', fromPath)).copy(toPath); -} diff --git a/flutter/realm_flutter/data b/flutter/realm_flutter/data deleted file mode 120000 index 4bfafef56..000000000 --- a/flutter/realm_flutter/data +++ /dev/null @@ -1 +0,0 @@ -../../test/data \ No newline at end of file diff --git a/flutter/realm_flutter/realm_flutter.iml b/flutter/realm_flutter/realm_flutter.iml deleted file mode 100644 index 429df7daf..000000000 --- a/flutter/realm_flutter/realm_flutter.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/flutter/realm_flutter/tests/.metadata b/flutter/realm_flutter/tests/.metadata index 863658e80..58ad27477 100644 --- a/flutter/realm_flutter/tests/.metadata +++ b/flutter/realm_flutter/tests/.metadata @@ -4,7 +4,39 @@ # This file should be version controlled and should not be manually edited. version: - revision: f18b9281c2280c2646aa3d4348715ed5bb9446c8 - channel: beta + revision: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: android + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: ios + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: linux + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: macos + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + - platform: windows + create_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + base_revision: 67457e669f79e9f8d13d7a68fe09775fefbb79f4 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/flutter/realm_flutter/tests/android/app/build.gradle b/flutter/realm_flutter/tests/android/app/build.gradle index 80137838e..443d0e67e 100644 --- a/flutter/realm_flutter/tests/android/app/build.gradle +++ b/flutter/realm_flutter/tests/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,21 +22,31 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 31 + namespace "io.realm.tests" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "io.realm.tests" - minSdkVersion 16 - targetSdkVersion 30 + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -52,3 +63,5 @@ android { flutter { source '../..' } + +dependencies {} diff --git a/flutter/realm_flutter/tests/android/app/src/debug/AndroidManifest.xml b/flutter/realm_flutter/tests/android/app/src/debug/AndroidManifest.xml index 26fb9c734..399f6981d 100644 --- a/flutter/realm_flutter/tests/android/app/src/debug/AndroidManifest.xml +++ b/flutter/realm_flutter/tests/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,6 @@ - - diff --git a/flutter/realm_flutter/tests/android/app/src/main/AndroidManifest.xml b/flutter/realm_flutter/tests/android/app/src/main/AndroidManifest.xml index 97e0f93f0..97f14c160 100644 --- a/flutter/realm_flutter/tests/android/app/src/main/AndroidManifest.xml +++ b/flutter/realm_flutter/tests/android/app/src/main/AndroidManifest.xml @@ -1,10 +1,11 @@ - - + - - diff --git a/flutter/realm_flutter/tests/android/app/src/main/java/io/tests/MainActivity.java b/flutter/realm_flutter/tests/android/app/src/main/java/io/tests/MainActivity.java deleted file mode 100644 index 925285545..000000000 --- a/flutter/realm_flutter/tests/android/app/src/main/java/io/tests/MainActivity.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.realm.tests; - -import io.flutter.embedding.android.FlutterActivity; - -public class MainActivity extends FlutterActivity { -} diff --git a/flutter/realm_flutter/tests/android/app/src/main/kotlin/io/realm/tests/MainActivity.kt b/flutter/realm_flutter/tests/android/app/src/main/kotlin/io/realm/tests/MainActivity.kt new file mode 100644 index 000000000..30d7769d8 --- /dev/null +++ b/flutter/realm_flutter/tests/android/app/src/main/kotlin/io/realm/tests/MainActivity.kt @@ -0,0 +1,6 @@ +package io.realm.tests + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/flutter/realm_flutter/tests/android/app/src/main/res/values-night/styles.xml b/flutter/realm_flutter/tests/android/app/src/main/res/values-night/styles.xml index 449a9f930..06952be74 100644 --- a/flutter/realm_flutter/tests/android/app/src/main/res/values-night/styles.xml +++ b/flutter/realm_flutter/tests/android/app/src/main/res/values-night/styles.xml @@ -3,14 +3,14 @@