pulsar/spec/file-system-blob-store-spec.coffee

106 lines
3.6 KiB
CoffeeScript
Raw Normal View History

2017-03-02 11:11:54 +03:00
temp = require('temp').track()
path = require 'path'
fs = require 'fs-plus'
FileSystemBlobStore = require '../src/file-system-blob-store'
describe "FileSystemBlobStore", ->
[storageDirectory, blobStore] = []
beforeEach ->
storageDirectory = temp.path('atom-spec-filesystemblobstore')
blobStore = FileSystemBlobStore.load(storageDirectory)
afterEach ->
fs.removeSync(storageDirectory)
it "is empty when the file doesn't exist", ->
expect(blobStore.get("foo")).toBeUndefined()
expect(blobStore.get("bar")).toBeUndefined()
2017-03-02 11:11:54 +03:00
it "allows to read and write buffers from/to memory without persisting them", ->
blobStore.set("foo", new Buffer("foo"))
blobStore.set("bar", new Buffer("bar"))
2017-03-02 11:11:54 +03:00
expect(blobStore.get("foo")).toEqual(new Buffer("foo"))
expect(blobStore.get("bar")).toEqual(new Buffer("bar"))
2017-03-02 11:11:54 +03:00
expect(blobStore.get("baz")).toBeUndefined()
expect(blobStore.get("qux")).toBeUndefined()
2017-03-02 11:11:54 +03:00
it "persists buffers when saved and retrieves them on load, giving priority to in-memory ones", ->
blobStore.set("foo", new Buffer("foo"))
blobStore.set("bar", new Buffer("bar"))
2017-03-02 11:11:54 +03:00
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
expect(blobStore.get("foo")).toEqual(new Buffer("foo"))
expect(blobStore.get("bar")).toEqual(new Buffer("bar"))
expect(blobStore.get("baz")).toBeUndefined()
expect(blobStore.get("qux")).toBeUndefined()
2017-03-02 11:11:54 +03:00
blobStore.set("foo", new Buffer("changed"))
2017-03-02 11:11:54 +03:00
expect(blobStore.get("foo")).toEqual(new Buffer("changed"))
2017-03-02 11:11:54 +03:00
it "persists in-memory and previously stored buffers, and deletes unused keys when saved", ->
blobStore.set("foo", new Buffer("foo"))
blobStore.set("bar", new Buffer("bar"))
2017-03-02 11:11:54 +03:00
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
blobStore.set("bar", new Buffer("changed"))
blobStore.set("qux", new Buffer("qux"))
2017-03-02 11:11:54 +03:00
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
expect(blobStore.get("foo")).toBeUndefined()
expect(blobStore.get("bar")).toEqual(new Buffer("changed"))
expect(blobStore.get("qux")).toEqual(new Buffer("qux"))
2017-03-02 11:11:54 +03:00
it "allows to delete keys from both memory and stored buffers", ->
blobStore.set("a", new Buffer("a"))
blobStore.set("b", new Buffer("b"))
2017-03-02 11:11:54 +03:00
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
blobStore.get("a") # prevent the key from being deleted on save
blobStore.set("b", new Buffer("b"))
blobStore.set("c", new Buffer("c"))
2017-03-02 11:11:54 +03:00
blobStore.delete("b")
blobStore.delete("c")
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
expect(blobStore.get("a")).toEqual(new Buffer("a"))
expect(blobStore.get("b")).toBeUndefined()
expect(blobStore.get("b")).toBeUndefined()
expect(blobStore.get("c")).toBeUndefined()
2017-03-02 11:11:54 +03:00
it "ignores errors when loading an invalid blob store", ->
blobStore.set("a", new Buffer("a"))
blobStore.set("b", new Buffer("b"))
2017-03-02 11:11:54 +03:00
blobStore.save()
# Simulate corruption
fs.writeFileSync(path.join(storageDirectory, "MAP"), new Buffer([0]))
fs.writeFileSync(path.join(storageDirectory, "INVKEYS"), new Buffer([0]))
fs.writeFileSync(path.join(storageDirectory, "BLOB"), new Buffer([0]))
blobStore = FileSystemBlobStore.load(storageDirectory)
expect(blobStore.get("a")).toBeUndefined()
expect(blobStore.get("b")).toBeUndefined()
2017-03-02 11:11:54 +03:00
blobStore.set("a", new Buffer("x"))
blobStore.set("b", new Buffer("y"))
2017-03-02 11:11:54 +03:00
blobStore.save()
blobStore = FileSystemBlobStore.load(storageDirectory)
expect(blobStore.get("a")).toEqual(new Buffer("x"))
expect(blobStore.get("b")).toEqual(new Buffer("y"))