diff --git a/.env b/.env
new file mode 100755
index 0000000000..70d0b2fa3c
--- /dev/null
+++ b/.env
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+FLANK_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]-$0}")" && pwd)"
+TEST_PROJECTS="$FLANK_ROOT/test_projects"
+FLANK_FIXTURES_TMP="$FLANK_ROOT/test_runner/src/test/kotlin/ftl/fixtures/tmp"
+
+. "$TEST_PROJECTS/ops.sh"
+
+function bash_debug() {
+ set -euxo pipefail
+}
diff --git a/docs/test_artifacts.md b/docs/test_artifacts.md
index 536313e62d..064217d431 100644
--- a/docs/test_artifacts.md
+++ b/docs/test_artifacts.md
@@ -1,8 +1,25 @@
# Test artifacts
+Test artifacts are necessary for CI and local testing.
+
+### Generating test artifacts
+```bash
+cd ... # your flank repositry root
+source .env
+update_test_artifacts android ios # [ android | go | ios | all ]
+```
+`update_test_artifacts` function will generate artifacts and copy them to `test_runner/src/test/kotlin/ftl/fixtures/tmp/` directory.
+
+### Test projects
+All source code for test artifacts is located in [test_projects](../test_projects/) directory.
+
+Each test project can contain own `ops.sh` script used building and coping generated artifacts.
+
+`update_test_artifacts` function is located in [test_projects/ops.sh](../test_projects/ops.sh) script.
+
+# Refactor
This is proposal of test artifacts refactoring.
-## Context
-Test artifacts are necessary for CI and local testing.
+## Context
Working on different issues sometimes requires different implementations of test artifacts that may exist in same time.
### Problem
@@ -33,9 +50,9 @@ Sometimes downloading may fail, but this not aborting test run.
For remote storage options see [host_binaries_solutions_comparison.md](./host_binaries_solutions_comparison.md)
## Solution proposal
-1. Move source code of test artifacts to one repo.
-We should consider flank repo because test_app is already there or dedicated repo linked to flank as git submodule.
-2. Prepare missing build scripts and adjust existing.
-We need dedicated scripts for each artifact group (iOS, Android or different types of each) and one to execute all of them.
+1. ~~Move source code of test artifacts to one repo.
+We should consider flank repo because test_app is already there or dedicated repo linked to flank as git submodule.~~
+2. ~~Prepare missing build scripts and adjust existing.
+We need dedicated scripts for each artifact group (iOS, Android or different types of each) and one to execute all of them.~~
3. Choose the best solution for hosting remote artifacts. See `Technical research` section.
4. Integrate artifacts synchronization with remote storage
diff --git a/flank-scripts/bash/flankScripts b/flank-scripts/bash/flankScripts
index 2212d2723f..1158f7255d 100755
--- a/flank-scripts/bash/flankScripts
+++ b/flank-scripts/bash/flankScripts
@@ -1,5 +1,10 @@
#!/usr/bin/env bash
-DIR=`dirname "$BASH_SOURCE"`
+dir=$(dirname "$BASH_SOURCE")
+scriptsJar="$dir/flankScripts.jar"
-/usr/bin/env java -jar "$DIR/flankScripts.jar" "$@"
+if [ ! -f "$scriptsJar" ]; then
+ "$dir/buildFlankScripts.sh"
+fi
+
+/usr/bin/env java -jar "$scriptsJar" "$@"
diff --git a/test_projects/android/bash/generate-multi-modules-apks.sh b/test_projects/android/bash/generate-multi-modules-apks.sh
index ff04b44c53..5c23885eea 100755
--- a/test_projects/android/bash/generate-multi-modules-apks.sh
+++ b/test_projects/android/bash/generate-multi-modules-apks.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
+echo "DEPRECATED!!! use functions from test_projects/android/ops.sh"
+
set -euxo pipefail
PROJECT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../.." >/dev/null 2>&1 && pwd )"
@@ -30,4 +32,4 @@ MULTI_MODULES_DIR="$PROJECT_DIR/test_runner/src/test/kotlin/ftl/fixtures/tmp/apk
:multi-modules:testModule20:assembleAndroidTest \
mkdir -p "$MULTI_MODULES_DIR"
-find multi-modules -type f -name "*.apk" -exec cp {} "$MULTI_MODULES_DIR" \;
\ No newline at end of file
+find multi-modules -type f -name "*.apk" -exec cp {} "$MULTI_MODULES_DIR" \;
diff --git a/test_projects/android/bash/generate_apks.sh b/test_projects/android/bash/generate_apks.sh
index 5df13a6228..6698423d4f 100755
--- a/test_projects/android/bash/generate_apks.sh
+++ b/test_projects/android/bash/generate_apks.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
+echo "DEPRECATED!!! use functions from test_projects/android/ops.sh"
+
set -euxo pipefail
APK_OUTPUT=$1
diff --git a/test_projects/android/bash/generate_duplicated_names_apks.sh b/test_projects/android/bash/generate_duplicated_names_apks.sh
index 18261938a9..a57f13f9d9 100755
--- a/test_projects/android/bash/generate_duplicated_names_apks.sh
+++ b/test_projects/android/bash/generate_duplicated_names_apks.sh
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
+echo "DEPRECATED!!! use functions from test_projects/android/ops.sh"
+
set -euxo pipefail
DIR=`dirname "$BASH_SOURCE"`
diff --git a/test_projects/android/ops.sh b/test_projects/android/ops.sh
new file mode 100644
index 0000000000..fc98c7de9d
--- /dev/null
+++ b/test_projects/android/ops.sh
@@ -0,0 +1,116 @@
+#!/usr/bin/env bash
+
+function base_app_apk() {
+ local dir=$TEST_PROJECTS_ANDROID
+ local outputDir="$FLANK_FIXTURES_TMP/apk"
+
+ for arg in "$@"; do case "$arg" in
+
+ '--generate' | '-g')
+ "$dir/gradlew" -p "$dir" app:assemble
+ ;;
+
+ '--copy' | '-c')
+ local apkIn="$dir/app/build/outputs/apk/singleSuccess/debug/app-single-success-debug.apk"
+ local apkOut="$outputDir/app-debug.apk"
+
+ mkdir -p "$outputDir"
+ cp "$apkIn" "$apkOut"
+ ;;
+
+ esac done
+}
+
+# depends on base_app_apk
+function base_test_apks() {
+ local dir=$TEST_PROJECTS_ANDROID
+
+ for arg in "$@"; do case "$arg" in
+
+ '--generate' | '-g')
+ "$dir/gradlew" -p "$dir" app:assembleAndroidTest
+ ;;
+
+ '--copy' | '-c')
+ local outputDir="$FLANK_FIXTURES_TMP/apk"
+
+ mkdir -p "$outputDir"
+ cp "$dir"/app/build/outputs/apk/androidTest/**/debug/*.apk "$outputDir/"
+ ;;
+
+ esac done
+}
+
+# depends on base_app_apk
+function duplicated_names_apks() {
+ local dir=$TEST_PROJECTS_ANDROID
+
+ for arg in "$@"; do case "$arg" in
+
+ '--generate' | '-g')
+ "$dir/gradlew" -p "$dir" \
+ dir0:testModule:assembleAndroidTest \
+ dir1:testModule:assembleAndroidTest \
+ dir2:testModule:assembleAndroidTest \
+ dir3:testModule:assembleAndroidTest
+ ;;
+
+ '--copy' | '-c')
+ local outputDir="$FLANK_FIXTURES_TMP/apk"
+ local testIn="$dir/app/build/outputs/apk/androidTest/**/debug/*.apk"
+
+ mkdir -p "$outputDir"
+ local dir=$(dirname "${BASH_SOURCE[0]-$0}")
+ local outputDir="$FLANK_FIXTURES_TMP/apk/duplicated_names/"
+
+ for index in 0 1 2 3; do
+ moduleName="dir$index"
+ apkDir="$outputDir/$moduleName/"
+ mkdir -p "$apkDir"
+ cp "$dir/$moduleName"/testModule/build/outputs/apk/**/debug/*.apk "$apkDir"
+ done
+ ;;
+
+ esac done
+}
+
+function multi_module_apks() {
+ local dir=$TEST_PROJECTS_ANDROID
+ local outputDir="$FLANK_FIXTURES_TMP/apk/multi-modules/"
+
+ for arg in "$@"; do case "$arg" in
+
+ '--generate' | '-g')
+ "$dir/gradlew" -p "$dir" \
+ :multi-modules:multiapp:assemble \
+ :multi-modules:testModule1:assembleAndroidTest \
+ :multi-modules:testModule2:assembleAndroidTest \
+ :multi-modules:testModule3:assembleAndroidTest \
+ :multi-modules:testModule4:assembleAndroidTest \
+ :multi-modules:testModule5:assembleAndroidTest \
+ :multi-modules:testModule6:assembleAndroidTest \
+ :multi-modules:testModule7:assembleAndroidTest \
+ :multi-modules:testModule8:assembleAndroidTest \
+ :multi-modules:testModule9:assembleAndroidTest \
+ :multi-modules:testModule10:assembleAndroidTest \
+ :multi-modules:testModule11:assembleAndroidTest \
+ :multi-modules:testModule12:assembleAndroidTest \
+ :multi-modules:testModule13:assembleAndroidTest \
+ :multi-modules:testModule14:assembleAndroidTest \
+ :multi-modules:testModule15:assembleAndroidTest \
+ :multi-modules:testModule16:assembleAndroidTest \
+ :multi-modules:testModule17:assembleAndroidTest \
+ :multi-modules:testModule18:assembleAndroidTest \
+ :multi-modules:testModule19:assembleAndroidTest \
+ :multi-modules:testModule20:assembleAndroidTest
+ ;;
+
+ '--copy' | '-c')
+ mkdir -p "$outputDir"
+ find "$dir/multi-modules" -type f -name "*.apk" -exec cp {} "$outputDir" \;
+ ;;
+
+ esac done
+}
+
+echo "Android test projects ops loaded"
diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj
index 86e31df388..468c3051fe 100644
--- a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj
+++ b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/project.pbxproj
@@ -283,18 +283,18 @@
TargetAttributes = {
2CB7314C1C29E54A00CF35C1 = {
CreatedOnToolsVersion = 7.2;
- DevelopmentTeam = H86XEK7ZTM;
+ DevelopmentTeam = AD2V26JBWL;
LastSwiftMigration = 0800;
TestTargetID = 5F5A53781ADE67D500F81DF0;
};
5F5A53781ADE67D500F81DF0 = {
CreatedOnToolsVersion = 6.3;
- DevelopmentTeam = H86XEK7ZTM;
+ DevelopmentTeam = AD2V26JBWL;
LastSwiftMigration = 0800;
};
5FDE05571B0DAA090037B82F = {
CreatedOnToolsVersion = 6.3.2;
- DevelopmentTeam = H86XEK7ZTM;
+ DevelopmentTeam = AD2V26JBWL;
TestTargetID = 5F5A53781ADE67D500F81DF0;
};
};
@@ -485,12 +485,12 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
ENABLE_TESTABILITY = YES;
INFOPLIST_FILE = EarlGreyExampleSwiftTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreySwiftTests;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGreySwiftTests;
PRODUCT_MODULE_NAME = EarlGreyExampleTestsSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
@@ -509,11 +509,11 @@
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
INFOPLIST_FILE = EarlGreyExampleSwiftTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreySwiftTests;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGreySwiftTests;
PRODUCT_MODULE_NAME = EarlGreyExampleTestsSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
@@ -619,12 +619,12 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
INFOPLIST_FILE = "$(SRCROOT)/EarlGreyExample/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGrey3;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGrey;
PRODUCT_MODULE_NAME = EarlGreyExampleSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_INSTALL_OBJC_HEADER = NO;
@@ -642,12 +642,12 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
INFOPLIST_FILE = "$(SRCROOT)/EarlGreyExample/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGrey3;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGrey;
PRODUCT_MODULE_NAME = EarlGreyExampleSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_INSTALL_OBJC_HEADER = NO;
@@ -666,7 +666,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -682,7 +682,7 @@
INFOPLIST_FILE = EarlGreyExample/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreyTests;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGreyTests;
PRODUCT_MODULE_NAME = EarlGreyExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "";
@@ -704,7 +704,7 @@
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = H86XEK7ZTM;
+ DEVELOPMENT_TEAM = AD2V26JBWL;
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
HEADER_SEARCH_PATHS = (
@@ -716,7 +716,7 @@
INFOPLIST_FILE = EarlGreyExample/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = com.google.earlgrey.samples.EarlGreyTests;
+ PRODUCT_BUNDLE_IDENTIFIER = io.gogoapps.earlgrey.samples.EarlGreyTests;
PRODUCT_MODULE_NAME = EarlGreyExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "";
diff --git a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme
index f696d36ce8..2f5163cb89 100644
--- a/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme
+++ b/test_projects/ios/EarlGreyExample/EarlGreyExample.xcodeproj/xcshareddata/xcschemes/EarlGreyExampleSwiftTests.xcscheme
@@ -11,6 +11,13 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "NO">
+
+
+
+
@@ -23,15 +30,6 @@
-
-
-
-
-
-
-
-