1 module tagion.testbench.dart.basic_dart_sync;
2 // Default import list for bdd
3 import std.algorithm : each, equal, filter, map, sort;
4 import std.file : mkdirRecurse;
5 import std.format : format;
6 import std.path : buildPath, setExtension;
7 import std.random : MinstdRand0, randomSample, randomShuffle;
8 import std.range;
9 import std.stdio;
10 import std.typecons : Tuple;
11 import tagion.Keywords;
12 import tagion.basic.basic : tempfile;
13 import tagion.basic.basic : forceRemove;
14 import tagion.behaviour;
15 import tagion.communication.HiRPC;
16 import tagion.crypto.SecureInterfaceNet : HashNet, SecureNet;
17 import tagion.dart.BlockFile : BlockFile;
18 import tagion.dart.DART : DART;
19 import tagion.dart.DARTBasic : DARTIndex, dartIndex;
20 import tagion.dart.DARTFakeNet;
21 import tagion.dart.DARTFile : DARTFile;
22 import tagion.dart.Recorder : Archive, RecordFactory;
23 import tagion.hibon.Document;
24 import tagion.hibon.HiBONJSON : toPretty;
25 import tagion.hibon.HiBONRecord;
26 import tagion.testbench.dart.dart_helper_functions;
27 import tagion.testbench.dart.dartinfo;
28 import tagion.testbench.tools.Environment;
29 import tagion.testbench.tools.Environment;
30 import tagion.utils.Random;
31 
32 enum feature = Feature(
33             "DARTSynchronization full sync",
34             ["All test in this bdd should use dart fakenet."]);
35 
36 alias FeatureContext = Tuple!(
37         FullSync, "FullSync",
38         FeatureGroup*, "result"
39 );
40 
41 @safe @Scenario("Full sync.",
42         [])
43 class FullSync {
44     DART db1;
45     DART db2;
46 
47     DARTIndex[] db1_fingerprints;
48 
49     const ushort angle = 0;
50     const ushort size = 10;
51 
52     DartInfo info;
53 
54     this(DartInfo info) {
55         this.info = info;
56     }
57 
58     @Given("I have a dartfile1 with pseudo random data.")
59     Document randomData() {
60         check(!info.states.empty, "Pseudo random sequence not generated");
61 
62         mkdirRecurse(info.module_path);
63         // create the dartfile
64         info.dartfilename.forceRemove;
65         DART.create(info.dartfilename, info.net);
66 
67         Exception dart_exception;
68         db1 = new DART(info.net, info.dartfilename, dart_exception);
69         check(dart_exception is null, format("Failed to open DART %s", dart_exception.msg));
70 
71         auto sector_states = info.states
72             .map!(state => state.list
73                     .map!(archive => putInSector(archive, angle, size))).array;
74 
75         db1_fingerprints = randomAdd(sector_states, MinstdRand0(65), db1);
76         check(!db1_fingerprints.empty, "No fingerprints added");
77 
78         return result_ok;
79     }
80 
81     @Given("I have a empty dartfile2.")
82     Document emptyDartfile2() {
83         info.dartfilename2.forceRemove;
84         DART.create(info.dartfilename2, info.net);
85 
86         Exception dart_exception;
87         db2 = new DART(info.net, info.dartfilename2, dart_exception);
88         check(dart_exception is null, format("Failed to open DART %s", dart_exception.msg));
89 
90         return result_ok;
91     }
92 
93     @Given("I synchronize dartfile1 with dartfile2.")
94     Document withDartfile2() {
95         syncDarts(db1, db2, angle, size);
96         return result_ok;
97     }
98 
99     @Then("the bullseyes should be the same.")
100     Document theSame() {
101         check(db1.bullseye == db2.bullseye, "Bullseyes not the same");
102 
103         db1.close();
104         db2.close();
105         return result_ok;
106     }
107 
108 }