File: TestOASISFileSystem.ml

package info (click to toggle)
oasis 0.4.11-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,752 kB
  • sloc: ml: 38,989; sh: 192; makefile: 122; ansic: 67
file content (141 lines) | stat: -rw-r--r-- 4,876 bytes parent folder | download | duplicates (4)
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
(******************************************************************************)
(* OASIS: architecture for building OCaml libraries and applications          *)
(*                                                                            *)
(* Copyright (C) 2011-2016, Sylvain Le Gall                                   *)
(* Copyright (C) 2008-2011, OCamlCore SARL                                    *)
(*                                                                            *)
(* This library is free software; you can redistribute it and/or modify it    *)
(* under the terms of the GNU Lesser General Public License as published by   *)
(* the Free Software Foundation; either version 2.1 of the License, or (at    *)
(* your option) any later version, with the OCaml static compilation          *)
(* exception.                                                                 *)
(*                                                                            *)
(* This library is distributed in the hope that it will be useful, but        *)
(* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *)
(* or FITNESS FOR A PARTICULAR PURPOSE. See the file COPYING for more         *)
(* details.                                                                   *)
(*                                                                            *)
(* You should have received a copy of the GNU Lesser General Public License   *)
(* along with this library; if not, write to the Free Software Foundation,    *)
(* Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA              *)
(******************************************************************************)


(** Test for OASISFileSystem.
   @author Sylvain Le Gall
*)

open OUnit2
open OASISFileSystem

let tests =
  "OASISFileSystem" >:::
  [
    "defer_close" >::
    (fun _ ->
       let tester msg =
         let clsr =
           object
             val count = ref 0
             method close = incr count
             method get_count = !count
           end
         in
         clsr,
         fun () ->
           assert_equal
             ~msg:(msg ^ ": number of time #close has been called.")
             ~printer:string_of_int
             1
             clsr#get_count
       in
       let clsr, assrt = tester "normal" in
       let () =
         defer_close clsr ignore;
         assrt ()
       in
       let clsr, assrt = tester "raise exception" in
       let exc = Failure "foobar" in
       let () =
         try
           defer_close clsr (fun _ -> if true then raise exc; ());
           assert_failure "raise exception should have raised an exception"
         with e when e = exc ->
           assrt ()
       in
       ());

    "host_fs" >::
    (fun test_ctxt ->
       let tmpdir = bracket_tmpdir test_ctxt in
       let hfs = new host_fs tmpdir in
       let fn = of_unix_filename "foobar" in
       let content = "abcd" in

       let assert_present fn =
         assert_bool
           (Printf.sprintf
              "File %S should exist."
              (hfs#string_of_filename fn))
           (hfs#file_exists fn)
       in

       let assert_absent fn =
         assert_bool
           (Printf.sprintf
              "File %S should not exist."
              (hfs#string_of_filename fn))
           (not (hfs#file_exists fn))
       in

       let buf = Buffer.create (String.length content) in

       assert_absent fn;
       defer_close (hfs#open_out fn) ignore;
       assert_present fn;
       defer_close
         (hfs#open_out fn)
         (fun wrtr ->
            Buffer.clear buf;
            Buffer.add_string buf content;
            wrtr#output buf);
       Buffer.clear buf;
       defer_close (hfs#open_in fn) (read_all buf);
       assert_equal
         ~msg:"File content"
         ~printer:(Printf.sprintf "%S")
         content
         (Buffer.contents buf);
       hfs#remove fn;
       assert_absent fn;
       ());

    "stream_of_reader" >::
    (fun test_ctxt ->
       let tmpdir = bracket_tmpdir test_ctxt in
       let fn = of_unix_filename "test.txt" in
       let hfs = new host_fs tmpdir in
       let buf = Buffer.create 13 in

       let test_one len =
         let str =
           Buffer.clear buf;
           for i = 0 to len - 1 do
             Buffer.add_char buf (Char.chr ((Char.code 'a') + (i mod 26)))
           done;
           defer_close
             (hfs#open_out fn)
             (fun wrtr -> wrtr#output buf);
           Buffer.contents buf
         in
         defer_close
           (hfs#open_in fn)
           (fun rdr ->
              let strm = stream_of_reader rdr in
              Buffer.clear buf;
              Stream.iter (Buffer.add_char buf) strm);
         assert_equal ~printer:(Printf.sprintf "%S") str (Buffer.contents buf)
       in
       test_one 15;
       test_one 15000);
  ]