Blame test/test.ml

Packit 9ff65e
(******************************************************************************)
Packit 9ff65e
(*  ocaml-fileutils: files and filenames common operations                    *)
Packit 9ff65e
(*                                                                            *)
Packit 9ff65e
(*  Copyright (C) 2003-2014, Sylvain Le Gall                                  *)
Packit 9ff65e
(*                                                                            *)
Packit 9ff65e
(*  This library is free software; you can redistribute it and/or modify it   *)
Packit 9ff65e
(*  under the terms of the GNU Lesser General Public License as published by  *)
Packit 9ff65e
(*  the Free Software Foundation; either version 2.1 of the License, or (at   *)
Packit 9ff65e
(*  your option) any later version, with the OCaml static compilation         *)
Packit 9ff65e
(*  exception.                                                                *)
Packit 9ff65e
(*                                                                            *)
Packit 9ff65e
(*  This library is distributed in the hope that it will be useful, but       *)
Packit 9ff65e
(*  WITHOUT ANY WARRANTY; without even the implied warranty of                *)
Packit 9ff65e
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file         *)
Packit 9ff65e
(*  COPYING for more details.                                                 *)
Packit 9ff65e
(*                                                                            *)
Packit 9ff65e
(*  You should have received a copy of the GNU Lesser General Public License  *)
Packit 9ff65e
(*  along with this library; if not, write to the Free Software Foundation,   *)
Packit 9ff65e
(*  Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA             *)
Packit 9ff65e
(******************************************************************************)
Packit 9ff65e
Packit 9ff65e
open OUnit2
Packit 9ff65e
open FilePath
Packit 9ff65e
open FileUtil
Packit 9ff65e
Packit 9ff65e
exception ExpectedException
Packit 9ff65e
Packit 9ff65e
let test_umask = 0o0022
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let umask_mutex = OUnitShared.Mutex.create OUnitShared.ScopeProcess
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let bracket_umask umask =
Packit 9ff65e
  bracket
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       OUnitShared.Mutex.lock test_ctxt.OUnitTest.shared umask_mutex;
Packit 9ff65e
       Unix.umask umask)
Packit 9ff65e
    (fun umask test_ctxt ->
Packit 9ff65e
       let _i: int = Unix.umask umask in
Packit 9ff65e
         OUnitShared.Mutex.unlock test_ctxt.OUnitTest.shared umask_mutex)
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let with_bracket_umask test_ctxt umask f =
Packit 9ff65e
  OUnitBracket.with_bracket test_ctxt (bracket_umask umask) f
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
module SetFilename = Set.Make (struct
Packit 9ff65e
    type t = FilePath.DefaultPath.filename
Packit 9ff65e
    let compare = FilePath.DefaultPath.compare
Packit 9ff65e
end)
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let assert_equal_string ~msg =
Packit 9ff65e
  assert_equal ~printer:(fun x -> x) ~msg:msg
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
module DiffSetFilename =
Packit 9ff65e
  OUnitDiff.SetMake
Packit 9ff65e
    (struct
Packit 9ff65e
       type t = string
Packit 9ff65e
       let compare = FilePath.DefaultPath.compare
Packit 9ff65e
       let pp_printer = Format.pp_print_string
Packit 9ff65e
       let pp_print_sep = OUnitDiff.pp_comma_separator
Packit 9ff65e
     end)
Packit 9ff65e
Packit 9ff65e
(** Check that two set of file are equal *)
Packit 9ff65e
let assert_equal_set_filename ?msg st_ref st =
Packit 9ff65e
  DiffSetFilename.assert_equal ?msg
Packit 9ff65e
    (DiffSetFilename.of_list (SetFilename.elements st_ref))
Packit 9ff65e
    (DiffSetFilename.of_list (SetFilename.elements st))
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let assert_perm fn exp =
Packit 9ff65e
  assert_equal
Packit 9ff65e
    ~msg:(Printf.sprintf "permission of '%s'" fn)
Packit 9ff65e
    ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
    exp (Unix.lstat fn).Unix.st_perm
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let assert_error msg e f =
Packit 9ff65e
  assert_raises
Packit 9ff65e
    ~msg
Packit 9ff65e
    ExpectedException
Packit 9ff65e
    (fun () ->
Packit 9ff65e
       f (fun _ err -> if e err then raise ExpectedException))
Packit 9ff65e
Packit 9ff65e
(** Ensure that we are dealing with generated file (and not random
Packit 9ff65e
    file on the filesystem).
Packit 9ff65e
  *)
Packit 9ff65e
module SafeFS =
Packit 9ff65e
struct
Packit 9ff65e
  module S =
Packit 9ff65e
    Set.Make
Packit 9ff65e
      (struct
Packit 9ff65e
         type t = int * int
Packit 9ff65e
         let compare = Pervasives.compare
Packit 9ff65e
       end)
Packit 9ff65e
Packit 9ff65e
  type t =
Packit 9ff65e
      {
Packit 9ff65e
        mutable files: SetFilename.t;
Packit 9ff65e
        mutable dirs: SetFilename.t;
Packit 9ff65e
        mutable markers: S.t;
Packit 9ff65e
      }
Packit 9ff65e
Packit 9ff65e
  let default () =
Packit 9ff65e
    {
Packit 9ff65e
      files = SetFilename.empty;
Packit 9ff65e
      dirs = SetFilename.empty;
Packit 9ff65e
      markers = S.empty;
Packit 9ff65e
    }
Packit 9ff65e
Packit 9ff65e
  let marker fn =
Packit 9ff65e
    let st = Unix.lstat fn in
Packit 9ff65e
      (st.Unix.st_dev, st.Unix.st_ino)
Packit 9ff65e
Packit 9ff65e
  let mark t fn =
Packit 9ff65e
    t.markers <- S.add (marker fn) t.markers
Packit 9ff65e
Packit 9ff65e
  let touch t fn =
Packit 9ff65e
    if Sys.file_exists fn then begin
Packit 9ff65e
      failwith (Printf.sprintf "File %S already exists." fn)
Packit 9ff65e
    end else begin
Packit 9ff65e
      let chn = open_out fn in
Packit 9ff65e
        close_out chn;
Packit 9ff65e
        mark t fn;
Packit 9ff65e
        t.files <- SetFilename.add fn t.files
Packit 9ff65e
    end
Packit 9ff65e
Packit 9ff65e
  let mkdir t dn =
Packit 9ff65e
    if Sys.file_exists dn then begin
Packit 9ff65e
      failwith (Printf.sprintf "Directory %S already exists." dn)
Packit 9ff65e
    end else begin
Packit 9ff65e
      Unix.mkdir dn 0o755;
Packit 9ff65e
      mark t dn;
Packit 9ff65e
      t.dirs <- SetFilename.add dn t.dirs
Packit 9ff65e
    end
Packit 9ff65e
Packit 9ff65e
  let auto_ask_user t =
Packit 9ff65e
    Ask (fun fn -> S.mem (marker fn) t.markers)
Packit 9ff65e
Packit 9ff65e
  let create dn dirs files =
Packit 9ff65e
    let t = default () in
Packit 9ff65e
      mark t dn;
Packit 9ff65e
      t.dirs <- SetFilename.add dn t.dirs;
Packit 9ff65e
      List.iter (fun fn -> mkdir t (Filename.concat dn fn)) dirs;
Packit 9ff65e
      List.iter (fun fn -> touch t (Filename.concat dn fn)) files;
Packit 9ff65e
      t
Packit 9ff65e
end
Packit 9ff65e
Packit 9ff65e
module Test =
Packit 9ff65e
functor (OsPath: PATH_STRING_SPECIFICATION) ->
Packit 9ff65e
struct
Packit 9ff65e
  let os_string = ref ""
Packit 9ff65e
Packit 9ff65e
  let test_label s value = (!os_string)^" : "^s^" \""^value^"\""
Packit 9ff65e
Packit 9ff65e
  let test_label_list s lst = test_label s ("["^(String.concat ";" lst)^"]")
Packit 9ff65e
Packit 9ff65e
  let test_label_pair s (a, b) = test_label s (a^"\" \""^b)
Packit 9ff65e
Packit 9ff65e
  let test_name s = (s)
Packit 9ff65e
Packit 9ff65e
  let reduce (exp, res) =
Packit 9ff65e
    (test_name "reduce") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string
Packit 9ff65e
          ~msg:(test_label "reduce" exp)
Packit 9ff65e
          res (OsPath.reduce ~no_symlink:true exp))
Packit 9ff65e
Packit 9ff65e
  let make_path (exp, res) =
Packit 9ff65e
    (test_name "make_path") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string ~msg:(test_label_list "make_path" exp)
Packit 9ff65e
          res (OsPath.string_of_path exp))
Packit 9ff65e
Packit 9ff65e
  let make_absolute (base, rela, res) =
Packit 9ff65e
    (test_name "make_absolute") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string ~msg:(test_label_pair "make_absolute" (base, rela))
Packit 9ff65e
          res (OsPath.reduce ~no_symlink:true (OsPath.make_absolute base rela)))
