public async Task Start(IDictionary <string, List <string> > args) { #if !DEBUG && !ASSERT return; #endif Beamer rayA = null; Beamer rayB = null; const int CFGA = 11; const int CFGB = 12; try { var targ = new TestArgs(args); var aep = targ.AE; var bep = targ.BE; rayA = new Beamer((f) => { }, new BeamerCfg() { Log = new BeamerLogCfg("rayA-ConfigExchange", targ.Log), MaxBeamedTilesAtOnce = CFGA #if DEBUG , dropFrames = true, deopFramePercent = 50 #endif }); rayB = new Beamer((f) => { }, new BeamerCfg() { Log = new BeamerLogCfg("rayB-ConfigExchange", targ.Log), MaxBeamedTilesAtOnce = CFGB #if DEBUG , dropFrames = true, deopFramePercent = 50 #endif }); var ta = new Task(async() => { if (rayA.LockOn(aep, bep) && await rayA.ConfigRequest()) { // The remote config must be available here var tc = rayA.GetTargetConfig(); if (tc == null || tc.MaxBeamedTilesAtOnce != CFGB) { Passed = false; FailureMessage = "The remote config B is not correct or is missing."; } } }); var tb = new Task(async() => { if (rayB.LockOn(bep, aep) && await rayB.ConfigRequest()) { var tc = rayB.GetTargetConfig(); if (tc == null || tc.MaxBeamedTilesAtOnce != CFGA) { Passed = false; FailureMessage = "The remote config A is not correct or is missing."; } } }); ta.Start(); tb.Start(); if (!Task.WaitAll(new Task[] { ta, tb }, new TimeSpan(0, 2, 0))) { Passed = false; FailureMessage = "Timeout."; FailureMessage.AsError(); } await Task.Yield(); if (Passed.HasValue && !Passed.Value) { "configExchange() failed".AsError(); } else { "OK: configExchange()".AsSuccess(); Passed = true; } IsComplete = true; } catch (Exception ex) { FailureMessage = ex.Message; Passed = false; } finally { rayA.Dispose(); rayB.Dispose(); } }
async Task halfGigNoLogNoVerify(TestArgs targ) { "[In] halfGigNoLogNoVerify()".AsTestInfo(); var started = DateTime.Now; Beamer rayA = null; Beamer rayB = null; const int CAP = 500_000_000; int totalSend = 0; int totalReceived = 0; int totalFragsOut = 0; int totalFragsIn = 0; var rdmSize = new Random(); try { var rst = new ManualResetEvent(false); var aep = targ.AE; var bep = targ.BE; void receive(MemoryFragment f) { int len = 0; bool err = false; int rec = 0; try { var s = f.Span(); f.Read(ref len, 0); var fi = Interlocked.Increment(ref totalFragsIn); if (s.Length == len) { rec = Interlocked.Add(ref totalReceived, len); } else { err = true; } } catch (Exception ex) { ex.ToString().AsError(); } finally { f.Dispose(); var rem = CAP - rec; if (rem < 0) { rem = 0; } $"Rem: {rem} ".AsInnerInfo(); if (err) { "rayB receive failed.".AsError(); rst.Set(); } else if (rec >= CAP) { Passed = true; IsComplete = true; var ts = DateTime.Now.Subtract(started); $"OK: halfGigNoLogNoVerify() {ts.Seconds}s {ts.Milliseconds}ms".AsSuccess(); rst.Set(); } } } var traceops = (LogFlags.ReqTiles | LogFlags.Tile | LogFlags.ProcTile); rayA = new Beamer((f) => { }, new BeamerCfg() { TileSizeBytes = 60000 }); rayB = new Beamer(receive, new BeamerCfg() { Log = new BeamerLogCfg("rayB-HalfGig", targ.Log, traceops), TileSizeBytes = 60000 }); using (var hw = new HeapHighway()) { var ta = new Task(async() => { rayA.LockOn(aep, bep); while (!rayA.IsStopped) { var len = rdmSize.Next(10, 10_000_000); var f = hw.Alloc(len); f.Write(len, 0); rayA.Beam(f).Wait(); Interlocked.Increment(ref totalFragsOut); if (Interlocked.Add(ref totalSend, len) > CAP) { break; } } $"Out of beaming loop".AsInnerInfo(); }); var tb = new Task(async() => { rayB.LockOn(bep, aep); }); ta.Start(); tb.Start(); if (!rst.WaitOne(new TimeSpan(0, 2, 0))) { Passed = false; FailureMessage = "Timeout."; FailureMessage.AsError(); } } await Task.Yield(); if (Passed.HasValue && !Passed.Value || !IsComplete) { "halfGigNoLogNoVerify() failed".AsError(); } } catch (Exception ex) { FailureMessage = ex.Message; Passed = false; } finally { rayA.Dispose(); rayB.Dispose(); } }