Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / netwerk / test / unit / test_tls_server_multiple_clients.js
blob8054d7746c8639de4ed06b204962402c67768156
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 // Need profile dir to store the key / cert
7 do_get_profile();
8 // Ensure PSM is initialized
9 Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
11 const certOverrideService = Cc[
12 "@mozilla.org/security/certoverride;1"
13 ].getService(Ci.nsICertOverrideService);
14 const socketTransportService = Cc[
15 "@mozilla.org/network/socket-transport-service;1"
16 ].getService(Ci.nsISocketTransportService);
18 function startServer(cert) {
19 let tlsServer = Cc["@mozilla.org/network/tls-server-socket;1"].createInstance(
20 Ci.nsITLSServerSocket
22 tlsServer.init(-1, true, -1);
23 tlsServer.serverCert = cert;
25 let input, output;
27 let listener = {
28 onSocketAccepted(socket, transport) {
29 info("Accept TLS client connection");
30 let connectionInfo = transport.securityCallbacks.getInterface(
31 Ci.nsITLSServerConnectionInfo
33 connectionInfo.setSecurityObserver(listener);
34 input = transport.openInputStream(0, 0, 0);
35 output = transport.openOutputStream(0, 0, 0);
37 onHandshakeDone() {
38 info("TLS handshake done");
40 input.asyncWait(
42 onInputStreamReady(input1) {
43 NetUtil.asyncCopy(input1, output);
48 Services.tm.currentThread
51 onStopListening() {},
54 tlsServer.setSessionTickets(false);
56 tlsServer.asyncListen(listener);
58 return tlsServer.port;
61 function storeCertOverride(port, cert) {
62 certOverrideService.rememberValidityOverride(
63 "127.0.0.1",
64 port,
65 {},
66 cert,
67 true
71 function startClient(port) {
72 let transport = socketTransportService.createTransport(
73 ["ssl"],
74 "127.0.0.1",
75 port,
76 null,
77 null
79 let input;
80 let output;
82 let inputDeferred = Promise.withResolvers();
83 let outputDeferred = Promise.withResolvers();
85 let handler = {
86 onTransportStatus(transport1, status) {
87 if (status === Ci.nsISocketTransport.STATUS_CONNECTED_TO) {
88 output.asyncWait(handler, 0, 0, Services.tm.currentThread);
92 onInputStreamReady(input1) {
93 try {
94 let data = NetUtil.readInputStreamToString(input1, input1.available());
95 equal(data, "HELLO", "Echoed data received");
96 input1.close();
97 output.close();
98 inputDeferred.resolve();
99 } catch (e) {
100 inputDeferred.reject(e);
104 onOutputStreamReady(output1) {
105 try {
106 output1.write("HELLO", 5);
107 info("Output to server written");
108 outputDeferred.resolve();
109 input = transport.openInputStream(0, 0, 0);
110 input.asyncWait(handler, 0, 0, Services.tm.currentThread);
111 } catch (e) {
112 outputDeferred.reject(e);
117 transport.setEventSink(handler, Services.tm.currentThread);
118 output = transport.openOutputStream(0, 0, 0);
120 return Promise.all([inputDeferred.promise, outputDeferred.promise]);
123 add_task(async function () {
124 let cert = getTestServerCertificate();
125 ok(!!cert, "Got self-signed cert");
126 let port = startServer(cert);
127 storeCertOverride(port, cert);
128 await startClient(port);
129 await startClient(port);