diff --git a/Makefile b/Makefile index ddbfd0f8851394..1c70416c737500 100644 --- a/Makefile +++ b/Makefile @@ -200,6 +200,7 @@ else test: all $(MAKE) build-addons $(MAKE) build-addons-napi + $(MAKE) doc $(MAKE) cctest $(PYTHON) tools/test.py --mode=release -J \ $(CI_ASYNC_HOOKS) \ @@ -379,7 +380,7 @@ test-ci-js: | clear-stalled fi test-ci: LOGLEVEL := info -test-ci: | clear-stalled build-addons build-addons-napi +test-ci: | clear-stalled build-addons build-addons-napi doc out/Release/cctest --gtest_output=tap:cctest.tap $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=release --flaky-tests=$(FLAKY_TESTS) \ @@ -518,7 +519,7 @@ doc: $(NODE_EXE) doc-only $(apidoc_dirs): mkdir -p $@ -out/doc/api/assets/%: doc/api_assets/% out/doc/api/assets/ +out/doc/api/assets/%: doc/api_assets/% out/doc/api/assets cp $< $@ out/doc/%: doc/% diff --git a/test/common/README.md b/test/common/README.md index e2135f710efe34..93106ad076e2e1 100644 --- a/test/common/README.md +++ b/test/common/README.md @@ -337,6 +337,11 @@ original state after calling [`common.hijackStdOut()`][]. Path to the 'root' directory. either `/` or `c:\\` (windows) +### projectDir +* return [<String>] + +Path to the project directory. + ### skip(msg) * `msg` [<String>] diff --git a/test/common/index.js b/test/common/index.js index 05f21e25ca346a..102120e6a1f54e 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -59,6 +59,8 @@ exports.enoughTestCpu = Array.isArray(cpus) && (cpus.length > 1 || cpus[0].speed > 999); exports.rootDir = exports.isWindows ? 'c:\\' : '/'; +exports.projectDir = path.resolve(__dirname, '..', '..'); + exports.buildType = process.config.target_defaults.default_configuration; // If env var is set then enable async_hook hooks for all tests. diff --git a/test/sequential/test-make-doc.js b/test/sequential/test-make-doc.js new file mode 100644 index 00000000000000..06386c0c818bcb --- /dev/null +++ b/test/sequential/test-make-doc.js @@ -0,0 +1,43 @@ +'use strict'; +const common = require('../common'); +if (common.isWindows) { + common.skip('`make doc` does not run on Windows'); +} + +// This tests that `make doc` generates the documentation properly. +// Note that for this test to pass, `make doc` must be run first. + +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); + +const apiPath = path.resolve(common.projectDir, 'out', 'doc', 'api'); +const docs = fs.readdirSync(apiPath); +assert.ok(docs.includes('_toc.html')); + +const toc = fs.readFileSync(path.resolve(apiPath, '_toc.html'), 'utf8'); +const re = /href="([^/]+\.html)"/; +const globalRe = new RegExp(re, 'g'); +const links = toc.match(globalRe); +assert.notStrictEqual(links, null); + +// Test that all the relative links in the TOC of the documentation +// work and all the generated documents are linked in TOC. +const linkedHtmls = links.map((link) => link.match(re)[1]); +for (const html of linkedHtmls) { + assert.ok(docs.includes(html), `${html} does not exist`); +} + +const excludes = ['.json', '_toc', 'assets']; +const generatedHtmls = docs.filter(function(doc) { + for (const exclude of excludes) { + if (doc.includes(exclude)) { + return false; + } + } + return true; +}); + +for (const html of generatedHtmls) { + assert.ok(linkedHtmls.includes(html), `${html} is not linked in toc`); +}