netwerk/test/unit/test_chunked_responses.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/netwerk/test/unit/test_chunked_responses.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,173 @@
     1.4 +/*
     1.5 + * Test Chunked-Encoded response parsing.
     1.6 + */
     1.7 +
     1.8 +////////////////////////////////////////////////////////////////////////////////
     1.9 +// Test infrastructure
    1.10 +
    1.11 +Cu.import("resource://testing-common/httpd.js");
    1.12 +
    1.13 +XPCOMUtils.defineLazyGetter(this, "URL", function() {
    1.14 +  return "http://localhost:" + httpserver.identity.primaryPort;
    1.15 +});
    1.16 +
    1.17 +var httpserver = new HttpServer();
    1.18 +var index = 0;
    1.19 +var test_flags = new Array();
    1.20 +var testPathBase = "/chunked_hdrs";
    1.21 +
    1.22 +function run_test()
    1.23 +{
    1.24 +  httpserver.start(-1);
    1.25 +
    1.26 +  do_test_pending();
    1.27 +  run_test_number(1);
    1.28 +}
    1.29 +
    1.30 +function run_test_number(num)
    1.31 +{
    1.32 +  testPath = testPathBase + num;
    1.33 +  httpserver.registerPathHandler(testPath, eval("handler" + num));
    1.34 +
    1.35 +  var channel = setupChannel(testPath);
    1.36 +  flags = test_flags[num];   // OK if flags undefined for test
    1.37 +  channel.asyncOpen(new ChannelListener(eval("completeTest" + num),
    1.38 +                                        channel, flags), null);
    1.39 +}
    1.40 +
    1.41 +function setupChannel(url)
    1.42 +{
    1.43 +  var ios = Components.classes["@mozilla.org/network/io-service;1"].
    1.44 +                       getService(Ci.nsIIOService);
    1.45 +  var chan = ios.newChannel(URL + url, "", null);
    1.46 +  var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
    1.47 +  return httpChan;
    1.48 +}
    1.49 +
    1.50 +function endTests()
    1.51 +{
    1.52 +  httpserver.stop(do_test_finished);
    1.53 +}
    1.54 +
    1.55 +////////////////////////////////////////////////////////////////////////////////
    1.56 +// Test 1: FAIL because of overflowed chunked size. The parser uses long so
    1.57 +//         the test case uses >64bit to fail on all platforms.
    1.58 +test_flags[1] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL;
    1.59 +
    1.60 +function handler1(metadata, response)
    1.61 +{
    1.62 +  var body = "12345678123456789\r\ndata never reached";
    1.63 +
    1.64 +  response.seizePower();
    1.65 +  response.write("HTTP/1.1 200 OK\r\n");
    1.66 +  response.write("Content-Type: text/plain\r\n");
    1.67 +  response.write("Transfer-Encoding: chunked\r\n");
    1.68 +  response.write("\r\n");
    1.69 +  response.write(body);
    1.70 +  response.finish();
    1.71 +}
    1.72 +
    1.73 +function completeTest1(request, data, ctx)
    1.74 +{
    1.75 +  do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED);
    1.76 +
    1.77 +  run_test_number(2);
    1.78 +}
    1.79 +
    1.80 +////////////////////////////////////////////////////////////////////////////////
    1.81 +// Test 2: FAIL because of non-hex in chunked length
    1.82 +
    1.83 +test_flags[2] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL;
    1.84 +
    1.85 +function handler2(metadata, response)
    1.86 +{
    1.87 +  var body = "junkintheway 123\r\ndata never reached";
    1.88 +
    1.89 +  response.seizePower();
    1.90 +  response.write("HTTP/1.1 200 OK\r\n");
    1.91 +  response.write("Content-Type: text/plain\r\n");
    1.92 +  response.write("Transfer-Encoding: chunked\r\n");
    1.93 +  response.write("\r\n");
    1.94 +  response.write(body);
    1.95 +  response.finish();
    1.96 +}
    1.97 +
    1.98 +function completeTest2(request, data, ctx)
    1.99 +{
   1.100 +  do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED);
   1.101 +  run_test_number(3);
   1.102 +}
   1.103 +
   1.104 +////////////////////////////////////////////////////////////////////////////////
   1.105 +// Test 3: OK in spite of non-hex digits after size in the length field
   1.106 +
   1.107 +test_flags[3] = CL_ALLOW_UNKNOWN_CL;
   1.108 +
   1.109 +function handler3(metadata, response)
   1.110 +{
   1.111 +  var body = "c junkafter\r\ndata reached";
   1.112 +
   1.113 +  response.seizePower();
   1.114 +  response.write("HTTP/1.1 200 OK\r\n");
   1.115 +  response.write("Content-Type: text/plain\r\n");
   1.116 +  response.write("Transfer-Encoding: chunked\r\n");
   1.117 +  response.write("\r\n");
   1.118 +  response.write(body);
   1.119 +  response.finish();
   1.120 +}
   1.121 +
   1.122 +function completeTest3(request, data, ctx)
   1.123 +{
   1.124 +  do_check_eq(request.status, 0);
   1.125 +  run_test_number(4);
   1.126 +}
   1.127 +
   1.128 +////////////////////////////////////////////////////////////////////////////////
   1.129 +// Test 4: Verify a fully compliant chunked response.
   1.130 +
   1.131 +test_flags[4] = CL_ALLOW_UNKNOWN_CL;
   1.132 +
   1.133 +function handler4(metadata, response)
   1.134 +{
   1.135 +  var body = "c\r\ndata reached\r\n\0\r\n\r\n";
   1.136 +
   1.137 +  response.seizePower();
   1.138 +  response.write("HTTP/1.1 200 OK\r\n");
   1.139 +  response.write("Content-Type: text/plain\r\n");
   1.140 +  response.write("Transfer-Encoding: chunked\r\n");
   1.141 +  response.write("\r\n");
   1.142 +  response.write(body);
   1.143 +  response.finish();
   1.144 +}
   1.145 +
   1.146 +function completeTest4(request, data, ctx)
   1.147 +{
   1.148 +  do_check_eq(request.status, 0);
   1.149 +  run_test_number(5);
   1.150 +}
   1.151 +
   1.152 +////////////////////////////////////////////////////////////////////////////////
   1.153 +// Test 5: A chunk size larger than 32 bit but smaller than 64bit also fails
   1.154 +// This is probabaly subject to get improved at some point.
   1.155 +
   1.156 +test_flags[5] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL;
   1.157 +
   1.158 +function handler5(metadata, response)
   1.159 +{
   1.160 +  var body = "123456781\r\ndata never reached";
   1.161 +
   1.162 +  response.seizePower();
   1.163 +  response.write("HTTP/1.1 200 OK\r\n");
   1.164 +  response.write("Content-Type: text/plain\r\n");
   1.165 +  response.write("Transfer-Encoding: chunked\r\n");
   1.166 +  response.write("\r\n");
   1.167 +  response.write(body);
   1.168 +  response.finish();
   1.169 +}
   1.170 +
   1.171 +function completeTest5(request, data, ctx)
   1.172 +{
   1.173 +  do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED);
   1.174 +  endTests();
   1.175 +//  run_test_number(6);
   1.176 +}

mercurial