A fork of mtelver's day10 project
at main 120 lines 4.0 kB view raw
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%!"