file-system-blob-store-spec.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const temp = require('temp').track();
  2. const path = require('path');
  3. const fs = require('fs-plus');
  4. const FileSystemBlobStore = require('../src/file-system-blob-store');
  5. describe('FileSystemBlobStore', function() {
  6. let [storageDirectory, blobStore] = [];
  7. beforeEach(function() {
  8. storageDirectory = temp.path('atom-spec-filesystemblobstore');
  9. blobStore = FileSystemBlobStore.load(storageDirectory);
  10. });
  11. afterEach(() => fs.removeSync(storageDirectory));
  12. it("is empty when the file doesn't exist", function() {
  13. expect(blobStore.get('foo')).toBeUndefined();
  14. expect(blobStore.get('bar')).toBeUndefined();
  15. });
  16. it('allows to read and write buffers from/to memory without persisting them', function() {
  17. blobStore.set('foo', Buffer.from('foo'));
  18. blobStore.set('bar', Buffer.from('bar'));
  19. expect(blobStore.get('foo')).toEqual(Buffer.from('foo'));
  20. expect(blobStore.get('bar')).toEqual(Buffer.from('bar'));
  21. expect(blobStore.get('baz')).toBeUndefined();
  22. expect(blobStore.get('qux')).toBeUndefined();
  23. });
  24. it('persists buffers when saved and retrieves them on load, giving priority to in-memory ones', function() {
  25. blobStore.set('foo', Buffer.from('foo'));
  26. blobStore.set('bar', Buffer.from('bar'));
  27. blobStore.save();
  28. blobStore = FileSystemBlobStore.load(storageDirectory);
  29. expect(blobStore.get('foo')).toEqual(Buffer.from('foo'));
  30. expect(blobStore.get('bar')).toEqual(Buffer.from('bar'));
  31. expect(blobStore.get('baz')).toBeUndefined();
  32. expect(blobStore.get('qux')).toBeUndefined();
  33. blobStore.set('foo', Buffer.from('changed'));
  34. expect(blobStore.get('foo')).toEqual(Buffer.from('changed'));
  35. });
  36. it('persists in-memory and previously stored buffers, and deletes unused keys when saved', function() {
  37. blobStore.set('foo', Buffer.from('foo'));
  38. blobStore.set('bar', Buffer.from('bar'));
  39. blobStore.save();
  40. blobStore = FileSystemBlobStore.load(storageDirectory);
  41. blobStore.set('bar', Buffer.from('changed'));
  42. blobStore.set('qux', Buffer.from('qux'));
  43. blobStore.save();
  44. blobStore = FileSystemBlobStore.load(storageDirectory);
  45. expect(blobStore.get('foo')).toBeUndefined();
  46. expect(blobStore.get('bar')).toEqual(Buffer.from('changed'));
  47. expect(blobStore.get('qux')).toEqual(Buffer.from('qux'));
  48. });
  49. it('allows to delete keys from both memory and stored buffers', function() {
  50. blobStore.set('a', Buffer.from('a'));
  51. blobStore.set('b', Buffer.from('b'));
  52. blobStore.save();
  53. blobStore = FileSystemBlobStore.load(storageDirectory);
  54. blobStore.get('a'); // prevent the key from being deleted on save
  55. blobStore.set('b', Buffer.from('b'));
  56. blobStore.set('c', Buffer.from('c'));
  57. blobStore.delete('b');
  58. blobStore.delete('c');
  59. blobStore.save();
  60. blobStore = FileSystemBlobStore.load(storageDirectory);
  61. expect(blobStore.get('a')).toEqual(Buffer.from('a'));
  62. expect(blobStore.get('b')).toBeUndefined();
  63. expect(blobStore.get('b')).toBeUndefined();
  64. expect(blobStore.get('c')).toBeUndefined();
  65. });
  66. it('ignores errors when loading an invalid blob store', function() {
  67. blobStore.set('a', Buffer.from('a'));
  68. blobStore.set('b', Buffer.from('b'));
  69. blobStore.save();
  70. // Simulate corruption
  71. fs.writeFileSync(path.join(storageDirectory, 'MAP'), Buffer.from([0]));
  72. fs.writeFileSync(path.join(storageDirectory, 'INVKEYS'), Buffer.from([0]));
  73. fs.writeFileSync(path.join(storageDirectory, 'BLOB'), Buffer.from([0]));
  74. blobStore = FileSystemBlobStore.load(storageDirectory);
  75. expect(blobStore.get('a')).toBeUndefined();
  76. expect(blobStore.get('b')).toBeUndefined();
  77. blobStore.set('a', Buffer.from('x'));
  78. blobStore.set('b', Buffer.from('y'));
  79. blobStore.save();
  80. blobStore = FileSystemBlobStore.load(storageDirectory);
  81. expect(blobStore.get('a')).toEqual(Buffer.from('x'));
  82. expect(blobStore.get('b')).toEqual(Buffer.from('y'));
  83. });
  84. });