summaryrefslogtreecommitdiff
path: root/tests/test_runner/run_test.ml
blob: 52619c4a99d86ee7c091e9094464d901ad650790 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
(* Paths to use for tests *)
type test_env = { aeneas_path : string; llbc_dir : string }

(* The data for a specific test to run *)
type test_case = {
  name : string;
  backend : string;
  subdir : string;
  extra_aeneas_options : string list;
}

(* Run Aeneas on a specific input with the given options *)
let run_test env case =
  let concat_path = List.fold_left Filename.concat "" in
  let input_file = concat_path [ env.llbc_dir; "llbc"; case.name ] ^ ".llbc" in
  let dest_dir = concat_path [ "tests"; case.backend; case.subdir ] in
  let args =
    [|
      env.aeneas_path; input_file; "-dest"; dest_dir; "-backend"; case.backend;
    |]
  in
  let args = Array.append args (Array.of_list case.extra_aeneas_options) in

  (* Debug arguments *)
  print_string "[test_runner] Running: ";
  Array.iter
    (fun x ->
      print_string x;
      print_string " ")
    args;
  print_endline "";

  (* Run Aeneas *)
  let pid =
    Unix.create_process env.aeneas_path args Unix.stdin Unix.stdout Unix.stderr
  in
  let _ = Unix.waitpid [] pid in
  ()

(* File-specific options *)
let test_options backend test_name =
  (* TODO: reactivate -test-trans-units for hashmap and hashmap_main *)
  let use_fuel =
    match (backend, test_name) with
    | ( "coq",
        ( "arrays" | "betree_main" | "demo" | "hashmap" | "hashmap_main"
        | "loops" ) ) ->
        true
    | "fstar", "demo" -> true
    | _ -> false
  in
  let options = if use_fuel then "-use-fuel" :: [] else [] in

  let decrease_template_clauses =
    backend = "fstar"
    &&
    match test_name with
    | "arrays" | "betree_main" | "betree_main-special" | "hashmap"
    | "hashmap_main" | "loops" | "traits" ->
        true
    | _ -> false
  in
  let options =
    if decrease_template_clauses then
      "-decreases-clauses" :: "-template-clauses" :: options
    else options
  in

  let extra_options =
    match (backend, test_name) with
    (* Additional, custom test on the betree: translate it without `-backward-no-state-update`. *)
    (* This generates very ugly code, but is good to test the translation. *)
    | _, "betree_main-special" ->
        [ "-test-trans-units"; "-state"; "-split-files" ]
    | _, "betree_main" ->
        [
          "-backward-no-state-update";
          "-test-trans-units";
          "-state";
          "-split-files";
        ]
    | _, "bitwise" -> [ "-test-trans-units" ]
    | _, "constants" -> [ "-test-trans-units" ]
    | _, "external" -> [ "-test-trans-units"; "-state"; "-split-files" ]
    | _, "hashmap_main" -> [ "-state"; "-split-files" ]
    | _, "no_nested_borrows" -> [ "-test-trans-units" ]
    | _, "paper" -> [ "-test-trans-units" ]
    | _, "polonius_list" -> [ "-test-trans-units" ]
    | "fstar", "arrays" -> [ "-split-files" ]
    | "fstar", "loops" -> [ "-split-files" ]
    (* We add a custom import in the Hashmap.lean file: we do not want to overwrite it *)
    | "lean", "hashmap" -> [ "-split-files"; "-no-gen-lib-entry" ]
    | _, "hashmap" -> [ "-split-files" ]
    | _ -> []
  in
  let options = List.append extra_options options in
  options

(* The subdirectory in which to store the outputs. *)
(* This reproduces the file layout that was set by the old Makefile. FIXME: cleanup *)
let test_subdir backend test_name =
  match (backend, test_name) with
  | "lean", "demo" -> "Demo"
  | "lean", _ -> "."
  | _, ("arrays" | "demo" | "hashmap" | "traits") -> test_name
  | _, "betree_main" -> "betree"
  | _, "betree_main-special" -> "betree_back_stateful"
  | _, "hashmap_main" -> "hashmap_on_disk"
  | "hol4", _ -> "misc-" ^ test_name
  | ( _,
      ( "bitwise" | "constants" | "external" | "loops" | "no_nested_borrows"
      | "paper" | "polonius_list" ) ) ->
      "misc"
  | _ -> test_name

let () =
  match Array.to_list Sys.argv with
  (* Ad-hoc argument passing for now. *)
  | _exe_path :: aeneas_path :: llbc_dir :: test_name :: options ->
      let tests_env = { aeneas_path; llbc_dir } in
      (* TODO: reactivate HOL4 once traits are parameterized by their associated types *)
      let backends =
        match test_name with
        | "betree_main-special" -> [ "fstar" ]
        | _ -> [ "coq"; "lean"; "fstar" ]
      in
      List.iter
        (fun backend ->
          let subdir = test_subdir backend test_name in
          let extra_aeneas_options =
            List.append (test_options backend test_name) options
          in
          let test_file_name =
            match test_name with
            | "betree_main-special" -> "betree_main"
            | _ -> test_name
          in
          let test_case =
            { name = test_file_name; backend; subdir; extra_aeneas_options }
          in
          run_test tests_env test_case)
        backends
  | _ -> failwith "Incorrect options passed to test runner"