|
2 | 2 |
|
3 | 3 | const fs = require('fs').promises
|
4 | 4 | const path = require('path')
|
5 |
| -const childProcess = require('child_process') |
6 |
| -const assert = require('assert') |
7 | 5 |
|
8 | 6 | const versionRe = /^v\d+\.\d+\.\d+/
|
9 | 7 | const additionalDistAssets = [
|
@@ -217,388 +215,3 @@ async function execute () {
|
217 | 215 | console.log(' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m')
|
218 | 216 | }
|
219 | 217 | }
|
220 |
| - |
221 |
| -/* TESTS ***********************************************************************/ |
222 |
| - |
223 |
| -function test () { |
224 |
| - // makes a staging or dist directory given a version string |
225 |
| - async function makeFixture (version, isStaging, dir, assets) { |
226 |
| - if (!assets) { |
227 |
| - assets = await loadExpectedAssets(version) |
228 |
| - } |
229 |
| - for (let asset of assets) { |
230 |
| - let absoluteAsset = path.join(dir, asset) |
231 |
| - if (asset.endsWith('/')) { |
232 |
| - await fs.mkdir(absoluteAsset, { recursive: true }) |
233 |
| - } else { |
234 |
| - await fs.writeFile(absoluteAsset, asset, 'utf8') |
235 |
| - } |
236 |
| - let dashPos = isStaging && asset.indexOf('/') |
237 |
| - if (isStaging && (dashPos === -1 || dashPos === asset.length - 1)) { |
238 |
| - // in staging, all files and directories that are ready have a |
239 |
| - // duplicate empty file with .done in the name |
240 |
| - await fs.writeFile(absoluteAsset.replace(/\/?$/, '.done'), asset, 'utf8') |
241 |
| - } |
242 |
| - } |
243 |
| - return assets |
244 |
| - } |
245 |
| - |
246 |
| - async function rimraf (dir) { |
247 |
| - const stat = await fs.stat(dir) |
248 |
| - if (!stat.isDirectory()) { |
249 |
| - await fs.unlink(dir) |
250 |
| - return |
251 |
| - } |
252 |
| - const ls = await fs.readdir(dir) |
253 |
| - for (let f of ls) { |
254 |
| - f = path.join(dir, f) |
255 |
| - const stat = await fs.stat(f) |
256 |
| - if (stat.isDirectory()) { |
257 |
| - await rimraf(f) |
258 |
| - } else { |
259 |
| - await fs.unlink(f) |
260 |
| - } |
261 |
| - } |
262 |
| - await fs.rmdir(dir) |
263 |
| - } |
264 |
| - |
265 |
| - // execute check_assets.js with the given staging and dist dirs, collect output |
266 |
| - async function executeMe (stagingDir, distDir) { |
267 |
| - return new Promise((resolve, reject) => { |
268 |
| - const args = [ '--no-warnings', __filename, stagingDir, distDir ] |
269 |
| - childProcess.execFile(process.execPath, args, (err, stdout, stderr) => { |
270 |
| - if (err) { |
271 |
| - return reject(err) |
272 |
| - } |
273 |
| - if (stderr) { |
274 |
| - console.log('STDERR:', stderr) |
275 |
| - } |
276 |
| - resolve(stdout) |
277 |
| - }) |
278 |
| - }) |
279 |
| - } |
280 |
| - |
281 |
| - async function runTest (number, version, expectedStdout, setup) { |
282 |
| - const testDir = await fs.mkdtemp(`${__filename}_`) |
283 |
| - const fixtureStagingDir = path.join(testDir, `staging/${version}`) |
284 |
| - const fixtureDistDir = path.join(testDir, `dist/${version}`) |
285 |
| - await setup(fixtureStagingDir, fixtureDistDir) |
286 |
| - |
287 |
| - const stdout = await executeMe(fixtureStagingDir, fixtureDistDir) |
288 |
| - console.log(`\nTest ${number} Assertions ???`) |
289 |
| - console.log(`STDOUT------------------------------------------\n\n${stdout}\n------------------------------------------------`) |
290 |
| - assert.equal(stdout, expectedStdout) |
291 |
| - console.log(`Test ${number} Assertions ✓✓✓`) |
292 |
| - |
293 |
| - await rimraf(testDir) |
294 |
| - } |
295 |
| - // TEST 1: Everything is in staging, nothing in dist, good to go |
296 |
| - async function test1 () { |
297 |
| - const version = 'v8.13.0' |
298 |
| - const expectedStdout = |
299 |
| - '... Checking assets\n' + |
300 |
| - '... Expecting a total of 44 assets for v8.x\n' + |
301 |
| - '... 44 assets waiting in staging\n' + |
302 |
| - '... 0 assets already promoted\n' + |
303 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v8.x\n' |
304 |
| - |
305 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
306 |
| - await makeFixture(version, true, fixtureStagingDir) |
307 |
| - } |
308 |
| - |
309 |
| - return runTest(1, version, expectedStdout, setup) |
310 |
| - } |
311 |
| - |
312 |
| - // TEST 2: Not quite everything is in staging, missing two assets, nothing in dist |
313 |
| - async function test2 () { |
314 |
| - const version = 'v10.1.0' |
315 |
| - const expectedStdout = |
316 |
| - '... Checking assets\n' + |
317 |
| - '... Expecting a total of 41 assets for v10.x\n' + |
318 |
| - '... 38 assets waiting in staging\n' + |
319 |
| - '... 0 assets already promoted\n' + |
320 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m The following assets are expected for v10.x but are currently missing from staging:\n' + |
321 |
| - ' • node-v10.1.0-linux-armv6l.tar.gz\n' + |
322 |
| - ' • node-v10.1.0-linux-armv6l.tar.xz\n' + |
323 |
| - ' • node-v10.1.0.pkg\n' + |
324 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
325 |
| - |
326 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
327 |
| - await makeFixture(version, true, fixtureStagingDir) |
328 |
| - await Promise.all([ |
329 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0-linux-armv6l.tar.gz')), |
330 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0-linux-armv6l.tar.gz.done')), |
331 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0-linux-armv6l.tar.xz')), |
332 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0-linux-armv6l.tar.xz.done')), |
333 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0.pkg')), |
334 |
| - fs.unlink(path.join(fixtureStagingDir, 'node-v10.1.0.pkg.done')) |
335 |
| - ]) |
336 |
| - } |
337 |
| - |
338 |
| - return runTest(2, version, expectedStdout, setup) |
339 |
| - } |
340 |
| - |
341 |
| - // TEST 3: Everything in staging, 3 files in dist |
342 |
| - async function test3 () { |
343 |
| - const version = 'v6.0.1' |
344 |
| - const expectedStdout = |
345 |
| - '... Checking assets\n' + |
346 |
| - '... Expecting a total of 46 assets for v6.x\n' + |
347 |
| - '... 46 assets waiting in staging\n' + |
348 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m 3 assets already promoted will be overwritten, is this OK?\n' + |
349 |
| - ' • node-v6.0.1-headers.tar.gz\n' + |
350 |
| - ' • node-v6.0.1-x86.msi\n' + |
351 |
| - ' • node-v6.0.1.tar.gz\n' + |
352 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v6.x\n' + |
353 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
354 |
| - |
355 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
356 |
| - await makeFixture(version, true, fixtureStagingDir) |
357 |
| - const distAssets = await makeFixture(version, false, fixtureDistDir) |
358 |
| - await Promise.all( |
359 |
| - distAssets.filter((a) => { |
360 |
| - return a !== 'node-v6.0.1-headers.tar.gz' && |
361 |
| - a !== 'node-v6.0.1.tar.gz' && |
362 |
| - a !== 'node-v6.0.1-x86.msi' && |
363 |
| - // deleting all directories, so we don't need to delete the children |
364 |
| - !/^win-x64\/.+/.test(a) && |
365 |
| - !/^win-x86\/.+/.test(a) && |
366 |
| - !/^docs\/.+/.test(a) |
367 |
| - }).map((e) => rimraf(path.join(fixtureDistDir, e))) |
368 |
| - ) |
369 |
| - } |
370 |
| - |
371 |
| - return runTest(3, version, expectedStdout, setup) |
372 |
| - } |
373 |
| - |
374 |
| - // TEST 4: Everything in staging and everything in dist |
375 |
| - async function test4 () { |
376 |
| - const version = 'v11.11.11' |
377 |
| - const expectedStdout = |
378 |
| - '... Checking assets\n' + |
379 |
| - '... Expecting a total of 41 assets for v11.x\n' + |
380 |
| - '... 41 assets waiting in staging\n' + |
381 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m 41 assets already promoted will be overwritten, is this OK?\n' + |
382 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v11.x\n' + |
383 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
384 |
| - |
385 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
386 |
| - await makeFixture(version, true, fixtureStagingDir) |
387 |
| - await makeFixture(version, false, fixtureDistDir) |
388 |
| - } |
389 |
| - |
390 |
| - return runTest(4, version, expectedStdout, setup) |
391 |
| - } |
392 |
| - |
393 |
| - // TEST 5: No expected files list is available for this version, it has to guess |
394 |
| - async function test5 () { |
395 |
| - const version = 'v9.9.9' |
396 |
| - const expectedStdout = |
397 |
| - '... Checking assets\n' + |
398 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m No expected asset list is available for v9.x, using the list for v8.x instead\n' + |
399 |
| - ' Should a new list be created for v9.x?\n' + |
400 |
| - ' https://github.com/nodejs/build/tree/main/ansible/www-standalone/tools/promote/expected_assets/v9.x\n' + |
401 |
| - '... Expecting a total of 44 assets for v9.x\n' + |
402 |
| - '... 41 assets waiting in staging\n' + |
403 |
| - '... 0 assets already promoted\n' + |
404 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m The following assets are expected for v9.x but are currently missing from staging:\n' + |
405 |
| - ' • node-v9.9.9-linux-x86.tar.gz\n' + |
406 |
| - ' • node-v9.9.9-linux-x86.tar.xz\n' + |
407 |
| - ' • node-v9.9.9-sunos-x86.tar.gz\n' + |
408 |
| - ' • node-v9.9.9-sunos-x86.tar.xz\n' + |
409 |
| - ' \u001b[31m\u001b[1m✖\u001b[22m\u001b[39m The following assets were found in staging but are not expected for v9.x:\n' + |
410 |
| - ' • docs/apilinks.json\n' + |
411 |
| - ' Does the expected assets list for v9.x need to be updated?\n' + |
412 |
| - ' https://github.com/nodejs/build/tree/main/ansible/www-standalone/tools/promote/expected_assets/v9.x\n' + |
413 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
414 |
| - |
415 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
416 |
| - // use the 10.x list, which is missing the x86 files, it'll check the 9.x |
417 |
| - const expectedAssets = await loadExpectedAssets(version, 'v10.x') |
418 |
| - await makeFixture(version, true, fixtureStagingDir, expectedAssets) |
419 |
| - } |
420 |
| - |
421 |
| - return runTest(5, version, expectedStdout, setup) |
422 |
| - } |
423 |
| - |
424 |
| - // TEST 6: Everything is in dist except for the armv6l files, but they are in staging |
425 |
| - async function test6 () { |
426 |
| - const version = 'v10.0.0' |
427 |
| - const expectedStdout = |
428 |
| - '... Checking assets\n' + |
429 |
| - '... Expecting a total of 41 assets for v10.x\n' + |
430 |
| - '... 2 assets waiting in staging\n' + |
431 |
| - '... 39 assets already promoted\n' + |
432 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v10.x\n' |
433 |
| - |
434 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
435 |
| - await fs.mkdir(fixtureStagingDir, { recursive: true }) |
436 |
| - await makeFixture(version, true, fixtureStagingDir, [ |
437 |
| - 'node-v10.0.0-linux-armv6l.tar.gz', |
438 |
| - 'node-v10.0.0-linux-armv6l.tar.xz' |
439 |
| - ]) |
440 |
| - await makeFixture(version, false, fixtureDistDir) |
441 |
| - await Promise.all([ |
442 |
| - fs.unlink(path.join(fixtureDistDir, 'node-v10.0.0-linux-armv6l.tar.gz')), |
443 |
| - fs.unlink(path.join(fixtureDistDir, 'node-v10.0.0-linux-armv6l.tar.xz')) |
444 |
| - ]) |
445 |
| - } |
446 |
| - |
447 |
| - return runTest(6, version, expectedStdout, setup) |
448 |
| - } |
449 |
| - |
450 |
| - // TEST 7: Some unexpected files in staging |
451 |
| - async function test7 () { |
452 |
| - const version = 'v10.0.0' |
453 |
| - const expectedStdout = |
454 |
| - '... Checking assets\n' + |
455 |
| - '... Expecting a total of 41 assets for v10.x\n' + |
456 |
| - '... 2 assets waiting in staging\n' + |
457 |
| - '... 41 assets already promoted\n' + |
458 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v10.x\n' + |
459 |
| - ' \u001b[31m\u001b[1m✖\u001b[22m\u001b[39m The following assets were found in staging but are not expected for v10.x:\n' + |
460 |
| - ' • ooolaalaa.tar.gz\n' + |
461 |
| - ' • whatdis.tar.xz\n' + |
462 |
| - ' Does the expected assets list for v10.x need to be updated?\n' + |
463 |
| - ' https://github.com/nodejs/build/tree/main/ansible/www-standalone/tools/promote/expected_assets/v10.x\n' + |
464 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
465 |
| - |
466 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
467 |
| - await fs.mkdir(fixtureStagingDir, { recursive: true }) |
468 |
| - await makeFixture(version, true, fixtureStagingDir, [ |
469 |
| - 'ooolaalaa.tar.gz', |
470 |
| - 'whatdis.tar.xz' |
471 |
| - ]) |
472 |
| - await makeFixture(version, false, fixtureDistDir) |
473 |
| - } |
474 |
| - |
475 |
| - return runTest(7, version, expectedStdout, setup) |
476 |
| - } |
477 |
| - |
478 |
| - // TEST 8: Unexpected files in subdirectories, only check 2 levels deep |
479 |
| - async function test8 () { |
480 |
| - const version = 'v11.11.1' |
481 |
| - const expectedStdout = |
482 |
| - '... Checking assets\n' + |
483 |
| - '... Expecting a total of 41 assets for v11.x\n' + |
484 |
| - '... 43 assets waiting in staging\n' + |
485 |
| - '... 0 assets already promoted\n' + |
486 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v11.x\n' + |
487 |
| - ' \u001b[31m\u001b[1m✖\u001b[22m\u001b[39m The following assets were found in staging but are not expected for v11.x:\n' + |
488 |
| - ' • docs/bar\n' + |
489 |
| - ' • docs/foo\n' + |
490 |
| - ' Does the expected assets list for v11.x need to be updated?\n' + |
491 |
| - ' https://github.com/nodejs/build/tree/main/ansible/www-standalone/tools/promote/expected_assets/v11.x\n' + |
492 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
493 |
| - |
494 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
495 |
| - await fs.mkdir(fixtureStagingDir, { recursive: true }) |
496 |
| - await makeFixture(version, true, fixtureStagingDir) |
497 |
| - await Promise.all([ |
498 |
| - fs.writeFile(path.join(fixtureStagingDir, 'docs/foo'), 'foo'), |
499 |
| - fs.writeFile(path.join(fixtureStagingDir, 'docs/bar'), 'foo'), |
500 |
| - fs.writeFile(path.join(fixtureStagingDir, 'docs/api/baz'), 'bar') |
501 |
| - ]) |
502 |
| - } |
503 |
| - |
504 |
| - return runTest(8, version, expectedStdout, setup) |
505 |
| - } |
506 |
| - |
507 |
| - // TEST 9: Some unexpected files in dist |
508 |
| - async function test9 () { |
509 |
| - const version = 'v6.7.8' |
510 |
| - const expectedStdout = |
511 |
| - '... Checking assets\n' + |
512 |
| - '... Expecting a total of 46 assets for v6.x\n' + |
513 |
| - '... 46 assets waiting in staging\n' + |
514 |
| - '... 2 assets already promoted\n' + |
515 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v6.x\n' + |
516 |
| - ' \u001b[31m\u001b[1m✖\u001b[22m\u001b[39m The following assets were already promoted but are not expected for v6.x:\n' + |
517 |
| - ' • ooolaalaa.tar.gz\n' + |
518 |
| - ' • whatdis.tar.xz\n' + |
519 |
| - ' Does the expected assets list for v6.x need to be updated?\n' + |
520 |
| - ' https://github.com/nodejs/build/tree/main/ansible/www-standalone/tools/promote/expected_assets/v6.x\n' + |
521 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
522 |
| - |
523 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
524 |
| - await fs.mkdir(fixtureDistDir, { recursive: true }) |
525 |
| - await makeFixture(version, false, fixtureDistDir, [ |
526 |
| - 'ooolaalaa.tar.gz', |
527 |
| - 'whatdis.tar.xz' |
528 |
| - ]) |
529 |
| - await makeFixture(version, true, fixtureStagingDir) |
530 |
| - } |
531 |
| - |
532 |
| - return runTest(9, version, expectedStdout, setup) |
533 |
| - } |
534 |
| - |
535 |
| - // TEST 10: SHASUMS in dist already, shouldn't bother us |
536 |
| - async function test10 () { |
537 |
| - const version = 'v8.0.0' |
538 |
| - const expectedStdout = |
539 |
| - '... Checking assets\n' + |
540 |
| - '... Expecting a total of 44 assets for v8.x\n' + |
541 |
| - '... 44 assets waiting in staging\n' + |
542 |
| - ' \u001b[33m\u001b[1m⚠\u001b[22m\u001b[39m 4 assets already promoted will be overwritten, is this OK?\n' + |
543 |
| - ' • docs/\n' + |
544 |
| - ' • docs/api/\n' + |
545 |
| - ' • node-v8.0.0-linux-armv6l.tar.gz\n' + |
546 |
| - ' • node-v8.0.0-linux-armv6l.tar.xz\n' + |
547 |
| - ' \u001b[32m\u001b[1m✓\u001b[22m\u001b[39m Complete set of expected assets in place for v8.x\n' + |
548 |
| - ' \u001b[33mPromote if you are certain this is the the correct course of action\u001b[39m\n' |
549 |
| - |
550 |
| - async function setup (fixtureStagingDir, fixtureDistDir) { |
551 |
| - await fs.mkdir(fixtureDistDir, { recursive: true }) |
552 |
| - await Promise.all([ |
553 |
| - makeFixture(version, true, fixtureStagingDir), |
554 |
| - makeFixture(version, false, fixtureDistDir, [ |
555 |
| - 'SHASUMS256.txt', |
556 |
| - 'SHASUMS256.txt.asc', |
557 |
| - 'SHASUMS256.txt.sig', |
558 |
| - 'docs/', |
559 |
| - 'docs/api/', |
560 |
| - 'docs/api/bar', |
561 |
| - 'node-v8.0.0-linux-armv6l.tar.gz', |
562 |
| - 'node-v8.0.0-linux-armv6l.tar.xz' |
563 |
| - ]) |
564 |
| - ]) |
565 |
| - } |
566 |
| - |
567 |
| - return runTest(10, version, expectedStdout, setup) |
568 |
| - } |
569 |
| - |
570 |
| - // run in parallel and just print failures to stderr |
571 |
| - let failures = 0 |
572 |
| - let passes = 0 |
573 |
| - const tests = [ |
574 |
| - test1, |
575 |
| - test2, |
576 |
| - test3, |
577 |
| - test4, |
578 |
| - test5, |
579 |
| - test6, |
580 |
| - test7, |
581 |
| - test8, |
582 |
| - test9, |
583 |
| - test10 |
584 |
| - ] |
585 |
| - |
586 |
| - tests.forEach((test) => { |
587 |
| - test() |
588 |
| - .then(() => passes++) |
589 |
| - .catch((err) => { |
590 |
| - failures++ |
591 |
| - console.error(err) |
592 |
| - }) |
593 |
| - }) |
594 |
| - |
595 |
| - process.on('exit', () => { |
596 |
| - if (failures) { |
597 |
| - console.error(`\n\u001b[31mThere were ${failures} test failures\u001b[39m`) |
598 |
| - } else if (passes === tests.length) { |
599 |
| - console.error('\n\u001b[32mAll tests have passed!\u001b[39m') |
600 |
| - } else { |
601 |
| - console.error(`\n\u001b[31mNot all tests seem to have run, something's wrong\u001b[39m`) |
602 |
| - } |
603 |
| - }) |
604 |
| -} |
0 commit comments