You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
5.6 KiB

/* Copyright (c) 2012-2016 LevelUP contributors
* See list at <https://github.com/level/levelup#contributing>
* MIT License <https://github.com/level/levelup/blob/master/LICENSE.md>
*/
var levelup = require('../lib/levelup.js')
var async = require('async')
var common = require('./common')
var assert = require('referee').assert
var refute = require('referee').refute
var buster = require('bustermove')
buster.testCase('Deferred open()', {
'setUp': common.commonSetUp,
'tearDown': common.commonTearDown,
'put() and get() on pre-opened database': function (done) {
var location = common.nextLocation()
// 1) open database without callback, opens in worker thread
var db = levelup(location, { createIfMissing: true, errorIfExists: true, valueEncoding: 'utf8' })
this.closeableDatabases.push(db)
this.cleanupDirs.push(location)
assert.isObject(db)
assert.equals(db.location, location)
async.parallel([
// 2) insert 3 values with put(), these should be deferred until the database is actually open
db.put.bind(db, 'k1', 'v1'),
db.put.bind(db, 'k2', 'v2'),
db.put.bind(db, 'k3', 'v3')
], function () {
// 3) when the callbacks have returned, the database should be open and those values should be in
// verify that the values are there
async.forEach([1, 2, 3], function (k, cb) {
db.get('k' + k, function (err, v) {
refute(err)
assert.equals(v, 'v' + k)
cb()
})
}, function () {
db.get('k4', function (err) {
assert(err)
// DONE
done()
})
})
})
// we should still be in a state of limbo down here, not opened or closed, but 'new'
refute(db.isOpen())
refute(db.isClosed())
},
'batch() on pre-opened database': function (done) {
var location = common.nextLocation()
// 1) open database without callback, opens in worker thread
var db = levelup(location, { createIfMissing: true, errorIfExists: true, valueEncoding: 'utf8' })
this.closeableDatabases.push(db)
this.cleanupDirs.push(location)
assert.isObject(db)
assert.equals(db.location, location)
// 2) insert 3 values with batch(), these should be deferred until the database is actually open
db.batch([
{ type: 'put', key: 'k1', value: 'v1' },
{ type: 'put', key: 'k2', value: 'v2' },
{ type: 'put', key: 'k3', value: 'v3' }
], function () {
// 3) when the callbacks have returned, the database should be open and those values should be in
// verify that the values are there
async.forEach([1, 2, 3], function (k, cb) {
db.get('k' + k, function (err, v) {
refute(err)
assert.equals(v, 'v' + k)
cb()
})
}, function () {
db.get('k4', function (err) {
assert(err)
// DONE
done()
})
})
})
// we should still be in a state of limbo down here, not opened or closed, but 'new'
refute(db.isOpen())
refute(db.isClosed())
},
'chained batch() on pre-opened database': function (done) {
var location = common.nextLocation()
// 1) open database without callback, opens in worker thread
var db = levelup(location, { createIfMissing: true, errorIfExists: true, valueEncoding: 'utf8' })
this.closeableDatabases.push(db)
this.cleanupDirs.push(location)
assert.isObject(db)
assert.equals(db.location, location)
// 2) insert 3 values with batch(), these should be deferred until the database is actually open
db.batch()
.put('k1', 'v1')
.put('k2', 'v2')
.put('k3', 'v3')
.write(function () {
// 3) when the callbacks have returned, the database should be open and those values should be in
// verify that the values are there
async.forEach([1, 2, 3], function (k, cb) {
db.get('k' + k, function (err, v) {
refute(err)
assert.equals(v, 'v' + k)
cb()
})
}, function () {
db.get('k4', function (err) {
assert(err)
// DONE
done()
})
})
})
// we should still be in a state of limbo down here, not opened or closed, but 'new'
refute(db.isOpen())
refute(db.isClosed())
},
'test deferred ReadStream': {
'setUp': common.readStreamSetUp,
'simple ReadStream': function (done) {
this.openTestDatabase(function (db) {
var location = db.location
db.batch(this.sourceData.slice(), function (err) {
refute(err)
db.close(function (err) {
refute(err, 'no error')
db = levelup(location, { createIfMissing: false, errorIfExists: false })
var rs = db.createReadStream()
rs.on('data', this.dataSpy)
rs.on('end', this.endSpy)
rs.on('close', this.verify.bind(this, rs, done))
}.bind(this))
}.bind(this))
}.bind(this))
}
},
'maxListeners warning': function (done) {
var location = common.nextLocation()
// 1) open database without callback, opens in worker thread
var db = levelup(location, { createIfMissing: true, errorIfExists: true, valueEncoding: 'utf8' })
var stderrMock = this.mock(console)
this.closeableDatabases.push(db)
this.cleanupDirs.push(location)
stderrMock.expects('error').never()
// 2) provoke an EventEmitter maxListeners warning
var toPut = 11
for (var i = 0; i < toPut; i++) {
db.put('some', 'string', function (err) {
refute(err)
if (!--toPut) {
done()
}
})
}
}
})