mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
208 lines
6.5 KiB
JavaScript
208 lines
6.5 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
/**
|
|
* Test simple requests using the protocol helpers.
|
|
*/
|
|
let protocol = devtools.require("devtools/server/protocol");
|
|
let {method, RetVal, Arg, Option} = protocol;
|
|
let {defer, resolve} = devtools.require("sdk/core/promise");
|
|
let events = devtools.require("sdk/event/core");
|
|
let {LongStringActor} = devtools.require("devtools/server/actors/string");
|
|
|
|
function simpleHello() {
|
|
return {
|
|
from: "root",
|
|
applicationType: "xpcshell-tests",
|
|
traits: [],
|
|
}
|
|
}
|
|
|
|
DebuggerServer.LONG_STRING_LENGTH = DebuggerServer.LONG_STRING_INITIAL_LENGTH = DebuggerServer.LONG_STRING_READ_LENGTH = 5;
|
|
|
|
let SHORT_STR = "abc";
|
|
let LONG_STR = "abcdefghijklmnop";
|
|
|
|
let rootActor = null;
|
|
|
|
let RootActor = protocol.ActorClass({
|
|
typeName: "root",
|
|
|
|
initialize: function(conn) {
|
|
rootActor = this;
|
|
protocol.Actor.prototype.initialize.call(this, conn);
|
|
// Root actor owns itself.
|
|
this.manage(this);
|
|
this.actorID = "root";
|
|
},
|
|
|
|
sayHello: simpleHello,
|
|
|
|
shortString: method(function() {
|
|
return new LongStringActor(this.conn, SHORT_STR);
|
|
}, {
|
|
response: { value: RetVal("longstring") },
|
|
}),
|
|
|
|
longString: method(function() {
|
|
return new LongStringActor(this.conn, LONG_STR);
|
|
}, {
|
|
response: { value: RetVal("longstring") },
|
|
}),
|
|
|
|
emitShortString: method(function() {
|
|
events.emit(this, "string-event", new LongStringActor(this.conn, SHORT_STR));
|
|
}, {
|
|
oneway: true,
|
|
}),
|
|
|
|
emitLongString: method(function() {
|
|
events.emit(this, "string-event", new LongStringActor(this.conn, LONG_STR));
|
|
}, {
|
|
oneway: true,
|
|
}),
|
|
|
|
events: {
|
|
"string-event": {
|
|
str: Arg(0, "longstring")
|
|
}
|
|
}
|
|
});
|
|
|
|
let RootFront = protocol.FrontClass(RootActor, {
|
|
initialize: function(client) {
|
|
this.actorID = "root";
|
|
protocol.Front.prototype.initialize.call(this, client);
|
|
// Root owns itself.
|
|
this.manage(this);
|
|
}
|
|
});
|
|
|
|
function run_test()
|
|
{
|
|
DebuggerServer.createRootActor = (conn => {
|
|
return RootActor(conn);
|
|
});
|
|
|
|
DebuggerServer.init(() => true);
|
|
let trace = connectPipeTracing();
|
|
let client = new DebuggerClient(trace);
|
|
let rootClient;
|
|
|
|
let strfront = null;
|
|
|
|
let expectRootChildren = function(size) {
|
|
do_check_eq(rootActor.__poolMap.size, size + 1);
|
|
do_check_eq(rootClient.__poolMap.size, size + 1);
|
|
}
|
|
|
|
|
|
client.connect((applicationType, traits) => {
|
|
rootClient = RootFront(client);
|
|
|
|
// Root actor has no children yet.
|
|
expectRootChildren(0);
|
|
|
|
trace.expectReceive({"from":"<actorid>","applicationType":"xpcshell-tests","traits":[]});
|
|
do_check_eq(applicationType, "xpcshell-tests");
|
|
rootClient.shortString().then(ret => {
|
|
trace.expectSend({"type":"shortString","to":"<actorid>"});
|
|
trace.expectReceive({"value":"abc","from":"<actorid>"});
|
|
|
|
// Should only own the one reference (itself) at this point.
|
|
expectRootChildren(0);
|
|
strfront = ret;
|
|
}).then(() => {
|
|
return strfront.string();
|
|
}).then(ret => {
|
|
do_check_eq(ret, SHORT_STR);
|
|
}).then(() => {
|
|
return rootClient.longString();
|
|
}).then(ret => {
|
|
trace.expectSend({"type":"longString","to":"<actorid>"});
|
|
trace.expectReceive({"value":{"type":"longString","actor":"<actorid>","length":16,"initial":"abcde"},"from":"<actorid>"});
|
|
|
|
strfront = ret;
|
|
// Should own a reference to itself and an extra string now.
|
|
expectRootChildren(1);
|
|
}).then(() => {
|
|
return strfront.string();
|
|
}).then(ret => {
|
|
trace.expectSend({"type":"substring","start":5,"end":10,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"fghij","from":"<actorid>"});
|
|
trace.expectSend({"type":"substring","start":10,"end":15,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"klmno","from":"<actorid>"});
|
|
trace.expectSend({"type":"substring","start":15,"end":20,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"p","from":"<actorid>"});
|
|
|
|
do_check_eq(ret, LONG_STR);
|
|
}).then(() => {
|
|
return strfront.release();
|
|
}).then(() => {
|
|
trace.expectSend({"type":"release","to":"<actorid>"});
|
|
trace.expectReceive({"from":"<actorid>"});
|
|
|
|
// That reference should be removed now.
|
|
expectRootChildren(0);
|
|
}).then(() => {
|
|
let deferred = defer();
|
|
rootClient.once("string-event", (str) => {
|
|
trace.expectSend({"type":"emitShortString","to":"<actorid>"});
|
|
trace.expectReceive({"type":"string-event","str":"abc","from":"<actorid>"});
|
|
|
|
do_check_true(!!str);
|
|
strfront = str;
|
|
// Shouldn't generate any new references
|
|
expectRootChildren(0);
|
|
// will generate no packets.
|
|
strfront.string().then((value) => { deferred.resolve(value) });
|
|
});
|
|
rootClient.emitShortString();
|
|
return deferred.promise;
|
|
}).then(value => {
|
|
do_check_eq(value, SHORT_STR);
|
|
}).then(() => {
|
|
// Will generate no packets
|
|
return strfront.release();
|
|
}).then(() => {
|
|
let deferred = defer();
|
|
rootClient.once("string-event", (str) => {
|
|
trace.expectSend({"type":"emitLongString","to":"<actorid>"});
|
|
trace.expectReceive({"type":"string-event","str":{"type":"longString","actor":"<actorid>","length":16,"initial":"abcde"},"from":"<actorid>"});
|
|
|
|
do_check_true(!!str);
|
|
// Should generate one new reference
|
|
expectRootChildren(1);
|
|
strfront = str;
|
|
strfront.string().then((value) => {
|
|
trace.expectSend({"type":"substring","start":5,"end":10,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"fghij","from":"<actorid>"});
|
|
trace.expectSend({"type":"substring","start":10,"end":15,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"klmno","from":"<actorid>"});
|
|
trace.expectSend({"type":"substring","start":15,"end":20,"to":"<actorid>"});
|
|
trace.expectReceive({"substring":"p","from":"<actorid>"});
|
|
|
|
deferred.resolve(value);
|
|
});
|
|
});
|
|
rootClient.emitLongString();
|
|
return deferred.promise;
|
|
}).then(value => {
|
|
do_check_eq(value, LONG_STR);
|
|
}).then(() => {
|
|
return strfront.release();
|
|
}).then(() => {
|
|
trace.expectSend({"type":"release","to":"<actorid>"});
|
|
trace.expectReceive({"from":"<actorid>"});
|
|
expectRootChildren(0);
|
|
}).then(() => {
|
|
client.close(() => {
|
|
do_test_finished();
|
|
});
|
|
}).then(null, err => {
|
|
do_report_unexpected_exception(err, "Failure executing test");
|
|
});
|
|
});
|
|
do_test_pending();
|
|
}
|