native-compile-cache-spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * decaffeinate suggestions:
  3. * DS101: Remove unnecessary use of Array.from
  4. * DS102: Remove unnecessary code created because of implicit returns
  5. * DS207: Consider shorter variations of null checks
  6. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
  7. */
  8. const fs = require('fs');
  9. const path = require('path');
  10. const Module = require('module');
  11. describe("NativeCompileCache", function() {
  12. const nativeCompileCache = require('../src/native-compile-cache');
  13. let [fakeCacheStore, cachedFiles] = Array.from([]);
  14. beforeEach(function() {
  15. cachedFiles = [];
  16. fakeCacheStore = jasmine.createSpyObj("cache store", ["set", "get", "has", "delete"]);
  17. fakeCacheStore.has.andCallFake(cacheKey => fakeCacheStore.get(cacheKey) != null);
  18. fakeCacheStore.get.andCallFake(function(cacheKey) {
  19. for (let i = cachedFiles.length - 1; i >= 0; i--) {
  20. const entry = cachedFiles[i];
  21. if (entry.cacheKey !== cacheKey) { continue; }
  22. return entry.cacheBuffer;
  23. }
  24. });
  25. fakeCacheStore.set.andCallFake((cacheKey, cacheBuffer) => cachedFiles.push({cacheKey, cacheBuffer}));
  26. nativeCompileCache.setCacheStore(fakeCacheStore);
  27. nativeCompileCache.setV8Version("a-v8-version");
  28. return nativeCompileCache.install();
  29. });
  30. it("writes and reads from the cache storage when requiring files", function() {
  31. let fn1 = require('./fixtures/native-cache/file-1');
  32. const fn2 = require('./fixtures/native-cache/file-2');
  33. expect(cachedFiles.length).toBe(2);
  34. expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array);
  35. expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0);
  36. expect(fn1()).toBe(1);
  37. expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array);
  38. expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0);
  39. expect(fn2()).toBe(2);
  40. delete Module._cache[require.resolve('./fixtures/native-cache/file-1')];
  41. fn1 = require('./fixtures/native-cache/file-1');
  42. expect(cachedFiles.length).toBe(2);
  43. return expect(fn1()).toBe(1);
  44. });
  45. describe("when v8 version changes", () => it("updates the cache of previously required files", function() {
  46. nativeCompileCache.setV8Version("version-1");
  47. let fn4 = require('./fixtures/native-cache/file-4');
  48. expect(cachedFiles.length).toBe(1);
  49. expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array);
  50. expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0);
  51. expect(fn4()).toBe("file-4");
  52. nativeCompileCache.setV8Version("version-2");
  53. delete Module._cache[require.resolve('./fixtures/native-cache/file-4')];
  54. fn4 = require('./fixtures/native-cache/file-4');
  55. expect(cachedFiles.length).toBe(2);
  56. expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array);
  57. return expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0);
  58. }));
  59. describe("when a previously required and cached file changes", function() {
  60. beforeEach(() => fs.writeFileSync(path.resolve(__dirname + '/fixtures/native-cache/file-5'), `\
  61. module.exports = function () { return "file-5" }\
  62. `
  63. ));
  64. afterEach(() => fs.unlinkSync(path.resolve(__dirname + '/fixtures/native-cache/file-5')));
  65. return it("removes it from the store and re-inserts it with the new cache", function() {
  66. let fn5 = require('./fixtures/native-cache/file-5');
  67. expect(cachedFiles.length).toBe(1);
  68. expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array);
  69. expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0);
  70. expect(fn5()).toBe("file-5");
  71. delete Module._cache[require.resolve('./fixtures/native-cache/file-5')];
  72. fs.appendFileSync(require.resolve('./fixtures/native-cache/file-5'), "\n\n");
  73. fn5 = require('./fixtures/native-cache/file-5');
  74. expect(cachedFiles.length).toBe(2);
  75. expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array);
  76. return expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0);
  77. });
  78. });
  79. return it("deletes previously cached code when the cache is an invalid file", function() {
  80. fakeCacheStore.has.andReturn(true);
  81. fakeCacheStore.get.andCallFake(() => Buffer.from("an invalid cache"));
  82. const fn3 = require('./fixtures/native-cache/file-3');
  83. expect(fakeCacheStore.delete).toHaveBeenCalled();
  84. return expect(fn3()).toBe(3);
  85. });
  86. });