File: bytebuffer_tests.ml

package info (click to toggle)
ocaml-cohttp 6.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,624 kB
  • sloc: ml: 13,107; makefile: 20; sh: 18; javascript: 18
file content (74 lines) | stat: -rw-r--r-- 2,289 bytes parent folder | download
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
66
67
68
69
70
71
72
73
74
module Bytebuffer = Http_bytebuffer.Bytebuffer

module Src = struct
  type src = { str : string; mutable pos : int; mutable reads : int }

  let create str = { str; pos = 0; reads = 10 }

  let refill r buf ~pos ~len =
    if r.reads = 0 then raise Exit
    else (
      r.reads <- r.reads - 1;
      let available = String.length r.str - r.pos in
      if available = 0 then `Eof
      else
        let read_len = min len available in
        BytesLabels.blit_string ~src:r.str ~src_pos:r.pos ~dst:buf ~dst_pos:pos
          ~len:read_len;
        r.pos <- r.pos + read_len;
        `Ok read_len)
end

module Refill =
  Bytebuffer.Make
    (struct
      type 'a t = 'a

      let ( >>| ) x f = f x
      let ( >>= ) x f = f x
      let return x = x
    end)
    (Src)

let%expect_test "read line" =
  let test line buf_size =
    let src = Src.create line in
    let buf = Bytebuffer.create buf_size in
    let res = Refill.read_line buf src in
    match res with
    | None -> print_endline "failed to read line"
    | Some line -> Printf.printf "read line: %S\n" line
    | exception Exit -> print_endline "failed to read - infinite loop"
  in
  let line = "foobar\r\n" in
  test line (String.length line);
  [%expect {| read line: "foobar" |}];
  test line (String.length line - 1);
  [%expect {| read line: "foobar" |}];
  let line = "foobar\r\n" in
  test line (String.length line - 1);
  [%expect {| read line: "foobar" |}];
  test line (String.length line);
  [%expect {| read line: "foobar" |}];
  let line = "foobar\r" in
  test line (String.length line + 10);
  [%expect {| failed to read line |}];
  test line (String.length line - 1);
  [%expect {| failed to read line |}]

let%expect_test "read fixed" =
  let src = "foobar" in
  let src_len = String.length src in
  let test buf_size =
    let src = Src.create src in
    let buf = Bytebuffer.create buf_size in
    match Refill.read buf src src_len with
    | res ->
        Printf.printf "buf size=%d: reading %d bytes we get %d bytes\n" buf_size
          src_len (String.length res)
    | exception Exit -> print_endline "failed to read - infinite loop"
  in
  test src_len;
  [%expect {| buf size=6: reading 6 bytes we get 6 bytes |}];
  test (src_len - 1);
  [%expect {| buf size=5: reading 6 bytes we get 5 bytes |}]