mte/unikernel/duniverse/dune_/otherlibs/stdune/test/io_tests.ml
2025-11-11 02:07:51 +01:00

93 lines
2.6 KiB
OCaml

open Stdune
let temp_dir () = Temp.create Dir ~prefix:"copyfile" ~suffix:"test"
let%expect_test "copy file simple" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
Io.write_file src "foobarbaz";
Io.copy_file ~src ~dst ();
print_endline (Io.read_file dst);
[%expect {| foobarbaz |}]
;;
let%expect_test "copy file overwrite" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
Io.write_file src "foobarbaz";
Io.write_file dst "xxx";
Io.copy_file ~src ~dst ();
print_endline (Io.read_file dst);
[%expect {| foobarbaz |}]
;;
let%expect_test "copy file chmod" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
Io.write_file src "foobarbaz";
Io.copy_file ~chmod:(fun _ -> 428) ~src ~dst ();
print_endline (Io.read_file dst);
Printf.printf "permissions: %d\n" (Path.stat_exn dst).st_perm;
[%expect
{|
foobarbaz
permissions: 428 |}]
;;
let%expect_test "copy file - no src" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
match Io.copy_file ~src ~dst () with
| () -> assert false
| exception Sys_error s ->
let s =
let _, exn = String.lsplit2_exn s ~on:':' in
sprintf "$PATH:%s" exn
in
print_endline s;
[%expect {| $PATH: No such file or directory |}]
;;
let%expect_test "copy file - src is a directory" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
Unix.mkdir (Path.to_string src) 0o755;
Io.copy_file ~src ~dst ();
[%expect.unreachable]
[@@expect.uncaught_exn {| (Sys_error "Is a directory") |}]
;;
let%expect_test "copy file - dst is a directory" =
let dir = temp_dir () in
let src = Path.relative dir "initial" in
let dst = Path.relative dir "final" in
Io.write_file src "foobarbaz";
Unix.mkdir (Path.to_string dst) 0o755;
Unix.sleepf 0.5;
match Io.copy_file ~src ~dst () with
| _ -> assert false
| exception Sys_error s ->
let s =
let _, exn = String.lsplit2_exn s ~on:':' in
sprintf "$DIR:%s" exn
in
print_endline s;
[%expect {| $DIR: Is a directory |}]
;;
let%expect_test "making a directory for an existing file" =
let dir = temp_dir () in
let fn = Path.relative dir "foo" in
Io.write_file fn "";
(* This does not error, but it will if it ends with a "/" on MacOS *)
ignore (Fpath.mkdir (Path.to_string fn));
[%expect {| |}];
Path.mkdir_p fn;
(* This in turn does not error *)
[%expect {| |}]
;;