using CodexContractsPlugin; using CodexNetDeployer; using CodexPlugin; using CodexTests.Helpers; using Core; using DistTestCore; using DistTestCore.Helpers; using DistTestCore.Logs; using NUnit.Framework.Constraints; namespace CodexTests { public class CodexDistTest : DistTest { private readonly Dictionary> onlineCodexNodes = new Dictionary>(); public CodexDistTest() { ProjectPlugin.Load(); ProjectPlugin.Load(); ProjectPlugin.Load(); ProjectPlugin.Load(); } protected override void Initialize(FixtureLog fixtureLog) { var localBuilder = new LocalCodexBuilder(fixtureLog); localBuilder.Intialize(); localBuilder.Build(); } protected override void LifecycleStart(TestLifecycle lifecycle) { onlineCodexNodes.Add(lifecycle, new List()); } protected override void LifecycleStop(TestLifecycle lifecycle) { onlineCodexNodes.Remove(lifecycle); } public ICodexNode StartCodex() { return StartCodex(s => { }); } public ICodexNode StartCodex(Action setup) { return StartCodex(1, setup)[0]; } public ICodexNodeGroup StartCodex(int numberOfNodes) { return StartCodex(numberOfNodes, s => { }); } public ICodexNodeGroup StartCodex(int numberOfNodes, Action setup) { var group = Ci.StartCodexNodes(numberOfNodes, s => { setup(s); OnCodexSetup(s); }); onlineCodexNodes[Get()].AddRange(group); return group; } public PeerConnectionTestHelpers CreatePeerConnectionTestHelpers() { return new PeerConnectionTestHelpers(GetTestLog()); } public PeerDownloadTestHelpers CreatePeerDownloadTestHelpers() { return new PeerDownloadTestHelpers(GetTestLog(), Get().GetFileManager()); } public IEnumerable GetAllOnlineCodexNodes() { return onlineCodexNodes[Get()]; } public void AssertBalance(ICodexContracts contracts, ICodexNode codexNode, Constraint constraint, string msg = "") { AssertHelpers.RetryAssert(constraint, () => contracts.GetTestTokenBalance(codexNode), nameof(AssertBalance) + msg); } public void CheckLogForErrors(params ICodexNode[] nodes) { foreach (var node in nodes) CheckLogForErrors(node); } public void CheckLogForErrors(ICodexNode node) { Log($"Checking {node.GetName()} log for errors."); var log = Ci.DownloadLog(node); log.AssertLogDoesNotContain("Block validation failed"); log.AssertLogDoesNotContain("ERR "); } protected virtual void OnCodexSetup(ICodexSetup setup) { } protected override void CollectStatusLogData(TestLifecycle lifecycle, Dictionary data) { var nodes = onlineCodexNodes[lifecycle]; var upload = nodes.Select(n => n.TransferSpeeds.GetUploadSpeed()).ToList()!.OptionalAverage(); var download = nodes.Select(n => n.TransferSpeeds.GetDownloadSpeed()).ToList()!.OptionalAverage(); if (upload != null) data.Add("avgupload", upload.ToString()); if (download != null) data.Add("avgdownload", download.ToString()); } } }