From 2873e76e116f33749359378ff86d9c2c9c05026a Mon Sep 17 00:00:00 2001 From: Simon Jarbrant Date: Wed, 11 Jan 2023 16:57:37 +0100 Subject: [PATCH] Fix issue where only major OS version is supplied --- index.test.js | 50 +++++++++++++ package-lock.json | 184 +++++++++++++++++++++++++++++----------------- package.json | 3 +- simctl.js | 14 +--- simulator.js | 24 ++++++ 5 files changed, 193 insertions(+), 82 deletions(-) diff --git a/index.test.js b/index.test.js index 6582392..e49316a 100644 --- a/index.test.js +++ b/index.test.js @@ -1,5 +1,7 @@ const simctl = require('./simctl'); const Destination = require('./destination'); +const Runtime = require('./runtime'); +const Simulator = require('./simulator'); const process = require('process'); const cp = require('child_process'); const path = require('path'); @@ -32,3 +34,51 @@ test('specifier with full platform matches runtime and version', () => { expect(destination.matchesRuntime('com.apple.CoreSimulator.SimRuntime.iOS-12-2')).toEqual(false); expect(destination.matchesRuntime('com.apple.CoreSimulator.SimRuntime.iOS-13-4')).toEqual(true); }); + +test('simulator matches name only', () => { + const runtime = new Runtime("com.apple.CoreSimulator.SimRuntime.iOS-16-0"); + const simulator = new Simulator({ + udid: "82B24D01-FFB0-4394-9FEE-8AE4D15011D0", + isAvailable: true, + state: "Shutdown", + name: "iPhone 12" + }, runtime); + + expect(simulator.matchesInputs("", "iPhone 12", "")).toEqual(true); +}); + +test('simulator matches full action input set', () => { + const runtime = new Runtime("com.apple.CoreSimulator.SimRuntime.iOS-16-0"); + const simulator = new Simulator({ + udid: "82B24D01-FFB0-4394-9FEE-8AE4D15011D0", + isAvailable: true, + state: "Shutdown", + name: "iPhone 12" + }, runtime); + + expect(simulator.matchesInputs("iOS", "iPhone 12", "16.0")).toEqual(true); +}); + +test('simulator matches full action input set without minor OS version', () => { + const runtime = new Runtime("com.apple.CoreSimulator.SimRuntime.iOS-16-0"); + const simulator = new Simulator({ + udid: "82B24D01-FFB0-4394-9FEE-8AE4D15011D0", + isAvailable: true, + state: "Shutdown", + name: "iPhone 12" + }, runtime); + + expect(simulator.matchesInputs("iOS", "iPhone 12", "16")).toEqual(true); +}); + +test('simulator doesn\'t match full action input set with differing OS version', () => { + const runtime = new Runtime("com.apple.CoreSimulator.SimRuntime.iOS-16-0"); + const simulator = new Simulator({ + udid: "82B24D01-FFB0-4394-9FEE-8AE4D15011D0", + isAvailable: true, + state: "Shutdown", + name: "iPhone 12" + }, runtime); + + expect(simulator.matchesInputs("iOS", "iPhone 12", "16.2")).toEqual(false); +}); diff --git a/package-lock.json b/package-lock.json index d8c6c2b..d634a13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "MIT", "dependencies": { "@actions/core": "^1.10.0", - "@actions/exec": "^1.1.1" + "@actions/exec": "^1.1.1", + "semver": "^7.3.8" }, "devDependencies": { "@vercel/ncc": "^0.31.1", @@ -112,6 +113,15 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", @@ -159,6 +169,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -2772,6 +2791,15 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -3333,39 +3361,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -3663,6 +3658,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -4257,14 +4261,35 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5022,6 +5047,14 @@ "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/generator": { @@ -5059,6 +5092,14 @@ "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/helper-environment-visitor": { @@ -7056,6 +7097,14 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -7494,32 +7543,6 @@ "natural-compare": "^1.4.0", "pretty-format": "^27.5.1", "semver": "^7.3.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "jest-util": { @@ -7746,6 +7769,14 @@ "dev": true, "requires": { "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "makeerror": { @@ -8176,10 +8207,27 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } }, "shebang-command": { "version": "2.0.0", diff --git a/package.json b/package.json index 80bb7f9..bbd7e97 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "homepage": "https://github.com/actions/javascript-action#readme", "dependencies": { "@actions/core": "^1.10.0", - "@actions/exec": "^1.1.1" + "@actions/exec": "^1.1.1", + "semver": "^7.3.8" }, "devDependencies": { "@vercel/ncc": "^0.31.1", diff --git a/simctl.js b/simctl.js index fc1a3f5..112577f 100644 --- a/simctl.js +++ b/simctl.js @@ -41,19 +41,7 @@ exports.listSimulators = async() => { exports.findMatchingSimulator = async(platform, name, os) => { const simulators = await exports.listSimulators(); const matchingSimulators = simulators.filter(simulator => { - if (simulator.name != name) { - return false; - } - - if (platform.length > 0 && simulator.runtime.platform != platform) { - return false; - } - - if (os.length > 0 && simulator.runtime.os != os) { - return false; - } - - return true; + return simulator.matchesInputs(platform, name, os); }) .sort((a, b) => { if (a.runtime.os > b.runtime.os) { diff --git a/simulator.js b/simulator.js index 33f9d5f..0f3fec6 100644 --- a/simulator.js +++ b/simulator.js @@ -1,3 +1,5 @@ +const semver = require('semver'); + class Simulator { constructor(rawSimulator, runtime) { this.udid = rawSimulator.udid; @@ -26,6 +28,28 @@ class Simulator { return parts.join(','); } + + matchesInputs(platform, name, os) { + if (this.name != name) { + return false; + } + + if (platform.length > 0 && this.runtime.platform != platform) { + return false; + } + + const osSemver = semver.coerce(os); + + if (osSemver != undefined) { + const runtimeSemver = semver.coerce(this.runtime.os); + + if (osSemver.compare(runtimeSemver) != 0) { + return false; + } + } + + return true; + } } module.exports = Simulator