finally fixed the timeout hack for tests

This commit is contained in:
Kevin Jahns 2015-11-18 16:17:59 +01:00
parent 5fcfbbfe94
commit 8ee563f873
4 changed files with 55 additions and 57 deletions

View File

@ -145,7 +145,7 @@ module.exports = function (gulp, helperOptions) {
'git pull',
'cd ./dist/ && git add -A',
'cd ./dist/ && git commit -am "Deploy <%= getVersion(file.path) %>" -n',
'cd ./dist/ && git push',
'cd ./dist/ && git push origin HEAD:dist',
'cd ./dist/ && git tag -a v<%= getVersion(file.path) %> -m "Release <%= getVersion(file.path) %>"',
'cd ./dist/ && git push origin --tags',
'git commit -am "Release <%= getVersion(file.path) %>" -n',

View File

@ -1,4 +1,4 @@
/* global getRandom, wait, async */
/* global getRandom, async */
'use strict'
module.exports = function (Y) {
@ -22,30 +22,34 @@ module.exports = function (Y) {
connector.userJoined(u.userId, 'master')
}
}
},
whenTransactionsFinished: function () {
var ps = []
for (var name in this.users) {
ps.push(this.users[name].y.db.whenTransactionsFinished())
}
return Promise.all(ps)
},
flushOne: function flushOne () {
var bufs = []
for (var i in globalRoom.buffers) {
if (globalRoom.buffers[i].length > 0) {
bufs.push(i)
}
}
if (bufs.length > 0) {
var userId = getRandom(bufs)
var m = globalRoom.buffers[userId].shift()
var user = globalRoom.users[userId]
user.receiveMessage(m[0], m[1])
return user.y.db.whenTransactionsFinished()
} else {
return false
}
}
}
Y.utils.globalRoom = globalRoom
function flushOne () {
var bufs = []
for (var i in globalRoom.buffers) {
if (globalRoom.buffers[i].length > 0) {
bufs.push(i)
}
}
if (bufs.length > 0) {
var userId = getRandom(bufs)
var m = globalRoom.buffers[userId].shift()
var user = globalRoom.users[userId]
user.receiveMessage(m[0], m[1])
return true
} else {
return false
}
}
// setInterval(flushOne, 10)
var userIdCounter = 0
class Test extends Y.AbstractConnector {
@ -91,17 +95,16 @@ module.exports = function (Y) {
globalRoom.removeUser(this.userId)
super.disconnect()
}
return wait()
return this.y.db.whenTransactionsFinished()
}
flush () {
var self = this
return async(function * () {
yield wait()
while (globalRoom.buffers[self.userId].length > 0) {
var m = globalRoom.buffers[self.userId].shift()
this.receiveMessage(m[0], m[1])
yield wait()
}
yield self.whenTransactionsFinished()
})
}
flushAll () {
@ -109,29 +112,19 @@ module.exports = function (Y) {
// flushes may result in more created operations,
// flush until there is nothing more to flush
function nextFlush () {
var c = flushOne()
var c = globalRoom.flushOne()
if (c) {
while (flushOne()) {
while (globalRoom.flushOne()) {
// nop
}
wait().then(nextFlush)
globalRoom.whenTransactionsFinished().then(nextFlush)
} else {
wait().then(function () {
resolve()
})
resolve()
}
}
// in the case that there are
// still actions that want to be performed
wait().then(nextFlush)
globalRoom.whenTransactionsFinished().then(nextFlush)
})
}
/*
Flushes an operation for some user..
*/
flushOne () {
flushOne()
}
}
Y.Test = Test

View File

@ -318,9 +318,23 @@ module.exports = function (Y) {
}
}
}
whenTransactionsFinished () {
if (this.transactionInProgress) {
if (this.transactionsFinished == null) {
this.transactionsFinished = Promise.defer()
}
return this.transactionsFinished.promise
} else {
return Promise.resolve()
}
}
getNextRequest () {
if (this.waitingTransactions.length === 0) {
this.transactionInProgress = false
if (this.transactionsFinished != null) {
this.transactionsFinished.resolve()
this.transactionsFinished = null
}
return null
} else {
return this.waitingTransactions.shift()

View File

@ -7,6 +7,9 @@
// When testing, you store everything on the global object. We call it g
var Y = require('./y.js')
require('../../y-memory/src/Memory.js')(Y)
require('../../y-array/src/Array.js')(Y)
require('../../y-indexeddb/src/IndexedDB.js')(Y)
module.exports = Y
var g
@ -33,6 +36,8 @@ g.describeManyTimes = function describeManyTimes (times, name, f) {
Wait for a specified amount of time (in ms). defaults to 5ms
*/
function wait (t) {
throw new Error("waiting..")
console.log("waiting..", t)
if (t == null) {
t = 5
}
@ -45,13 +50,9 @@ function wait (t) {
g.wait = wait
g.databases = ['memory']
require('../../y-memory/src/Memory.js')(Y)
if (typeof window !== 'undefined') {
g.databases.push('indexeddb')
require('../../y-indexeddb/src/IndexedDB.js')(Y)
}
require('../../y-array/src/Array.js')
/*
returns a random element of o.
works on Object, and Array
@ -86,10 +87,11 @@ function * applyTransactions (relAmount, numberOfTransactions, objects, users, t
var r = Math.random()
if (r >= 0.5) {
// 50% chance to flush
users[0].connector.flushOne() // flushes for some user.. (not necessarily 0)
Y.utils.globalRoom.flushOne() // flushes for some user.. (not necessarily 0)
} else if (r >= 0.05) {
// 45% chance to create operation
randomTransaction(getRandom(objects))
yield Y.utils.globalRoom.whenTransactionsFinished()
} else {
// 5% chance to disconnect/reconnect
var u = getRandom(users)
@ -99,18 +101,15 @@ function * applyTransactions (relAmount, numberOfTransactions, objects, users, t
yield u.disconnect()
}
}
yield wait()
}
}
g.applyRandomTransactionsAllRejoinNoGC = async(function * applyRandomTransactions (users, objects, transactions, numberOfTransactions) {
yield* applyTransactions(1, numberOfTransactions, objects, users, transactions)
yield users[0].connector.flushAll()
yield wait()
for (var u in users) {
yield users[u].reconnect()
}
yield wait(100)
yield users[0].connector.flushAll()
yield g.garbageCollectAllUsers(users)
})
@ -119,26 +118,21 @@ g.applyRandomTransactionsWithGC = async(function * applyRandomTransactions (user
yield* applyTransactions(1, numberOfTransactions, objects, users.slice(1), transactions)
yield users[0].connector.flushAll()
yield g.garbageCollectAllUsers(users)
yield wait(100)
for (var u in users) {
// TODO: here, we enforce that two users never sync at the same time with u[0]
// enforce that in the connector itself!
yield users[u].reconnect()
}
yield wait(100)
yield users[0].connector.flushAll()
yield wait(100)
yield g.garbageCollectAllUsers(users)
})
g.garbageCollectAllUsers = async(function * garbageCollectAllUsers (users) {
// gc two times because of the two gc phases (really collect everything)
yield wait(100)
for (var i in users) {
yield users[i].db.garbageCollect()
yield users[i].db.garbageCollect()
}
yield wait(100)
})
g.compareAllUsers = async(function * compareAllUsers (users) {
@ -165,7 +159,6 @@ g.compareAllUsers = async(function * compareAllUsers (users) {
})
}
yield users[0].connector.flushAll()
yield wait()
yield g.garbageCollectAllUsers(users)
for (var uid = 0; uid < users.length; uid++) {
@ -196,7 +189,6 @@ g.compareAllUsers = async(function * compareAllUsers (users) {
}
})
// compare allDels tree
yield wait()
if (s1 == null) {
u.db.requestTransaction(function * () {
yield* t1.call(this)
@ -206,7 +198,6 @@ g.compareAllUsers = async(function * compareAllUsers (users) {
db1.push(o)
})
})
yield wait()
} else {
// TODO: make requestTransaction return a promise..
u.db.requestTransaction(function * () {
@ -221,8 +212,8 @@ g.compareAllUsers = async(function * compareAllUsers (users) {
expect(db1[count++]).toEqual(o)
})
})
yield wait()
}
yield u.db.whenTransactionsFinished()
}
})