Packit 9ff65e
Packit 9ff65e
  let make_relative (base, abs, res) =
Packit 9ff65e
    (test_name "make_relative") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string ~msg:(test_label_pair "make_relative" (base, abs))
Packit 9ff65e
          res (OsPath.make_relative base abs))
Packit 9ff65e
Packit 9ff65e
  let valid exp =
Packit 9ff65e
    (test_name "valid") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_bool (test_label "is_valid" exp)
Packit 9ff65e
          (OsPath.is_valid exp))
Packit 9ff65e
Packit 9ff65e
  let identity exp =
Packit 9ff65e
    (test_name "identity") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string ~msg:(test_label "identity" exp)
Packit 9ff65e
          exp (OsPath.identity exp))
Packit 9ff65e
Packit 9ff65e
  let extension (filename, basename, extension) =
Packit 9ff65e
    (test_name "extension") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal_string ~msg:(test_label "chop_extension" filename)
Packit 9ff65e
          (OsPath.chop_extension filename) basename;
Packit 9ff65e
Packit 9ff65e
        assert_equal_string ~msg:(test_label "get_extension" filename)
Packit 9ff65e
          (OsPath.string_of_extension (OsPath.get_extension filename))
Packit 9ff65e
          extension;
Packit 9ff65e
Packit 9ff65e
        assert_bool (test_label "check_extension" filename)
Packit 9ff65e
          (OsPath.check_extension filename
Packit 9ff65e
             (OsPath.extension_of_string extension));
Packit 9ff65e
Packit 9ff65e
        assert_bool (test_label "check_extension (false) " filename)
Packit 9ff65e
          (not (OsPath.check_extension filename
Packit 9ff65e
                  (OsPath.extension_of_string "dummy"))))
Packit 9ff65e
Packit 9ff65e
  let is_relative (filename, res) =
Packit 9ff65e
    (test_name "is_relative") >::
Packit 9ff65e
     (fun _ ->
Packit 9ff65e
        assert_equal
Packit 9ff65e
          res
Packit 9ff65e
          (OsPath.is_relative filename))
Packit 9ff65e
end
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
module TestUnix  = Test(UnixPath)
Packit 9ff65e
module TestMacOS = Test(MacOSPath)
Packit 9ff65e
module TestWin32 = Test(Win32Path)
Packit 9ff65e
let () =
Packit 9ff65e
  TestUnix.os_string := "Unix";
Packit 9ff65e
  TestMacOS.os_string := "MacOS";
Packit 9ff65e
  TestWin32.os_string := "Win32"
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
(** Static test *)
Packit 9ff65e
let _ =
Packit 9ff65e
  assert(UnixPath.get_extension "test.txt" = "txt");
Packit 9ff65e
  assert(MacOSPath.get_extension "test.txt" = "txt");
Packit 9ff65e
  assert(Win32Path.get_extension "test.txt" = "txt")
Packit 9ff65e
Packit 9ff65e
(*********************)
Packit 9ff65e
(* Unix FilePath test*)
Packit 9ff65e
(*********************)
Packit 9ff65e
let test_unix =
Packit 9ff65e
  let test_path =
Packit 9ff65e
  [
Packit 9ff65e
   ("/");
Packit 9ff65e
   ("/a/b");
Packit 9ff65e
   ("/a/b/c/");
Packit 9ff65e
   ("/a/../b/c");
Packit 9ff65e
   ("/a/../b/../c");
Packit 9ff65e
   ("a/b/c/");
Packit 9ff65e
   ("../a/b");
Packit 9ff65e
   ("");
Packit 9ff65e
   (".");
Packit 9ff65e
   ("./");
Packit 9ff65e
   ("..");
Packit 9ff65e
   ("../")
Packit 9ff65e
  ]
Packit 9ff65e
  in
