Skip to content

Commit c8b724e

Browse files
committed
- eslint /test/test_worker.js
1 parent 898cfd3 commit c8b724e

File tree

2 files changed

+188
-102
lines changed

2 files changed

+188
-102
lines changed

.eslintrc.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ module.exports = {
2121
"/out/",
2222
"/src/shell-post.js",
2323
"/src/shell-pre.js",
24-
"/test/test_worker.js",
2524
"!/.eslintrc.js"
2625
],
2726
parserOptions: {

test/test_worker.js

Lines changed: 188 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,204 @@
11
// TODO: Instead of using puppeteer, we could use the new Node 11 workers via
22
// node --experimental-worker test/all.js
33
// Then we could do this:
4-
//var { Worker } = require('worker_threads');
5-
// But it turns out that the worker_threads interface is just different enough not to work.
6-
var puppeteer = require("puppeteer");
7-
var path = require("path");
4+
// var { Worker } = require('worker_threads');
5+
// But it turns out that the worker_threads interface is just different enough
6+
// not to work.
7+
8+
"use strict";
9+
810
var fs = require("fs");
11+
var path = require("path");
12+
var puppeteer = require("puppeteer");
13+
14+
function obj2array(obj) {
15+
var buffer = [];
16+
Object.entries(obj).forEach(function (elem) {
17+
buffer[elem[0]] = elem[1];
18+
});
19+
return buffer;
20+
}
921

10-
class Worker {
11-
constructor(handle) {
22+
function Worker(handle) {
1223
this.handle = handle;
13-
}
14-
static async fromFile(file) {
15-
var browser = await puppeteer.launch();
16-
var page = await browser.newPage();
17-
var source = fs.readFileSync(file, 'utf8');
18-
var worker = await page.evaluateHandle(x => {
19-
var url = URL.createObjectURL(new Blob([x]), { type: 'application/javascript; charset=utf-8' });
20-
return new Worker(url);
21-
}, source);
22-
return new Worker(worker);
23-
}
24-
async postMessage(msg) {
25-
return await this.handle.evaluate((worker, msg) => {
26-
return new Promise((accept, reject) => {
27-
setTimeout(reject, 20000, new Error("time out"));
28-
worker.onmessage = evt => accept(evt.data);
29-
worker.onerror = reject;
30-
worker.postMessage(msg);
31-
})
32-
}, msg);
33-
}
3424
}
3525

36-
exports.test = async function test(SQL, assert) {
37-
var target = process.argv[2];
38-
var file = target ? "sql-" + target : "sql-wasm";
39-
if (file.indexOf('wasm') > -1 || file.indexOf('memory-growth') > -1) {
40-
console.error("Skipping worker test for " + file + ". Not implemented yet");
41-
return;
42-
};
43-
// If we use puppeteer, we need to pass in this new cwd as the root of the file being loaded:
44-
var filename = "../dist/worker." + file + ".js";
45-
var worker = await Worker.fromFile(path.join(__dirname, filename));
46-
var data = await worker.postMessage({ id: 1, action: 'open' });
47-
assert.strictEqual(data.id, 1, "Return the given id in the correct format");
48-
assert.deepEqual(data, { id: 1, ready: true }, 'Correct data answered to the "open" query');
26+
Worker.fromFile = function (file) {
27+
var source;
28+
return puppeteer.launch({
29+
// args: ["--no-sandbox"]
30+
}).then(function (browser) {
31+
return browser.newPage();
32+
}).then(function (page) {
33+
source = fs.readFileSync(file, "utf8");
34+
return page.evaluateHandle(function (x) {
35+
var url = URL.createObjectURL(
36+
new Blob([x]),
37+
{ type: "application/javascript; charset=utf-8" }
38+
);
39+
return new Worker(url);
40+
}, source);
41+
}).then(function (worker) {
42+
return new Worker(worker);
43+
});
44+
};
4945

50-
data = await worker.postMessage({
51-
id: 2,
52-
action: 'exec',
53-
params: {
54-
":num2": 2,
55-
"@str2": 'b',
56-
// test_worker.js has issue message-passing Uint8Array
57-
// but it works fine in real-world browser-usage
58-
// "$hex2": new Uint8Array([0x00, 0x42]),
59-
":num3": 3,
60-
"@str3": 'c'
61-
// "$hex3": new Uint8Array([0x00, 0x44])
62-
},
63-
sql: "CREATE TABLE test (num, str, hex);" +
64-
"INSERT INTO test VALUES (1, 'a', x'0042');" +
65-
"INSERT INTO test VALUES (:num2, @str2, x'0043');" +
66-
// test passing params split across multi-statement "exec"
67-
"INSERT INTO test VALUES (:num3, @str3, x'0044');" +
68-
"SELECT * FROM test;"
69-
});
70-
assert.strictEqual(data.id, 2, "Correct id");
71-
// debug error
72-
assert.strictEqual(data.error, undefined, data.error);
73-
var results = data.results;
74-
assert.ok(Array.isArray(results), 'Correct result type');
75-
assert.strictEqual(results.length, 1, 'Expected exactly 1 table');
76-
var table = results[0];
77-
assert.strictEqual(typeof table, 'object', 'Type of the returned table');
78-
assert.deepEqual(table.columns, ['num', 'str', 'hex'], 'Reading column names');
79-
assert.strictEqual(table.values[0][0], 1, 'Reading number');
80-
assert.strictEqual(table.values[0][1], 'a', 'Reading string');
81-
assert.deepEqual(obj2array(table.values[0][2]), [0x00, 0x42], 'Reading BLOB byte');
82-
assert.strictEqual(table.values[1][0], 2, 'Reading number');
83-
assert.strictEqual(table.values[1][1], 'b', 'Reading string');
84-
assert.deepEqual(obj2array(table.values[1][2]), [0x00, 0x43], 'Reading BLOB byte');
85-
assert.strictEqual(table.values[2][0], 3, 'Reading number');
86-
assert.strictEqual(table.values[2][1], 'c', 'Reading string');
87-
assert.deepEqual(obj2array(table.values[2][2]), [0x00, 0x44], 'Reading BLOB byte');
46+
Worker.prototype.postMessage = function (msg) {
47+
return this.handle.evaluate(function (worker, msg2) {
48+
return new Promise(function (accept, reject) {
49+
setTimeout(
50+
reject,
51+
20000,
52+
new Error("time out")
53+
);
54+
worker.onmessage = function (evt) {
55+
return accept(evt.data);
56+
};
57+
worker.onerror = reject;
58+
worker.postMessage(msg2);
59+
});
60+
}, msg);
61+
};
8862

89-
data = await worker.postMessage({ action: 'export' });
90-
var header = "SQLite format 3\0";
91-
var actual = "";
92-
for (let i = 0; i < header.length; i += 1) actual += String.fromCharCode(data.buffer[i]);
93-
assert.equal(actual, header, 'Data returned is an SQLite database file');
63+
exports.test = function test(SQL, assert) {
64+
var actual;
65+
var file;
66+
var filename;
67+
var header;
68+
var i;
69+
var promise;
70+
var results;
71+
var table;
72+
var target;
73+
var worker;
74+
target = process.argv[2];
75+
file = target ? "sql-" + target : "sql-wasm";
76+
if (file.indexOf("wasm") > -1 || file.indexOf("memory-growth") > -1) {
77+
console.error(
78+
"Skipping worker test for " + file + ". Not implemented yet"
79+
);
80+
return promise;
81+
}
82+
// If we use puppeteer, we need to pass in this new cwd as the root
83+
// of the file being loaded:
84+
filename = "../dist/worker." + file + ".js";
85+
promise = Worker.fromFile(
86+
path.join(__dirname, filename)
87+
);
88+
promise = promise.then(function (data) {
89+
worker = data;
90+
return worker.postMessage({ id: 1, action: "open" });
91+
});
92+
promise = promise.then(function (data) {
93+
assert.strictEqual(
94+
data.id,
95+
1,
96+
"Return the given id in the correct format"
97+
);
98+
assert.deepEqual(
99+
data,
100+
{ id: 1, ready: true },
101+
"Correct data answered to the \"open\" query"
102+
);
94103

95-
// test worker properly opens db after closing
96-
await worker.postMessage({ action: "close" });
97-
await worker.postMessage({ action: "open" });
98-
data = await worker.postMessage({ action: "exec", sql: "SELECT 1" });
99-
assert.deepEqual(data.results, [{"columns":["1"],"values":[[1]]}]);
100-
}
104+
return worker.postMessage({
105+
id: 2,
106+
action: "exec",
107+
params: {
108+
":num2": 2,
109+
"@str2": "b",
110+
// test_worker.js has issue message-passing Uint8Array
111+
// but it works fine in real-world browser-usage
112+
// "$hex2": new Uint8Array([0x00, 0x42]),
113+
":num3": 3,
114+
"@str3": "c"
115+
// "$hex3": new Uint8Array([0x00, 0x44])
116+
},
117+
sql: "CREATE TABLE test (num, str, hex);"
118+
+ "INSERT INTO test VALUES (1, 'a', x'0042');"
119+
+ "INSERT INTO test VALUES (:num2, @str2, x'0043');"
120+
// test passing params split across multi-statement "exec"
121+
+ "INSERT INTO test VALUES (:num3, @str3, x'0044');"
122+
+ "SELECT * FROM test;"
123+
});
124+
});
125+
promise = promise.then(function (data) {
126+
assert.strictEqual(data.id, 2, "Correct id");
127+
// debug error
128+
assert.strictEqual(data.error, undefined, data.error);
129+
results = data.results;
130+
assert.ok(Array.isArray(results), "Correct result type");
131+
assert.strictEqual(results.length, 1, "Expected exactly 1 table");
132+
table = results[0];
133+
assert.strictEqual(
134+
typeof table,
135+
"object",
136+
"Type of the returned table"
137+
);
138+
assert.deepEqual(
139+
table.columns,
140+
["num", "str", "hex"],
141+
"Reading column names"
142+
);
143+
assert.strictEqual(table.values[0][0], 1, "Reading number");
144+
assert.strictEqual(table.values[0][1], "a", "Reading string");
145+
assert.deepEqual(
146+
obj2array(table.values[0][2]),
147+
[0x00, 0x42],
148+
"Reading BLOB byte"
149+
);
150+
assert.strictEqual(table.values[1][0], 2, "Reading number");
151+
assert.strictEqual(table.values[1][1], "b", "Reading string");
152+
assert.deepEqual(
153+
obj2array(table.values[1][2]),
154+
[0x00, 0x43],
155+
"Reading BLOB byte"
156+
);
157+
assert.strictEqual(table.values[2][0], 3, "Reading number");
158+
assert.strictEqual(table.values[2][1], "c", "Reading string");
159+
assert.deepEqual(
160+
obj2array(table.values[2][2]),
161+
[0x00, 0x44],
162+
"Reading BLOB byte"
163+
);
101164

102-
function obj2array(obj) {
103-
var buffer = []
104-
for (var p in obj) { buffer[p] = obj[p] }
105-
return buffer;
106-
}
165+
return worker.postMessage({ action: "export" });
166+
});
167+
promise = promise.then(function (data) {
168+
header = "SQLite format 3\0";
169+
actual = "";
170+
for (i = 0; i < header.length; i += 1) {
171+
actual += String.fromCharCode(data.buffer[i]);
172+
}
173+
assert.equal(
174+
actual,
175+
header,
176+
"Data returned is an SQLite database file"
177+
);
107178

108-
if (module === require.main) {
109-
process.on('unhandledRejection', r => console.log(r));
179+
// test worker properly opens db after closing
180+
return worker.postMessage({ action: "close" });
181+
});
182+
promise = promise.then(function () {
183+
return worker.postMessage({ action: "open" });
184+
});
185+
promise = promise.then(function () {
186+
return worker.postMessage({ action: "exec", sql: "SELECT 1" });
187+
});
188+
promise = promise.then(function (data) {
189+
assert.deepEqual(data.results, [{ columns: ["1"], values: [[1]] }]);
190+
});
191+
return promise;
192+
};
110193

111-
require('test').run({
112-
'test worker': function (assert, done) {
113-
exports.test(null, assert).then(done);
114-
}
115-
});
194+
if (module === require.main) {
195+
process.on("unhandledRejection", function (r) {
196+
console.log(r);
197+
});
116198

199+
require("test").run({
200+
"test worker": function (assert, done) {
201+
exports.test(null, assert).then(done);
202+
}
203+
});
117204
}

0 commit comments

Comments
 (0)