diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 79b7921a2..1a00bb6fb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -48,7 +48,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: validate gradle wrapper uses: gradle/wrapper-validation-action@v1 @@ -61,10 +61,11 @@ jobs: npm test - name: Java 15 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: 'zulu' java-version: 15 - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: avd-cache with: path: | diff --git a/.github/workflows/manually.yml b/.github/workflows/manually.yml index 3f7da86be..5b1338f3d 100644 --- a/.github/workflows/manually.yml +++ b/.github/workflows/manually.yml @@ -39,7 +39,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: validate gradle wrapper uses: gradle/wrapper-validation-action@v1 @@ -52,10 +52,11 @@ jobs: npm test - name: Java 15 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: 'zulu' java-version: 15 - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.gradle/caches diff --git a/.gitignore b/.gitignore index 61f8dbe7c..c109d2099 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,13 @@ typings/ # DynamoDB Local files .dynamodb/ + +# Mac +.DS_Store + +# Vscode +.vscode + +# IntelliJ IDEA +.idea +*.iml diff --git a/CHANGELOG.md b/CHANGELOG.md index f9ae475c6..646a708ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## v2.24.0 + +* Add option to specify `heap-size` for the AVD. - [#245](https://github.com/ReactiveCircus/android-emulator-runner/pull/245) @timusus. + ## v2.23.0 * Update build tools to `32.0.0`. - [#212](https://github.com/ReactiveCircus/android-emulator-runner/pull/212) diff --git a/README.md b/README.md index 0864cff06..1ebb922cd 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,13 @@ It is recommended to run this action on a **macOS** VM, e.g. `macos-latest`, `ma A workflow that uses **android-emulator-runner** to run your instrumented tests on **API 29**: -``` +```yml jobs: test: runs-on: macos-latest steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: run tests uses: reactivecircus/android-emulator-runner@v2 @@ -43,7 +43,7 @@ jobs: We can also leverage GitHub Actions's build matrix to test across multiple configurations: -``` +```yml jobs: test: runs-on: macos-latest @@ -53,7 +53,7 @@ jobs: target: [default, google_apis] steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: run tests uses: reactivecircus/android-emulator-runner@v2 @@ -67,13 +67,13 @@ jobs: If you need specific versions of **NDK** and **CMake** installed: -``` +```yml jobs: test: runs-on: macos-latest steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: run tests uses: reactivecircus/android-emulator-runner@v2 @@ -86,11 +86,12 @@ jobs: We can significantly reduce emulator startup time by setting up AVD snapshot caching: -1. add an `actions/cache@v2` step for caching the `avd` -2. add a `reactivecircus/android-emulator-runner@v2` step to generate a clean snapshot - specify `emulator-options` without `no-snapshot` -3. add another `reactivecircus/android-emulator-runner@v2` step to run your tests using existing AVD / snapshot - specify `emulator-options` with `no-snapshot-save` +1. add a `gradle/gradle-build-action@v2` step for caching Gradle, more details see [#229](https://github.com/ReactiveCircus/android-emulator-runner/issues/229) +2. add an `actions/cache@v3` step for caching the `avd` +3. add a `reactivecircus/android-emulator-runner@v2` step to generate a clean snapshot - specify `emulator-options` without `no-snapshot` +4. add another `reactivecircus/android-emulator-runner@v2` step to run your tests using existing AVD / snapshot - specify `emulator-options` with `no-snapshot-save` -``` +```yml jobs: test: runs-on: macos-latest @@ -99,18 +100,13 @@ jobs: api-level: [21, 23, 29] steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Gradle cache - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}-${{ hashFiles('**/buildSrc/**/*.kt') }} - + uses: gradle/gradle-build-action@v2 + - name: AVD cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: avd-cache with: path: | @@ -148,6 +144,7 @@ jobs: | `profile` | Optional | N/A | Hardware profile used for creating the AVD - e.g. `Nexus 6`. For a list of all profiles available, run `avdmanager list device`. | | `cores` | Optional | 2 | Number of cores to use for the emulator (`hw.cpu.ncore` in config.ini). | | `ram-size` | Optional | N/A | Size of RAM to use for this AVD, in KB or MB, denoted with K or M. - e.g. `2048M` | +| `heap-size` | Optional | N/A | Heap size to use for this AVD, in KB or MB, denoted with K or M. - e.g. `512M` | | `sdcard-path-or-size` | Optional | N/A | Path to the SD card image for this AVD or the size of a new SD card image to create for this AVD, in KB or MB, denoted with K or M. - e.g. `path/to/sdcard`, or `1000M`. | | `disk-size` | Optional | N/A | Disk size to use for this AVD. Either in bytes or KB, MB or GB, when denoted with K, M or G. - e.g. `2048M` | | `avd-name` | Optional | `test` | Custom AVD name used for creating the Android Virtual Device. | diff --git a/action.yml b/action.yml index e8b418f65..12ae7a15d 100644 --- a/action.yml +++ b/action.yml @@ -21,6 +21,8 @@ inputs: default: 2 ram-size: description: 'size of RAM to use for this AVD, in KB or MB, denoted with K or M. - e.g. `2048M`' + heap-size: + description: 'size of heap to use for this AVD in MB. - e.g. `512M`' sdcard-path-or-size: description: 'path to the SD card image for this AVD or the size of a new SD card image to create for this AVD, in KB or MB, denoted with K or M. - e.g. `path/to/sdcard`, or `1000M`' disk-size: diff --git a/lib/emulator-manager.js b/lib/emulator-manager.js index 564c812d7..e4be85ea6 100644 --- a/lib/emulator-manager.js +++ b/lib/emulator-manager.js @@ -35,7 +35,7 @@ const EMULATOR_BOOT_TIMEOUT_SECONDS = 600; /** * Creates and launches a new AVD instance with the specified configurations. */ -function launchEmulator(apiLevel, target, arch, profile, cores, ramSize, sdcardPathOrSize, diskSize, avdName, forceAvdCreation, emulatorOptions, disableAnimations, disableSpellChecker, disableLinuxHardwareAcceleration, enableHardwareKeyboard) { +function launchEmulator(apiLevel, target, arch, profile, cores, ramSize, heapSize, sdcardPathOrSize, diskSize, avdName, forceAvdCreation, emulatorOptions, disableAnimations, disableSpellChecker, disableLinuxHardwareAcceleration, enableHardwareKeyboard) { return __awaiter(this, void 0, void 0, function* () { try { console.log(`::group::Launch Emulator`); @@ -53,6 +53,9 @@ function launchEmulator(apiLevel, target, arch, profile, cores, ramSize, sdcardP if (ramSize) { yield exec.exec(`sh -c \\"printf 'hw.ramSize=${ramSize}\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); } + if (heapSize) { + yield exec.exec(`sh -c \\"printf 'hw.heapSize=${heapSize}\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); + } if (enableHardwareKeyboard) { yield exec.exec(`sh -c \\"printf 'hw.keyboard=yes\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); } diff --git a/lib/main.js b/lib/main.js index 59e6aca0b..1ac0a0daa 100644 --- a/lib/main.js +++ b/lib/main.js @@ -71,6 +71,9 @@ function run() { // RAM to use for AVD const ramSize = core.getInput('ram-size'); console.log(`RAM size: ${ramSize}`); + // Heap size to use for AVD + const heapSize = core.getInput('heap-size'); + console.log(`Heap size: ${heapSize}`); // SD card path or size used for creating the AVD const sdcardPathOrSize = core.getInput('sdcard-path-or-size'); console.log(`SD card path or size: ${sdcardPathOrSize}`); @@ -149,7 +152,7 @@ function run() { // install SDK yield sdk_installer_1.installAndroidSdk(apiLevel, target, arch, channelId, emulatorBuild, ndkVersion, cmakeVersion); // launch an emulator - yield emulator_manager_1.launchEmulator(apiLevel, target, arch, profile, cores, ramSize, sdcardPathOrSize, diskSize, avdName, forceAvdCreation, emulatorOptions, disableAnimations, disableSpellchecker, disableLinuxHardwareAcceleration, enableHardwareKeyboard); + yield emulator_manager_1.launchEmulator(apiLevel, target, arch, profile, cores, ramSize, heapSize, sdcardPathOrSize, diskSize, avdName, forceAvdCreation, emulatorOptions, disableAnimations, disableSpellchecker, disableLinuxHardwareAcceleration, enableHardwareKeyboard); // execute the custom script try { // move to custom working directory if set diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 5c16bc0fb..30e856167 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -74,9 +74,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/semver": { "version": "6.3.0", diff --git a/node_modules/minimist/index.js b/node_modules/minimist/index.js index d2afe5e4d..d9c3eb79f 100644 --- a/node_modules/minimist/index.js +++ b/node_modules/minimist/index.js @@ -70,7 +70,7 @@ module.exports = function (args, opts) { var o = obj; for (var i = 0; i < keys.length-1; i++) { var key = keys[i]; - if (key === '__proto__') return; + if (isConstructorOrProto(o, key)) return; if (o[key] === undefined) o[key] = {}; if (o[key] === Object.prototype || o[key] === Number.prototype || o[key] === String.prototype) o[key] = {}; @@ -79,7 +79,7 @@ module.exports = function (args, opts) { } var key = keys[keys.length - 1]; - if (key === '__proto__') return; + if (isConstructorOrProto(o, key)) return; if (o === Object.prototype || o === Number.prototype || o === String.prototype) o = {}; if (o === Array.prototype) o = []; @@ -243,3 +243,7 @@ function isNumber (x) { return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); } + +function isConstructorOrProto (obj, key) { + return key === 'constructor' && typeof obj[key] === 'function' || key === '__proto__'; +} diff --git a/node_modules/minimist/package.json b/node_modules/minimist/package.json index 804dcec2d..c22585335 100644 --- a/node_modules/minimist/package.json +++ b/node_modules/minimist/package.json @@ -1,67 +1,16 @@ { - "_args": [ - [ - "minimist@1.2.5", - "/Users/Yang/Desktop/Projects/android-emulator-runner" - ] - ], - "_from": "minimist@1.2.5", - "_id": "minimist@1.2.5", - "_inBundle": false, - "_integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "_location": "/minimist", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "minimist@1.2.5", - "name": "minimist", - "escapedName": "minimist", - "rawSpec": "1.2.5", - "saveSpec": null, - "fetchSpec": "1.2.5" - }, - "_requiredBy": [ - "/", - "/@babel/core/json5", - "/@cnakazawa/watch", - "/json5", - "/sane" - ], - "_resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "_spec": "1.2.5", - "_where": "/Users/Yang/Desktop/Projects/android-emulator-runner", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "bugs": { - "url": "https://github.com/substack/minimist/issues" - }, + "name": "minimist", + "version": "1.2.6", "description": "parse argument options", + "main": "index.js", "devDependencies": { "covert": "^1.0.0", "tap": "~0.4.0", "tape": "^3.5.0" }, - "homepage": "https://github.com/substack/minimist", - "keywords": [ - "argv", - "getopt", - "parser", - "optimist" - ], - "license": "MIT", - "main": "index.js", - "name": "minimist", - "repository": { - "type": "git", - "url": "git://github.com/substack/minimist.git" - }, "scripts": { - "coverage": "covert test/*.js", - "test": "tap test/*.js" + "test": "tap test/*.js", + "coverage": "covert test/*.js" }, "testling": { "files": "test/*.js", @@ -76,5 +25,21 @@ "opera/12" ] }, - "version": "1.2.5" + "repository": { + "type": "git", + "url": "git://github.com/substack/minimist.git" + }, + "homepage": "https://github.com/substack/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT" } diff --git a/node_modules/minimist/readme.markdown b/node_modules/minimist/readme.markdown index 5fd97ab11..859d1ab45 100644 --- a/node_modules/minimist/readme.markdown +++ b/node_modules/minimist/readme.markdown @@ -34,7 +34,10 @@ $ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz Previous versions had a prototype pollution bug that could cause privilege escalation in some circumstances when handling untrusted user input. -Please use version 1.2.3 or later: https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 +Please use version 1.2.6 or later: + +* https://security.snyk.io/vuln/SNYK-JS-MINIMIST-2429795 (version <=1.2.5) +* https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 (version <=1.2.3) # methods diff --git a/node_modules/minimist/test/proto.js b/node_modules/minimist/test/proto.js index 8649107ec..4ac62df26 100644 --- a/node_modules/minimist/test/proto.js +++ b/node_modules/minimist/test/proto.js @@ -42,3 +42,19 @@ test('proto pollution (constructor)', function (t) { t.equal(argv.y, undefined); t.end(); }); + +test('proto pollution (constructor function)', function (t) { + var argv = parse(['--_.concat.constructor.prototype.y', '123']); + function fnToBeTested() {} + t.equal(fnToBeTested.y, undefined); + t.equal(argv.y, undefined); + t.end(); +}); + +// powered by snyk - https://github.com/backstage/backstage/issues/10343 +test('proto pollution (constructor function) snyk', function (t) { + var argv = parse('--_.constructor.constructor.prototype.foo bar'.split(' ')); + t.equal((function(){}).foo, undefined); + t.equal(argv.y, undefined); + t.end(); +}) diff --git a/package-lock.json b/package-lock.json index 7018fc8d1..5ea042408 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@actions/core": "^1.6.0", "@actions/exec": "^1.1.0", "@actions/tool-cache": "^1.7.1", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "set-value": "^4.1.0" }, "devDependencies": { @@ -8508,9 +8508,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -17432,9 +17432,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mixin-deep": { "version": "1.3.2", diff --git a/package.json b/package.json index 50471ed8f..26ef20f1e 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@actions/core": "^1.6.0", "@actions/exec": "^1.1.0", "@actions/tool-cache": "^1.7.1", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "set-value": "^4.1.0" }, "devDependencies": { diff --git a/src/emulator-manager.ts b/src/emulator-manager.ts index 6ee896141..ba7490d6e 100644 --- a/src/emulator-manager.ts +++ b/src/emulator-manager.ts @@ -13,6 +13,7 @@ export async function launchEmulator( profile: string, cores: string, ramSize: string, + heapSize: string, sdcardPathOrSize: string, diskSize: string, avdName: string, @@ -44,6 +45,10 @@ export async function launchEmulator( await exec.exec(`sh -c \\"printf 'hw.ramSize=${ramSize}\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); } + if (heapSize) { + await exec.exec(`sh -c \\"printf 'hw.heapSize=${heapSize}\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); + } + if (enableHardwareKeyboard) { await exec.exec(`sh -c \\"printf 'hw.keyboard=yes\n' >> ${process.env.ANDROID_AVD_HOME}/"${avdName}".avd"/config.ini`); } diff --git a/src/main.ts b/src/main.ts index 325d1f14e..13fd80281 100644 --- a/src/main.ts +++ b/src/main.ts @@ -61,6 +61,10 @@ async function run() { const ramSize = core.getInput('ram-size'); console.log(`RAM size: ${ramSize}`); + // Heap size to use for AVD + const heapSize = core.getInput('heap-size'); + console.log(`Heap size: ${heapSize}`); + // SD card path or size used for creating the AVD const sdcardPathOrSize = core.getInput('sdcard-path-or-size'); console.log(`SD card path or size: ${sdcardPathOrSize}`); @@ -162,6 +166,7 @@ async function run() { profile, cores, ramSize, + heapSize, sdcardPathOrSize, diskSize, avdName, diff --git a/test-fixture/build.gradle b/test-fixture/build.gradle index f288a804a..8422a812b 100644 --- a/test-fixture/build.gradle +++ b/test-fixture/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.30' + ext.kotlin_version = '1.6.10' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/test-fixture/gradle/wrapper/gradle-wrapper.properties b/test-fixture/gradle/wrapper/gradle-wrapper.properties index 991c63eac..ab4bea5b5 100644 --- a/test-fixture/gradle/wrapper/gradle-wrapper.properties +++ b/test-fixture/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip