A fork of mtelver's day10 project
1(** Unit tests for run data reading *)
2
3let test_dir = ref ""
4
5let setup () =
6 let dir = Filename.temp_dir "test-run-data-" "" in
7 test_dir := dir;
8 dir
9
10let teardown () =
11 if !test_dir <> "" then begin
12 ignore (Sys.command (Printf.sprintf "rm -rf %s" !test_dir));
13 test_dir := ""
14 end
15
16let mkdir_p path =
17 let rec create dir =
18 if not (Sys.file_exists dir) then begin
19 create (Filename.dirname dir);
20 try Unix.mkdir dir 0o755 with Unix.Unix_error (Unix.EEXIST, _, _) -> ()
21 end
22 in
23 create path
24
25let write_file path content =
26 let dir = Filename.dirname path in
27 mkdir_p dir;
28 Out_channel.with_open_text path (fun oc -> Out_channel.output_string oc content)
29
30(** Test: list_runs returns runs sorted by most recent first *)
31let test_list_runs () =
32 let base_dir = setup () in
33 let runs_dir = Filename.concat base_dir "runs" in
34 mkdir_p (Filename.concat runs_dir "2026-02-01-120000");
35 mkdir_p (Filename.concat runs_dir "2026-02-03-120000");
36 mkdir_p (Filename.concat runs_dir "2026-02-02-120000");
37
38 let runs = Day10_web_data.Run_data.list_runs ~log_dir:base_dir in
39 assert (List.length runs = 3);
40 assert (List.hd runs = "2026-02-03-120000");
41
42 teardown ();
43 Printf.printf "PASS: test_list_runs\n%!"
44
45(** Test: read_summary parses summary.json *)
46let test_read_summary () =
47 let base_dir = setup () in
48 let run_dir = Filename.concat (Filename.concat base_dir "runs") "2026-02-04-120000" in
49 mkdir_p run_dir;
50 write_file (Filename.concat run_dir "summary.json") {|{
51 "run_id": "2026-02-04-120000",
52 "start_time": "2026-02-04T12:00:00",
53 "end_time": "2026-02-04T12:30:00",
54 "duration_seconds": 1800.0,
55 "targets_requested": 100,
56 "solutions_found": 95,
57 "build_success": 90,
58 "build_failed": 5,
59 "doc_success": 80,
60 "doc_failed": 5,
61 "doc_skipped": 5,
62 "failures": [{"package": "bad.1.0", "error": "build failed"}]
63 }|};
64
65 let summary = Day10_web_data.Run_data.read_summary ~log_dir:base_dir ~run_id:"2026-02-04-120000" in
66 assert (Option.is_some summary);
67 let s = Option.get summary in
68 assert (s.run_id = "2026-02-04-120000");
69 assert (s.build_success = 90);
70 assert (List.length s.failures = 1);
71
72 teardown ();
73 Printf.printf "PASS: test_read_summary\n%!"
74
75(** Test: read_summary returns None for missing run *)
76let test_read_summary_missing () =
77 let base_dir = setup () in
78 let summary = Day10_web_data.Run_data.read_summary ~log_dir:base_dir ~run_id:"nonexistent" in
79 assert (Option.is_none summary);
80 teardown ();
81 Printf.printf "PASS: test_read_summary_missing\n%!"
82
83(** Test: get_latest_run_id follows symlink *)
84let test_get_latest_run_id () =
85 let base_dir = setup () in
86 let runs_dir = Filename.concat base_dir "runs" in
87 mkdir_p (Filename.concat runs_dir "2026-02-04-120000");
88 let latest = Filename.concat base_dir "latest" in
89 Unix.symlink "runs/2026-02-04-120000" latest;
90
91 let latest_id = Day10_web_data.Run_data.get_latest_run_id ~log_dir:base_dir in
92 assert (Option.is_some latest_id);
93 assert (Option.get latest_id = "2026-02-04-120000");
94
95 teardown ();
96 Printf.printf "PASS: test_get_latest_run_id\n%!"
97
98(** Test: read_log returns log content *)
99let test_read_log () =
100 let base_dir = setup () in
101 let run_dir = Filename.concat (Filename.concat base_dir "runs") "2026-02-04-120000" in
102 write_file (Filename.concat (Filename.concat run_dir "build") "test-pkg.1.0.log")
103 "Build output here\n";
104
105 let content = Day10_web_data.Run_data.read_build_log
106 ~log_dir:base_dir ~run_id:"2026-02-04-120000" ~package:"test-pkg.1.0" in
107 assert (Option.is_some content);
108 assert (String.trim (Option.get content) = "Build output here");
109
110 teardown ();
111 Printf.printf "PASS: test_read_log\n%!"
112
113let () =
114 Printf.printf "Running Run_data tests...\n%!";
115 test_list_runs ();
116 test_read_summary ();
117 test_read_summary_missing ();
118 test_get_latest_run_id ();
119 test_read_log ();
120 Printf.printf "\nAll Run_data tests passed!\n%!"