diff --git a/.circleci/config.yml b/.circleci/config.yml index e9286c7850..eee5f78cf2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -67,6 +67,10 @@ jobs: else npx hardhat test:integration:l2 --compile --deploy --use-sips --use-fork fi; + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ job-fork-tests: working_directory: ~/repo docker: @@ -92,6 +96,10 @@ jobs: else npx hardhat test:integration:l1 --compile --deploy --use-sips --use-fork --provider-port 9545 fi; + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ job-integration-tests: working_directory: ~/repo machine: @@ -137,6 +145,10 @@ jobs: name: Run dual layer 1 and layer 2 integration tests command: | npx hardhat test:integration:dual --deploy + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ job-lint: working_directory: ~/repo docker: @@ -361,6 +373,10 @@ jobs: root: . paths: - gasReporterOutput-*.json + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ job-validate-deployments: working_directory: ~/repo docker: diff --git a/.circleci/src/jobs/job-fork-tests-ovm.yml b/.circleci/src/jobs/job-fork-tests-ovm.yml index 4d9ba6e7b1..628172b3ca 100644 --- a/.circleci/src/jobs/job-fork-tests-ovm.yml +++ b/.circleci/src/jobs/job-fork-tests-ovm.yml @@ -19,3 +19,7 @@ steps: else npx hardhat test:integration:l2 --compile --deploy --use-sips --use-fork fi; + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ diff --git a/.circleci/src/jobs/job-fork-tests.yml b/.circleci/src/jobs/job-fork-tests.yml index 9f6d7b54ca..469314b7f7 100644 --- a/.circleci/src/jobs/job-fork-tests.yml +++ b/.circleci/src/jobs/job-fork-tests.yml @@ -19,3 +19,7 @@ steps: else npx hardhat test:integration:l1 --compile --deploy --use-sips --use-fork --provider-port 9545 fi; + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ diff --git a/.circleci/src/jobs/job-integration-tests.yml b/.circleci/src/jobs/job-integration-tests.yml index 971bb25df3..9e8ae1a276 100644 --- a/.circleci/src/jobs/job-integration-tests.yml +++ b/.circleci/src/jobs/job-integration-tests.yml @@ -43,3 +43,7 @@ steps: name: Run dual layer 1 and layer 2 integration tests command: | npx hardhat test:integration:dual --deploy + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ diff --git a/.circleci/src/jobs/job-unit-tests.yml b/.circleci/src/jobs/job-unit-tests.yml index 4aa4bb18df..2b68d64e58 100644 --- a/.circleci/src/jobs/job-unit-tests.yml +++ b/.circleci/src/jobs/job-unit-tests.yml @@ -25,3 +25,7 @@ steps: root: . paths: - gasReporterOutput-*.json + - store_test_results: + path: /tmp/junit/ + - store_artifacts: + path: /tmp/junit/ diff --git a/hardhat/tasks/task-test.js b/hardhat/tasks/task-test.js index 75aaf70504..f9931f2b49 100644 --- a/hardhat/tasks/task-test.js +++ b/hardhat/tasks/task-test.js @@ -3,6 +3,7 @@ const { types, task, subtask } = require('hardhat/config'); const { TASK_TEST_RUN_MOCHA_TESTS } = require('hardhat/builtin-tasks/task-names'); const { gray, yellow } = require('chalk'); const optimizeIfRequired = require('../util/optimizeIfRequired'); +const isCI = require('is-ci'); // Override builtin "test:run-mocha-tests" subtask so we can use the local mocha // installation, which is up to date and allows us to run parallel tests. @@ -54,5 +55,14 @@ task('test') hre.config.gasReporter.outputFile = gasOutputFile; } + // When using CircleCI, output the test metadata + // See https://circleci.com/docs/2.0/collect-test-data + if (isCI) { + hre.config.mocha.reporter = 'mocha-junit-reporter'; + hre.config.mocha.reporterOptions = { + mochaFile: '/tmp/junit/test-results.[hash].xml', + }; + } + await runSuper(taskArguments); }); diff --git a/package-lock.json b/package-lock.json index 56f8d500a0..a170ef12c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,6 +63,7 @@ "lodash.clonedeep": "^4.5.0", "lodash.uniq": "^4.5.0", "mocha": "8.1.3", + "mocha-junit-reporter": "2.0.2", "mustache": "^4.0.1", "openzeppelin-solidity-2.3.0": "npm:openzeppelin-solidity@2.3.0", "p-limit": "1.3.0", @@ -16553,6 +16554,17 @@ "node": ">=8.9.0" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -16563,6 +16575,12 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/md5/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -16999,6 +17017,58 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha-junit-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", @@ -25473,6 +25543,12 @@ "cookiejar": "^2.1.1" } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "node_modules/xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", @@ -42574,6 +42650,25 @@ "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "dev": true }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -43108,6 +43203,51 @@ } } }, + "mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -49941,6 +50081,12 @@ "cookiejar": "^2.1.1" } }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", diff --git a/package.json b/package.json index 8b1bbddc3a..395082060e 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "lodash.clonedeep": "^4.5.0", "lodash.uniq": "^4.5.0", "mocha": "8.1.3", + "mocha-junit-reporter": "2.0.2", "mustache": "^4.0.1", "openzeppelin-solidity-2.3.0": "npm:openzeppelin-solidity@2.3.0", "p-limit": "1.3.0",