packager.test.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. 'use strict';
  2. const assert = require('assert');
  3. const fs = require('fs');
  4. const os = require('os');
  5. const path = require('path');
  6. const {
  7. BOOTSTRAP_MARKER,
  8. packageHotUpdate,
  9. } = require('../lib/packager');
  10. async function main() {
  11. const fixtureRoot = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'hot-update-builder-'));
  12. try {
  13. const projectPath = path.join(fixtureRoot, 'project');
  14. const buildRoot = path.join(projectPath, 'build', 'android');
  15. const dataRoot = path.join(buildRoot, 'data');
  16. await fs.promises.mkdir(path.join(dataRoot, 'src'), { recursive: true });
  17. await fs.promises.mkdir(path.join(dataRoot, 'assets', 'main'), { recursive: true });
  18. await fs.promises.mkdir(path.join(dataRoot, 'jsb-adapter'), { recursive: true });
  19. await fs.promises.writeFile(
  20. path.join(projectPath, 'package.json'),
  21. JSON.stringify({ creator: { version: '3.8.8' } }),
  22. );
  23. await fs.promises.writeFile(path.join(dataRoot, 'main.js'), 'require("src/system.bundle.js");\n');
  24. await fs.promises.writeFile(path.join(dataRoot, 'application.js'), 'application();\n');
  25. await fs.promises.writeFile(path.join(dataRoot, 'src', 'system.bundle.js'), 'system();\n');
  26. await fs.promises.writeFile(path.join(dataRoot, 'assets', 'main', 'config.json'), '{}\n');
  27. await fs.promises.writeFile(path.join(dataRoot, 'jsb-adapter', 'engine-adapter.js'), 'adapter();\n');
  28. const input = {
  29. buildOptions: { platform: 'android', md5Cache: false },
  30. buildResult: { dest: buildRoot },
  31. remoteUrl: 'https://cdn.example.com/game/android/1.2.3',
  32. version: '1.2.3',
  33. projectPath,
  34. };
  35. const first = await packageHotUpdate(input);
  36. const second = await packageHotUpdate(input);
  37. const manifest = JSON.parse(await fs.promises.readFile(first.localManifestPath, 'utf8'));
  38. assert.equal(manifest.packageUrl, 'https://cdn.example.com/game/android/1.2.3/');
  39. assert.equal(manifest.version, '1.2.3');
  40. assert.equal(manifest.engineVersion, '3.8.8');
  41. assert.ok(manifest.assets['application.js']);
  42. assert.ok(manifest.assets['src/system.bundle.js']);
  43. assert.ok(manifest.assets['assets/main/config.json']);
  44. assert.ok(manifest.assets['jsb-adapter/engine-adapter.js']);
  45. assert.equal(first.fileCount, 4);
  46. assert.equal(second.fileCount, 4);
  47. const mainScript = await fs.promises.readFile(path.join(dataRoot, 'main.js'), 'utf8');
  48. assert.equal(mainScript.split(BOOTSTRAP_MARKER).length - 1, 1, 'bootstrap should only be injected once');
  49. assert.ok(await exists(path.join(first.remotePackagePath, 'project.manifest')));
  50. assert.ok(await exists(path.join(first.remotePackagePath, 'application.js')));
  51. assert.ok(await exists(path.join(first.remotePackagePath, 'assets', 'main', 'config.json')));
  52. console.log('hot-update-builder packager tests passed');
  53. } finally {
  54. await fs.promises.rm(fixtureRoot, { recursive: true, force: true });
  55. }
  56. }
  57. async function exists(target) {
  58. try {
  59. await fs.promises.access(target);
  60. return true;
  61. } catch {
  62. return false;
  63. }
  64. }
  65. main().catch((error) => {
  66. console.error(error);
  67. process.exitCode = 1;
  68. });