Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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();
            }
        }