42885b20a4
Use latest store modules from npm Update README Update docs Update examples Update benchmarks Update dependencies Add Getting Started guide Add new a screenshot Add a new live demo Add persistency tests for snapshot saving/loading and events Add network stress tests (but skip them by default as they're very heavy and lengthy) Add browser benchmarks Add log() alias for eventlog() database Add possibility to create database if it doesn't exist yet Add support for orbitdb addresses Add a test for starting replication when peers connect Add debug build Use IPFS nodeID as default user id Use ipfs-pubsub-room Handle closing of databases properly Handle cache errors Clean up tests, re-organize code files Clean up code style Support for CLI Remove obsolete scripts
186 lines
5.4 KiB
JavaScript
186 lines
5.4 KiB
JavaScript
'use strict'
|
|
|
|
const assert = require('assert')
|
|
const mapSeries = require('p-map-series')
|
|
const rmrf = require('rimraf')
|
|
const OrbitDB = require('../src/OrbitDB')
|
|
const config = require('./utils/config')
|
|
const startIpfs = require('./utils/start-ipfs')
|
|
|
|
const dbPath = './orbitdb/tests/persistency'
|
|
const ipfsPath = './orbitdb/tests/persistency/ipfs'
|
|
|
|
describe('orbit-db - Persistency', function() {
|
|
this.timeout(config.timeout)
|
|
|
|
const entryCount = 100
|
|
|
|
let ipfs, orbitdb1, db, address
|
|
|
|
before(async () => {
|
|
config.daemon1.repo = ipfsPath
|
|
rmrf.sync(config.daemon1.repo)
|
|
rmrf.sync(dbPath)
|
|
ipfs = await startIpfs(config.daemon1)
|
|
orbitdb1 = new OrbitDB(ipfs, dbPath + '/1')
|
|
})
|
|
|
|
after(async () => {
|
|
if(orbitdb1)
|
|
orbitdb1.stop()
|
|
|
|
if (ipfs)
|
|
await ipfs.stop()
|
|
})
|
|
|
|
describe('load', function() {
|
|
beforeEach(async () => {
|
|
const dbName = new Date().getTime().toString()
|
|
const entryArr = []
|
|
|
|
for (let i = 0; i < entryCount; i ++)
|
|
entryArr.push(i)
|
|
|
|
db = await orbitdb1.eventlog(dbName)
|
|
address = db.address.toString()
|
|
await mapSeries(entryArr, (i) => db.add('hello' + i))
|
|
await db.close()
|
|
db = null
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await db.drop()
|
|
})
|
|
|
|
it('loads database from local cache', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
await db.load()
|
|
const items = db.iterator({ limit: -1 }).collect()
|
|
assert.equal(items.length, entryCount)
|
|
assert.equal(items[0].payload.value, 'hello0')
|
|
assert.equal(items[entryCount - 1].payload.value, 'hello99')
|
|
})
|
|
|
|
it('loading a database emits \'ready\' event', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
return new Promise(async (resolve) => {
|
|
db.events.on('ready', () => {
|
|
const items = db.iterator({ limit: -1 }).collect()
|
|
assert.equal(items.length, entryCount)
|
|
assert.equal(items[0].payload.value, 'hello0')
|
|
assert.equal(items[entryCount - 1].payload.value, 'hello99')
|
|
resolve()
|
|
})
|
|
await db.load()
|
|
})
|
|
})
|
|
|
|
it('loading a database emits \'load.progress\' event', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
return new Promise(async (resolve, reject) => {
|
|
let count = 0
|
|
db.events.on('load.progress', (address, hash, entry, progress, total) => {
|
|
count ++
|
|
try {
|
|
assert.equal(address, db.address.toString())
|
|
assert.equal(total, entryCount)
|
|
assert.equal(progress, count)
|
|
assert.notEqual(hash, null)
|
|
assert.notEqual(entry, null)
|
|
if (progress === entryCount && count === entryCount) {
|
|
resolve()
|
|
}
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
})
|
|
// Start loading the database
|
|
await db.load()
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('load from snapshot', function() {
|
|
beforeEach(async () => {
|
|
const dbName = new Date().getTime().toString()
|
|
const entryArr = []
|
|
|
|
for (let i = 0; i < entryCount; i ++)
|
|
entryArr.push(i)
|
|
|
|
db = await orbitdb1.eventlog(dbName)
|
|
address = db.address.toString()
|
|
await mapSeries(entryArr, (i) => db.add('hello' + i))
|
|
await db.saveSnapshot()
|
|
await db.close()
|
|
db = null
|
|
})
|
|
|
|
afterEach(async () => {
|
|
await db.drop()
|
|
})
|
|
|
|
it('loads database from snapshot', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
await db.loadFromSnapshot()
|
|
const items = db.iterator({ limit: -1 }).collect()
|
|
assert.equal(items.length, entryCount)
|
|
assert.equal(items[0].payload.value, 'hello0')
|
|
assert.equal(items[entryCount - 1].payload.value, 'hello99')
|
|
})
|
|
|
|
it('throws an error when trying to load a missing snapshot', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
await db.drop()
|
|
db = null
|
|
db = await orbitdb1.eventlog(address)
|
|
|
|
let err
|
|
try {
|
|
await db.loadFromSnapshot()
|
|
} catch (e) {
|
|
err = e.toString()
|
|
}
|
|
assert.equal(err, `Error: Snapshot for ${address} not found!`)
|
|
})
|
|
|
|
it('loading a database emits \'ready\' event', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
return new Promise(async (resolve) => {
|
|
db.events.on('ready', () => {
|
|
const items = db.iterator({ limit: -1 }).collect()
|
|
assert.equal(items.length, entryCount)
|
|
assert.equal(items[0].payload.value, 'hello0')
|
|
assert.equal(items[entryCount - 1].payload.value, 'hello99')
|
|
resolve()
|
|
})
|
|
await db.loadFromSnapshot()
|
|
})
|
|
})
|
|
|
|
it('loading a database emits \'load.progress\' event', async () => {
|
|
db = await orbitdb1.eventlog(address)
|
|
return new Promise(async (resolve, reject) => {
|
|
let count = 0
|
|
db.events.on('load.progress', (address, hash, entry, progress, total) => {
|
|
count ++
|
|
try {
|
|
assert.equal(address, db.address.toString())
|
|
assert.equal(total, entryCount)
|
|
assert.equal(progress, count)
|
|
assert.notEqual(hash, null)
|
|
assert.notEqual(entry, null)
|
|
if (progress === entryCount && count === entryCount) {
|
|
resolve()
|
|
}
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
})
|
|
// Start loading the database
|
|
await db.loadFromSnapshot()
|
|
})
|
|
})
|
|
})
|
|
})
|