Packit 9ff65e
  "Unix FilePath" >::: (
Packit 9ff65e
    (* Is_valid *)
Packit 9ff65e
    (
Packit 9ff65e
      List.map TestUnix.valid test_path
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Identity *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.identity test_path
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Reduce path *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.reduce
Packit 9ff65e
      [
Packit 9ff65e
       ("/a/b/c",                    "/a/b/c");
Packit 9ff65e
       ("/a/b/c/",                   "/a/b/c");
Packit 9ff65e
       ("/a/b/c/d/..",               "/a/b/c");
Packit 9ff65e
       ("/a/b/c/.",                  "/a/b/c");
Packit 9ff65e
       ("/a/d/../b/c",               "/a/b/c");
Packit 9ff65e
       ("/a/./b/c",                  "/a/b/c");
Packit 9ff65e
       ("/a/b/c/d/./..",             "/a/b/c");
Packit 9ff65e
       ("/a/b/c/d/../.",             "/a/b/c");
Packit 9ff65e
       ("/a/b/d/./../c",             "/a/b/c");
Packit 9ff65e
       ("/a/b/d/.././c",             "/a/b/c");
Packit 9ff65e
       ("/a/b/../d/../b/c",          "/a/b/c");
Packit 9ff65e
       ("/a/./././b/./c",            "/a/b/c");
Packit 9ff65e
       ("/a/../a/./b/../c/../b/./c", "/a/b/c");
Packit 9ff65e
       ("/a/../..",                  "/");
Packit 9ff65e
       ("./d/../a/b/c",              "a/b/c");
Packit 9ff65e
       ("a/b/c/../../../",           "");
Packit 9ff65e
       ("",                          "");
Packit 9ff65e
       (".",                         "");
Packit 9ff65e
       ("./",                        "");
Packit 9ff65e
       ("..",                        "..");
Packit 9ff65e
       ("../",                       "..");
Packit 9ff65e
      ]
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Create path *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.make_path
Packit 9ff65e
      [
Packit 9ff65e
       (["/a"; "b"; "/c/d"], "/a:b:/c/d");
Packit 9ff65e
       ([],                  "");
Packit 9ff65e
      ]
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Convert to absolute *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.make_absolute
Packit 9ff65e
      [
Packit 9ff65e
       ("/a/b/c", ".",    "/a/b/c");
Packit 9ff65e
       ("/a/b/c", "./d",  "/a/b/c/d");
Packit 9ff65e
       ("/a/b/c", "../d", "/a/b/d");
Packit 9ff65e
       ("/a/b/c", "",     "/a/b/c");
Packit 9ff65e
       ("/a/b/c", ".",    "/a/b/c");
Packit 9ff65e
       ("/a/b/c", "./",   "/a/b/c");
Packit 9ff65e
       ("/a/b/c", "..",   "/a/b");
Packit 9ff65e
       ("/a/b/c", "../",  "/a/b")
Packit 9ff65e
      ]
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Convert to relative *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.make_relative
Packit 9ff65e
      [
Packit 9ff65e
       ("/a/b/c", "/a/b/c", "");
Packit 9ff65e
       ("/a/b/c", "/a/b/d", "../d")
Packit 9ff65e
      ]
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
    (* Check extension *)
Packit 9ff65e
    @ (
Packit 9ff65e
      List.map TestUnix.extension
Packit 9ff65e
      [
Packit 9ff65e
       ("/a/b/c.d",   "/a/b/c",   "d");
Packit 9ff65e
       ("/a/b.c/d.e", "/a/b.c/d", "e");
Packit 9ff65e
       ("a.",         "a",        "");
Packit 9ff65e
      ]
Packit 9ff65e
    )
Packit 9ff65e
  )
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
(**********************)
Packit 9ff65e
(* Win32 FilePath test*)
Packit 9ff65e
(**********************)
Packit 9ff65e
let test_win32 =
Packit 9ff65e
  let test_path =
Packit 9ff65e
  [
Packit 9ff65e
   ("c:\\");
Packit 9ff65e
   ("c:\\a\\b");
Packit 9ff65e
   ("c:\\a\\b\\c\\");
Packit 9ff65e
   ("c:\\a\\..\\b\\c");
Packit 9ff65e
   ("c:\\a\\..\\b\\..\\c");
Packit 9ff65e
   ("a\\b\\c\\");
Packit 9ff65e
   ("..\\a\\b");
Packit 9ff65e
   ("");
Packit 9ff65e
   (".");
Packit 9ff65e
   (".\\");
Packit 9ff65e
   ("..");
Packit 9ff65e
   ("..\\")
Packit 9ff65e
  ]
Packit 9ff65e
  in
Packit 9ff65e
  "Win32 FilePath" >:::
Packit 9ff65e
    (
Packit 9ff65e
      (* Is_valid *)
Packit 9ff65e
      (List.map TestWin32.valid test_path)
Packit 9ff65e
Packit 9ff65e
      (* Identity *)
Packit 9ff65e
      @ (List.map TestWin32.identity test_path)
Packit 9ff65e
Packit 9ff65e
      (* Reduce path *)
Packit 9ff65e
      @ (List.map TestWin32.reduce
Packit 9ff65e
           [("c:\\a\\b\\c",                            "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\c\\",                          "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\c\\d\\..",                     "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\c\\.",                         "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\d\\..\\b\\c",                     "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\.\\b\\c",                         "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\c\\d\\.\\..",                  "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\c\\d\\..\\.",                  "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\d\\.\\..\\c",                  "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\d\\..\\.\\c",                  "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\b\\..\\d\\..\\b\\c",              "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\.\\.\\.\\b\\.\\c",                "c:\\a\\b\\c");
Packit 9ff65e
            ("c:\\a\\..\\a\\.\\b\\..\\c\\..\\b\\.\\c", "c:\\a\\b\\c");
Packit 9ff65e
            ("a\\..\\b",                               "b");
Packit 9ff65e
            ("",                                       "");
Packit 9ff65e
            (".",                                      "");
Packit 9ff65e
            (".\\",                                    "");
Packit 9ff65e
            ("..",                                     "..");
Packit 9ff65e
            ("..\\",                                   "..")])
Packit 9ff65e
Packit 9ff65e
      (* Create path *)
Packit 9ff65e
      @ (List.map TestWin32.make_path
Packit 9ff65e
           [(["c:/a"; "b"; "c:/c\\d"], "c:\\a;b;c:\\c\\d");
Packit 9ff65e
            ([],                       "")])
Packit 9ff65e
Packit 9ff65e
      (* Convert to absolute *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestWin32.make_absolute
Packit 9ff65e
        [
Packit 9ff65e
         ("c:\\a\\b\\c", ".",     "c:\\a\\b\\c");
Packit 9ff65e
         ("c:\\a\\b\\c", ".\\d",  "c:\\a\\b\\c\\d");
Packit 9ff65e
         ("c:\\a\\b\\c", "..\\d", "c:\\a\\b\\d");
Packit 9ff65e
         ("c:\\a\\b\\c", "",      "c:\\a\\b\\c");
Packit 9ff65e
         ("c:\\a\\b\\c", ".",     "c:\\a\\b\\c");
Packit 9ff65e
         ("c:\\a\\b\\c", ".\\",   "c:\\a\\b\\c");
Packit 9ff65e
         ("c:\\a\\b\\c", "..",    "c:\\a\\b");
Packit 9ff65e
         ("c:\\a\\b\\c", "..\\",  "c:\\a\\b");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Convert to relative *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestWin32.make_relative
Packit 9ff65e
        [
Packit 9ff65e
         ("c:\\a\\b\\c", "c:/a\\b\\c", "");
Packit 9ff65e
         ("c:\\a\\b\\c", "c:/a\\b\\d", "..\\d")
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Check extension *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestWin32.extension
Packit 9ff65e
        [
Packit 9ff65e
         ("c:\\a\\b\\c.d",   "c:\\a\\b\\c",   "d");
Packit 9ff65e
         ("c:\\a\\b.c\\d.e", "c:\\a\\b.c\\d", "e");
Packit 9ff65e
         ("a.",         "a",        "");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestWin32.is_relative
Packit 9ff65e
          [
Packit 9ff65e
            "c:/a",  false;
Packit 9ff65e
            "c:\\a", false;
Packit 9ff65e
            "./a",   true;
Packit 9ff65e
            ".\\a",  true;
Packit 9ff65e
            "../a",  true;
Packit 9ff65e
            "..\\a",  true;
Packit 9ff65e
          ]
Packit 9ff65e
      )
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
(**********************)
Packit 9ff65e
(* MacOS FilePath test*)
Packit 9ff65e
(**********************)
Packit 9ff65e
let test_macos =
Packit 9ff65e
  let test_path =
Packit 9ff65e
  [
Packit 9ff65e
   ("a:");
Packit 9ff65e
   ("a:::");
Packit 9ff65e
   (":a:b:c");
Packit 9ff65e
   ("");
Packit 9ff65e
   (":");
Packit 9ff65e
   ("::");
Packit 9ff65e
  ]
Packit 9ff65e
  in
Packit 9ff65e
  "MacOS FilePath" >:::
Packit 9ff65e
    (
Packit 9ff65e
      (* Is_valid *)
Packit 9ff65e
      (
Packit 9ff65e
        List.map TestMacOS.valid test_path
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Identity *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.identity test_path
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Reduce path *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.reduce
Packit 9ff65e
        [
Packit 9ff65e
         ("root:a:b:c",       "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c:",      "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c:d::",   "root:a:b:c");
Packit 9ff65e
         ("root:a:d::b:c",    "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c:d::",   "root:a:b:c");
Packit 9ff65e
         ("root:a:b:d::c",    "root:a:b:c");
Packit 9ff65e
         ("root:a:b::d::b:c", "root:a:b:c");
Packit 9ff65e
         ("",                 "");
Packit 9ff65e
         (":",                "");
Packit 9ff65e
         ("::",               "::");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Create path *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.make_path
Packit 9ff65e
        [
Packit 9ff65e
         ([":a"; "b"; ":c:d"], ":a;b;:c:d");
Packit 9ff65e
         ([],                  "");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Convert to absolute *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.make_absolute
Packit 9ff65e
        [
Packit 9ff65e
         ("root:a:b:c", ":",   "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c", ":d",  "root:a:b:c:d");
Packit 9ff65e
         ("root:a:b:c", "::d", "root:a:b:d");
Packit 9ff65e
         ("root:a:b:c", "",    "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c", ":",   "root:a:b:c");
Packit 9ff65e
         ("root:a:b:c", "::",  "root:a:b");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Convert to relative *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.make_relative
Packit 9ff65e
        [
Packit 9ff65e
         ("root:a:b:c", "root:a:b:c", "");
Packit 9ff65e
         ("root:a:b:c", "root:a:b:d", "::d")
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
Packit 9ff65e
      (* Check extension *)
Packit 9ff65e
      @ (
Packit 9ff65e
        List.map TestMacOS.extension
Packit 9ff65e
        [
Packit 9ff65e
         ("root:a:b:c.d",   "root:a:b:c",   "d");
Packit 9ff65e
         ("root:a:b.c:d.e", "root:a:b.c:d", "e");
Packit 9ff65e
         ("a.",         "a",        "");
Packit 9ff65e
        ]
Packit 9ff65e
      )
Packit 9ff65e
    )
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
(*****************)
Packit 9ff65e
(* FileUtil test *)
Packit 9ff65e
(*****************)
Packit 9ff65e
Packit 9ff65e
(* Test to be performed *)
Packit 9ff65e
let test_fileutil =
Packit 9ff65e
  "FileUtil" >:::
Packit 9ff65e
    ["Test" >::
Packit 9ff65e
     (fun test_ctxt ->
Packit 9ff65e
        let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
        let file_test =
Packit 9ff65e
          let fn, chn = bracket_tmpfile test_ctxt in
Packit 9ff65e
            output_string chn "foo";
Packit 9ff65e
            close_out chn;
Packit 9ff65e
            fn
Packit 9ff65e
        in
Packit 9ff65e
        let non_fatal_test file (stest, expr, res) =
Packit 9ff65e
          non_fatal test_ctxt
Packit 9ff65e
            (fun _ ->
Packit 9ff65e
               assert_bool
Packit 9ff65e
                 ("Test "^stest^" on "^file)
Packit 9ff65e
                 (res = (test expr file)))
Packit 9ff65e
        in
Packit 9ff65e
          non_fatal_test file_test ("Size_not_null",   Size_not_null, true);
Packit 9ff65e
          List.iter
Packit 9ff65e
            (non_fatal_test tmp_dir)
Packit 9ff65e
            [
Packit 9ff65e
              "True",            True,            true;
Packit 9ff65e
              "False",           False,           false;
Packit 9ff65e
              "Is_dir",          Is_dir,          true;
Packit 9ff65e
              "Not Is_dir",      (Not Is_dir),    false;
Packit 9ff65e
              "Is_dev_block",    Is_dev_block,    false;
Packit 9ff65e
              "Is_dev_char",     Is_dev_char,     false;
Packit 9ff65e
              "Exists",          Exists,          true;
Packit 9ff65e
              "Is_file",         Is_file,         false;
Packit 9ff65e
              "Is_set_group_ID", Is_set_group_ID, false;
Packit 9ff65e
              "Has_sticky_bit",  Has_sticky_bit,  false;
Packit 9ff65e
              "Is_link",         Is_link,         false;
Packit 9ff65e
              "Is_pipe",         Is_pipe,         false;
Packit 9ff65e
              "Is_readable",     Is_readable,     true;
Packit 9ff65e
              "Is_writeable",    Is_writeable,    true;
Packit 9ff65e
              "Is_socket",       Is_socket,       false;
Packit 9ff65e
              "Has_set_user_ID", Has_set_user_ID, false;
Packit 9ff65e
              "Is_exec",         Is_exec,         true;
Packit 9ff65e
              "Match",           Match(tmp_dir), true;
Packit 9ff65e
Packit 9ff65e
              "And of test_file * test_file", And(True, False), false;
Packit 9ff65e
              "Or of test_file * test_file", Or(True, False), true;
Packit 9ff65e
              "Is_newer_than", (Is_newer_than tmp_dir), false;
Packit 9ff65e
              "Is_older_than", (Is_older_than tmp_dir), false;
Packit 9ff65e
            ];
Packit 9ff65e
          if Sys.os_type <> "Win32" then begin
Packit 9ff65e
            List.iter
Packit 9ff65e
              (non_fatal_test tmp_dir)
Packit 9ff65e
              [
Packit 9ff65e
                "Is_owned_by_user_ID", Is_owned_by_user_ID, true;
Packit 9ff65e
                "Is_owned_by_group_ID", Is_owned_by_group_ID, true;
Packit 9ff65e
              ]
Packit 9ff65e
          end);
Packit 9ff65e
Packit 9ff65e
    "Test with FileUtilStr.Match" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir ~prefix:"fileutil-foobar" test_ctxt in
Packit 9ff65e
         assert_bool
Packit 9ff65e
           "FileUtilStr.Match = true"
Packit 9ff65e
           (FileUtilStr.test (Match ".*fileutil-") tmp_dir);
Packit 9ff65e
         assert_bool
Packit 9ff65e
           "FileUtilStr.Match = false"
Packit 9ff65e
           (not (FileUtilStr.test (Match "fileutil") tmp_dir)));
Packit 9ff65e
Packit 9ff65e
    "Mode" >:::
Packit 9ff65e
    [
Packit 9ff65e
      "to_string" >::
Packit 9ff65e
      (fun _ ->
Packit 9ff65e
         List.iter
Packit 9ff65e
           (fun (str, mode) ->
Packit 9ff65e
              assert_equal
Packit 9ff65e
                ~printer:(fun s -> s)
Packit 9ff65e
                str
Packit 9ff65e
                (FileUtilMode.to_string mode))
Packit 9ff65e
           [
Packit 9ff65e
             "u+r", [`User (`Add `Read)];
Packit 9ff65e
             "u+rw", [`User (`Add (`List [`Read; `Write]))];
Packit 9ff65e
             "+rw,u=rw,g=rwx",
Packit 9ff65e
             [
Packit 9ff65e
               `None (`Add (`List [`Read; `Write]));
Packit 9ff65e
               `User (`Set (`List [`Read; `Write]));
Packit 9ff65e
               `Group (`Set (`List [`Read; `Write; `Exec]));
Packit 9ff65e
             ];
Packit 9ff65e
           ]);
Packit 9ff65e
Packit 9ff65e
      "apply" >::
Packit 9ff65e
      (fun _ ->
Packit 9ff65e
         List.iter
Packit 9ff65e
           (fun (is_dir, umask, i, m, e) ->
Packit 9ff65e
              assert_equal
Packit 9ff65e
                ~msg:(Printf.sprintf "0o%04o + %s" i (FileUtilMode.to_string m))
Packit 9ff65e
                ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
                e (FileUtilMode.apply ~is_dir ~umask i m))
Packit 9ff65e
           [
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add `Read)], 0o0640;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add (`List [`Read; `Write]))], 0o0660;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Other (`Add (`List [`Read; `Write]))], 0o0606;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`User (`Set (`List [`Read; `Write; `Exec]))], 0o0700;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`User (`Set (`List [`Read; `Write; `Exec]))], 0o0700;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`None (`Add (`List [`Read; `Write; `Exec]))], 0o0755;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add `ExecX)], 0o0600;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0700,
Packit 9ff65e
             [`Group (`Add `ExecX)], 0o0710;
