diff --git a/.circleci/config.yml b/.circleci/config.yml index 0ce7f8c80..5cc9882fd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,502 +1,71 @@ ---- -aliases: -# ------------------------- -# CACHE -# ------------------------- -- &restore-yarn-cache - key: v1-yarn-cache-{{ arch }}-{{ checksum "~/.tmp/checksumfiles/package.json" }}-{{ checksum "yarn.lock" }} +version: 2.1 -- &save-yarn-cache - paths: - - ~/.cache/yarn - - ~/Library/Detox - key: v1-yarn-cache-{{ arch }}-{{ checksum "~/.tmp/checksumfiles/package.json" }}-{{ checksum "yarn.lock" }} +orbs: + rn: react-native-community/react-native@dev:0.1.0-rc10 -# ------------------------- -# iOS -# ------------------------- - -- &save-ios-build-cache - paths: - - ~/react-native-cameraroll/example/ios/build/Build - key: v1-ios-build-cache-{{ arch }}-{{ checksum "~/.tmp/checksumfiles/package.json" }} - when: always - -- &restore-ios-build-cache - key: v1-ios-build-cache-{{ arch }}-{{ checksum "~/.tmp/checksumfiles/package.json" }} - -# ------------------------- -# Android -# ------------------------- -- &save-gradle-home-caches - name: Saving Gradle home cache - paths: - - ~/.gradle/caches/ - key: v1-gradle-home-cache-{{ checksum "~/.tmp/checksumfiles/build.gradle" }}-{{ checksum "~/.tmp/checksumfiles/settings.gradle" }} - -- &restore-gradle-home-caches - keys: - - v1-gradle-home-cache-{{ checksum "~/.tmp/checksumfiles/build.gradle" }}-{{ checksum "~/.tmp/checksumfiles/settings.gradle" }} - - v1-gradle-home-cache - -- &save-gradle-wrapper-cache - name: Saving Gradle wrapper cache - paths: - - ~/.gradle/wrapper/ - key: v1-gradle-wrapper-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }} - -- &restore-gradle-wrapper-cache - keys: - - v1-gradle-wrapper-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }} - -- &collect-gradle-build-caches - name: Collecting Gradle Build caches for saving - command: | - mkdir -p ~/gradle-build-caches - [ -d ~/.gradle/caches ] && - [ -n "$(ls -Ad ~/.gradle/caches/build-cache-* 2>/dev/null)" ] && - rm -rf ~/gradle-build-caches/* && - mv ~/.gradle/caches/build-cache-* ~/gradle-build-caches || true - when: always - -- &save-gradle-debug-build-cache - name: Saving Gradle Build caches - paths: - - ~/gradle-build-caches - key: v1-gradle-debug-build-cache-{{ .Revision }} - when: always - -- &save-gradle-release-build-cache - name: Saving Gradle Build caches - paths: - - ~/gradle-build-caches - key: v1-gradle-release-build-cache-{{ .Revision }} - when: always - -- &disperse-gradle-build-caches - name: Dispersing Gradle Build caches for restoring - command: | - [ -d ~/gradle-build-caches ] && - [ -n "$(ls -A ~/gradle-build-caches)" ] && - rm -rf ~/.gradle/caches/build-cache-* && - mkdir -p ~/.gradle/caches/ && - mv ~/gradle-build-caches/* ~/.gradle/caches/ || true - -- &restore-gradle-debug-build-cache - name: Restoring Gradle Build caches - keys: - - v1-gradle-debug-build-cache-{{ .Revision }} - - v1-gradle-debug-build-cache - -- &restore-gradle-release-build-cache - name: Restoring Gradle Build caches - keys: - - v1-gradle-release-build-cache-{{ .Revision }} - - v1-gradle-release-build-cache - - -# ------------------------- -# DETOX -# ------------------------- - -- &save-brew-cache - paths: - - /usr/local/Homebrew - - ~/Library/Caches/Homebrew - key: v1-brew-cache-{{ arch }} - -- &restore-brew-cache - keys: - - v1-brew-cache-{{ arch }} - - -# ------------------------- -# SHARED RUN COMMANDS -# ------------------------- - -- &configure-ios-detox-environment - name: Configure Detox Environment - command: | - HOMEBREW_NO_AUTO_UPDATE=1 brew install node@8 >/dev/null - HOMEBREW_NO_AUTO_UPDATE=1 brew tap wix/brew >/dev/null - HOMEBREW_NO_AUTO_UPDATE=1 brew install applesimutils >/dev/null - touch .watchmanconfig - node -v - -- &make-cache-check-files - name: Make Cache Checksum Files - command: | - mkdir -p ~/.tmp - mkdir -p ~/.tmp/checksumfiles - find . -type f -name 'build.gradle' -not -path "*node_modules*" -exec cat {} + >> ~/.tmp/checksumfiles/build.gradle - find . -type f -name 'settings.gradle' -not -path "*node_modules*" -exec cat {} + >> ~/.tmp/checksumfiles/settings.gradle - find . -type f -name 'package.json' -not -path "*node_modules*" -exec cat {} + >> ~/.tmp/checksumfiles/package.json - -# ------------------------- -# INSTALLATION -# ------------------------- -- &yarn - name: Yarn Install - command: | - yarn install --non-interactive --cache-folder ~/.cache/yarn - -# ------------------------- -# ANALYSE -# ------------------------- - -# eslint -- &eslint - name: Lint JS Code (ESLint) - command: yarn run validate:eslint - -# typescript -- &validate-typescript - name: Validate TypeScript Declarations - command: yarn run validate:typescript - -# flow -- &validate-flow - name: Validate Flow Declarations - command: yarn run validate:flow - -# Jest -- &jest-tests - name: Run Jest Tests - command: yarn run test:jest - -# JS Bundle - iOS -- &js-bundle-ios - name: Build iOS JavaScript Bundle - command: yarn run test:detox:ios:bundle:release - -# JS Bundle - iOS -- &js-bundle-android - name: Build Android JavaScript Bundle - command: yarn run test:detox:android:bundle:release - -# ------------------------- -# DEFAULTS -# ------------------------- - -defaults: &defaults - working_directory: ~/react-native-cameraroll - environment: - - GIT_COMMIT_DESC: git log --format=oneline -n 1 $CIRCLE_SHA1 - -# JAVASCRIPT -js_defaults: &js_defaults - <<: *defaults - docker: - - image: circleci/node:8 - environment: - - PATH: '/opt/yarn/yarn-v1.5.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' - -# ANDROID -android_defaults: &android_defaults - <<: *defaults - docker: - - image: reactnativecommunity/react-native-android - resource_class: 'medium' - working_directory: ~/react-native-cameraroll - environment: - - _JAVA_OPTIONS: '-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx2048m' - - GRADLE_OPTS: '-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-XX:+HeapDumpOnOutOfMemoryError -Xmx2048m"' - - BUILD_THREADS: 2 - - -# IOS -macos_defaults: &macos_defaults - <<: *defaults - resource_class: 'medium' - macos: - xcode: '10.1.0' - -# ------------------------- -# JOBS -# ------------------------- -version: 2 jobs: - # Set up a Node environment for downstream jobs - checkout-code: - <<: *js_defaults + checkout_code: + executor: rn/linux_js steps: - - checkout - - persist_to_workspace: - root: . - paths: . - - analyse: - <<: *js_defaults + - checkout + - persist_to_workspace: + root: . + paths: . + analyze: + executor: rn/linux_js steps: - - attach_workspace: - at: ~/react-native-cameraroll - - run: *make-cache-check-files + - attach_workspace: + at: . + - rn/yarn_install + - run: + name: Eslint + command: yarn run validate:eslint + - run: + name: Flow + command: yarn run validate:flow + - run: + name: TypeScript + command: yarn run validate:typescript + - run: + name: Jest + command: yarn run test:jest + - run: + name: Android JavaScript Bundle + command: yarn run test:detox:android:bundle:release + - run: + name: iOS JavaScript Bundle + command: yarn run test:detox:ios:bundle:release - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - run: *eslint - - run: *validate-flow - - run: *validate-typescript - - run: *jest-tests - - run: *js-bundle-ios - - run: *js-bundle-android - - persist_to_workspace: - root: ~/react-native-cameraroll - paths: - - .tmp - - # ------------------------- - # ANDROID - BUILD - # ------------------------- - - android-build-debug: - <<: *android_defaults - steps: - - attach_workspace: - at: ~/react-native-cameraroll - - run: *make-cache-check-files - - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - - restore-cache: *restore-gradle-wrapper-cache - - restore_cache: *restore-gradle-home-caches - - - restore-cache: *restore-gradle-debug-build-cache - - run: *disperse-gradle-build-caches - - # download and cache dependencies and Gradle - - run: - name: Downloading Gradle Dependencies - command: cd example/android && ./gradlew --max-workers 2 downloadDependencies - - - save-cache: *save-gradle-wrapper-cache - - save-cache: *save-gradle-home-caches - - - run: - name: Build Android Debug APK - command: cd example/android && chmod +x gradlew && ./gradlew --build-cache --max-workers 2 --continue assembleDebug assembleAndroidTest -DtestBuildType=debug --stacktrace - - - run: *collect-gradle-build-caches - - save-cache: *save-gradle-debug-build-cache - - android-build-release: - <<: *android_defaults - steps: - - attach_workspace: - at: ~/react-native-cameraroll - - run: *make-cache-check-files - - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - - restore-cache: *restore-gradle-wrapper-cache - - restore_cache: *restore-gradle-home-caches - - - restore-cache: *restore-gradle-release-build-cache - - run: *disperse-gradle-build-caches - - # download and cache dependencies and Gradle - - run: - name: Downloading Dependencies - command: cd example/android && ./gradlew --max-workers 2 downloadDependencies - - - save-cache: *save-gradle-wrapper-cache - - save-cache: *save-gradle-home-caches - - - run: - command: cp .tmp/android-bundle.js example/android/app/src/main/assets/index.android.bundle - - run: - name: Build Android Release APK - command: cd example/android && chmod +x gradlew && ./gradlew --build-cache --max-workers 2 --continue assembleRelease assembleAndroidTest -DtestBuildType=release - - - run: *collect-gradle-build-caches - - save-cache: *save-gradle-release-build-cache - - - persist_to_workspace: - root: ~/react-native-cameraroll - paths: - - example/android/app/build/outputs/apk - - # ------------------------- - # ANDROID - TEST E2E - # ------------------------- - - android-test-e2e: - <<: *macos_defaults - steps: - - attach_workspace: - at: ~/react-native-cameraroll - - run: *make-cache-check-files - - - run: - name: Configure Environment Variables - command: | - echo 'export PATH="$PATH:/usr/local/opt/node@8/bin:~/.yarn/bin:~/react-native-cameraroll/node_modules/.bin:~/react-native-cameraroll/example/node_modules/.bin"' >> $BASH_ENV - echo 'export ANDROID_HOME="/usr/local/share/android-sdk"' >> $BASH_ENV - echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> $BASH_ENV - echo 'export PATH="$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH"' >> $BASH_ENV - echo 'export QEMU_AUDIO_DRV=none' >> $BASH_ENV - echo 'export JAVA_HOME=/Library/Java/Home' >> $BASH_ENV - source $BASH_ENV - - - run: - name: Install Android SDK Tools - command: | - HOMEBREW_NO_AUTO_UPDATE=1 brew tap homebrew/cask >/dev/null - HOMEBREW_NO_AUTO_UPDATE=1 brew cask install android-sdk >/dev/null - HOMEBREW_NO_AUTO_UPDATE=1 brew cask install intel-haxm >/dev/null - HOMEBREW_NO_AUTO_UPDATE=1 brew install node@8 >/dev/null >/dev/null - - # Yarn install - to ensure detox post install builds - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - - run: - name: Install Android Emulator - shell: /bin/bash -e - command: | - yes | sdkmanager "platform-tools" "tools" >/dev/null - yes | sdkmanager "platforms;android-28" "system-images;android-27;google_apis;x86" "system-images;android-28;google_apis;x86" >/dev/null - yes | sdkmanager "emulator" --channel=3 >/dev/null - yes | sdkmanager "build-tools;28.0.3" >/dev/null - yes | sdkmanager --licenses >/dev/null - yes | sdkmanager --list - - # to force ssh key generation for emulators - - run: - name: ADB Start Stop - command: | - adb start-server - adb devices - adb kill-server - ls -la ~/.android - - - run: - name: Create Android Emulator (API 28) - command: avdmanager create avd --force -n TestingAVD -k "system-images;android-28;google_apis;x86" -g google_apis -d "Nexus 4" - - - run: - name: Start Android Emulator (API 28) in background - command: | - /usr/local/share/android-sdk/emulator/emulator @TestingAVD -version - /usr/local/share/android-sdk/emulator/emulator @TestingAVD -skin 470x860 -cores 1 -gpu auto -accel on -memory 1024 -no-audio -no-snapshot -no-boot-anim -no-window -logcat *:W | grep -i 'ReactNative\|com.reactnativecommunity\|RNCNetInfo' - background: true - - - run: - name: Wait for AVD to be ready (API 28) - no_output_timeout: "5m" - command: sh ./.circleci/scripts/wait-for-avd.sh - - - run: - name: Run Tests (API 28) - command: yarn run test:detox:android:test:release - - - store_artifacts: - path: ~/detox-artifacts - - # ------------------------- - # iOS - TEST E2E - # ------------------------- - - ios-test-e2e: - <<: *macos_defaults - steps: - - attach_workspace: - at: ~/react-native-cameraroll - - run: *make-cache-check-files - - - run: - name: Start iPhone X simulator (background) - background: true - command: xcrun simctl boot "iPhone X" || true - - run: - name: Configure Environment Variables - command: | - echo 'export PATH="$PATH:/usr/local/opt/node@8/bin:~/.yarn/bin:~/react-native-cameraroll/node_modules/.bin:~/react-native-cameraroll/example/node_modules/.bin"' >> $BASH_ENV - source $BASH_ENV - - # Brew - - restore-cache: *restore-brew-cache - - run: *configure-ios-detox-environment - - save-cache: *save-brew-cache - - # Yarn install - to ensure detox post install builds - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - # XCode Build - - restore-cache: *restore-ios-build-cache - - run: - name: Build iOS Testing App - command: yarn run test:detox:ios:build:release - - save-cache: *save-ios-build-cache - - - run: mkdir ~/detox-artifacts - - # Now Test \o/ - - run: - name: Run Detox Tests - command: yarn run test:detox:ios:test:release - - - store_artifacts: - path: ~/detox-artifacts - - # ------------------------- - # Publish - # ------------------------- - - publish: - <<: *js_defaults - steps: - - attach_workspace: - at: ~/react-native-cameraroll - - restore-cache: *restore-yarn-cache - - run: *yarn - - save-cache: *save-yarn-cache - - run: - name: Publish to NPM - command: yarn ci:publish - -# ------------------------- -# WORK FLOWS -# ------------------------- workflows: - version: 2 - - testing: + test: jobs: - - checkout-code - - analyse: - requires: - - checkout-code - - - android-build-debug: - requires: - - analyse - - - android-build-release: - requires: - - analyse - - - android-test-e2e: - requires: - - android-build-release - - - ios-test-e2e: - requires: - - analyse - - - publish: - requires: - - analyse - - android-test-e2e - - ios-test-e2e - filters: - branches: - only: master + - checkout_code + - analyze: + requires: + - checkout_code + - rn/android_build: + name: android_debug_build + project_path: "example/android" + build_type: debug + requires: + - analyze + - rn/android_build: + name: android_release_build + project_path: "example/android" + build_type: release + requires: + - analyze + - rn/android_test: + logcat_grep: "com.camerarollexample" + detox_configuration: "android.emu.release" + requires: + - android_release_build + - rn/ios_build_and_test: + project_path: "example/ios/CameraRollExample.xcodeproj" + derived_data_path: "example/ios/build" + device: "iPhone X" + build_configuration: "Release" + scheme: "CameraRollExample" + detox_configuration: "ios.sim.release" + requires: + - analyze diff --git a/.circleci/scripts/wait-for-avd.sh b/.circleci/scripts/wait-for-avd.sh deleted file mode 100755 index fa8153b00..000000000 --- a/.circleci/scripts/wait-for-avd.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -boot="" - -echo "Waiting for AVD to finish booting" -export PATH=$(dirname $(dirname $(command -v android)))/platform-tools:$PATH - -until [[ "$boot" =~ "1" ]]; do - sleep 5 - boot=$(adb -e shell getprop sys.boot_completed 2>&1) -done - -# extra time to let the OS settle -sleep 15 - -adb shell settings put global window_animation_scale 0 -adb shell settings put global transition_animation_scale 0 -adb shell settings put global animator_duration_scale 0 - -echo "Android Virtual Device is now ready." diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 3493ce12b..08a6ea3d7 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -99,7 +99,7 @@ android { buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { - applicationId "com.reactnativecommunity.cameraroll.example" + applicationId "com.camerarollexample" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/example/android/app/src/androidTest/java/com/camerarollexample/DetoxTest.java b/example/android/app/src/androidTest/java/com/camerarollexample/DetoxTest.java new file mode 100644 index 000000000..01b32c2c4 --- /dev/null +++ b/example/android/app/src/androidTest/java/com/camerarollexample/DetoxTest.java @@ -0,0 +1,24 @@ +package com.camerarollexample; + +import android.support.test.filters.LargeTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import com.wix.detox.Detox; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class DetoxTest { + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); + + @Test + public void runDetoxTests() throws InterruptedException { + Detox.runTests(mActivityRule); + } +} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index f5e9e0e0b..d3ae0cd8c 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ + + android:theme="@style/AppTheme" + android:usesCleartextTraffic="true"> getPackages() { return Arrays.asList( - new MainReactPackage() + new MainReactPackage(), + new CameraRollPackage() ); } diff --git a/example/e2e/init.js b/example/e2e/init.js index d4bea54b4..2308c74cf 100644 --- a/example/e2e/init.js +++ b/example/e2e/init.js @@ -16,7 +16,7 @@ jest.setTimeout(300000); jasmine.getEnv().addReporter(adapter); beforeAll(async () => { - await detox.init(config, {initGlobals: false, launchApp: false}); + await detox.init(config, {launchApp: false}); }); beforeEach(async () => { diff --git a/react-native-cameraroll.podspec b/react-native-cameraroll.podspec new file mode 100644 index 000000000..7f771e004 --- /dev/null +++ b/react-native-cameraroll.podspec @@ -0,0 +1,19 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = "react-native-cameraroll" + s.version = package['version'] + s.summary = package['description'] + s.license = package['license'] + + s.authors = package['author'] + s.homepage = package['homepage'] + s.platform = :ios, "9.0" + + s.source = { :git => "https://github.com/react-native-community/react-native-cameraroll.git", :tag => "#{s.version}" } + s.source_files = "ios/**/*.{h,m}" + + s.dependency 'React' +end