/
01_server_restart_bb.js
92 lines (80 loc) · 2.5 KB
/
01_server_restart_bb.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"use strict";
require('stream-url-node');
var fs = require('fs');
var rimraf = require('rimraf');
var stamp = require('swarm-stamp');
var SwarmServer = require('..');
var bat = require('swarm-bat');
var tape = require('tape');
if (typeof(window)==='object') {
var tape_dom = require('tape-dom');
tape_dom.installCSS();
tape_dom.stream(tape);
}
// this is not a bare Replica, but a Replica+Host server-side combo
// which must aggregate logs into states properly
var AGG = [
{
comment: 'upstream handshake, subscriptions initiated',
query: '[alice]/Swarm+Host#db!Alice.on \n\n',
response:'[alice]/Swarm+Replica#db!00001+swarm~1A\tAlice~1\n\n'
},
{
comment: 'client pushes an object',
query: '[alice]#00002+Alice~1\t\n' +
'\t!00002+Alice~1.~state\t{"00002+Alice~1":{"old":true,"alice":1}}\n\n',
response:'[alice]#00002+Alice~1\t!00002+Alice~1\n\n'
},
{
comment: 'client pushes an op (echo)',
query: '[alice]#00002+Alice~1!00003+Alice~1.set\t{"alice":2}\n',
response:'[alice]#00002+Alice~1!00003+Alice~1.set\t{"alice":2}\n'
},
{
comment: 'new client connects, gets ssn',
query: '[bob]/Swarm+Host#db!Bob.on \n\n',
response:'[bob]/Swarm+Replica#db!00003+swarm~1A\tBob~2\n\n'
},
{
comment: 'fresh subscription (log is aggregated)',
query: '[bob]#00002+Alice~1\t0\n\n',
response:'[bob]#00002+Alice~1!00003+Alice~1.~state\t'+
'{"00002+Alice~1":{"old":true},"00003+Alice~1":{"alice":2}}\n'
}
];
tape ('server.1.A log aggregation', function (t) {
var db_path = '.test_db_server.1.A';
fs.existsSync(db_path) && rimraf.sync(db_path);
var port = 10000+Math.floor(Math.random() * 10000);
var listen_url = 'tcp://localhost:'+port;
if (fs.existsSync(db_path)) {
fs.unlinkSync(db_path);
}
var server = new SwarmServer({
listen: listen_url,
ssn_id: 'swarm~1A',
db_id: 'db',
db_path: db_path,
clock: stamp.LamportClock,
callback: run
});
var mux = new bat.BatMux({
connect: listen_url
});
var bt = new bat.StreamTest(mux, AGG, t.equal.bind(t));
function run () {
bt.run(end);
}
function end () {
fs.existsSync(db_path) && rimraf.sync(db_path);
server.close();
t.end();
}
});
// !!!!!!!!!!!!!!!!!!!!!
// TODO: two clients req consurrently
// also a new op arrives
// slave is a stream (async, slow)
tape.skip ('server.1.B snapshotting - concurrency', function (t) {
t.fail();
});