// Copyright Keysight Technologies 2012-2019
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at http://mozilla.org/MPL/2.0/.
using NUnit.Framework;
using OpenTap.EngineUnitTestUtils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using OpenTap.Plugins.BasicSteps;
namespace OpenTap.UnitTests
{
///
/// Test TestStep used along with EvmMeasurementStep to test IResultSink implementation
///
[Display("EVM Limit Check Step", "Test TestStep used along with EvmMeasurementStep to test IResultSink implementation", Group: "ResultSink Tests")]
public class EvmLimitCheckStep : TestStep
{
public EvmMeasurementStep EvmSourceTestStep
{
get => EvmMeasurementValueSink.SourceTestStep as EvmMeasurementStep;
set => EvmMeasurementValueSink.SourceTestStep = value;
}
public double MaxEvm { get; set; } = 1;
public ScalarResultSink EvmMeasurementValueSink { get; private set; }
public EvmLimitCheckStep()
{
EvmMeasurementValueSink = new ScalarResultSink(this) { ResultColumnName = "EVM" };
}
public override void Run()
{
Stopwatch timer = Stopwatch.StartNew();
double measurement = EvmMeasurementValueSink.GetResult(TapThread.Current.AbortToken);
if (measurement > MaxEvm)
{
Log.Info(timer, "Failed as EVM of {0} is greater than limit.", measurement);
UpgradeVerdict(Verdict.Fail);
}
else
{
Log.Info(timer, "Passed as EVM of {0} is within the limit.", measurement);
UpgradeVerdict(Verdict.Pass);
}
}
}
///
/// Test TestStep used along with EvmLimitCheckStep to test IResultSink implementation
///
[Display("EVM Measurement Step", "Test TestStep used along with EvmMeasurementStep to test IResultSink implementation", Group: "ResultSink Tests")]
public class EvmMeasurementStep : TestStep
{
static Random rnd = new Random();
[Unit("dBm")]
public double Power { get; set; } = 10;
public override void Run()
{
double evm = rnd.NextDouble() + 0.05 * Power;
Results.Publish("EVM Measurement", new List { "Power", "EVM" }, Power, evm);
Log.Info("Measured EVM of {0}", evm);
}
}
[TestFixture]
public class IResultSinkTests
{
[TestCase(0, Verdict.Pass)]
[TestCase(1,Verdict.Fail)]
public void RunPlanTest(int stepIndex, Verdict expectedVerdict)
{
TestPlan plan = new TestPlan();
plan.Steps.Add(new EvmMeasurementStep() { Power = 0 });
plan.Steps.Add(new EvmMeasurementStep() { Power = 21 });
plan.Steps.Add(new EvmMeasurementStep());
var limitStep = new EvmLimitCheckStep();
limitStep.EvmSourceTestStep = plan.Steps[stepIndex] as EvmMeasurementStep;
plan.Steps.Add(limitStep);
TestTraceListener listener = new TestTraceListener();
Log.AddListener(listener);
var planRun = plan.Execute(new List());
Log.RemoveListener(listener);
listener.Flush();
listener.AssertErrors();
Assert.AreEqual(expectedVerdict, planRun.Verdict,listener.GetLog());
}
[TestCase(0, Verdict.Pass)]
[TestCase(1, Verdict.Fail)]
public void RunPlanWithLoopTest(int stepIndex, Verdict expectedVerdict)
{
TestPlan plan = new TestPlan();
var loop = new Plugins.BasicSteps.RepeatStep() { Count = 3 };
plan.Steps.Add(loop);
loop.ChildTestSteps.Add(new EvmMeasurementStep() { Power = 0 });
loop.ChildTestSteps.Add(new EvmMeasurementStep() { Power = 21 });
loop.ChildTestSteps.Add(new EvmMeasurementStep());
loop.ChildTestSteps.Add(new EvmLimitCheckStep() { EvmSourceTestStep = loop.ChildTestSteps[stepIndex] as EvmMeasurementStep });
TestTraceListener listener = new TestTraceListener();
Log.AddListener(listener);
var planRun = plan.Execute(new List());
Log.RemoveListener(listener);
listener.Flush();
listener.AssertErrors();
Assert.AreEqual(expectedVerdict, planRun.Verdict, listener.GetLog());
}
[TestCase(0, Verdict.Pass)]
[TestCase(21, Verdict.Fail)]
public void ResultSinkInParallel(double power, Verdict expectedVerdict)
{
var plan = new TestPlan();
var parallel = new ParallelStep();
plan.ChildTestSteps.Add(parallel);
for (int i = 0; i < 10; i++)
{
plan.ChildTestSteps.Add(new DelayStep(){DelaySecs = 0.001});
}
var result = new EvmMeasurementStep() {Power = power};
plan.ChildTestSteps.Add(result);
var limit = new EvmLimitCheckStep() {EvmSourceTestStep = result};
plan.ChildTestSteps.Add(limit);
var planRun = plan.Execute(new List());
Assert.AreEqual(expectedVerdict, planRun.Verdict);
}
}
}