minor style changes
[ocurl.git] / examples / test_memory_leaks.ml
blob330620eed2ea0cb908bfadc0ecd110d46cc7cc75
1 open Curl
3 let test1 size =
4 let h = init () in
5 let s1 = String.make size 'd' in
6 set_private h s1;
7 let s2 = String.make size 'c' in
8 set_httppost h [CURLFORM_CONTENT ("part", s2, DEFAULT)];
9 assert (get_private h = s1);
10 cleanup h
12 let test2 size =
13 let h = init () in
14 let s = String.make size 'a' in
15 set_mimepost h [{encoding=CURLMIME_BINARY;headers=[];subparts=[];data=CURLMIME_DATA s}];
16 let g = init () in
17 cleanup h;
18 cleanup g
20 let test3 size =
21 let h = init () in
22 let s = String.make size 'a' in
23 set_mimepost
27 encoding=CURLMIME_BINARY;
28 headers=[];
29 subparts=[];
30 data=CURLMIME_DATA_WITH_NAME {data=String s;name=Some "foo";filename=Some "bar"};
33 let g = init () in
34 cleanup h;
35 cleanup g
37 let rss () =
38 let path = Printf.sprintf "/proc/%d/statm" (Unix.getpid ()) in
39 try
40 let ch = Scanf.Scanning.open_in path in
41 let n = Scanf.bscanf ch "%_d %d" (fun x -> 4*1024*x) in Scanf.Scanning.close_in ch; n
42 with exn -> Printf.eprintf "Error opening %s (%s), ignoring\n%!" path (Printexc.to_string exn); 0
44 let check test count leak_size =
45 try
46 let rss1 = rss () in
47 for _i = 0 to pred count do
48 test leak_size;
49 Gc.compact ();
50 done;
51 let rss2 = rss () in
52 Printf.printf "RSS %d -> %d %s\n%!" rss1 rss2 (if rss2 - rss1 < count * leak_size / 10 then "OK" else "LEAKING")
53 with
54 Curl.NotImplemented s -> Printf.printf "skipping test : libcurl doesn't provide %s\n%!" s
56 let () =
57 let mb = 1024 * 1024 in
58 check test1 200 mb;
59 check test2 100 mb;
60 check test3 100 mb;