2016-10-12 17:00:19 +04:00
|
|
|
(**************************************************************************)
|
|
|
|
(* *)
|
2017-11-14 03:36:14 +04:00
|
|
|
(* Copyright (c) 2014 - 2017. *)
|
2016-10-12 17:00:19 +04:00
|
|
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
|
|
|
(* *)
|
|
|
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
|
|
|
(* *)
|
|
|
|
(**************************************************************************)
|
|
|
|
|
2016-09-08 21:13:10 +04:00
|
|
|
open Hash
|
|
|
|
open Context
|
|
|
|
|
|
|
|
let (>>=) = Lwt.bind
|
|
|
|
let (>|=) = Lwt.(>|=)
|
|
|
|
let (//) = Filename.concat
|
|
|
|
|
|
|
|
(** Basic blocks *)
|
|
|
|
|
|
|
|
let genesis_block =
|
2017-04-05 11:54:21 +04:00
|
|
|
Block_hash.of_b58check_exn
|
2017-02-19 21:22:32 +04:00
|
|
|
"BLockGenesisGenesisGenesisGenesisGenesisGeneskvg68z"
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
let genesis_protocol =
|
2017-04-05 11:54:21 +04:00
|
|
|
Protocol_hash.of_b58check_exn
|
2017-02-19 21:22:32 +04:00
|
|
|
"ProtoDemoDemoDemoDemoDemoDemoDemoDemoDemoDemoD3c8k9"
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
let genesis_time =
|
|
|
|
Time.of_seconds 0L
|
|
|
|
|
2017-02-24 20:17:53 +04:00
|
|
|
let genesis : State.Net.genesis = {
|
|
|
|
time = genesis_time ;
|
2016-09-08 21:13:10 +04:00
|
|
|
block = genesis_block ;
|
|
|
|
protocol = genesis_protocol ;
|
|
|
|
}
|
|
|
|
|
2017-03-31 15:04:05 +04:00
|
|
|
let net_id = Net_id.of_block_hash genesis_block
|
2017-02-24 20:17:53 +04:00
|
|
|
|
2016-09-08 21:13:10 +04:00
|
|
|
(** Context creation *)
|
|
|
|
|
2017-04-10 14:14:11 +04:00
|
|
|
let commit = commit ~time:Time.epoch ~message:""
|
|
|
|
|
2016-09-08 21:13:10 +04:00
|
|
|
let block2 =
|
2017-02-24 20:17:53 +04:00
|
|
|
Block_hash.of_hex_exn
|
2016-09-08 21:13:10 +04:00
|
|
|
"2222222222222222222222222222222222222222222222222222222222222222"
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let create_block2 idx genesis_commit =
|
|
|
|
checkout idx genesis_commit >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout genesis_block"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
set ctxt ["a"; "b"] (MBytes.of_string "Novembre") >>= fun ctxt ->
|
|
|
|
set ctxt ["a"; "c"] (MBytes.of_string "Juin") >>= fun ctxt ->
|
|
|
|
set ctxt ["version";] (MBytes.of_string "0.0") >>= fun ctxt ->
|
2017-07-17 17:59:09 +04:00
|
|
|
commit ctxt
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
let block3a =
|
2017-02-24 20:17:53 +04:00
|
|
|
Block_hash.of_hex_exn
|
2016-09-08 21:13:10 +04:00
|
|
|
"3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a"
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let create_block3a idx block2_commit =
|
|
|
|
checkout idx block2_commit >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout block2"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
del ctxt ["a"; "b"] >>= fun ctxt ->
|
|
|
|
set ctxt ["a"; "d"] (MBytes.of_string "Mars") >>= fun ctxt ->
|
2017-07-17 17:59:09 +04:00
|
|
|
commit ctxt
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
let block3b =
|
2017-02-24 20:17:53 +04:00
|
|
|
Block_hash.of_hex_exn
|
2016-09-08 21:13:10 +04:00
|
|
|
"3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b"
|
|
|
|
|
|
|
|
let block3c =
|
2017-02-24 20:17:53 +04:00
|
|
|
Block_hash.of_hex_exn
|
2016-09-08 21:13:10 +04:00
|
|
|
"3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c"
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let create_block3b idx block2_commit =
|
|
|
|
checkout idx block2_commit >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout block3b"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
del ctxt ["a"; "c"] >>= fun ctxt ->
|
|
|
|
set ctxt ["a"; "d"] (MBytes.of_string "Février") >>= fun ctxt ->
|
2017-07-17 17:59:09 +04:00
|
|
|
commit ctxt
|
|
|
|
|
|
|
|
type t = {
|
|
|
|
idx: Context.index ;
|
|
|
|
genesis: Context.commit ;
|
|
|
|
block2: Context.commit ;
|
|
|
|
block3a: Context.commit ;
|
|
|
|
block3b: Context.commit ;
|
|
|
|
}
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
let wrap_context_init f base_dir =
|
|
|
|
let root = base_dir // "context" in
|
2017-11-13 17:29:28 +04:00
|
|
|
Context.init ~root ?patch_context:None >>= fun idx ->
|
2017-02-24 20:17:53 +04:00
|
|
|
Context.commit_genesis idx
|
2017-07-17 17:59:09 +04:00
|
|
|
~net_id
|
2017-02-24 20:17:53 +04:00
|
|
|
~time:genesis.time
|
2017-07-17 17:59:09 +04:00
|
|
|
~protocol:genesis.protocol >>= fun genesis ->
|
|
|
|
create_block2 idx genesis >>= fun block2 ->
|
|
|
|
create_block3a idx block2 >>= fun block3a ->
|
|
|
|
create_block3b idx block2 >>= fun block3b ->
|
|
|
|
f { idx; genesis; block2 ; block3a; block3b } >>= fun result ->
|
2017-03-07 12:51:11 +04:00
|
|
|
Error_monad.return result
|
2016-09-08 21:13:10 +04:00
|
|
|
|
|
|
|
(** Simple test *)
|
|
|
|
|
|
|
|
let c = function
|
|
|
|
| None -> None
|
|
|
|
| Some s -> Some (MBytes.to_string s)
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let test_simple { idx ; block2 } =
|
2016-09-08 21:13:10 +04:00
|
|
|
checkout idx block2 >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout block2"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["version"] >>= fun version ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (c version) (Some "0.0") ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"b"] >>= fun novembre ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option (Some "Novembre") (c novembre) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"c"] >>= fun juin ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Juin") (c juin) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
Lwt.return ()
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let test_continuation { idx ; block3a } =
|
2016-09-08 21:13:10 +04:00
|
|
|
checkout idx block3a >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout block3a"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["version"] >>= fun version ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "0.0") (c version) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"b"] >>= fun novembre ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.is_none ~msg:__LOC__ (c novembre) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"c"] >>= fun juin ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Juin") (c juin) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"d"] >>= fun mars ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Mars") (c mars) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
Lwt.return ()
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let test_fork { idx ; block3b } =
|
2016-09-08 21:13:10 +04:00
|
|
|
checkout idx block3b >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout block3b"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["version"] >>= fun version ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "0.0") (c version) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"b"] >>= fun novembre ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"c"] >>= fun juin ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.is_none ~msg:__LOC__ (c juin) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt ["a";"d"] >>= fun mars ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Février") (c mars) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
Lwt.return ()
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let test_replay { idx ; genesis } =
|
|
|
|
checkout idx genesis >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout genesis_block"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt0 ->
|
2016-09-08 21:13:10 +04:00
|
|
|
set ctxt0 ["version"] (MBytes.of_string "0.0") >>= fun ctxt1 ->
|
|
|
|
set ctxt1 ["a"; "b"] (MBytes.of_string "Novembre") >>= fun ctxt2 ->
|
|
|
|
set ctxt2 ["a"; "c"] (MBytes.of_string "Juin") >>= fun ctxt3 ->
|
|
|
|
set ctxt3 ["a"; "d"] (MBytes.of_string "July") >>= fun ctxt4a ->
|
|
|
|
set ctxt3 ["a"; "d"] (MBytes.of_string "Juillet") >>= fun ctxt4b ->
|
|
|
|
set ctxt4a ["a"; "b"] (MBytes.of_string "November") >>= fun ctxt5a ->
|
|
|
|
get ctxt4a ["a";"b"] >>= fun novembre ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt5a ["a";"b"] >>= fun november ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "November") (c november) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt5a ["a";"d"] >>= fun july ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "July") (c july) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt4b ["a";"b"] >>= fun novembre ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
get ctxt4b ["a";"d"] >>= fun juillet ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.equal_string_option ~msg:__LOC__ (Some "Juillet") (c juillet) ;
|
2016-09-08 21:13:10 +04:00
|
|
|
Lwt.return ()
|
|
|
|
|
2017-11-15 19:20:08 +04:00
|
|
|
let test_keys { idx ; genesis } =
|
2017-07-17 17:59:09 +04:00
|
|
|
checkout idx genesis >>= function
|
2017-02-24 20:17:53 +04:00
|
|
|
| None ->
|
2016-09-30 13:43:50 +04:00
|
|
|
Assert.fail_msg "checkout genesis_block"
|
2017-02-24 20:17:53 +04:00
|
|
|
| Some ctxt ->
|
2016-09-08 21:13:10 +04:00
|
|
|
set ctxt ["a"; "b"] (MBytes.of_string "Novembre") >>= fun ctxt ->
|
|
|
|
set ctxt ["a"; "c"] (MBytes.of_string "Juin") >>= fun ctxt ->
|
|
|
|
set ctxt ["a"; "d"; "e"] (MBytes.of_string "Septembre") >>= fun ctxt ->
|
|
|
|
set ctxt ["f";] (MBytes.of_string "Avril") >>= fun ctxt ->
|
|
|
|
set ctxt ["g"; "h"] (MBytes.of_string "Avril") >>= fun ctxt ->
|
2017-11-15 19:20:08 +04:00
|
|
|
keys ctxt [] >>= fun l ->
|
|
|
|
Assert.equal_string_list_list ~msg:__LOC__
|
|
|
|
[["a";"b"];
|
|
|
|
["a";"c"];
|
|
|
|
["a";"d";"e"];
|
|
|
|
["f"];
|
|
|
|
["g";"h"]] (List.sort compare l) ;
|
|
|
|
keys ctxt ["a"] >>= fun l ->
|
2017-04-05 20:24:26 +04:00
|
|
|
Assert.equal_string_list_list
|
2017-11-15 19:20:08 +04:00
|
|
|
~msg:__LOC__ [["a";"b"]; ["a";"c"]; ["a";"d";"e"]]
|
|
|
|
(List.sort compare l) ;
|
|
|
|
keys ctxt ["f"] >>= fun l ->
|
2017-04-05 20:24:26 +04:00
|
|
|
Assert.equal_string_list_list ~msg:__LOC__ [] l ;
|
2017-11-15 19:20:08 +04:00
|
|
|
keys ctxt ["g"] >>= fun l ->
|
2017-04-05 20:24:26 +04:00
|
|
|
Assert.equal_string_list_list ~msg:__LOC__ [["g";"h"]] l ;
|
2017-11-15 19:20:08 +04:00
|
|
|
keys ctxt ["i"] >>= fun l ->
|
2017-04-05 20:24:26 +04:00
|
|
|
Assert.equal_string_list_list ~msg:__LOC__ [] l ;
|
2016-09-08 21:13:10 +04:00
|
|
|
Lwt.return ()
|
|
|
|
|
|
|
|
|
|
|
|
(******************************************************************************)
|
|
|
|
|
2017-07-17 17:59:09 +04:00
|
|
|
let tests : (string * (t -> unit Lwt.t)) list = [
|
2016-09-08 21:13:10 +04:00
|
|
|
"simple", test_simple ;
|
|
|
|
"continuation", test_continuation ;
|
|
|
|
"fork", test_fork ;
|
|
|
|
"replay", test_replay ;
|
2017-11-15 19:20:08 +04:00
|
|
|
"keys", test_keys ;
|
2016-09-08 21:13:10 +04:00
|
|
|
]
|
|
|
|
|
2016-09-30 13:43:50 +04:00
|
|
|
let () =
|
2016-09-08 21:13:10 +04:00
|
|
|
Test.run "context." (List.map (fun (s, f) -> s, wrap_context_init f) tests)
|