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 }