training-update-smoke-test.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. 'use strict';
  2. const assert = require('assert/strict');
  3. const fs = require('fs');
  4. const http = require('http');
  5. const os = require('os');
  6. const path = require('path');
  7. const {
  8. readLocalVersion,
  9. compareVersions,
  10. checkForUpdate,
  11. isCompiledDelivery,
  12. spawnUpdateHelper,
  13. } = require('../mcp/src/core/update-service');
  14. async function main() {
  15. const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-update-smoke-'));
  16. const runtime = path.join(root, 'outputs', 'runtime');
  17. fs.mkdirSync(runtime, { recursive: true });
  18. fs.writeFileSync(path.join(root, 'version.json'), JSON.stringify({ product: 'fmode-qiwei-training', version: '0.5.2', platform: 'win-x64' }), 'utf8');
  19. const server = http.createServer((req, res) => {
  20. res.writeHead(200, { 'content-type': 'application/json' });
  21. res.end(JSON.stringify({
  22. product: 'fmode-qiwei-training',
  23. version: '0.5.3',
  24. notes: 'smoke',
  25. platforms: { 'win-x64': { url: 'https://example.invalid/update.zip', sha256: '0'.repeat(64) } },
  26. }));
  27. });
  28. await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
  29. const url = `http://127.0.0.1:${server.address().port}/latest.json`;
  30. try {
  31. assert.equal(readLocalVersion(root).version, '0.5.2');
  32. assert.equal(compareVersions('0.5.3', '0.5.2'), 1);
  33. assert.equal(compareVersions('0.5.2', '0.5.2'), 0);
  34. const result = await checkForUpdate({ root, manifestUrl: url, timeoutMs: 2000 });
  35. assert.equal(result.status, 'update_available');
  36. assert.equal(result.latest.version, '0.5.3');
  37. assert.equal(result.release.url, 'https://example.invalid/update.zip');
  38. assert.equal(fs.existsSync(path.join(runtime, 'update-status.json')), true);
  39. if (!isCompiledDelivery()) {
  40. assert.throws(() => spawnUpdateHelper('missing.zip', root), /开发源码模式/);
  41. }
  42. process.stdout.write(JSON.stringify({ status: 'passed', checks: ['version-read', 'semver-compare', 'manifest-check', 'source-replacement-guard'] }, null, 2) + '\n');
  43. } finally {
  44. await new Promise(resolve => server.close(resolve));
  45. fs.rmSync(root, { recursive: true, force: true });
  46. }
  47. }
  48. main().catch(error => {
  49. process.stderr.write(JSON.stringify({ status: 'failed', message: error.message, stack: error.stack }, null, 2) + '\n');
  50. process.exitCode = 1;
  51. });