mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-11-10 10:17:11 +03:00
0d29004723
This was unneeded because we can simply compute the cache key by concatenating the v8 version and the file's contents.
98 lines
3.7 KiB
CoffeeScript
98 lines
3.7 KiB
CoffeeScript
fs = require 'fs'
|
|
path = require 'path'
|
|
Module = require 'module'
|
|
|
|
describe "NativeCompileCache", ->
|
|
nativeCompileCache = require '../src/native-compile-cache'
|
|
[fakeCacheStore, cachedFiles] = []
|
|
|
|
beforeEach ->
|
|
cachedFiles = []
|
|
fakeCacheStore = jasmine.createSpyObj("cache store", ["set", "get", "has", "delete"])
|
|
|
|
fakeCacheStore.has.andCallFake (cacheKey) ->
|
|
fakeCacheStore.get(cacheKey)?
|
|
|
|
fakeCacheStore.get.andCallFake (cacheKey) ->
|
|
for entry in cachedFiles by -1
|
|
continue if entry.cacheKey isnt cacheKey
|
|
return entry.cacheBuffer
|
|
return
|
|
|
|
fakeCacheStore.set.andCallFake (cacheKey, cacheBuffer) ->
|
|
cachedFiles.push({cacheKey, cacheBuffer})
|
|
|
|
nativeCompileCache.setCacheStore(fakeCacheStore)
|
|
nativeCompileCache.setV8Version("a-v8-version")
|
|
nativeCompileCache.install()
|
|
|
|
it "writes and reads from the cache storage when requiring files", ->
|
|
fn1 = require('./fixtures/native-cache/file-1')
|
|
fn2 = require('./fixtures/native-cache/file-2')
|
|
|
|
expect(cachedFiles.length).toBe(2)
|
|
expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0)
|
|
expect(fn1()).toBe(1)
|
|
|
|
expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0)
|
|
expect(fn2()).toBe(2)
|
|
|
|
delete Module._cache[require.resolve('./fixtures/native-cache/file-1')]
|
|
fn1 = require('./fixtures/native-cache/file-1')
|
|
expect(cachedFiles.length).toBe(2)
|
|
expect(fn1()).toBe(1)
|
|
|
|
describe "when v8 version changes", ->
|
|
it "updates the cache of previously required files", ->
|
|
nativeCompileCache.setV8Version("version-1")
|
|
fn4 = require('./fixtures/native-cache/file-4')
|
|
|
|
expect(cachedFiles.length).toBe(1)
|
|
expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0)
|
|
expect(fn4()).toBe("file-4")
|
|
|
|
nativeCompileCache.setV8Version("version-2")
|
|
delete Module._cache[require.resolve('./fixtures/native-cache/file-4')]
|
|
fn4 = require('./fixtures/native-cache/file-4')
|
|
|
|
expect(cachedFiles.length).toBe(2)
|
|
expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0)
|
|
|
|
describe "when a previously required and cached file changes", ->
|
|
beforeEach ->
|
|
fs.writeFileSync path.resolve(__dirname + '/fixtures/native-cache/file-5'), """
|
|
module.exports = function () { return "file-5" }
|
|
"""
|
|
|
|
afterEach ->
|
|
fs.unlinkSync path.resolve(__dirname + '/fixtures/native-cache/file-5')
|
|
|
|
it "removes it from the store and re-inserts it with the new cache", ->
|
|
fn5 = require('./fixtures/native-cache/file-5')
|
|
|
|
expect(cachedFiles.length).toBe(1)
|
|
expect(cachedFiles[0].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[0].cacheBuffer.length).toBeGreaterThan(0)
|
|
expect(fn5()).toBe("file-5")
|
|
|
|
delete Module._cache[require.resolve('./fixtures/native-cache/file-5')]
|
|
fs.appendFileSync(require.resolve('./fixtures/native-cache/file-5'), "\n\n")
|
|
fn5 = require('./fixtures/native-cache/file-5')
|
|
|
|
expect(cachedFiles.length).toBe(2)
|
|
expect(cachedFiles[1].cacheBuffer).toBeInstanceOf(Uint8Array)
|
|
expect(cachedFiles[1].cacheBuffer.length).toBeGreaterThan(0)
|
|
|
|
it "deletes previously cached code when the cache is an invalid file", ->
|
|
fakeCacheStore.has.andReturn(true)
|
|
fakeCacheStore.get.andCallFake -> new Buffer("an invalid cache")
|
|
|
|
fn3 = require('./fixtures/native-cache/file-3')
|
|
|
|
expect(fakeCacheStore.delete).toHaveBeenCalled()
|
|
expect(fn3()).toBe(3)
|