login-flow-port-isolation-smoke-test.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. 'use strict';
  2. const assert = require('node:assert/strict');
  3. const net = require('node:net');
  4. const path = require('node:path');
  5. const ROOT = path.resolve(__dirname, '..');
  6. function listenEphemeral() {
  7. return new Promise((resolve, reject) => {
  8. const server = net.createServer();
  9. server.once('error', reject);
  10. server.listen(0, '127.0.0.1', () => resolve(server));
  11. });
  12. }
  13. async function main() {
  14. const previousFlowPort = process.env.QIWEI_FLOW_PORT;
  15. const blocker = await listenEphemeral();
  16. try {
  17. const occupiedPort = blocker.address().port;
  18. process.env.QIWEI_FLOW_PORT = String(occupiedPort);
  19. const { canListen, defaultFlowPort, selectFlowPort } = require(path.join(ROOT, 'bin', 'qiwei-training.js'));
  20. const selectedPort = await selectFlowPort(4320);
  21. assert.equal(defaultFlowPort(4320), 4310);
  22. assert.notEqual(selectedPort, occupiedPort);
  23. assert.equal(await canListen(selectedPort), true);
  24. process.stdout.write(`${JSON.stringify({
  25. status: 'ok',
  26. checks: 3,
  27. coverage: [
  28. 'default_dashboard_flow_port_pair',
  29. 'occupied_flow_port_selects_next_available_port',
  30. 'selected_flow_port_is_listenable',
  31. ],
  32. }, null, 2)}\n`);
  33. } finally {
  34. await new Promise(resolve => blocker.close(resolve));
  35. if (previousFlowPort === undefined) delete process.env.QIWEI_FLOW_PORT;
  36. else process.env.QIWEI_FLOW_PORT = previousFlowPort;
  37. }
  38. }
  39. main().catch(error => {
  40. process.stderr.write(`${error.stack || error.message}\n`);
  41. process.exitCode = 1;
  42. });