Packit 9ff65e
Packit 9ff65e
             true, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add `ExecX)], 0o0610;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Set `User)], 0o0660;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add `StickyO)], 0o0600;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Group (`Add `Sticky)], 0o2600;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Other (`Add `StickyO)], 0o1600;
Packit 9ff65e
Packit 9ff65e
             false, 0o022, 0o0600,
Packit 9ff65e
             [`Other (`Add `Sticky)], 0o0600;
Packit 9ff65e
           ]
Packit 9ff65e
      )
Packit 9ff65e
    ];
Packit 9ff65e
Packit 9ff65e
    "Touch in not existing subdir" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       try
Packit 9ff65e
         let file = make_filename [tmp_dir; "doesntexist"; "essai0"] in
Packit 9ff65e
         touch file;
Packit 9ff65e
         assert_failure
Packit 9ff65e
           "Touch should have failed, since intermediate directory is missing"
Packit 9ff65e
       with _ ->
Packit 9ff65e
         ());
Packit 9ff65e
Packit 9ff65e
    "Touch in existing dir v1" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
       touch file;
Packit 9ff65e
       assert_bool "touch" (test Exists file);
Packit 9ff65e
    );
Packit 9ff65e
Packit 9ff65e
    "Touch in existing dir with no create" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = make_filename [tmp_dir; "essai2"] in
Packit 9ff65e
         touch ~create:false file;
Packit 9ff65e
         assert_bool "touch" (not (test Exists file)));
Packit 9ff65e
Packit 9ff65e
    "Touch in existing dir v2" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = make_filename [tmp_dir; "essai1"] in
Packit 9ff65e
         touch file;
Packit 9ff65e
         assert_bool "touch" (test Exists file));
Packit 9ff65e
Packit 9ff65e
    "Touch precedence" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let time = Unix.gettimeofday () in
Packit 9ff65e
       let fn1 = make_filename [tmp_dir; "essai1"] in
Packit 9ff65e
       let fn2 = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
         touch ~time:(Touch_timestamp time) fn1;
Packit 9ff65e
         touch ~time:(Touch_timestamp (time +. 1.0)) fn2;
Packit 9ff65e
         assert_bool "touch precedence 1"
Packit 9ff65e
           (test (Is_newer_than fn1) fn2);
Packit 9ff65e
         assert_bool
Packit 9ff65e
           "touch precedence 2"
Packit 9ff65e
           (test (Is_older_than fn2) fn1));
Packit 9ff65e
Packit 9ff65e
    "Mkdir simple v1" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = make_filename [tmp_dir; "essai2"] in
Packit 9ff65e
         mkdir dir;
Packit 9ff65e
         assert_bool "mkdir" (test Is_dir dir));
Packit 9ff65e
Packit 9ff65e
    "Mkdir simple && mode 700" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = make_filename [tmp_dir; "essai3"] in
Packit 9ff65e
         mkdir ~mode:(`Octal 0o0700) dir;
Packit 9ff65e
         assert_bool "mkdir" (test Is_dir dir));
Packit 9ff65e
Packit 9ff65e
    "Mkdir recurse v2" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = make_filename [tmp_dir; "essai4"; "essai5"] in
Packit 9ff65e
         assert_error
Packit 9ff65e
           "missing component path"
Packit 9ff65e
           (function
Packit 9ff65e
              | `MissingComponentPath _ -> true
Packit 9ff65e
              | _ -> false)
Packit 9ff65e
           (fun error -> mkdir ~error dir));
Packit 9ff65e
Packit 9ff65e
    "Mkdir && already exist v3" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
         touch dir;
Packit 9ff65e
         assert_error
Packit 9ff65e
           "dirname already used"
Packit 9ff65e
           (function
Packit 9ff65e
              | `DirnameAlreadyUsed _ -> true
Packit 9ff65e
              | _ -> false)
Packit 9ff65e
           (fun error -> mkdir ~error dir));
Packit 9ff65e
Packit 9ff65e
    "Mkdir recurse v4" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir1 = (make_filename [tmp_dir; "essai4"]) in
Packit 9ff65e
       let dir2 = (make_filename [dir1; "essai5"]) in
Packit 9ff65e
         mkdir ~parent:true dir2;
Packit 9ff65e
         assert_bool "mkdir" (test Is_dir dir2);
Packit 9ff65e
         assert_perm dir1 0o0755;
Packit 9ff65e
         assert_perm dir2 0o0755;
Packit 9ff65e
         rm ~recurse:true [dir1];
Packit 9ff65e
         assert_bool "no dir" (not (test Exists dir2));
Packit 9ff65e
Packit 9ff65e
         mkdir
Packit 9ff65e
           ~parent:true
Packit 9ff65e
           ~mode:(`Symbolic [`Group (`Add `Write); `Other (`Set (`List []))])
Packit 9ff65e
           dir2;
Packit 9ff65e
         assert_bool "mkdir" (test Is_dir dir2);
Packit 9ff65e
         assert_perm dir1 0o0755;
Packit 9ff65e
         assert_perm dir2 0o0770;
Packit 9ff65e
         rm ~recurse:true [dir1];
Packit 9ff65e
         assert_bool "no dir" (not (test Exists dir2));
Packit 9ff65e
Packit 9ff65e
         mkdir
Packit 9ff65e
           ~parent:true
