ligo/test/test_context.ml

209 lines
7.3 KiB
OCaml
Raw Normal View History

2016-10-12 17:00:19 +04:00
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2016. *)
(* 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 =
Block_hash.of_b58check
"BLockGenesisGenesisGenesisGenesisGenesisGeneskvg68z"
2016-09-08 21:13:10 +04:00
let genesis_protocol =
Protocol_hash.of_b58check
"ProtoDemoDemoDemoDemoDemoDemoDemoDemoDemoDemoD3c8k9"
2016-09-08 21:13:10 +04:00
let genesis_time =
Time.of_seconds 0L
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
2016-09-08 21:13:10 +04:00
(** Context creation *)
let block2 =
Block_hash.of_hex_exn
2016-09-08 21:13:10 +04:00
"2222222222222222222222222222222222222222222222222222222222222222"
let create_block2 idx =
checkout idx genesis_block >>= function
| None ->
Assert.fail_msg "checkout genesis_block"
| 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 ->
commit block2 ctxt
2016-09-08 21:13:10 +04:00
let block3a =
Block_hash.of_hex_exn
2016-09-08 21:13:10 +04:00
"3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a"
let create_block3a idx =
checkout idx block2 >>= function
| None ->
Assert.fail_msg "checkout block2"
| 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 ->
commit block3a ctxt
2016-09-08 21:13:10 +04:00
let block3b =
Block_hash.of_hex_exn
2016-09-08 21:13:10 +04:00
"3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b"
let block3c =
Block_hash.of_hex_exn
2016-09-08 21:13:10 +04:00
"3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c"
let create_block3b idx =
checkout idx block2 >>= function
| None ->
Assert.fail_msg "checkout block3b"
| 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 ->
commit block3b ctxt
2016-09-08 21:13:10 +04:00
let wrap_context_init f base_dir =
let root = base_dir // "context" in
Context.init root >>= fun idx ->
Context.commit_genesis idx
~id:genesis.block
~time:genesis.time
~protocol:genesis.protocol
~test_protocol:genesis.protocol >>= fun _ ->
2016-09-08 21:13:10 +04:00
create_block2 idx >>= fun () ->
create_block3a idx >>= fun () ->
create_block3b idx >>= fun () ->
2017-03-07 12:51:11 +04:00
f idx >>= fun result ->
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)
let test_simple idx =
checkout idx block2 >>= function
| None ->
Assert.fail_msg "checkout block2"
| Some ctxt ->
2016-09-08 21:13:10 +04:00
get ctxt ["version"] >>= fun version ->
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 ->
Assert.equal_string_option (Some "Novembre") (c novembre) ;
2016-09-08 21:13:10 +04:00
get ctxt ["a";"c"] >>= fun juin ->
Assert.equal_string_option ~msg:__LOC__ (Some "Juin") (c juin) ;
2016-09-08 21:13:10 +04:00
Lwt.return ()
let test_continuation idx =
checkout idx block3a >>= function
| None ->
Assert.fail_msg "checkout block3a"
| Some ctxt ->
2016-09-08 21:13:10 +04:00
get ctxt ["version"] >>= fun version ->
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 ->
Assert.is_none ~msg:__LOC__ (c novembre) ;
2016-09-08 21:13:10 +04:00
get ctxt ["a";"c"] >>= fun juin ->
Assert.equal_string_option ~msg:__LOC__ (Some "Juin") (c juin) ;
2016-09-08 21:13:10 +04:00
get ctxt ["a";"d"] >>= fun mars ->
Assert.equal_string_option ~msg:__LOC__ (Some "Mars") (c mars) ;
2016-09-08 21:13:10 +04:00
Lwt.return ()
let test_fork idx =
checkout idx block3b >>= function
| None ->
Assert.fail_msg "checkout block3b"
| Some ctxt ->
2016-09-08 21:13:10 +04:00
get ctxt ["version"] >>= fun version ->
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 ->
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
2016-09-08 21:13:10 +04:00
get ctxt ["a";"c"] >>= fun juin ->
Assert.is_none ~msg:__LOC__ (c juin) ;
2016-09-08 21:13:10 +04:00
get ctxt ["a";"d"] >>= fun mars ->
Assert.equal_string_option ~msg:__LOC__ (Some "Février") (c mars) ;
2016-09-08 21:13:10 +04:00
Lwt.return ()
let test_replay idx =
checkout idx genesis_block >>= function
| None ->
Assert.fail_msg "checkout genesis_block"
| 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 ->
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
2016-09-08 21:13:10 +04:00
get ctxt5a ["a";"b"] >>= fun november ->
Assert.equal_string_option ~msg:__LOC__ (Some "November") (c november) ;
2016-09-08 21:13:10 +04:00
get ctxt5a ["a";"d"] >>= fun july ->
Assert.equal_string_option ~msg:__LOC__ (Some "July") (c july) ;
2016-09-08 21:13:10 +04:00
get ctxt4b ["a";"b"] >>= fun novembre ->
Assert.equal_string_option ~msg:__LOC__ (Some "Novembre") (c novembre) ;
2016-09-08 21:13:10 +04:00
get ctxt4b ["a";"d"] >>= fun juillet ->
Assert.equal_string_option ~msg:__LOC__ (Some "Juillet") (c juillet) ;
2016-09-08 21:13:10 +04:00
Lwt.return ()
let test_list idx =
checkout idx genesis_block >>= function
| None ->
Assert.fail_msg "checkout genesis_block"
| 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 ->
list ctxt [[]] >>= fun l ->
Assert.equal_persist_list ~msg:__LOC__ [["a"];["f"];["g"]] l ;
2016-09-08 21:13:10 +04:00
list ctxt [["a"]] >>= fun l ->
Assert.equal_persist_list
~msg:__LOC__ [["a";"b"]; ["a";"c"]; ["a";"d"]] l ;
2016-09-08 21:13:10 +04:00
list ctxt [["f"]] >>= fun l ->
Assert.equal_persist_list ~msg:__LOC__ [] l ;
2016-09-08 21:13:10 +04:00
list ctxt [["g"]] >>= fun l ->
Assert.equal_persist_list ~msg:__LOC__ [["g";"h"]] l ;
2016-09-08 21:13:10 +04:00
list ctxt [["i"]] >>= fun l ->
Assert.equal_persist_list ~msg:__LOC__ [] l ;
2016-09-08 21:13:10 +04:00
list ctxt [["a"];["g"]] >>= fun l ->
Assert.equal_persist_list ~msg:__LOC__
[["a"; "b"]; ["a"; "c"]; ["a"; "d"]; ["g"; "h"]] l ;
2016-09-08 21:13:10 +04:00
Lwt.return ()
(******************************************************************************)
let tests : (string * (index -> unit Lwt.t)) list = [
"simple", test_simple ;
"continuation", test_continuation ;
"fork", test_fork ;
"replay", test_replay ;
"list", test_list ;
]
let () =
2016-09-08 21:13:10 +04:00
Test.run "context." (List.map (fun (s, f) -> s, wrap_context_init f) tests)