blob: 927deafa7b08620c5d0d6d923f1a7f725a0643d9 [file] [log] [blame]
var PouchDB = require('../../packages/node_modules/pouchdb-for-coverage');
var memoryAdapter = require('../../packages/node_modules/pouchdb-adapter-memory');
PouchDB.plugin(memoryAdapter);
describe('test.memory-adapter.js', () => {
it('Race condition initially discovered with PouchDB in-memory-adapter 7.3.0', async () => {
const func1 = async () => {
const pouch1 = new PouchDB('test-db', {
adapter: 'memory'
});
const docId = 'func1doc1';
// insert
await pouch1.bulkDocs({
docs: [{
_id: docId,
value: 1,
_rev: '1-51b2fae5721cc4d3cf7392f19e6cc118'
}]
}, {
new_edits: false
});
// update
let getDocs = await pouch1.bulkGet({
docs: [{id: docId}],
revs: true,
latest: true
});
const useRevs = (getDocs).
results[0].docs[0].ok._revisions;
useRevs.start = useRevs.start + 1;
useRevs.ids.unshift('a723631364fbfa906c5ffa8203ac9725');
await pouch1.bulkDocs({
docs: [{
_id: docId,
value: 2,
_rev: '2-a723631364fbfa906c5ffa8203ac9725',
_revisions: useRevs
}]
}, {
new_edits: false
});
// delete
getDocs = await pouch1.bulkGet({
docs: [{id: docId}],
revs: true,
latest: true
});
// same via .get
await pouch1.get(docId);
// if this is switched to pouch1.destroy(); ... this test will pass.
pouch1.close();
};
const func2 = async () => {
const pouch2 = new PouchDB(
'test-db-2', {
adapter: 'memory',
});
await pouch2.createIndex({
index: {
fields: ['foo']
}
});
pouch2.destroy();
};
// func1 succeeds when run alone.
// func2 succeeds when run alone.
// As of PouchDB 7.3.0, when running these functions in parallel, there is a race condition where func2 gets
// impacted by func1. The result: func2 will hang and the test will timeout.
await Promise.all([func1(), func2()]);
});
});