Packit 9ff65e
           ~mode:(`Octal 0o0770)
Packit 9ff65e
           dir2;
Packit 9ff65e
         assert_bool "mkdir" (test Is_dir dir2);
Packit 9ff65e
         assert_perm dir1 0o0755;
Packit 9ff65e
         assert_perm dir2 0o0770;
Packit 9ff65e
         rm ~recurse:true [dir1];
Packit 9ff65e
         assert_bool "no dir" (not (test Exists dir2)));
Packit 9ff65e
Packit 9ff65e
    "Find v0" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       with_bracket_chdir test_ctxt tmp_dir
Packit 9ff65e
         (fun _ ->
Packit 9ff65e
            let find_acc _ =
Packit 9ff65e
              find True "." (fun acc x -> reduce x :: acc) []
Packit 9ff65e
            in
Packit 9ff65e
            let lst_dot =
Packit 9ff65e
              find_acc "."
Packit 9ff65e
            in
Packit 9ff65e
            let lst_empty =
Packit 9ff65e
              find_acc ""
Packit 9ff65e
            in
Packit 9ff65e
              assert_bool "find '.' is empty" (lst_dot <> []);
Packit 9ff65e
              assert_bool "find '' is empty" (lst_empty <> []);
Packit 9ff65e
              assert_bool "find '.' <> find ''" (lst_dot = lst_empty)));
Packit 9ff65e
Packit 9ff65e
    "Find v1" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let sfs =
Packit 9ff65e
         SafeFS.create tmp_dir
Packit 9ff65e
           ["essai_dir"]
Packit 9ff65e
           ["essai_file"]
Packit 9ff65e
       in
Packit 9ff65e
       let set =
Packit 9ff65e
         find True tmp_dir (fun set fln -> SetFilename.add fln set)
Packit 9ff65e
           SetFilename.empty
Packit 9ff65e
       in
Packit 9ff65e
         assert_equal_set_filename
Packit 9ff65e
           (SetFilename.union sfs.SafeFS.dirs sfs.SafeFS.files)
Packit 9ff65e
           set);
Packit 9ff65e
Packit 9ff65e
    "Find v2" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let sfs =
Packit 9ff65e
         SafeFS.create tmp_dir
Packit 9ff65e
           ["essai_dir"]
Packit 9ff65e
           ["essai_file"]
Packit 9ff65e
       in
Packit 9ff65e
       let set =
Packit 9ff65e
         find Is_dir tmp_dir (fun set fln -> SetFilename.add fln set)
Packit 9ff65e
           SetFilename.empty
Packit 9ff65e
       in
Packit 9ff65e
         assert_equal_set_filename sfs.SafeFS.dirs set);
Packit 9ff65e
Packit 9ff65e
    "Find v3" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let sfs =
Packit 9ff65e
         SafeFS.create tmp_dir
Packit 9ff65e
           ["essai_dir"]
Packit 9ff65e
           ["essai_file"]
Packit 9ff65e
       in
Packit 9ff65e
       let set =
Packit 9ff65e
         find Is_file tmp_dir (fun set fln -> SetFilename.add fln set)
Packit 9ff65e
           SetFilename.empty
Packit 9ff65e
       in
Packit 9ff65e
         assert_equal_set_filename sfs.SafeFS.files set);
Packit 9ff65e
Packit 9ff65e
    "Find v4" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let sfs =
Packit 9ff65e
         SafeFS.create tmp_dir
Packit 9ff65e
           ["essai_dir"]
Packit 9ff65e
           ["essai_file"]
Packit 9ff65e
       in
Packit 9ff65e
       let set =
Packit 9ff65e
         find Is_file (Filename.concat tmp_dir "")
Packit 9ff65e
           (fun set fln -> SetFilename.add fln set)
Packit 9ff65e
           SetFilename.empty
Packit 9ff65e
      in
Packit 9ff65e
         assert_equal_set_filename sfs.SafeFS.files set);
Packit 9ff65e
Packit 9ff65e
    "Unix specific" >:::
Packit 9ff65e
    (
Packit 9ff65e
      let mk_symlink test_ctxt =
Packit 9ff65e
        let () =
Packit 9ff65e
          skip_if (Sys.os_type <> "Unix") "Symlink only works on Unix."
Packit 9ff65e
        in
Packit 9ff65e
        let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
        let symlink = make_filename [tmp_dir; "recurse"] in
Packit 9ff65e
        let sfs =
Packit 9ff65e
          SafeFS.create tmp_dir
Packit 9ff65e
            ["essai_dir"]
Packit 9ff65e
            ["essai_file"]
Packit 9ff65e
        in
Packit 9ff65e
          Unix.symlink current_dir symlink;
Packit 9ff65e
          SafeFS.mark sfs symlink;
Packit 9ff65e
          tmp_dir, symlink, sfs
Packit 9ff65e
      in
Packit 9ff65e
      let mk_filelink test_ctxt =
Packit 9ff65e
        let () =
Packit 9ff65e
          skip_if (Sys.os_type <> "Unix") "Symlink only works on Unix."
Packit 9ff65e
        in
Packit 9ff65e
        let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
        let symlink = make_filename [tmp_dir; "recurse"] in
Packit 9ff65e
        let source  = make_filename [tmp_dir; "essai_file"] in
Packit 9ff65e
        let sfs =
Packit 9ff65e
          SafeFS.create tmp_dir
Packit 9ff65e
            []
Packit 9ff65e
            ["essai_file"]
Packit 9ff65e
        in
Packit 9ff65e
        Unix.symlink source symlink;
Packit 9ff65e
        SafeFS.mark sfs symlink;
Packit 9ff65e
        tmp_dir, symlink, sfs
Packit 9ff65e
      in
Packit 9ff65e
      let mk_deadlink test_ctxt =
Packit 9ff65e
        let () =
Packit 9ff65e
          skip_if (Sys.os_type <> "Unix") "Symlink only works on Unix."
Packit 9ff65e
        in
Packit 9ff65e
        let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
        let dir = make_filename [tmp_dir; "dir1"] in
Packit 9ff65e
        let symlink = make_filename [dir; "dead"] in
Packit 9ff65e
          mkdir dir;
Packit 9ff65e
          Unix.symlink "non_existing.txt" symlink;
Packit 9ff65e
          tmp_dir, symlink, dir
Packit 9ff65e
      in
Packit 9ff65e
        [
Packit 9ff65e
          "Unix symlink" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let _, symlink, _ = mk_symlink test_ctxt in
Packit 9ff65e
               assert_bool "symlink is not a link" (test Is_link symlink);
Packit 9ff65e
               assert_bool "symlink is not a dir" (test Is_dir symlink));
Packit 9ff65e
Packit 9ff65e
          "Find v4 (link follow)" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, _, _ = mk_symlink test_ctxt in
Packit 9ff65e
               try
Packit 9ff65e
                 find ~follow:Follow Is_dir tmp_dir (fun () _ -> ()) ();
Packit 9ff65e
                 assert_failure
Packit 9ff65e
                   "find follow should have failed, since there is \
Packit 9ff65e
                    recursive symlink"
Packit 9ff65e
               with RecursiveLink _ ->
Packit 9ff65e
                 ());
Packit 9ff65e
Packit 9ff65e
          "Find v5 (no link follow)" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, fn, sfs = mk_symlink test_ctxt in
Packit 9ff65e
             let set =
Packit 9ff65e
               find ~follow:Skip Is_dir tmp_dir
Packit 9ff65e
                 (fun set fln -> SetFilename.add fln set)
Packit 9ff65e
                 SetFilename.empty
Packit 9ff65e
             in
Packit 9ff65e
               assert_bool "find symlink skip fails"
Packit 9ff65e
                 (SetFilename.equal set
Packit 9ff65e
                    (SetFilename.add fn sfs.SafeFS.dirs)));
Packit 9ff65e
Packit 9ff65e
          "Unix delete symlink" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let _, symlink, _ = mk_symlink test_ctxt in
Packit 9ff65e
               rm [symlink];
Packit 9ff65e
                 try
Packit 9ff65e
                   let _st: Unix.stats = Unix.lstat symlink in
Packit 9ff65e
                     assert_failure "rm symlink failed"
Packit 9ff65e
                 with Unix.Unix_error(Unix.ENOENT, _, _) ->
Packit 9ff65e
                   ());
Packit 9ff65e
          "Dead link + stat" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let _, symlink, _ = mk_deadlink test_ctxt in
Packit 9ff65e
             let st = stat symlink in
Packit 9ff65e
               assert_bool "is marked as a link" st.is_link;
Packit 9ff65e
               assert_equal ~msg:"is a link" Symlink st.kind;
Packit 9ff65e
               assert_raises
Packit 9ff65e
                 ~msg:"cannot dereference"
Packit 9ff65e
                 (FileDoesntExist symlink)
Packit 9ff65e
                 (fun () -> stat ~dereference:true symlink));
Packit 9ff65e
Packit 9ff65e
          "Dead link + test" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let _, symlink, _ = mk_deadlink test_ctxt in
Packit 9ff65e
               assert_bool "dead link exists"
Packit 9ff65e
                 (test Is_link symlink));
Packit 9ff65e
Packit 9ff65e
          "Dead symlink + rm" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let _, _, dir = mk_deadlink test_ctxt in
Packit 9ff65e
               rm ~recurse:true [dir]);
Packit 9ff65e
Packit 9ff65e
          "Dead symlink + cp -r" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, _, dir1 = mk_deadlink test_ctxt in
Packit 9ff65e
             let dir2 = make_filename [tmp_dir; "dir2"] in
Packit 9ff65e
               cp ~recurse:true [dir1] dir2;
Packit 9ff65e
               try
Packit 9ff65e
                 (* test Is_link *)
Packit 9ff65e
                 let _st: Unix.stats =
Packit 9ff65e
                   Unix.lstat (make_filename [dir2; "dead"])
Packit 9ff65e
                 in
Packit 9ff65e
                 ()
Packit 9ff65e
               with Unix.Unix_error(Unix.ENOENT, _, _) ->
Packit 9ff65e
                 assert_failure "dead link not copied.");
Packit 9ff65e
Packit 9ff65e
          "Dead symlink + cp -r v2" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, symlink, _ = mk_deadlink test_ctxt in
Packit 9ff65e
             let dir2 = make_filename [tmp_dir; "dir2"] in
Packit 9ff65e
               cp ~recurse:true [symlink] dir2;
Packit 9ff65e
               try
Packit 9ff65e
                 (* test Is_link *)
Packit 9ff65e
                 let _st: Unix.stats = Unix.lstat dir2 in
Packit 9ff65e
                 ()
Packit 9ff65e
               with Unix.Unix_error(Unix.ENOENT, _, _) ->
Packit 9ff65e
                 assert_failure "dead link not copied.");
Packit 9ff65e
Packit 9ff65e
          "Dead symlink + cp" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, symlink, _ = mk_deadlink test_ctxt in
Packit 9ff65e
             let dir2 = make_filename [tmp_dir; "dir2"] in
Packit 9ff65e
               try
Packit 9ff65e
                 cp [symlink] dir2;
Packit 9ff65e
                 assert_failure "dead link should not copied."
Packit 9ff65e
               with FileDoesntExist _ ->
Packit 9ff65e
                 ());
Packit 9ff65e
Packit 9ff65e
          "Live filelink + cp" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, symlink, _ = mk_filelink test_ctxt in
Packit 9ff65e
             let dest = make_filename [tmp_dir; "dest"] in
Packit 9ff65e
             cp [symlink] dest;
Packit 9ff65e
             assert_bool "regular" (not(test Is_link dest)));
Packit 9ff65e
Packit 9ff65e
          "Readlink" >::
Packit 9ff65e
          (fun test_ctxt ->
Packit 9ff65e
             let tmp_dir, fn, _ = mk_symlink test_ctxt in
Packit 9ff65e
               assert_equal
Packit 9ff65e
                 ~printer:(Printf.sprintf "%S")
Packit 9ff65e
                 tmp_dir (readlink fn));
Packit 9ff65e
        ]
Packit 9ff65e
    );
Packit 9ff65e
Packit 9ff65e
    "Chmod" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let fn, chn = bracket_tmpfile test_ctxt in
Packit 9ff65e
       let () = close_out chn in
Packit 9ff65e
Packit 9ff65e
       let iter_chmod =
Packit 9ff65e
         List.iter
Packit 9ff65e
           (fun (ini, mode, exp) ->
Packit 9ff65e
              Unix.chmod fn ini;
Packit 9ff65e
              chmod mode [fn];
Packit 9ff65e
              assert_perm fn exp)
Packit 9ff65e
       in
Packit 9ff65e
Packit 9ff65e
       let () =
Packit 9ff65e
         if Sys.os_type = "Unix" then begin
Packit 9ff65e
           iter_chmod
Packit 9ff65e
             [
Packit 9ff65e
               0o0000, `Symbolic [`User (`Add `Exec)],     0o0100;
Packit 9ff65e
               0o0100, `Symbolic [`User (`Remove `Exec)],  0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Group (`Add `Exec)],    0o0010;
Packit 9ff65e
               0o0010, `Symbolic [`Group (`Remove `Exec)], 0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Other (`Add `Exec)],    0o0001;
Packit 9ff65e
               0o0001, `Symbolic [`Other (`Remove `Exec)], 0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`All (`Add `Exec)],      0o0111;
Packit 9ff65e
               0o0111, `Symbolic [`All (`Remove `Exec)],   0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`User (`Add `ExecX)],    0o0000;
Packit 9ff65e
               0o0010, `Symbolic [`User (`Add `ExecX)],    0o0110;
Packit 9ff65e
               0o0001, `Symbolic [`User (`Add `ExecX)],    0o0101;
Packit 9ff65e
             ]
Packit 9ff65e
         end;
Packit 9ff65e
         iter_chmod
Packit 9ff65e
           [
Packit 9ff65e
               0o0200, `Symbolic [`User (`Add `Write)],     0o0200;
Packit 9ff65e
               0o0000, `Symbolic [`User (`Add `Write)],     0o0200;
Packit 9ff65e
               0o0200, `Symbolic [`User (`Remove `Write)],  0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Group (`Add `Write)],    0o0020;
Packit 9ff65e
               0o0020, `Symbolic [`Group (`Remove `Write)], 0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Other (`Add `Write)],    0o0002;
Packit 9ff65e
               0o0002, `Symbolic [`Other (`Remove `Write)], 0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`All (`Add `Write)],      0o0222;
Packit 9ff65e
               0o0222, `Symbolic [`All (`Remove `Write)],   0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`User (`Add `Read)],      0o0400;
Packit 9ff65e
               0o0400, `Symbolic [`User (`Remove `Read)],   0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Group (`Add `Read)],     0o0040;
Packit 9ff65e
               0o0040, `Symbolic [`Group (`Remove `Read)],  0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`Other (`Add `Read)],     0o0004;
Packit 9ff65e
               0o0004, `Symbolic [`Other (`Remove `Read)],  0o0000;
Packit 9ff65e
               0o0000, `Symbolic [`All (`Add `Read)],       0o0444;
Packit 9ff65e
               0o0444, `Symbolic [`All (`Remove `Read)],    0o0000;
Packit 9ff65e
               0o0000, `Octal 0o644,                        0o0644;
Packit 9ff65e
               0o0100,
Packit 9ff65e
               (* u=r,g=u,u+w *)
Packit 9ff65e
               `Symbolic [`User (`Set `Read);
Packit 9ff65e
                          `Group (`Set `User);
Packit 9ff65e
                          `User (`Add `Write)],
Packit 9ff65e
               0o640;
Packit 9ff65e
           ]
Packit 9ff65e
       in
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let fn =  make_filename [tmp_dir; "essai6"] in
Packit 9ff65e
         touch fn;
Packit 9ff65e
         Unix.chmod fn 0o0000;
Packit 9ff65e
         chmod ~recurse:true (`Symbolic [`User (`Add `Read)]) [tmp_dir];
Packit 9ff65e
         assert_perm fn 0o0400);
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
    "Cp v1" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = make_filename [tmp_dir; "essai6"] in
Packit 9ff65e
       let fn0 = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
         touch fn0;
Packit 9ff65e
         cp [fn0] file;
Packit 9ff65e
         assert_bool "cp" (test Exists file));
Packit 9ff65e
Packit 9ff65e
    "Cp v2" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = make_filename [tmp_dir; "essai4"] in
Packit 9ff65e
       let fn0 = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
         touch fn0;
Packit 9ff65e
         cp [fn0] file;
Packit 9ff65e
         assert_bool "cp" (test Exists file));
Packit 9ff65e
Packit 9ff65e
    "Cp with space" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dirspace = make_filename [tmp_dir; "essai 7"] in
Packit 9ff65e
       let file = make_filename [dirspace; "essai0"] in
Packit 9ff65e
       let fn0 = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
         touch fn0;
Packit 9ff65e
         mkdir dirspace;
Packit 9ff65e
         cp [fn0] file;
Packit 9ff65e
         assert_bool "cp" (test Exists file));
Packit 9ff65e
Packit 9ff65e
    "Cp dir to dir" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir1 = make_filename [tmp_dir; "dir1"] in
Packit 9ff65e
       let dir2 = make_filename [tmp_dir; "dir2"] in
Packit 9ff65e
         mkdir dir1;
Packit 9ff65e
         touch (make_filename [dir1; "file.txt"]);
Packit 9ff65e
         cp ~recurse:true [dir1] dir2;
Packit 9ff65e
         assert_bool "cp" (test Exists (make_filename [dir2; "file.txt"]));
Packit 9ff65e
         cp ~recurse:true [dir1] dir2;
Packit 9ff65e
         assert_bool "cp dir" (test Is_dir (make_filename [dir2; "dir1"])));
Packit 9ff65e
Packit 9ff65e
    "Cp ACL" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let fn1 = make_filename [tmp_dir; "foo1.txt"] in
Packit 9ff65e
       let fn2 = make_filename [tmp_dir; "foo2.txt"] in
Packit 9ff65e
       let fn3 = make_filename [tmp_dir; "foo3.txt"] in
Packit 9ff65e
         touch fn1;
Packit 9ff65e
         Unix.chmod fn1 0o444;
Packit 9ff65e
         assert_perm fn1 0o444;
Packit 9ff65e
         cp [fn1] fn2;
Packit 9ff65e
         assert_perm fn2 0o444;
Packit 9ff65e
         if Sys.os_type = "Unix" then begin
Packit 9ff65e
           Unix.chmod fn1 0o555;
Packit 9ff65e
           assert_perm fn1 0o555;
Packit 9ff65e
           cp [fn1] fn3;
Packit 9ff65e
           assert_perm fn3 0o555
Packit 9ff65e
         end);
Packit 9ff65e
Packit 9ff65e
    "Cp preserve" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir1 = make_filename [tmp_dir; "dir1"] in
Packit 9ff65e
       let fn1 = make_filename [dir1; "fn1.txt"] in
Packit 9ff65e
       let dir2 = make_filename [tmp_dir; "dir2"] in
Packit 9ff65e
       let fn2 = make_filename [dir2; "fn1.txt"] in
Packit 9ff65e
       let assert_equal_time ?msg exp got =
Packit 9ff65e
         assert_equal ?msg ~printer:string_of_float exp got
Packit 9ff65e
       in
Packit 9ff65e
         mkdir dir1;
Packit 9ff65e
         touch ~time:(Touch_timestamp 1.0) ~mtime:true fn1;
Packit 9ff65e
         touch ~time:(Touch_timestamp 2.0) ~atime:true fn1;
Packit 9ff65e
         touch ~time:(Touch_timestamp 3.0) ~mtime:true dir1;
Packit 9ff65e
         touch ~time:(Touch_timestamp 4.0) ~atime:true dir1;
Packit 9ff65e
         assert_equal_time ~msg:"fn1 mtime"  1.0 (stat fn1).modification_time;
Packit 9ff65e
         assert_equal_time ~msg:"fn1 atime"  2.0 (stat fn1).access_time;
Packit 9ff65e
         assert_equal_time ~msg:"dir1 mtime" 3.0 (stat dir1).modification_time;
Packit 9ff65e
         assert_equal_time ~msg:"dir1 atime" 4.0 (stat dir1).access_time;
Packit 9ff65e
         cp ~recurse:true ~preserve:true [dir1] dir2;
Packit 9ff65e
         assert_equal_time ~msg:"fn2 mtime"  1.0 (stat fn2).modification_time;
Packit 9ff65e
         assert_equal_time ~msg:"fn2 atime"  2.0 (stat fn2).access_time;
Packit 9ff65e
         assert_equal_time ~msg:"dir2 mtime" 3.0 (stat dir2).modification_time;
Packit 9ff65e
         assert_equal_time ~msg:"dir2 atime" 4.0 (stat dir2).access_time);
Packit 9ff65e
Packit 9ff65e
    "Cp POSIX" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir1 = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let tmp_dir2 = bracket_tmpdir test_ctxt in
Packit 9ff65e
         touch (concat tmp_dir1 "foo.txt");
Packit 9ff65e
         with_bracket_chdir test_ctxt tmp_dir1
Packit 9ff65e
           (fun _ ->
Packit 9ff65e
              cp ~recurse:true [current_dir] tmp_dir2);
Packit 9ff65e
         assert_bool "file" (test Is_file (concat tmp_dir2 "foo.txt")));
Packit 9ff65e
Packit 9ff65e
    "Mv simple" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file0 = make_filename [tmp_dir; "essai0"] in
Packit 9ff65e
       let file1 = make_filename [tmp_dir; "essai10"] in
Packit 9ff65e
       let file2 = make_filename [tmp_dir; "essai9"] in
Packit 9ff65e
         touch file0;
Packit 9ff65e
         cp [file0] file1;
Packit 9ff65e
         mv file1 file2;
Packit 9ff65e
         cp [file0] file1;
Packit 9ff65e
         mv file1 file2;
Packit 9ff65e
         assert_bool "mv" (test Exists file2));
Packit 9ff65e
Packit 9ff65e
    "Mv otherfs" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file_test = make_filename [tmp_dir; "essai12"] in
Packit 9ff65e
       let sfs = SafeFS.create tmp_dir [] ["essai12"] in
Packit 9ff65e
       let file =
Packit 9ff65e
         let fn = Filename.temp_file ~temp_dir:(pwd ()) "otherfs" ".txt" in
Packit 9ff65e
           Sys.remove fn;
Packit 9ff65e
           bracket ignore
Packit 9ff65e
             (fun () _ ->
Packit 9ff65e
                rm ~force:(SafeFS.auto_ask_user sfs) [fn])
Packit 9ff65e
             test_ctxt;
Packit 9ff65e
           fn
Packit 9ff65e
       in
Packit 9ff65e
         mv file_test file;
Packit 9ff65e
         SafeFS.mark sfs file;
Packit 9ff65e
         assert_bool "mv" (test Exists file));
Packit 9ff65e
Packit 9ff65e
    "Rm simple" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let file = (make_filename [tmp_dir; "essai0"]) in
Packit 9ff65e
       let sfs = SafeFS.create tmp_dir [] ["essai0"] in
Packit 9ff65e
         rm ~force:(SafeFS.auto_ask_user sfs) [file];
Packit 9ff65e
         assert_bool "rm" (test (Not Exists) file));
Packit 9ff65e
Packit 9ff65e
    "Rm no recurse" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = (make_filename [tmp_dir; "essai4"]) in
Packit 9ff65e
       let sfs = SafeFS.create tmp_dir ["essai4"] ["essai0"] in
Packit 9ff65e
         mkdir dir;
Packit 9ff65e
         assert_error
Packit 9ff65e
           "rm should have failed trying to delete a directory"
Packit 9ff65e
           (function
Packit 9ff65e
              | `NoRecurse _ -> true
Packit 9ff65e
              | _ -> false)
Packit 9ff65e
           (fun error -> rm ~error ~force:(SafeFS.auto_ask_user sfs) [dir]));
Packit 9ff65e
Packit 9ff65e
    "Rm ask duplicate" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       let tmp_dir = bracket_tmpdir test_ctxt in
Packit 9ff65e
       let dir = make_filename [tmp_dir; "ask-duplicate"] in
Packit 9ff65e
       let sfs =
Packit 9ff65e
         SafeFS.create tmp_dir
Packit 9ff65e
           ["ask-duplicate"]
Packit 9ff65e
           [make_filename ["ask-duplicate"; "toto.txt"]]
Packit 9ff65e
       in
Packit 9ff65e
       let set_asked = ref SetFilename.empty in
Packit 9ff65e
       let set_duplicated = ref SetFilename.empty in
Packit 9ff65e
       let ask_register fn =
Packit 9ff65e
         if SetFilename.mem fn !set_asked then
Packit 9ff65e
           set_duplicated := SetFilename.add fn !set_duplicated;
Packit 9ff65e
         set_asked := SetFilename.add fn !set_asked;
Packit 9ff65e
         match SafeFS.auto_ask_user sfs with
Packit 9ff65e
           | Ask f -> f fn
Packit 9ff65e
           | _ -> false
Packit 9ff65e
       in
Packit 9ff65e
         rm ~force:(Ask ask_register) ~recurse:true [dir];
Packit 9ff65e
         assert_equal
Packit 9ff65e
           ~msg:"duplicate file asked when removing"
Packit 9ff65e
           SetFilename.empty
Packit 9ff65e
           !set_duplicated);
Packit 9ff65e
Packit 9ff65e
    "Which ocamlc" >::
Packit 9ff65e
    (fun _ ->
Packit 9ff65e
       try
Packit 9ff65e
         let _str: string = which "ocamlc" in
Packit 9ff65e
           ()
Packit 9ff65e
       with Not_found ->
Packit 9ff65e
         assert_failure "Cannot find ocamlc");
Packit 9ff65e
Packit 9ff65e
    "Umask" >::
Packit 9ff65e
    (fun test_ctxt ->
Packit 9ff65e
       assert_equal
Packit 9ff65e
         ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
         test_umask
Packit 9ff65e
         (umask (`Octal (fun i -> i)));
Packit 9ff65e
       assert_equal
Packit 9ff65e
         ~printer:FileUtilMode.to_string
Packit 9ff65e
         [`User (`Set (`List [`Read; `Write; `Exec]));
Packit 9ff65e
          `Group (`Set (`List [`Read; `Exec]));
Packit 9ff65e
          `Other (`Set (`List [`Read; `Exec]))]
Packit 9ff65e
         (umask (`Symbolic (fun s -> s)));
Packit 9ff65e
       List.iter
Packit 9ff65e
         (fun (i, e) ->
Packit 9ff65e
            assert_equal
Packit 9ff65e
              ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
              e (umask_apply i))
Packit 9ff65e
         [
Packit 9ff65e
           0o777, 0o755;
Packit 9ff65e
           0o1777, 0o1755
Packit 9ff65e
         ];
Packit 9ff65e
       with_bracket_umask test_ctxt test_umask
Packit 9ff65e
         (fun _ _ ->
Packit 9ff65e
            umask ~mode:(`Octal 0o0222) (`Octal ignore);
Packit 9ff65e
            assert_equal
Packit 9ff65e
              ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
              0o0222 (umask (`Octal (fun i -> i))));
Packit 9ff65e
       with_bracket_umask test_ctxt test_umask
Packit 9ff65e
         (fun _ _ ->
Packit 9ff65e
            assert_raises
Packit 9ff65e
              (UmaskError("Cannot set sticky bit in umask 0o1222"))
Packit 9ff65e
              (fun () ->
Packit 9ff65e
                 umask ~mode:(`Octal 0o1222) (`Octal ignore)));
Packit 9ff65e
       List.iter
Packit 9ff65e
         (fun (s, e) ->
Packit 9ff65e
            with_bracket_umask test_ctxt test_umask
Packit 9ff65e
              (fun msk _ ->
Packit 9ff65e
                 assert_equal
Packit 9ff65e
                   ~msg:(Printf.sprintf
Packit 9ff65e
                           "0o%04o + %s -> 0o%04o"
Packit 9ff65e
                           msk (FileUtilMode.to_string s) e)
Packit 9ff65e
                   ~printer:(Printf.sprintf "0o%04o")
Packit 9ff65e
                   e (umask ~mode:(`Symbolic s) (`Octal (fun i -> i)))))
Packit 9ff65e
         [
Packit 9ff65e
           [`None (`Add `Read)], 0o0022;
Packit 9ff65e
           [`None (`Add (`List [`Read; `Write]))], 0o0000;
Packit 9ff65e
           [`All (`Remove `Read)], 0o0466;
Packit 9ff65e
           [`Group (`Set (`List [`Read; `Write; `Exec]))], 0o0002;
Packit 9ff65e
         ];
Packit 9ff65e
       ()
Packit 9ff65e
    );
Packit 9ff65e
Packit 9ff65e
    "Size" >:::
Packit 9ff65e
    [
Packit 9ff65e
Packit 9ff65e
      "string_of_size" >:::
Packit 9ff65e
      (
Packit 9ff65e
        let i64_unit =
Packit 9ff65e
          1025L
Packit 9ff65e
        in
Packit 9ff65e
        let i64_unit2 =
Packit 9ff65e
          Int64.succ (Int64.mul 1024L 1024L)
Packit 9ff65e
        in
Packit 9ff65e
        let test_of_vector fuzzy (str, sz) =
Packit 9ff65e
          test_case
Packit 9ff65e
            (fun _ ->
Packit 9ff65e
               assert_equal
Packit 9ff65e
                 ~printer:(fun s -> s)
Packit 9ff65e
                 str
Packit 9ff65e
                 (string_of_size ~fuzzy:fuzzy sz))
Packit 9ff65e
        in
Packit 9ff65e
Packit 9ff65e
          [
Packit 9ff65e
            "exact" >:::
Packit 9ff65e
            (List.map
Packit 9ff65e
               (test_of_vector false)
Packit 9ff65e
               [
Packit 9ff65e
                 "0 TB", TB 0L;
Packit 9ff65e
                 "0 GB", GB 0L;
Packit 9ff65e
                 "0 MB", MB 0L;
Packit 9ff65e
                 "0 KB", KB 0L;
Packit 9ff65e
                 "0 B",  B  0L;
Packit 9ff65e
                 "1 TB", TB 1L;
Packit 9ff65e
                 "1 GB", GB 1L;
Packit 9ff65e
                 "1 MB", MB 1L;
Packit 9ff65e
                 "1 KB", KB 1L;
Packit 9ff65e
                 "1 B",  B  1L;
Packit 9ff65e
                 "1025 TB",   TB i64_unit;
Packit 9ff65e
                 "1 TB 1 GB", GB i64_unit;
Packit 9ff65e
                 "1 GB 1 MB", MB i64_unit;
Packit 9ff65e
                 "1 MB 1 KB", KB i64_unit;
Packit 9ff65e
                 "1 KB 1 B",  B  i64_unit;
Packit 9ff65e
                 "1024 TB 1 GB", GB i64_unit2;
Packit 9ff65e
                 "1 TB 1 MB",    MB i64_unit2;
Packit 9ff65e
                 "1 GB 1 KB",    KB i64_unit2;
Packit 9ff65e
                 "1 MB 1 B",     B  i64_unit2;
Packit 9ff65e
                 "97 MB 728 KB 349 B", B 102457693L;
Packit 9ff65e
               ]);
Packit 9ff65e
Packit 9ff65e
            "fuzzy" >:::
Packit 9ff65e
            (List.map
Packit 9ff65e
               (test_of_vector true)
Packit 9ff65e
               [
Packit 9ff65e
                 "0.00 TB", TB 0L;
Packit 9ff65e
                 "0.00 GB", GB 0L;
Packit 9ff65e
                 "0.00 MB", MB 0L;
Packit 9ff65e
                 "0.00 KB", KB 0L;
Packit 9ff65e
                 "0.00 B",  B  0L;
Packit 9ff65e
                 "1.00 TB", TB 1L;
Packit 9ff65e
                 "1.00 GB", GB 1L;
Packit 9ff65e
                 "1.00 MB", MB 1L;
Packit 9ff65e
                 "1.00 KB", KB 1L;
Packit 9ff65e
                 "1.00 B",  B  1L;
Packit 9ff65e
                 "1025.00 TB", TB i64_unit;
Packit 9ff65e
                 "1.00 TB",    GB i64_unit;
Packit 9ff65e
                 "1.00 GB",    MB i64_unit;
Packit 9ff65e
                 "1.00 MB",    KB i64_unit;
Packit 9ff65e
                 "1.00 KB",    B  i64_unit;
Packit 9ff65e
                 "1024.00 TB", GB i64_unit2;
Packit 9ff65e
                 "1.00 TB",    MB i64_unit2;
Packit 9ff65e
                 "1.00 GB",    KB i64_unit2;
Packit 9ff65e
                 "1.00 MB",    B  i64_unit2;
Packit 9ff65e
                 "97.71 MB", B 102457693L;
Packit 9ff65e
               ]);
Packit 9ff65e
          ]);
Packit 9ff65e
Packit 9ff65e
      "size_add" >:::
Packit 9ff65e
      (let test_of_vector (str, szs) =
Packit 9ff65e
         test_case
Packit 9ff65e
           (fun _ ->
Packit 9ff65e
              assert_equal
Packit 9ff65e
                ~printer:(fun s -> s)
Packit 9ff65e
                str
Packit 9ff65e
                (string_of_size
Packit 9ff65e
                   (List.fold_left size_add (B 0L) szs)))
Packit 9ff65e
       in
Packit 9ff65e
         List.map
Packit 9ff65e
           test_of_vector
Packit 9ff65e
           [
Packit 9ff65e
             "1 TB 10 MB 12 KB", [TB 1L; KB 12L; MB 10L];
Packit 9ff65e
             "2 MB 976 KB",      [KB 2000L; MB 1L]
Packit 9ff65e
           ]);
Packit 9ff65e
Packit 9ff65e
      "size_compare" >:::
Packit 9ff65e
      (
Packit 9ff65e
        let test_of_vector (sz1, sz2, res) =
Packit 9ff65e
          test_case
Packit 9ff65e
            (fun _ ->
Packit 9ff65e
               let cmp =
Packit 9ff65e
                 size_compare sz1 sz2
Packit 9ff65e
               in
Packit 9ff65e
               let norm i =
Packit 9ff65e
                 if i < 0 then
Packit 9ff65e
                   -1
Packit 9ff65e
                 else if i > 0 then
Packit 9ff65e
                   1
Packit 9ff65e
                 else
Packit 9ff65e
                   0
Packit 9ff65e
               in
Packit 9ff65e
                 assert_equal
Packit 9ff65e
                   ~printer:string_of_int
Packit 9ff65e
                   (norm res)
Packit 9ff65e
                   cmp)
Packit 9ff65e
        in
Packit 9ff65e
          List.map
Packit 9ff65e
            test_of_vector
Packit 9ff65e
            [
Packit 9ff65e
              TB 1L, TB 1L, 0;
Packit 9ff65e
              GB 1L, GB 1L, 0;
Packit 9ff65e
              MB 1L, MB 1L, 0;
Packit 9ff65e
              KB 1L, KB 1L, 0;
Packit 9ff65e
               B 1L,  B 1L, 0;
Packit 9ff65e
              TB 1L,  B 1L, 1;
Packit 9ff65e
              GB 1L,  B 1L, 1;
Packit 9ff65e
              MB 1L,  B 1L, 1;
Packit 9ff65e
              KB 1L,  B 1L, 1;
Packit 9ff65e
               B 2L,  B 1L, 1;
Packit 9ff65e
            ]);
Packit 9ff65e
    ];
Packit 9ff65e
  ]
Packit 9ff65e
Packit 9ff65e
Packit 9ff65e
let () =
Packit 9ff65e
  let _i: int = Unix.umask test_umask in
Packit 9ff65e
  run_test_tt_main
Packit 9ff65e
    ("ocaml-fileutils" >:::
Packit 9ff65e
     [
Packit 9ff65e
       "FilePath" >:::
Packit 9ff65e
       [
Packit 9ff65e
         test_unix;
Packit 9ff65e
         test_win32;
Packit 9ff65e
         test_macos;
Packit 9ff65e
       ];
Packit 9ff65e
Packit 9ff65e
       test_fileutil;
Packit 9ff65e
     ])