doc: document directories in test directory
[platform/upstream/nodejs.git] / benchmark / http / _chunky_http_client.js
1 'use strict';
2
3 // test HTTP throughput in fragmented header case
4 var common = require('../common.js');
5 var net = require('net');
6 var test = require('../../test/common.js');
7
8 var bench = common.createBenchmark(main, {
9   len:  [1, 4, 8, 16, 32, 64, 128],
10   num:  [5, 50, 500, 2000],
11   type: ['send'],
12 });
13
14
15 function main(conf) {
16   var len = +conf.len;
17   var num = +conf.num;
18   var type = conf.type;
19   var todo = [];
20   var headers = [];
21   // Chose 7 because 9 showed "Connection error" / "Connection closed"
22   // An odd number could result in a better length dispersion.
23   for (var i = 7; i <= 7 * 7 * 7; i *= 7)
24     headers.push(Array(i + 1).join('o'));
25
26   function WriteHTTPHeaders(channel, has_keep_alive, extra_header_count) {
27     todo = []
28     todo.push('GET / HTTP/1.1');
29     todo.push('Host: localhost');
30     todo.push('Connection: keep-alive');
31     todo.push('Accept: text/html,application/xhtml+xml,' +
32               'application/xml;q=0.9,image/webp,*/*;q=0.8');
33     todo.push('User-Agent: Mozilla/5.0 (X11; Linux x86_64) ' +
34               'AppleWebKit/537.36 (KHTML, like Gecko) ' +
35               'Chrome/39.0.2171.71 Safari/537.36');
36     todo.push('Accept-Encoding: gzip, deflate, sdch');
37     todo.push('Accept-Language: en-US,en;q=0.8');
38     for (var i = 0; i < extra_header_count; i++) {
39       // Utilize first three powers of a small integer for an odd cycle and
40       // because the fourth power of some integers overloads the server.
41       todo.push('X-Header-' + i + ': ' + headers[i % 3]);
42     }
43     todo.push('');
44     todo.push('');
45     todo = todo.join('\r\n');
46     // Using odd numbers in many places may increase length coverage.
47     var chunksize = 37;
48     for (i = 0; i < todo.length; i += chunksize) {
49       var cur = todo.slice(i, i + chunksize);
50       channel.write(cur);
51     }
52   }
53
54   var success = 0;
55   var failure = 0;
56   var min = 10;
57   var size = 0;
58   var mod = 317;
59   var mult = 17;
60   var add = 11;
61   var count = 0;
62   var PIPE = test.PIPE;
63   var socket = net.connect(PIPE, function() {
64     bench.start();
65     WriteHTTPHeaders(socket, 1, len);
66     socket.setEncoding('utf8')
67     socket.on('data', function(d) {
68       var did = false;
69       var pattern = 'HTTP/1.1 200 OK\r\n';
70       if ((d.length === pattern.length && d === pattern) ||
71           (d.length > pattern.length &&
72            d.slice(0, pattern.length) === pattern)) {
73         success += 1;
74         did = true;
75       } else {
76         pattern = 'HTTP/1.1 '
77         if ((d.length === pattern.length && d === pattern) ||
78             (d.length > pattern.length &&
79              d.slice(0, pattern.length) === pattern)) {
80           failure += 1;
81           did = true;
82         }
83       }
84       size = (size * mult + add) % mod;
85       if (did) {
86         count += 1;
87         if (count === num) {
88           bench.end(count);
89         } else {
90           WriteHTTPHeaders(socket, 1, min + size);
91         }
92       }
93     });
94     socket.on('close', function() {
95       console.log('Connection closed');
96     });
97
98     socket.on('error', function() {
99       throw new Error('Connection error');
100     });
101   });
102 }