tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_separate_connections.js (3022B)


      1 "use strict";
      2 
      3 const { HttpServer } = ChromeUtils.importESModule(
      4  "resource://testing-common/httpd.sys.mjs"
      5 );
      6 
      7 ChromeUtils.defineLazyGetter(this, "URL", function () {
      8  return "http://localhost:" + httpserv.identity.primaryPort;
      9 });
     10 
     11 // This unit test ensures each container has its own connection pool.
     12 // We verify this behavior by opening channels with different userContextId,
     13 // and their connection info's hash keys should be different.
     14 
     15 // In the first round of this test, we record the hash key in each container.
     16 // In the second round, we check if each container's hash key is consistent
     17 // and different from other container's hash key.
     18 
     19 let httpserv = null;
     20 let gSecondRoundStarted = false;
     21 
     22 function handler(metadata, response) {
     23  response.setHeader("Content-Type", "text/plain", false);
     24  response.setHeader("Cache-Control", "no-cache", false);
     25  response.setStatusLine(metadata.httpVersion, 200, "OK");
     26  let body = "0123456789";
     27  response.bodyOutputStream.write(body, body.length);
     28 }
     29 
     30 function makeChan(url, userContextId) {
     31  let chan = NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
     32  chan.loadInfo.originAttributes = { userContextId };
     33  return chan;
     34 }
     35 
     36 let previousHashKeys = [];
     37 
     38 function Listener(userContextId) {
     39  this.userContextId = userContextId;
     40 }
     41 
     42 let gTestsRun = 0;
     43 Listener.prototype = {
     44  onStartRequest(request) {
     45    request
     46      .QueryInterface(Ci.nsIHttpChannel)
     47      .QueryInterface(Ci.nsIHttpChannelInternal);
     48 
     49    Assert.equal(
     50      request.loadInfo.originAttributes.userContextId,
     51      this.userContextId
     52    );
     53 
     54    let hashKey = request.connectionInfoHashKey;
     55    if (gSecondRoundStarted) {
     56      // Compare the hash keys with the previous set ones.
     57      // Hash keys should match if and only if their userContextId are the same.
     58      for (let userContextId = 0; userContextId < 3; userContextId++) {
     59        if (userContextId == this.userContextId) {
     60          Assert.equal(hashKey, previousHashKeys[userContextId]);
     61        } else {
     62          Assert.notEqual(hashKey, previousHashKeys[userContextId]);
     63        }
     64      }
     65    } else {
     66      // Set the hash keys in the first round.
     67      previousHashKeys[this.userContextId] = hashKey;
     68    }
     69  },
     70  onDataAvailable(request, stream, off, cnt) {
     71    read_stream(stream, cnt);
     72  },
     73  onStopRequest() {
     74    gTestsRun++;
     75    if (gTestsRun == 3) {
     76      gTestsRun = 0;
     77      if (gSecondRoundStarted) {
     78        // The second round finishes.
     79        httpserv.stop(do_test_finished);
     80      } else {
     81        // The first round finishes. Do the second round.
     82        gSecondRoundStarted = true;
     83        doTest();
     84      }
     85    }
     86  },
     87 };
     88 
     89 function doTest() {
     90  for (let userContextId = 0; userContextId < 3; userContextId++) {
     91    let chan = makeChan(URL, userContextId);
     92    let listener = new Listener(userContextId);
     93    chan.asyncOpen(listener);
     94  }
     95 }
     96 
     97 function run_test() {
     98  do_test_pending();
     99  httpserv = new HttpServer();
    100  httpserv.registerPathHandler("/", handler);
    101  httpserv.start(-1);
    102 
    103  doTest();
    104 }