Files
sousa-gecko/devtools/server/tests/unit/test_protocol_longstring.js
T
2018-06-01 12:36:09 +02:00

244 lines
7.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable max-nested-callbacks */
"use strict";
/**
* Test simple requests using the protocol helpers.
*/
var protocol = require("devtools/shared/protocol");
var {RetVal, Arg} = protocol;
var EventEmitter = require("devtools/shared/event-emitter");
var {LongStringActor} = require("devtools/server/actors/string");
// The test implicitly relies on this.
require("devtools/shared/fronts/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;
var SHORT_STR = "abc";
var LONG_STR = "abcdefghijklmnop";
var rootActor = null;
const rootSpec = protocol.generateActorSpec({
typeName: "root",
events: {
"string-event": {
str: Arg(0, "longstring")
}
},
methods: {
shortString: {
response: { value: RetVal("longstring") },
},
longString: {
response: { value: RetVal("longstring") },
},
emitShortString: {
oneway: true,
},
emitLongString: {
oneway: true,
}
}
});
var RootActor = protocol.ActorClassWithSpec(rootSpec, {
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: function() {
return new LongStringActor(this.conn, SHORT_STR);
},
longString: function() {
return new LongStringActor(this.conn, LONG_STR);
},
emitShortString: function() {
EventEmitter.emit(this, "string-event", new LongStringActor(this.conn, SHORT_STR));
},
emitLongString: function() {
EventEmitter.emit(this, "string-event", new LongStringActor(this.conn, LONG_STR));
},
});
var RootFront = protocol.FrontClassWithSpec(rootSpec, {
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();
const trace = connectPipeTracing();
const client = new DebuggerClient(trace);
let rootClient;
let strfront = null;
const expectRootChildren = function(size) {
Assert.equal(rootActor.__poolMap.size, size + 1);
Assert.equal(rootClient.__poolMap.size, size + 1);
};
client.connect().then(([applicationType, traits]) => {
rootClient = RootFront(client);
// Root actor has no children yet.
expectRootChildren(0);
trace.expectReceive({"from": "<actorid>",
"applicationType": "xpcshell-tests",
"traits": []});
Assert.equal(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 => {
Assert.equal(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>"});
Assert.equal(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(() => {
const deferred = defer();
rootClient.once("string-event", (str) => {
trace.expectSend({"type": "emitShortString", "to": "<actorid>"});
trace.expectReceive({"type": "string-event", "str": "abc", "from": "<actorid>"});
Assert.ok(!!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 => {
Assert.equal(value, SHORT_STR);
}).then(() => {
// Will generate no packets
return strfront.release();
}).then(() => {
const 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>"});
Assert.ok(!!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 => {
Assert.equal(value, LONG_STR);
}).then(() => {
return strfront.release();
}).then(() => {
trace.expectSend({"type": "release", "to": "<actorid>"});
trace.expectReceive({"from": "<actorid>"});
expectRootChildren(0);
}).then(() => {
client.close().then(() => {
do_test_finished();
});
}).catch(err => {
do_report_unexpected_exception(err, "Failure executing test");
});
});
do_test_pending();
}