47a18b05f5
pointing to fix/store-performance branch fix:typo fix: indentation test: Changing test to reflect new orbit-store default Update package.json test: updating tests update localstorage-level-migration dep experiment:Moving keystore up ALL way orbitdb storage adapter mark 1 fix: more passing tests more fixes chore:package-lock.json reverting mkdir.c for now package-lock.json for node 10.13 fix: circleci fix: webpack fs updates disabling loadCache Moving storage adapter to its own thing tests: fixing up chore: long needed fixing More linting tests: fix up look sharp test: v0 failure only Reversting lint fixes fix v0-load test set cache heads fix: passing in storage no longer needed fix: removing artifact from previous merge fix: honor default keystore and pesky call-by-reference bug fix: removing directory arg from _addManifestToCache chore: package-lock fix: pending drop test removing directory option for individual dbs docs: removing directory options fix: removing line instead of commenting fix: moving storage setup to createInstance feat: Upgrading ipfs to 0.36 chore: package-log fix: restoring onlyHash workaround: removing memstore from replication tests fix: this.keystore.close and this.cache.close chore: removing eslint annotation chore: package-lock.json fix: passing preCreate in as option chore: package files Fixing package.json fixing replicate tests Fixing some tests Updating orbit-db-store dependency CircleCI updates - To be obviated via other PR Restoring ability to pass a custom directory to orbitdb.create More test fixes set identity tests fixed Fixing replication tests Temporarily disabling concurrency tests Closing keystore in identities test Restoring test:all package.json More replicate test fixes successful make rebuild Linting fixes
169 lines
5.5 KiB
JavaScript
169 lines
5.5 KiB
JavaScript
'use strict'
|
|
|
|
const assert = require('assert')
|
|
const mapSeries = require('p-each-series')
|
|
const rmrf = require('rimraf')
|
|
const OrbitDB = require('../src/OrbitDB')
|
|
|
|
// Include test utilities
|
|
const {
|
|
config,
|
|
startIpfs,
|
|
stopIpfs,
|
|
testAPIs,
|
|
connectPeers,
|
|
waitForPeers,
|
|
} = require('./utils')
|
|
|
|
const dbPath1 = './orbitdb/tests/replicate-and-load/1'
|
|
const dbPath2 = './orbitdb/tests/replicate-and-load/2'
|
|
const ipfsPath1 = './orbitdb/tests/replicate-and-load/1/ipfs'
|
|
const ipfsPath2 = './orbitdb/tests/replicate-and-load/2/ipfs'
|
|
|
|
Object.keys(testAPIs).forEach(API => {
|
|
describe(`orbit-db - Replicate and Load (${API})`, function() {
|
|
this.timeout(config.timeout)
|
|
|
|
let ipfsd1, ipfsd2, ipfs1, ipfs2
|
|
let orbitdb1, orbitdb2, db1, db2
|
|
|
|
before(async () => {
|
|
config.daemon1.repo = ipfsPath1
|
|
config.daemon2.repo = ipfsPath2
|
|
rmrf.sync(config.daemon1.repo)
|
|
rmrf.sync(config.daemon2.repo)
|
|
rmrf.sync(dbPath1)
|
|
rmrf.sync(dbPath2)
|
|
ipfsd1 = await startIpfs(API, config.daemon1)
|
|
ipfsd2 = await startIpfs(API, config.daemon2)
|
|
ipfs1 = ipfsd1.api
|
|
ipfs2 = ipfsd2.api
|
|
orbitdb1 = await OrbitDB.createInstance(ipfs1, { directory: dbPath1 })
|
|
orbitdb2 = await OrbitDB.createInstance(ipfs2, { directory: dbPath2 })
|
|
// Connect the peers manually to speed up test times
|
|
await connectPeers(ipfs1, ipfs2)
|
|
})
|
|
|
|
after(async () => {
|
|
if(orbitdb1)
|
|
await orbitdb1.stop()
|
|
|
|
if(orbitdb2)
|
|
await orbitdb2.stop()
|
|
|
|
if (ipfsd1)
|
|
await stopIpfs(ipfsd1)
|
|
|
|
if (ipfsd2)
|
|
await stopIpfs(ipfsd2)
|
|
})
|
|
|
|
describe('two peers', function() {
|
|
// Opens two databases db1 and db2 and gives write-access to both of the peers
|
|
const openDatabases1 = async (options) => {
|
|
// Set write access for both clients
|
|
options.write = [
|
|
orbitdb1.identity.publicKey,
|
|
orbitdb2.identity.publicKey
|
|
],
|
|
|
|
options = Object.assign({}, options, { path: dbPath1 })
|
|
db1 = await orbitdb1.eventlog('replicate-and-load-tests', options)
|
|
// Set 'localOnly' flag on and it'll error if the database doesn't exist locally
|
|
options = Object.assign({}, options, { path: dbPath2 })
|
|
db2 = await orbitdb2.eventlog(db1.address.toString(), options)
|
|
}
|
|
|
|
const openDatabases = async (options) => {
|
|
// Set write access for both clients
|
|
options.write = [
|
|
orbitdb1.identity.publicKey,
|
|
orbitdb2.identity.publicKey
|
|
],
|
|
|
|
options = Object.assign({}, options, { path: dbPath1, create: true })
|
|
db1 = await orbitdb1.eventlog('tests', options)
|
|
// Set 'localOnly' flag on and it'll error if the database doesn't exist locally
|
|
options = Object.assign({}, options, { path: dbPath2 })
|
|
db2 = await orbitdb2.eventlog(db1.address.toString(), options)
|
|
}
|
|
|
|
beforeEach(async () => {
|
|
await openDatabases({ sync: true })
|
|
|
|
assert.equal(db1.address.toString(), db2.address.toString())
|
|
|
|
console.log("Waiting for peers...")
|
|
await waitForPeers(ipfs1, [orbitdb2.id], db1.address.toString())
|
|
await waitForPeers(ipfs2, [orbitdb1.id], db1.address.toString())
|
|
console.log("Found peers")
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await db1.drop()
|
|
await db2.drop()
|
|
})
|
|
|
|
it('replicates database of 100 entries and loads it from the disk', async () => {
|
|
const entryCount = 100
|
|
const entryArr = []
|
|
let timer
|
|
|
|
for (let i = 0; i < entryCount; i ++)
|
|
entryArr.push(i)
|
|
|
|
await mapSeries(entryArr, (i) => db1.add('hello' + i))
|
|
|
|
return new Promise((resolve, reject) => {
|
|
timer = setInterval(async () => {
|
|
const items = db2.iterator({ limit: -1 }).collect()
|
|
if (items.length === entryCount) {
|
|
clearInterval(timer)
|
|
assert.equal(items.length, entryCount)
|
|
assert.equal(items[0].payload.value, 'hello0')
|
|
assert.equal(items[items.length - 1].payload.value, 'hello99')
|
|
|
|
db2 = null
|
|
|
|
try {
|
|
|
|
// Set write access for both clients
|
|
let options = {
|
|
accessController: {
|
|
write: [
|
|
orbitdb1.identity.id,
|
|
orbitdb2.identity.id
|
|
]
|
|
}
|
|
}
|
|
|
|
// Get the previous address to make sure nothing mutates it
|
|
const addr = db1.address.toString()
|
|
|
|
// Open the database again (this time from the disk)
|
|
options = Object.assign({}, options, { path: dbPath1, create: false })
|
|
db1 = await orbitdb1.eventlog(addr, options)
|
|
// Set 'localOnly' flag on and it'll error if the database doesn't exist locally
|
|
options = Object.assign({}, options, { path: dbPath2, localOnly: true })
|
|
db2 = await orbitdb2.eventlog(addr, options)
|
|
|
|
await db1.load()
|
|
await db2.load()
|
|
|
|
// Make sure we have all the entries in the databases
|
|
const result1 = db1.iterator({ limit: -1 }).collect()
|
|
const result2 = db2.iterator({ limit: -1 }).collect()
|
|
assert.equal(result1.length, entryCount)
|
|
assert.equal(result2.length, entryCount)
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
resolve()
|
|
}
|
|
}, 100)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|