-
Notifications
You must be signed in to change notification settings - Fork 0
/
pdiskTest.ml
135 lines (117 loc) · 4.59 KB
/
pdiskTest.ml
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
(***********************************************************************)
(* pdiskTest.ml *)
(* *)
(* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, *)
(* 2011, 2012 Yaron Minsky and Contributors *)
(* *)
(* This file is part of SKS. SKS is free software; you can *)
(* redistribute it and/or modify it under the terms of the GNU General *)
(* Public License as published by the Free Software Foundation; either *)
(* version 2 of the License, or (at your option) any later version. *)
(* *)
(* This program 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 GNU *)
(* General Public License for more details. *)
(* *)
(* You should have received a copy of the GNU General Public License *)
(* along with this program; if not, write to the Free Software *)
(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *)
(* USA or see <http://www.gnu.org/licenses/>. *)
(***********************************************************************)
open StdLabels
open MoreLabels
open Printf
open Common
open Packet
module Unix = UnixLabels
module PTree = PrefixTree
open Bdb
module Set = PSet.Set
let mbar = !Settings.mbar
let bitquantum = !Settings.bitquantum
let num_samples = mbar + 1
let bytes = ZZp.num_bytes () - 1
(* Generate DB *)
let db_fname = "ptree.db"
let () = if Sys.file_exists db_fname then Unix.unlink db_fname
let db = Db.sopen db_fname Db.BTREE [Db.CREATE] 0o600
let load key = Db.get db key []
let save (txn: unit option) ~key ~data = Db.put db ~key ~data []
let delete (txn: unit option) key = Db.del db key
let dbtup = (load,save,delete,!Settings.max_ptree_nodes)
let db_ptree =
PTree.create ?db:(Some dbtup) ~txn:None
~num_samples ~bitquantum ~thresh:mbar ()
let (ptree:unit PTree.tree) =
PTree.create ?db:None ~txn:None
~num_samples ~bitquantum ~thresh:mbar ()
let set = ref Set.empty
let add_element () =
let rstring = RMisc.random_string Random.bits bytes in
set := Set.add rstring !set;
PTree.insert_str ptree None rstring;
PTree.insert_str db_ptree None rstring
let del_element () =
if PTree.size (PTree.root ptree) < 10
then ()
else
let element = PTree.get_random ptree (PTree.root ptree) in
PTree.delete_str ptree None element;
PTree.delete_str db_ptree None element;
set := Set.remove element !set
let node_eq n1 n2 =
(n1.PTree.svalues = n2.PTree.svalues) &&
(n1.PTree.num_elements = n2.PTree.num_elements) &&
(n1.PTree.key = n2.PTree.key) &&
match (n1.PTree.children,n2.PTree.children) with
(PTree.Leaf _, PTree.Children _)
| (PTree.Children _, PTree.Leaf _) -> false
| (PTree.Leaf e1,PTree.Leaf e2) -> Set.equal e1 e2
| (PTree.Children e1, PTree.Children e2) -> true
(* we don't test the children *)
let sef = true
let rec eqtest (tree1,node1) (tree2,node2) =
if node_eq node1 node2 then (
if PTree.is_leaf node1 && PTree.is_leaf node2
then `passed
else
let keys = PTree.child_keys tree1 node1.PTree.key in
let rec loop keys = match keys with
[] -> `passed
| key::tl ->
let nnode1 = PTree.get_node_key ~sef tree1 key
and nnode2 = PTree.get_node_key ~sef tree2 key in
match eqtest (tree1,nnode1) (tree2,nnode2) with
`passed -> loop tl
| x -> x
in
loop keys
) else
`failed (node1,node2)
let eqtest tree1 tree2 =
eqtest (tree1, PTree.root tree1) (tree2, PTree.root tree2)
let rec runtest n =
if n > 0 then (
if Random.float 1. > !Settings.prob
then add_element () else del_element ();
runtest (n - 1)
) else (
printf "-------- Running Equality Test -------------\n";
match eqtest ptree db_ptree with
`passed -> printf "All tests passed\n"
| `failed (n1,n2) ->
printf "Equality tests failed. Differing nodes have keys:\n";
printf " %s, %s\n"
(Bitstring.to_string n1.PTree.key)
(Bitstring.to_string n2.PTree.key)
)
let n = !Settings.n
let timer = MTimer.create ()
let () =
if not !Sys.interactive then (
MTimer.start timer;
runtest n;
MTimer.stop timer;
printf "Time elapsed: %f secs\n" (MTimer.read timer)
)