This commit is contained in:
Isaac A. Murchie 2018-10-03 09:39:25 -04:00 коммит произвёл GitHub
Родитель c63919052e
Коммит 7f3f136557
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
19 изменённых файлов: 89 добавлений и 119 удалений

Просмотреть файл

@ -1,23 +0,0 @@
assets/
submodules/
test/
coverage/
commands-yml/
docs/
sample-code/
.vscode/
_vimrc_local.vim
*.swp
*.swo
*~
.*~
.DS_Store
.travis.yml
*.log
*.trace
*.sublime-
*.prefs
./.npmignore
coverage
sample-code/

Просмотреть файл

@ -23,12 +23,6 @@ jobs:
- sudo: false
script: npm run test && npm run e2e-test
node_js: "8"
- stage:
os:
- linux
- sudo: false
script: npm run test && npm run e2e-test
node_js: "6"
- stage:
os:
- linux

Просмотреть файл

@ -73,7 +73,7 @@ Handlebars.registerHelper('versions', (object, name, driverName) => {
return `${min} to ${max}`;
});
Handlebars.registerHelper('hyphenate', (str) => str.replace('_', '-'));
Handlebars.registerHelper('hyphenate', (str) => str.replace('_', '-'));
Handlebars.registerHelper('uppercase', (str) => str.toUpperCase());
Handlebars.registerHelper('capitalize', function (driverName) {

Просмотреть файл

@ -4,13 +4,14 @@
// turn all logging on since we have tests that rely on npmlog logs actually
// getting sent to the handler
process.env._FORCE_LOGS="1";
process.env._FORCE_LOGS = "1";
const gulp = require('gulp');
const boilerplate = require('appium-gulp-plugins').boilerplate.use(gulp);
const path = require('path');
const fs = require('fs');
// remove 'fsevents' from shrinkwrap, since it causes errors on non-Mac hosts
// see https://github.com/npm/npm/issues/2679
gulp.task('fixShrinkwrap', function (done) {
@ -20,16 +21,13 @@ gulp.task('fixShrinkwrap', function (done) {
} catch (err) {
console.error('Could not find shrinkwrap; skipping fixing shrinkwrap. ' +
'(Original error: ' + err.message + ')');
return;
return done();
}
delete shrinkwrap.dependencies.fsevents;
const shrinkwrapString = JSON.stringify(shrinkwrap, null, ' ') + '\n';
fs.writeFile('./npm-shrinkwrap.json', shrinkwrapString, done);
});
boilerplate({
build: 'appium',
test: {
@ -40,7 +38,7 @@ boilerplate({
});
// generates server arguments readme
gulp.task('docs', ['transpile'], function () {
gulp.task('docs', gulp.series(['transpile']), function () {
const parser = require('./build/lib/parser.js');
const appiumArguments = parser.getParser().rawArgs;
const docFile = path.resolve(__dirname, "docs/en/writing-running-appium/server-args.md");
@ -77,7 +75,7 @@ gulp.task('docs', ['transpile'], function () {
md += "|" + ((typeof argOpts.example === "undefined") ? "" : "`" + exampleArg + " " + argOpts.example + "`");
md += "|\n";
});
// console.log(md);
fs.writeFile(docFile, md, function (err) {
if (err) {
console.log(err.stack);

Просмотреть файл

@ -202,9 +202,9 @@ class AppiumDriver extends BaseDriver {
log.warn(`Unable to get version of driver '${driver.name}'`);
}
async getStatus () {
async getStatus () { // eslint-disable-line require-await
return {
build: _.clone(await getBuildInfo()),
build: _.clone(getBuildInfo()),
};
}

Просмотреть файл

@ -116,7 +116,7 @@ async function getGitTimestamp (commitSha, useGitHubFallback = false) {
* and git commit hash asynchronously as soon as `updateBuildInfo` is called
* and succeeds.
*/
async function getBuildInfo () {
function getBuildInfo () {
return BUILD_INFO;
}
@ -139,7 +139,7 @@ function warnNodeDeprecations () {
async function showConfig () {
await updateBuildInfo();
console.log(JSON.stringify(await getBuildInfo())); // eslint-disable-line no-console
console.log(JSON.stringify(getBuildInfo())); // eslint-disable-line no-console
}
function getNonDefaultArgs (parser, args) {
@ -228,7 +228,8 @@ async function validateTmpDir (tmpDir) {
}
}
export { getBuildInfo, validateServerArgs, checkNodeOk, showConfig,
warnNodeDeprecations, validateTmpDir, getNonDefaultArgs,
getDeprecatedArgs, getGitRev, checkValidPort, APPIUM_VER,
updateBuildInfo };
export {
getBuildInfo, validateServerArgs, checkNodeOk, showConfig,
warnNodeDeprecations, validateTmpDir, getNonDefaultArgs, getDeprecatedArgs,
getGitRev, checkValidPort, APPIUM_VER, updateBuildInfo,
};

Просмотреть файл

@ -21,7 +21,7 @@ async function registerNode (configFile, addr, port) {
logger.error('No data found in the node configuration file to send to the grid');
return;
}
await postRequest(data, addr, port);
postRequest(data, addr, port);
}
async function registerToGrid (options_post, jsonObject) {
@ -37,7 +37,7 @@ async function registerToGrid (options_post, jsonObject) {
}
}
async function postRequest (data, addr, port) {
function postRequest (data, addr, port) {
// parse json to get hub host and port
let jsonObject;
try {
@ -121,8 +121,8 @@ async function isAlreadyRegistered (jsonObject) {
try {
let response = await request({
uri: `${hubUri(jsonObject.configuration)}/grid/api/proxy?id=${id}`,
method : 'GET',
timeout : 10000,
method: 'GET',
timeout: 10000,
resolveWithFullResponse: true // return the full response, not just the body
});
if (response === undefined || response.statusCode !== 200) {

Просмотреть файл

@ -1,5 +1,5 @@
import npmlog from 'npmlog';
import winston from 'winston';
import winston from 'winston';
import { fs, logger } from 'appium-support';
import dateformat from 'dateformat';
import _ from 'lodash';
@ -52,7 +52,7 @@ function timestamp () {
function applyStripColorPatch (transport) {
let _log = transport.log.bind(transport);
transport.log = function (level, msg, meta, callback) { // eslint-disable-line promise/prefer-await-to-callbacks
let code = /\u001b\[(\d+(;\d+)*)?m/g;
const code = /\u001b\[(\d+(;\d+)*)?m/g; // eslint-disable-line no-control-regex
msg = ('' + msg).replace(code, '');
_log(level, msg, meta, callback);
};
@ -130,7 +130,7 @@ async function _createTransports (args) {
if (args.loglevel && args.loglevel.match(":")) {
// --log-level arg can optionally provide diff logging levels for console and file, separated by a colon
let lvlPair = args.loglevel.split(':');
consoleLogLevel = lvlPair[0] || consoleLogLevel;
consoleLogLevel = lvlPair[0] || consoleLogLevel;
fileLogLevel = lvlPair[1] || fileLogLevel;
} else {
consoleLogLevel = fileLogLevel = args.loglevel;

Просмотреть файл

@ -78,10 +78,10 @@ async function logStartupInfo (parser, args) {
logDefaultCapabilitiesWarning(args.defaultCapabilities);
}
// TODO: bring back loglevel reporting below once logger is flushed out
//logger.info('Console LogLevel: ' + logger.transports.console.level);
//if (logger.transports.file) {
//logger.info('File LogLevel: ' + logger.transports.file.level);
//}
// logger.info('Console LogLevel: ' + logger.transports.console.level);
// if (logger.transports.file) {
// logger.info('File LogLevel: ' + logger.transports.file.level);
// }
}
function logServerPort (address, port) {

Просмотреть файл

@ -111,10 +111,12 @@ const args = [
}],
[['--log-level'], {
choices: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error',
'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error',
'error', 'error:debug', 'error:info', 'error:warn', 'error:error',
'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'],
choices: [
'info', 'info:debug', 'info:info', 'info:warn', 'info:error',
'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error',
'error', 'error:debug', 'error:info', 'error:warn', 'error:error',
'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error',
],
defaultValue: 'debug',
dest: 'loglevel',
required: false,

Просмотреть файл

@ -253,5 +253,7 @@ function getPackageVersion (pkgName) {
const rootDir = findRoot(__dirname);
export { inspectObject, parseCapsForInnerDriver, insertAppiumPrefixes, rootDir,
getPackageVersion };
export {
inspectObject, parseCapsForInnerDriver, insertAppiumPrefixes, rootDir,
getPackageVersion,
};

Просмотреть файл

@ -22,8 +22,8 @@
"url": "https://github.com/appium/appium/issues"
},
"engines": {
"node": ">=6",
"npm": ">=3"
"node": ">=8",
"npm": ">=6"
},
"main": "./build/lib/main.js",
"bin": {
@ -33,7 +33,13 @@
"lib": "./lib",
"doc": "./docs"
},
"files": [
"bin",
"lib",
"build/lib"
],
"dependencies": {
"@babel/runtime": "^7.0.0",
"appium-android-driver": "^4.0.0",
"appium-base-driver": "3.x",
"appium-espresso-driver": ">=1.0.0-beta.13",
@ -50,7 +56,6 @@
"argparse": "^1.0.10",
"async-lock": "^1.0.0",
"asyncbox": "2.x",
"babel-runtime": "=5.8.24",
"bluebird": "3.x",
"continuation-local-storage": "3.x",
"dateformat": "^3.0.3",
@ -66,7 +71,7 @@
"winston": "2.x"
},
"scripts": {
"prepublish": "gulp prepublish",
"prepare": "gulp prepublish",
"publish": "gulp prepublish",
"test": "gulp once",
"e2e-test": "gulp e2e-test",
@ -90,20 +95,20 @@
"precommit-test"
],
"devDependencies": {
"appium-gulp-plugins": "^2.4.0",
"ajv": "^6.5.3",
"appium-gulp-plugins": "^3.1.0",
"babel-cli": "^6.26.0",
"babel-eslint": "^7.x",
"babel-eslint": "^10.0.0",
"babel-preset-env": "^1.7.0",
"chai": "4.x",
"chai-as-promised": "7.x",
"eslint": "^3.x",
"eslint-config-appium": "2.x",
"eslint-plugin-babel": "3.x",
"eslint-plugin-import": "2.x",
"eslint-plugin-mocha": "4.x",
"eslint-plugin-promise": "3.x",
"eslint": "^5.2.0",
"eslint-config-appium": "3.x",
"eslint-plugin-import": "^2.2.0",
"eslint-plugin-mocha": "^5.0.0",
"eslint-plugin-promise": "^4.0.0",
"fancy-log": "^1.3.2",
"gulp": "^3.9.1",
"gulp": "^4.0.0",
"handlebars": "^4.0.10",
"mocha": "5.x",
"pre-commit": "1.x",
@ -120,15 +125,6 @@
},
"greenkeeper": {
"ignore": [
"babel-eslint",
"babel-preset-env",
"eslint",
"eslint-plugin-babel",
"eslint-plugin-import",
"eslint-plugin-mocha",
"eslint-plugin-promise",
"gulp",
"babel-runtime",
"winston"
]
}

Просмотреть файл

@ -30,7 +30,7 @@ describe('Config', function () {
describe('Appium config', function () {
describe('getBuildInfo', function () {
async function verifyBuildInfoUpdate (useLocalGit) {
const buildInfo = await getBuildInfo();
const buildInfo = getBuildInfo();
mockFs.expects('exists').atLeast(1).returns(useLocalGit);
buildInfo['git-sha'] = undefined;
buildInfo.built = undefined;
@ -118,9 +118,9 @@ describe('Config', function () {
sinon.spy(console, "log");
});
it('should log the config to console', async function () {
const config = await getBuildInfo();
const config = getBuildInfo();
await showConfig();
console.log.calledOnce.should.be.true; // eslint-disable-line no-console
console.log.calledOnce.should.be.true; // eslint-disable-line no-console
console.log.getCall(0).args[0].should.contain(JSON.stringify(config)); // eslint-disable-line no-console
});
});
@ -136,10 +136,10 @@ describe('Config', function () {
for (let [prop, value] of _.toPairs(process)) {
tempProcess[prop] = value;
}
process = tempProcess;
process = tempProcess; // eslint-disable-line no-global-assign
});
after(function () {
process = _process;
process = _process; // eslint-disable-line no-global-assign
});
describe('checkNodeOk', function () {
it('should fail if node is below 6', function () {
@ -259,13 +259,13 @@ describe('Config', function () {
});
describe('validateTmpDir', function () {
it('should fail to use a tmp dir with incorrect permissions', async function () {
it('should fail to use a tmp dir with incorrect permissions', function () {
validateTmpDir('/private/if_you_run_with_sudo_this_wont_fail').should.be.rejectedWith(/could not ensure/);
});
it('should fail to use an undefined tmp dir', async function () {
it('should fail to use an undefined tmp dir', function () {
validateTmpDir().should.be.rejectedWith(/could not ensure/);
});
it('should be able to use a tmp dir with correct permissions', async function () {
it('should be able to use a tmp dir with correct permissions', function () {
validateTmpDir('/tmp/test_tmp_dir/with/any/number/of/levels').should.not.be.rejected;
});
});

Просмотреть файл

@ -105,14 +105,14 @@ describe('FakeDriver - via HTTP', function () {
});
// Now use that sessionId to call /screenshot
const {status:screenshotStatus, value:screenshotValue} = await request({url: `${baseUrl}/${value.sessionId}/screenshot`, json: true});
const {status: screenshotStatus, value: screenshotValue} = await request({url: `${baseUrl}/${value.sessionId}/screenshot`, json: true});
should.not.exist(screenshotStatus);
screenshotValue.should.equal('hahahanotreallyascreenshot');
// Now use that sessionID to call an arbitrary W3C-only endpoint that isn't implemented to see if it responds with correct error
const {statusCode, error} = await request.post({url: `${baseUrl}/${value.sessionId}/execute/async`, json: {script: '', args: ['a']}}).should.eventually.be.rejected;
statusCode.should.equal(404);
const {error:errorMessage, message, stacktrace} = error.value;
const {error: errorMessage, message, stacktrace} = error.value;
errorMessage.should.match(/unknown method/);
message.should.match(/Method has not yet been implemented/);
stacktrace.should.match(/FakeDriver.executeCommand/);
@ -287,7 +287,7 @@ describe('FakeDriver - via HTTP', function () {
};
// Have an MJSONWP and W3C session running concurrently
const {sessionId:mjsonwpSessId, value:mjsonwpValue, status} = await request.post({url: baseUrl, json: _.omit(combinedCaps, 'capabilities')});
const {sessionId: mjsonwpSessId, value: mjsonwpValue, status} = await request.post({url: baseUrl, json: _.omit(combinedCaps, 'capabilities')});
status.should.exist;
mjsonwpValue.should.eql(caps);
mjsonwpSessId.should.exist;
@ -335,7 +335,7 @@ describe('Logsink', function () {
await server.close();
});
it('should send logs to a logHandler passed in by a parent package', async function () {
it('should send logs to a logHandler passed in by a parent package', function () {
logs.length.should.be.above(1);
let welcomeIndex = logs[0][1].includes('versions of node') ? 1 : 0;
logs[welcomeIndex].length.should.equal(2);

Просмотреть файл

@ -24,7 +24,7 @@ describe('AppiumDriver', function () {
let fakeDriver = new FakeDriver();
let mockFakeDriver = sinon.mock(fakeDriver);
appium.getDriverForCaps = function (/*args*/) {
return () => {
return function Driver () {
return fakeDriver;
};
};
@ -41,16 +41,16 @@ describe('AppiumDriver', function () {
await appium.deleteSession(SESSION_ID);
});
it('should call inner driver\'s createSession with desired capabilities', async function () {
it(`should call inner driver's createSession with desired capabilities`, async function () {
mockFakeDriver.expects("createSession")
.once().withExactArgs(BASE_CAPS, undefined, null, [])
.returns([SESSION_ID, BASE_CAPS]);
await appium.createSession(BASE_CAPS);
mockFakeDriver.verify();
});
it('should call inner driver\'s createSession with desired and default capabilities', async function () {
let defaultCaps = {deviceName: 'Emulator'}
, allCaps = _.extend(_.clone(defaultCaps), BASE_CAPS);
it(`should call inner driver's createSession with desired and default capabilities`, async function () {
let defaultCaps = {deviceName: 'Emulator'};
let allCaps = _.extend(_.clone(defaultCaps), BASE_CAPS);
appium.args.defaultCapabilities = defaultCaps;
mockFakeDriver.expects("createSession")
.once().withArgs(allCaps)
@ -58,7 +58,7 @@ describe('AppiumDriver', function () {
await appium.createSession(BASE_CAPS);
mockFakeDriver.verify();
});
it('should call inner driver\'s createSession with desired and default capabilities without overriding caps', async function () {
it(`should call inner driver's createSession with desired and default capabilities without overriding caps`, async function () {
// a default capability with the same key as a desired capability
// should do nothing
let defaultCaps = {platformName: 'Ersatz'};
@ -73,9 +73,11 @@ describe('AppiumDriver', function () {
appium.args.sessionOverride = true;
// mock three sessions that should be removed when the new one is created
let fakeDrivers = [new FakeDriver(),
new FakeDriver(),
new FakeDriver()];
let fakeDrivers = [
new FakeDriver(),
new FakeDriver(),
new FakeDriver(),
];
let mockFakeDrivers = _.map(fakeDrivers, (fd) => {return sinon.mock(fd);});
mockFakeDrivers[0].expects('deleteSession')
.once();
@ -182,7 +184,7 @@ describe('AppiumDriver', function () {
sessions.should.have.length(0);
});
it('should call inner driver\'s deleteSession method', async function () {
const [sessionId] = (await appium.createSession(BASE_CAPS)).value;
const [sessionId] = (await appium.createSession(BASE_CAPS)).value;
mockFakeDriver.expects("deleteSession")
.once().withExactArgs(sessionId, [])
.returns();
@ -236,8 +238,8 @@ describe('AppiumDriver', function () {
describe('sessionExists', function () {
});
describe('attachUnexpectedShutdownHandler', function () {
let appium
, mockFakeDriver;
let appium;
let mockFakeDriver;
beforeEach(function () {
[appium, mockFakeDriver] = getDriverAndFakeDriver();
});
@ -273,11 +275,11 @@ describe('AppiumDriver', function () {
});
});
describe('getDriverForCaps', function () {
it('should not blow up if user does not provide platformName', async function () {
it('should not blow up if user does not provide platformName', function () {
let appium = new AppiumDriver({});
(() => { appium.getDriverForCaps({}); }).should.throw(/platformName/);
});
it('should get XCUITestDriver driver for automationName of XCUITest', async function () {
it('should get XCUITestDriver driver for automationName of XCUITest', function () {
let appium = new AppiumDriver({});
let driver = appium.getDriverForCaps({
platformName: 'iOS',
@ -286,7 +288,7 @@ describe('AppiumDriver', function () {
driver.should.be.an.instanceof(Function);
driver.should.equal(XCUITestDriver);
});
it('should get iosdriver for ios < 10', async function () {
it('should get iosdriver for ios < 10', function () {
let appium = new AppiumDriver({});
let caps = {
platformName: 'iOS',
@ -316,7 +318,7 @@ describe('AppiumDriver', function () {
driver = appium.getDriverForCaps(caps);
driver.should.equal(IosDriver);
});
it('should get xcuitestdriver for ios >= 10', async function () {
it('should get xcuitestdriver for ios >= 10', function () {
let appium = new AppiumDriver({});
let caps = {
platformName: 'iOS',

Просмотреть файл

@ -28,7 +28,7 @@ function initSession (caps) {
const BASE_CAPS = {platformName: 'Fake', deviceName: 'Fake', app: TEST_FAKE_APP};
const W3C_PREFIXED_CAPS = {...insertAppiumPrefixes(BASE_CAPS)};
const W3C_CAPS = {
alwaysMatch:{...W3C_PREFIXED_CAPS},
alwaysMatch: {...W3C_PREFIXED_CAPS},
firstMatch: [{}],
};

Просмотреть файл

@ -25,14 +25,12 @@ describe('Parser', function () {
});
it('should parse default capabilities correctly from a string', function () {
let defaultCapabilities = {a: 'b'};
let args = p.parseArgs(['--default-capabilities',
JSON.stringify(defaultCapabilities)]);
let args = p.parseArgs(['--default-capabilities', JSON.stringify(defaultCapabilities)]);
args.defaultCapabilities.should.eql(defaultCapabilities);
});
it('should parse default capabilities correctly from a file', function () {
let defaultCapabilities = {a: 'b'};
let args = p.parseArgs(['--default-capabilities',
'test/fixtures/caps.json']);
let args = p.parseArgs(['--default-capabilities', 'test/fixtures/caps.json']);
args.defaultCapabilities.should.eql(defaultCapabilities);
});
it('should throw an error with invalid arg to default capabilities', function () {

Просмотреть файл

@ -9,11 +9,11 @@ chai.use(chaiAsPromised);
const expect = chai.expect;
describe.skip('shrinkwrap checks', function () {
it('shrinkwrap file should exist', async function () {
it('shrinkwrap file should exist', function () {
require('../../npm-shrinkwrap.json');
});
it('shrinkwrap should not include fsevents', async function () {
it('shrinkwrap should not include fsevents', function () {
// fsevents is an optional dep that only works on Mac.
// if it's in shrinkwrap, non-Mac hosts won't be able to install appium
let shrinkwrap = require('../../npm-shrinkwrap.json');