summaryrefslogtreecommitdiff
path: root/std/http/racing_server_test.ts
blob: b6698624712e30cedd0378ebd2588205d1405b33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const { dial, run } = Deno;

import { test, runIfMain } from "../testing/mod.ts";
import { assert, assertEquals } from "../testing/asserts.ts";
import { BufReader } from "../io/bufio.ts";
import { TextProtoReader } from "../textproto/mod.ts";

let server: Deno.Process;
async function startServer(): Promise<void> {
  server = run({
    args: [Deno.execPath(), "run", "-A", "http/racing_server.ts"],
    stdout: "piped"
  });
  // Once racing server is ready it will write to its stdout.
  const r = new TextProtoReader(new BufReader(server.stdout!));
  const s = await r.readLine();
  assert(s !== Deno.EOF && s.includes("Racing server listening..."));
}
function killServer(): void {
  server.close();
  server.stdout!.close();
}

const input = `GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

`;
const HUGE_BODY_SIZE = 1024 * 1024;
const output = `HTTP/1.1 200 OK
content-length: 8

Hello 1
HTTP/1.1 200 OK
content-length: ${HUGE_BODY_SIZE}

${"a".repeat(HUGE_BODY_SIZE)}HTTP/1.1 200 OK
content-length: ${HUGE_BODY_SIZE}

${"b".repeat(HUGE_BODY_SIZE)}HTTP/1.1 200 OK
content-length: 8

World 4
`;

test(async function serverPipelineRace(): Promise<void> {
  await startServer();

  const conn = await dial({ port: 4501 });
  const r = new TextProtoReader(new BufReader(conn));
  await conn.write(new TextEncoder().encode(input));
  const outLines = output.split("\n");
  // length - 1 to disregard last empty line
  for (let i = 0; i < outLines.length - 1; i++) {
    const s = await r.readLine();
    assertEquals(s, outLines[i]);
  }
  killServer();
});

runIfMain(import.meta);