diff --git a/.gitignore b/.gitignore index ae640387..3be9ebd9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,21 @@ .DS_Store +.gradle +.metadata +Thumbs.db +Desktop.ini +*.tmp +*.bak +*.swp +*.class +*.jar default.properties gen assets/www/cordova.js local.properties proguard.cfg -proguard.cfg proguard-project.txt +example +/coverage /framework/lib /framework/build /framework/bin @@ -15,30 +25,23 @@ proguard-project.txt /framework/libs /framework/javadoc-public /framework/javadoc-private -/test/libs -example -/test/bin -/test/assets/www/.tmp* -/test/assets/www/cordova.js +/test/.externalNativeBuild +/test/build.gradle /test/gradle /test/gradlew /test/gradlew.bat +/test/assets/www/.tmp* +/test/assets/www/cordova.js +/test/bin /test/build -.gradle +/test/captures +/test/libs tmp/** -.metadata tmp/**/* -Thumbs.db -Desktop.ini -*.tmp -*.bak -*.swp -*.class -*.jar !/spec/fixtures/org.test.plugins.dummyplugin/src/android/TestLib.jar # IntelliJ IDEA files +**/.idea/**/* *.iml -.idea npm-debug.log node_modules/jshint node_modules/promise-matchers @@ -130,4 +133,3 @@ node_modules/wordwrap/ node_modules/yargs/ node_modules/jasmine-core/ node_modules/fs.realpath/ -/coverage diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index dc77ccc1..00000000 --- a/.jshintignore +++ /dev/null @@ -1,3 +0,0 @@ -bin/node_modules/* -bin/templates/project/* -spec/fixtures/* diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 89a121cf..00000000 --- a/.jshintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "node": true - , "bitwise": true - , "undef": true - , "trailing": true - , "quotmark": true - , "indent": 4 - , "unused": "vars" - , "latedef": "nofunc" -} diff --git a/.travis.yml b/.travis.yml index 7ad8eeae..f4734d14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,14 +9,12 @@ before_install: install: - npm install - npm install -g codecov - - echo y | android update sdk -u --filter android-22,android-23,android-24,android-25 + - echo y | android --silent update sdk --no-ui --all --filter platform-tools,tools,build-tools-26.0.0,android-26,android-25,extra-google-m2repository,extra-android-m2repository android: components: - tools - - tools script: - - npm run eslint + - npm test - npm run cover - - npm run test-build after_script: - codecov diff --git a/appveyor.yml b/appveyor.yml index 24ea88a7..f8bef7ed 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,11 +1,29 @@ environment: + ANDROID_HOME: "C:\\android" matrix: - nodejs_version: "4" - nodejs_version: "6" +init: + - mkdir "%ANDROID_HOME% + - cd "%ANDROID_HOME%" + - appveyor DownloadFile "https://dl.google.com/android/repository/tools_r25.2.3-windows.zip" + - 7z x "tools_r25.2.3-windows.zip" > nul + - cd "C:\projects\cordova-android" + install: -# - cinst android-sdk -# - echo y | android update sdk -u --filter android-22,android-23 + - choco install gradle -version 3.4.1 + - gradle -version + - echo y | "%ANDROID_HOME%\tools\android.bat" --silent update sdk --no-ui --all --filter platform-tools,tools,build-tools-26.0.0,android-26,android-25,extra-google-m2repository,extra-android-m2repository + # on windows we need to accept sublicenses for the new tooling, wee. 30 is an arbitrary number, + # but should be the maximum number of licenses we explicitly need to type "Y ENTER" for. + # also, the sdkmanager in all its glory leaks a bit of output to stderr, and powershell + # and appveyor interpret that as errors, and blows up. so, when piping in our "Y ENTER" + # responses, we invoke cmd so we can redirect stderr to stdout, and tell it to --update itself. + - ps: for($i=0;$i -lt 30;$i++) { $response += "y`n"}; $response | cmd /c 'C:\android\tools\bin\sdkmanager.bat 2>&1' --update + - cd test + - gradle :wrapper -b build.gradle + - cd .. - ps: Install-Product node $env:nodejs_version - npm install @@ -14,5 +32,4 @@ build: off test_script: - node --version - npm --version - - npm run test -# - npm run test-build + - npm test diff --git a/bin/templates/cordova/.jshintrc b/bin/templates/cordova/.jshintrc deleted file mode 100644 index 89a121cf..00000000 --- a/bin/templates/cordova/.jshintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "node": true - , "bitwise": true - , "undef": true - , "trailing": true - , "quotmark": true - , "indent": 4 - , "unused": "vars" - , "latedef": "nofunc" -} diff --git a/bin/templates/cordova/lib/builders/GradleBuilder.js b/bin/templates/cordova/lib/builders/GradleBuilder.js index 05c0aa13..20fab2aa 100644 --- a/bin/templates/cordova/lib/builders/GradleBuilder.js +++ b/bin/templates/cordova/lib/builders/GradleBuilder.js @@ -37,7 +37,7 @@ var TEMPLATE = function GradleBuilder (projectRoot) { GenericBuilder.call(this, projectRoot); - this.binDirs = {gradle: this.binDirs.gradle}; + this.binDirs = { gradle: this.binDirs.gradle }; } util.inherits(GradleBuilder, GenericBuilder); @@ -73,9 +73,12 @@ GradleBuilder.prototype.runGradleWrapper = function (gradle_cmd) { var gradlePath = path.join(this.root, 'gradlew'); var wrapperGradle = path.join(this.root, 'wrapper.gradle'); if (fs.existsSync(gradlePath)) { - // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows + // Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows } else { - return superspawn.spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], {stdio: 'inherit'}); + return superspawn.spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], { stdio: 'pipe' }) + .progress(function (stdio) { + suppressJavaOptionsInfo(stdio); + }); } }; @@ -270,33 +273,19 @@ GradleBuilder.prototype.build = function (opts) { var wrapper = path.join(this.root, 'gradlew'); var args = this.getArgs(opts.buildType === 'debug' ? 'debug' : 'release', opts); - return superspawn.spawn(wrapper, args, {stdio: 'pipe'}).progress(function (stdio) { - if (stdio.stderr) { - /* - * Workaround for the issue with Java printing some unwanted information to - * stderr instead of stdout. - * This function suppresses 'Picked up _JAVA_OPTIONS' message from being - * printed to stderr. See https://issues.apache.org/jira/browse/CB-9971 for - * explanation. - */ - var suppressThisLine = /^Picked up _JAVA_OPTIONS: /i.test(stdio.stderr.toString()); - if (suppressThisLine) { - return; + return superspawn.spawn(wrapper, args, { stdio: 'pipe' }) + .progress(function (stdio) { + suppressJavaOptionsInfo(stdio); + }).catch(function (error) { + if (error.toString().indexOf('failed to find target with hash string') >= 0) { + return check_reqs.check_android_target(error).then(function () { + // If due to some odd reason - check_android_target succeeds + // we should still fail here. + return Q.reject(error); + }); } - process.stderr.write(stdio.stderr); - } else { - process.stdout.write(stdio.stdout); - } - }).catch(function (error) { - if (error.toString().indexOf('failed to find target with hash string') >= 0) { - return check_reqs.check_android_target(error).then(function () { - // If due to some odd reason - check_android_target succeeds - // we should still fail here. - return Q.reject(error); - }); - } - return Q.reject(error); - }); + return Q.reject(error); + }); }; GradleBuilder.prototype.clean = function (opts) { @@ -304,7 +293,7 @@ GradleBuilder.prototype.clean = function (opts) { var wrapper = path.join(this.root, 'gradlew'); var args = builder.getArgs('clean', opts); return Q().then(function () { - return superspawn.spawn(wrapper, args, {stdio: 'inherit'}); + return superspawn.spawn(wrapper, args, { stdio: 'inherit' }); }).then(function () { shell.rm('-rf', path.join(builder.root, 'out')); @@ -319,6 +308,25 @@ GradleBuilder.prototype.clean = function (opts) { module.exports = GradleBuilder; +function suppressJavaOptionsInfo (stdio) { + if (stdio.stderr) { + /* + * Workaround for the issue with Java printing some unwanted information to + * stderr instead of stdout. + * This function suppresses 'Picked up _JAVA_OPTIONS' message from being + * printed to stderr. See https://issues.apache.org/jira/browse/CB-9971 for + * explanation. + */ + var suppressThisLine = /^Picked up _JAVA_OPTIONS: /i.test(stdio.stderr.toString()); + if (suppressThisLine) { + return; + } + process.stderr.write(stdio.stderr); + } else { + process.stdout.write(stdio.stdout); + } +} + function isAutoGenerated (file) { return fs.existsSync(file) && fs.readFileSync(file, 'utf8').indexOf(MARKER) > 0; } diff --git a/package.json b/package.json index 5b78eb7e..574de80c 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,10 @@ "apache" ], "scripts": { - "test": "npm run eslint && jasmine", - "cover": "istanbul cover --root bin/templates/cordova --print detail jasmine", - "test-build": "jasmine --captureExceptions --color spec/e2e/*.spec.js", + "test": "npm run eslint && npm run unit-tests && npm run e2e-tests", + "unit-tests": "jasmine --config=spec/unit/jasmine.json", + "cover": "istanbul cover --root bin/templates/cordova --print detail jasmine -- --config=spec/unit/jasmine.json", + "e2e-tests": "jasmine --config=spec/e2e/jasmine.json", "eslint": "eslint bin && eslint spec" }, "author": "Apache Software Foundation", @@ -51,7 +52,7 @@ "eslint-plugin-promise": "^3.5.0", "eslint-plugin-standard": "^3.0.1", "istanbul": "^0.4.2", - "jasmine": "^2.5.2", + "jasmine": "~2.6.0", "promise-matchers": "~0", "rewire": "^2.1.3" }, diff --git a/spec/.jshintrc b/spec/.jshintrc deleted file mode 100644 index 17eae32c..00000000 --- a/spec/.jshintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "node": true - , "bitwise": true - , "undef": true - , "trailing": true - , "quotmark": true - , "indent": 4 - , "unused": "vars" - , "latedef": "nofunc" - , "jasmine": true -} diff --git a/spec/e2e/jasmine.json b/spec/e2e/jasmine.json new file mode 100644 index 00000000..49c40b2c --- /dev/null +++ b/spec/e2e/jasmine.json @@ -0,0 +1,8 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "e2e/**/*[sS]pec.js" + ], + "stopSpecOnExpectationFailure": false, + "random": false +} diff --git a/spec/unit/builders/GradleBuilder.spec.js b/spec/unit/builders/GradleBuilder.spec.js index bae5a796..f8ad1a4f 100644 --- a/spec/unit/builders/GradleBuilder.spec.js +++ b/spec/unit/builders/GradleBuilder.spec.js @@ -1,6 +1,7 @@ var Gradle_builder = require('../../../bin/templates/cordova/lib/builders/GradleBuilder.js'); var fs = require('fs'); +var Q = require('q'); var superspawn = require('cordova-common').superspawn; var builder; @@ -8,7 +9,8 @@ describe('Gradle Builder', function () { beforeEach(function () { spyOn(fs, 'existsSync').and.returnValue(true); builder = new Gradle_builder('/root'); - spyOn(superspawn, 'spawn'); + var deferred = Q.defer(); + spyOn(superspawn, 'spawn').and.returnValue(deferred.promise); }); describe('runGradleWrapper method', function () { diff --git a/spec/support/jasmine.json b/spec/unit/jasmine.json similarity index 86% rename from spec/support/jasmine.json rename to spec/unit/jasmine.json index e04f8140..4fe01a65 100644 --- a/spec/support/jasmine.json +++ b/spec/unit/jasmine.json @@ -4,5 +4,5 @@ "unit/**/*[sS]pec.js" ], "stopSpecOnExpectationFailure": false, - "random": false + "random": true } diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index 39fb081a..00000000 --- a/test/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures -.externalNativeBuild