diff --git a/ProjectPlugins/CodexPlugin/CodexAccess.cs b/ProjectPlugins/CodexPlugin/CodexAccess.cs
index 5d59375..2394235 100644
--- a/ProjectPlugins/CodexPlugin/CodexAccess.cs
+++ b/ProjectPlugins/CodexPlugin/CodexAccess.cs
@@ -234,8 +234,15 @@ namespace CodexPlugin
.CreateEndpoint(GetAddress(), "/api/codex/v1/", Container.Name);
}
+ public static Address? UploaderOverride { get; set; } = null;
+ public static Address? DownloaderOverride { get; set; } = null;
+
private Address GetAddress()
{
+ if (GetName().ToLowerInvariant().Contains("upload") && UploaderOverride != null) return UploaderOverride;
+ if (GetName().ToLowerInvariant().Contains("download") && DownloaderOverride != null) return DownloaderOverride;
+
+
return Container.Containers.Single().GetAddress(CodexContainerRecipe.ApiPortTag);
}
diff --git a/SeeTimeline/App.xaml b/SeeTimeline/App.xaml
deleted file mode 100644
index dc94526..0000000
--- a/SeeTimeline/App.xaml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/SeeTimeline/App.xaml.cs b/SeeTimeline/App.xaml.cs
deleted file mode 100644
index 71c26be..0000000
--- a/SeeTimeline/App.xaml.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System.Configuration;
-using System.Data;
-using System.Windows;
-
-namespace SeeTimeline
-{
- ///
- /// Interaction logic for App.xaml
- ///
- public partial class App : Application
- {
- }
-
-}
diff --git a/SeeTimeline/AssemblyInfo.cs b/SeeTimeline/AssemblyInfo.cs
deleted file mode 100644
index b0ec827..0000000
--- a/SeeTimeline/AssemblyInfo.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System.Windows;
-
-[assembly: ThemeInfo(
- ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
- //(used if a resource is not found in the page,
- // or application resource dictionaries)
- ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
- //(used if a resource is not found in the page,
- // app, or any theme specific resource dictionaries)
-)]
diff --git a/SeeTimeline/LogToEvents.cs b/SeeTimeline/LogToEvents.cs
deleted file mode 100644
index 05a73a1..0000000
--- a/SeeTimeline/LogToEvents.cs
+++ /dev/null
@@ -1,286 +0,0 @@
-using CodexPlugin;
-using System.IO;
-using System.Windows.Media;
-
-namespace SeeTimeline
-{
- public class CodexEvent
- {
- public string Name { get; }
- public Color Color { get; }
- public DateTime Dt { get; private set; }
-
- public CodexEvent(string name, Color color, DateTime dt)
- {
- Name = name;
- Color = color;
- Dt = dt;
- }
-
- public void Scale(DateTime from, double factor)
- {
- var span = Dt - from;
- Dt = from + (span * factor);
- }
-
- public override string ToString()
- {
- return Name;
- }
- }
-
- public class EventSet
- {
- public const string NoAddress = "-";
- public const string MiscAddress = "~";
-
- private readonly Dictionary> events = new Dictionary>();
- private readonly LogLineAdder adder = new LogLineAdder();
-
- public void Add(string address, CodexEvent e)
- {
- if (!events.ContainsKey(address)) events.Add(address, new List());
- events[address].Add(e);
-
- if (e.Dt > Latest) Latest = e.Dt;
- if (e.Dt < Earliest) Earliest = e.Dt;
- }
-
- public string[] Addresses => events.Keys.ToArray();
- public DateTime Earliest { get; private set; } = DateTime.MaxValue;
- public DateTime Latest { get; private set; } = DateTime.MinValue;
-
- public void KeepOnly(string[] addresses)
- {
- var keys = events.Keys.ToArray();
- foreach (var key in keys)
- {
- if (key != NoAddress && !key.StartsWith(MiscAddress) && !addresses.Contains(key))
- {
- events.Remove(key);
- }
- }
- }
-
- public void Iterate(Action action)
- {
- foreach (var pair in events)
- {
- action(pair.Key, pair.Value.ToArray());
- }
- }
-
- public void AddLine(string line)
- {
- var cline = CodexLogLine.Parse(line);
- if (cline == null) return;
- adder.Add(cline, this);
- }
-
- public void AddFile(string path)
- {
- var lines = File.ReadAllLines(path);
- foreach (var line in lines) AddLine(line);
- }
-
- public void Scale(DateTime from, double factor)
- {
- foreach (var pair in events)
- {
- foreach (var e in pair.Value) e.Scale(from, factor);
- }
- }
- }
-
- public class LogLineAdder
- {
- public void Add(CodexLogLine line, EventSet set)
- {
- var context = new SetLineContext(line, set);
- context.Parse();
- }
-
- public class SetLineContext
- {
- private readonly CodexLogLine line;
- private readonly EventSet set;
-
- public SetLineContext(CodexLogLine line, EventSet set)
- {
- this.line = line;
- this.set = set;
- }
-
- public void Parse()
- {
- var colormap = new Dictionary
- {
- { "0", Colors.Black },
- { "1", Colors.Red },
- { "2", Colors.Green },
- { "3", Colors.Blue },
- { "4", Colors.Red },
- { "5", Colors.Green },
- { "6", Colors.Blue },
- { "7", Colors.Red },
- { "8", Colors.Green },
- { "9", Colors.Blue },
- { "10", Colors.Black }
- };
-
- //if (!line.Attributes.Any(a => a.Value.ToLowerInvariant().Contains("index: 5"))) return;
-
- //AddJobs(result, "Created", Colors.Red, req.Created);
- // trace "BlockRequest created", address
- if (line.Message == "BlockRequest created") AddEvent(line.Attributes["address"], "ReqCreated", Colors.Red);
-
- //AddJobs(result, "TaskScheduled", Colors.Purple, req.TaskScheduled);
- // trace "Task scheduled", peerId = task.id
- else if (line.Message == "Task scheduled") AddEvent(EventSet.NoAddress, "TaskScheduled", Colors.Black);
-
- //trace "Sending wantHave request", toAsk, peer = p.id
- //AddJobs(result, "WantHaveSent", Colors.Orange, req.WantHaveSent);
- else if (line.Message == "Sending wantHave request") AddMultiple(line.Attributes["toAsk"], "SentWantHave", Colors.Orange);
-
- //trace "Sending wantBlock request to", addresses, peer = blockPeer.id
- //AddJobs(result, "WantBlkSent", Colors.Green, req.WantBlkSent);
- else if (line.Message == "Sending wantBlock request to") AddMultiple(line.Attributes["addresses"], "SentWantBlk", Colors.Green);
-
- //trace "Handling blockPresences", addrs = blocks.mapIt(it.address), anyCancel = blocks.anyIt(it.isCancel)
- //AddJobs(result, "PresenceRecv", Colors.Yellow, req.PresenceRecv);
- else if (line.Message == "Handling blockPresences")
- {
- var anyCancel = line.Attributes["anyCancel"].ToLowerInvariant();
- if (anyCancel == "true")
- {
- AddMultiple(line.Attributes["addrs"], "CancelPresenceRecv", Colors.Red);
- }
- else
- {
- AddMultiple(line.Attributes["addrs"], "PresenceRecv", Colors.Yellow);
- }
- }
-
- //trace "Sending block request cancellations to peers", addrs, peers = b.peers.mapIt($it.id)
- //AddJobs(result, "CancelSent", Colors.Purple, req.CancelSent);
- else if (line.Message == "Sending block request cancellations to peers") AddMultiple(line.Attributes["addrs"], "CancelSent", Colors.Purple);
-
- //trace "Resolving blocks", addrs = blocksDelivery.mapIt(it.address)
- //AddJobs(result, "Resolve", Colors.Pink, req.Resolve);
- else if (line.Message == "Resolving blocks") AddMultiple(line.Attributes["addrs"], "Resolve", Colors.Pink);
-
- //trace "Received blocks from peer", peer, blocks = (blocksDelivery.mapIt(it.address))
- //AddJobs(result, "BlkRecv", Colors.Blue, req.BlkRecv);
- else if (line.Message == "Received blocks from peer") AddMultiple(line.Attributes["blocks"], "BlkRecv", Colors.Blue);
-
- //logScope:
- // peer = peerCtx.id
- // address = e.address
- // wantType = $e.wantType
- // isCancel = $e.cancel
- //trace "Received wantHave".
- //AddJobs(result, "WantHaveRecv", Colors.Red, req.WantHaveRecv);
- else if (line.Message == "Received wantHave")
- {
- var isCancel = line.Attributes["isCancel"];
-
- if (isCancel.ToLowerInvariant() == "true")
- {
- AddEvent(line.Attributes["address"], "CancelRecv", Colors.Red);
- }
- else
- {
- AddEvent(line.Attributes["address"], "WantHaveRecv", Colors.Red);
- }
- }
-
- //trace "Received wantBlock"
- //AddJobs(result, "WantBlkRecv", Colors.Yellow, req.WantBlkRecv);
- else if (line.Message == "Received wantBlock") AddEvent(line.Attributes["address"], "WantBlkRecv", Colors.Yellow);
-
- //trace "Sending presence to remote", addrs = presence.mapIt(it.address), anyCancel = presence.anyIt(it.isCancel)
- //AddJobs(result, "PresenceSent", Colors.Orange, req.PresenceSent);
- else if (line.Message == "Sending presence")
- {
- var isCancel = line.Attributes["anyCancel"];
-
- if (isCancel.ToLowerInvariant() == "true")
- {
- AddMultiple(line.Attributes["addrs"], "CancelPresenceSent", Colors.Red);
- }
- else
- {
- AddMultiple(line.Attributes["addrs"], "PresenceSent", Colors.Orange);
- }
- }
-
- //trace "Begin sending blocks", addrs = wantAddresses
- //AddJobs(result, "BlkSendStart", Colors.Green, req.BlkSendStart);
- else if (line.Message == "Begin sending blocks") AddMultiple(line.Attributes["addrs"], "BlkSendStart", Colors.Green);
-
- //trace "Finished sending blocks", addrs = wantAddresses
- //AddJobs(result, "BlkSendEnd", Colors.Blue, req.BlkSendEnd);
- else if (line.Message == "Finished sending blocks") AddMultiple(line.Attributes["addrs"], "BlkSendEnd", Colors.Blue);
-
- else if (line.Message == "tick") AddEvent(EventSet.MiscAddress, "tick", Colors.Black);
-
- //// Discovery Started
- //else if (line.Message == "Discovery Started") AddEvent(EventSet.NoAddress, "DiscoveryStart", Colors.Black);
-
- //// Setting up peer
- //else if (line.Message == "Setting up peer") AddEvent(EventSet.NoAddress, "NewPeer", Colors.Black);
-
- //// Error block handle, disconnecting peer
- //else if (line.Message == "Error block handle, disconnecting peer") AddEvent(EventSet.NoAddress, "DisconnectPeer", Colors.Black);
-
- //// Dropping peer
- //else if (line.Message == "Dropping peer") AddEvent(EventSet.NoAddress, "DisconnectPeer", Colors.Black);
-
- //// Acquired slot
- //else if (line.Message == "Acquired slot") AddEvent(EventSet.MiscAddress, "AcqSlot", Colors.Black);
-
- //// Released slot
- //else if (line.Message == "Released slot") AddEvent(EventSet.MiscAddress, "RlsSlot", Colors.Black);
-
- //// Got discv5 lookup query response
- //else if (line.Message == "Got discv5 lookup query response") AddEvent(EventSet.MiscAddress, "Discv5", Colors.Black);
-
- //// waiting for data
- //else if (line.Message == "waiting for data") AddEvent(EventSet.MiscAddress, "wait", Colors.Black);
-
-
- // MsgReceived
- // MsgSending
- // MsgSent
-
- //else if (line.Message == "MsgSending") AddEvent(EventSet.MiscAddress + "snd", line.Attributes["num"], colormap[line.Attributes["num"]]);
- //else if (line.Message == "MsgSent") AddEvent(EventSet.MiscAddress + "snt", line.Attributes["num"], colormap[line.Attributes["num"]]);
- //else if (line.Message == "MsgReceived") AddEvent(EventSet.MiscAddress + "rcv", line.Attributes["num"], colormap[line.Attributes["num"]]);
-
- //else if (line.Message == "lpc-write-fast") AddEvent(EventSet.MiscAddress + "f", "F", Colors.Black);
- //else if (line.Message == "lpc-write-prepare") AddEvent(EventSet.MiscAddress + "p", "P", Colors.Black);
-
- else if (line.Message == "chronoswrite") AddEvent(EventSet.MiscAddress + "chronos-write", line.Attributes["ticks"], Colors.Black);
- else if (line.Message == "chronosread") AddEvent(EventSet.MiscAddress + "chronos-read", line.Attributes["ticks"], Colors.Black);
- }
-
- private void AddMultiple(string addresses, string name, Color color)
- {
- var addressToken = addresses
- .Replace("@[", "")
- .Replace("]", "");
-
- //foreach (var adddress in addressTokens)
- //{
- // AddEvent(adddress, name, color);
- //}
- AddEvent(addressToken, name, color);
- }
-
- private void AddEvent(string address, string name, Color color)
- {
- set.Add(address, new CodexEvent(name, color, line.TimestampUtc));
- }
- }
- }
-}
diff --git a/SeeTimeline/MainWindow.xaml b/SeeTimeline/MainWindow.xaml
deleted file mode 100644
index e93074e..0000000
--- a/SeeTimeline/MainWindow.xaml
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/SeeTimeline/MainWindow.xaml.cs b/SeeTimeline/MainWindow.xaml.cs
deleted file mode 100644
index b0fbc59..0000000
--- a/SeeTimeline/MainWindow.xaml.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System.IO;
-using System.Windows;
-using System.Windows.Media;
-using TimelinerNet;
-
-namespace SeeTimeline
-{
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
-
- Timeliner1.PropertyChanged += Timeliner1_PropertyChanged;
- Timeliner3.PropertyChanged += Timeliner3_PropertyChanged;
- }
-
- private void Timeliner3_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- Timeliner4.LeftEdge = Timeliner3.LeftEdge;
- Timeliner4.RightEdge = Timeliner3.RightEdge;
- }
-
- private void Timeliner1_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- Timeliner2.LeftEdge = Timeliner1.LeftEdge;
- Timeliner2.RightEdge = Timeliner1.RightEdge;
- }
-
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- //var path = "d:\\Projects\\cs-codex-dist-tests\\Tests\\CodexReleaseTests\\bin\\Debug\\net8.0\\CodexTestLogs\\2025-01\\08\\13-56-44Z_TwoClientTests\\";
- var path = "c:\\Projects\\cs-codex-dist-tests\\Tests\\CodexReleaseTests\\bin\\Debug\\net8.0\\CodexTestLogs\\2025-01\\09\\10-45-20Z_TwoClientTests\\";
- var file1 = Path.Combine(path, "TwoClientTest[thatbenbierens_nim-codex_blkex-cancelpresence-25-f]_000001_Downloader1.log");
- var file2 = Path.Combine(path, "TwoClientTest[thatbenbierens_nim-codex_blkex-cancelpresence-25-f]_000000_Uploader0.log");
- var file3 = Path.Combine(path, "TwoClientTest[thatbenbierens_nim-codex_blkex-cancelpresence-25-s]_000001_Downloader1.log");
- var file4 = Path.Combine(path, "TwoClientTest[thatbenbierens_nim-codex_blkex-cancelpresence-25-s]_000000_Uploader0.log");
-
- Line1Name.Text = file1;
- Line2Name.Text = file2;
- Line3Name.Text = file3;
- Line4Name.Text = file4;
-
- var set1 = new EventSet();
- set1.AddFile(file1);
-
- var addrs1 = set1.Addresses.Take(5).ToArray();
- set1.KeepOnly(addrs1);
-
- var set2 = new EventSet();
- set2.AddFile(file2);
-
- set2.KeepOnly(addrs1);
-
- var set3 = new EventSet();
- set3.AddFile(file3);
-
- var addrs2 = set3.Addresses.Take(5).ToArray();
- set3.KeepOnly(addrs2);
-
- var set4 = new EventSet();
- set4.AddFile(file4);
-
- set4.KeepOnly(addrs2);
-
- var factor = 3600.0 * 24.0;
- var now1 = set1.Earliest;
- set1.Scale(from: now1, factor);
- set2.Scale(from: now1, factor);
-
- var now2 = set3.Earliest;
- set3.Scale(from: now2, factor);
- set4.Scale(from: now2, factor);
-
- DisplaySet(set1, Timeliner1);
- DisplaySet(set2, Timeliner2);
- DisplaySet(set3, Timeliner3);
- DisplaySet(set4, Timeliner4);
-
- //var end1 = set2.Latest;
- Timeliner1.Now = now1;
- Timeliner2.Now = now1;
-
- Timeliner1.LeftEdge = now1;
- //Timeliner1.RightEdge = end1;
- Timeliner2.LeftEdge = now1;
- //Timeliner2.RightEdge = end1;
-
- //var end2 = set3.Latest;
- Timeliner3.Now = now2;
- Timeliner4.Now = now2;
-
- Timeliner3.LeftEdge = now2;
- //Timeliner3.RightEdge = end2;
- Timeliner4.LeftEdge = now2;
- //Timeliner4.RightEdge = end2;
- }
-
- private void DisplaySet(EventSet set, Timeliner timeliner)
- {
- timeliner.Data = new TimelinerData()
- {
- Items = CreateItems(set)
- };
- }
-
- private List CreateItems(EventSet set)
- {
- var result = new List();
-
- set.Iterate((addr, events) =>
- {
- if (addr == EventSet.NoAddress || addr.StartsWith(EventSet.MiscAddress))
- {
- result.Add(CreateItem(addr, events));
- }
- else
- {
- foreach (var e in events)
- {
- result.Add(new TimelinerItem()
- {
- Name = addr + " " + e.Name,
- Jobs = new List
- {
- CreateJob(e)
- }
- });
- }
- }
- });
-
- return result;
- }
-
- private TimelinerItem CreateItem(string addr, CodexEvent[] events)
- {
- return new TimelinerItem
- {
- Name = addr,
- Jobs = CreateJobs(events)
- };
- }
-
- private List CreateJobs(CodexEvent[] events)
- {
- return events.Select(CreateJob).ToList();
- }
-
- private TimelinerJob CreateJob(CodexEvent e)
- {
- return new TimelinerJob
- {
- Name = e.Name,
- Color = new SolidColorBrush(e.Color),
- Begin = e.Dt,
- End = e.Dt
- };
- }
- }
-}
diff --git a/SeeTimeline/SeeTimeline.csproj b/SeeTimeline/SeeTimeline.csproj
deleted file mode 100644
index b3807c3..0000000
--- a/SeeTimeline/SeeTimeline.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- WinExe
- net8.0-windows
- enable
- enable
- true
-
-
-
-
-
-
-
-
-
-
-
diff --git a/SeeTimeline/SeeTimeline.csproj.user b/SeeTimeline/SeeTimeline.csproj.user
deleted file mode 100644
index 644b0a6..0000000
--- a/SeeTimeline/SeeTimeline.csproj.user
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
- Designer
-
-
-
-
- Designer
-
-
-
\ No newline at end of file
diff --git a/SpeedCheckTests/Parallelism.cs b/SpeedCheckTests/Parallelism.cs
new file mode 100644
index 0000000..a628e96
--- /dev/null
+++ b/SpeedCheckTests/Parallelism.cs
@@ -0,0 +1,6 @@
+using NUnit.Framework;
+
+[assembly: LevelOfParallelism(1)]
+namespace CodexTests
+{
+}
diff --git a/SpeedCheckTests/SpeedCheckTests.csproj b/SpeedCheckTests/SpeedCheckTests.csproj
new file mode 100644
index 0000000..0222939
--- /dev/null
+++ b/SpeedCheckTests/SpeedCheckTests.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SpeedCheckTests/SpeedTest.cs b/SpeedCheckTests/SpeedTest.cs
new file mode 100644
index 0000000..5a46f17
--- /dev/null
+++ b/SpeedCheckTests/SpeedTest.cs
@@ -0,0 +1,107 @@
+using CodexPlugin;
+using CodexTests;
+using NUnit.Framework;
+using System.Diagnostics;
+using System.Drawing;
+using Utils;
+
+namespace SpeedCheckTests
+{
+ [TestFixture]
+ public class SpeedTest : CodexDistTest
+ {
+ [Test]
+ public void Symmetric()
+ {
+ // Symmetric: A node always sends a reply to every message it receives.
+ CodexContainerRecipe.DockerImageOverride = "thatbenbierens/nim-codex:blkex-cancelpresence-27-f";
+
+ var uploader = StartCodex(s => s.WithName("SymUploader"));
+ var downloader = StartCodex(s => s.WithName("SymDownloader").WithBootstrapNode(uploader));
+ var timeTaken = PerformTest(uploader, downloader);
+
+ Console.WriteLine($"Symmetric time: {Time.FormatDuration(timeTaken)}");
+
+ Assert.That(timeTaken, Is.LessThan(TimeSpan.FromSeconds(10.0)),
+ $"Symmetric: Too slow. Expected less than 10 seconds but was: {Time.FormatDuration(timeTaken)}");
+ }
+
+ [Test]
+ public void Asymmetric()
+ {
+ // Asymmetric: A node does not always send a reply when a message is received.
+ CodexContainerRecipe.DockerImageOverride = "thatbenbierens/nim-codex:blkex-cancelpresence-27-s";
+
+ var uploader = StartCodex(s => s.WithName("AsymUploader"));
+ var downloader = StartCodex(s => s.WithName("AsymDownloader").WithBootstrapNode(uploader));
+ var timeTaken = PerformTest(uploader, downloader);
+
+ Console.WriteLine($"Asymmetric time: {Time.FormatDuration(timeTaken)}");
+
+ Assert.That(timeTaken, Is.LessThan(TimeSpan.FromSeconds(10.0)),
+ $"Asymmetric: Too slow. Expected less than 10 seconds but was: {Time.FormatDuration(timeTaken)}");
+ }
+
+ [Test]
+ public void Binary()
+ {
+ // Docker image not used: Here for api check.
+ CodexContainerRecipe.DockerImageOverride = "thatbenbierens/nim-codex:blkex-cancelpresence-27-f";
+
+ var binary = "C:\\Projects\\nim-codex\\build\\codex.exe";
+ if (!File.Exists(binary)) throw new Exception("TODO: Update binary path");
+
+ var uploadInfo = new ProcessStartInfo
+ {
+ FileName = binary,
+ Arguments = "--data-dir=upload_data " +
+ "--api-port=8081 " +
+ "--nat=127.0.0.1 " +
+ "--disc-ip=127.0.0.1 " +
+ "--disc-port=8091 " +
+ "--listen-addrs=/ip4/127.0.0.1/tcp/8071",
+ UseShellExecute = true,
+ };
+
+ var uploadProcess = Process.Start(uploadInfo);
+
+ Thread.Sleep(5000);
+ if (uploadProcess == null || uploadProcess.HasExited) throw new Exception("Node exited.");
+
+ CodexAccess.UploaderOverride = new Address("http://localhost", 8081);
+ var uploader = StartCodex(s => s.WithName("BinaryUploader"));
+ var spr = uploader.GetSpr();
+
+ var downloadProcess = Process.Start(binary,
+ "--data-dir=download_data " +
+ "--api-port=8082 " +
+ "--nat=127.0.0.1 " +
+ "--disc-ip=127.0.0.1 " +
+ "--disc-port=8092 " +
+ "--listen-addrs=/ip4/127.0.0.1/tcp/8072 " +
+ "--bootstrap-node=" + spr
+ );
+
+ CodexAccess.DownloaderOverride = new Address("http://localhost", 8082);
+ var downloader = StartCodex(s => s.WithName("BinaryDownloader"));
+
+ var timeTaken = PerformTest(uploader, downloader);
+
+ uploadProcess.Kill();
+ downloadProcess.Kill();
+
+ Console.WriteLine($"Binary time: {Time.FormatDuration(timeTaken)}");
+
+ Assert.That(timeTaken, Is.LessThan(TimeSpan.FromSeconds(10.0)),
+ $"Binary: Too slow. Expected less than 10 seconds but was: {Time.FormatDuration(timeTaken)}");
+ }
+
+ private TimeSpan PerformTest(ICodexNode uploader, ICodexNode downloader)
+ {
+ var testFile = GenerateTestFile(100.MB());
+ var contentId = uploader.UploadFile(testFile);
+ var (downloadedFile, timeTaken) = downloader.DownloadContentT(contentId);
+ return timeTaken;
+ }
+ }
+}
diff --git a/cs-codex-dist-testing.sln b/cs-codex-dist-testing.sln
index 05e6cb6..19bca2c 100644
--- a/cs-codex-dist-testing.sln
+++ b/cs-codex-dist-testing.sln
@@ -82,7 +82,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExperimentalTests", "Tests\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockchainUtils", "Framework\BlockchainUtils\BlockchainUtils.csproj", "{4648B5AA-A0A7-44BA-89BC-2FD57370943C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SeeTimeline", "SeeTimeline\SeeTimeline.csproj", "{24702B12-0448-4770-9AD2-8BDE5B04EF94}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpeedCheckTests", "SpeedCheckTests\SpeedCheckTests.csproj", "{5D134D9A-DC61-4472-8F47-92250C8DB5CC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -222,10 +222,10 @@ Global
{4648B5AA-A0A7-44BA-89BC-2FD57370943C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4648B5AA-A0A7-44BA-89BC-2FD57370943C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4648B5AA-A0A7-44BA-89BC-2FD57370943C}.Release|Any CPU.Build.0 = Release|Any CPU
- {24702B12-0448-4770-9AD2-8BDE5B04EF94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {24702B12-0448-4770-9AD2-8BDE5B04EF94}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {24702B12-0448-4770-9AD2-8BDE5B04EF94}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {24702B12-0448-4770-9AD2-8BDE5B04EF94}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5D134D9A-DC61-4472-8F47-92250C8DB5CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5D134D9A-DC61-4472-8F47-92250C8DB5CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5D134D9A-DC61-4472-8F47-92250C8DB5CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5D134D9A-DC61-4472-8F47-92250C8DB5CC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -264,7 +264,7 @@ Global
{639A0603-4E80-465B-BB59-AB02F1DEEF5A} = {88C2A621-8A98-4D07-8625-7900FC8EF89E}
{BA7369CD-7C2F-4075-8E35-98BCC19EE203} = {88C2A621-8A98-4D07-8625-7900FC8EF89E}
{4648B5AA-A0A7-44BA-89BC-2FD57370943C} = {81AE04BC-CBFA-4E6F-B039-8208E9AFAAE7}
- {24702B12-0448-4770-9AD2-8BDE5B04EF94} = {88C2A621-8A98-4D07-8625-7900FC8EF89E}
+ {5D134D9A-DC61-4472-8F47-92250C8DB5CC} = {88C2A621-8A98-4D07-8625-7900FC8EF89E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {237BF0AA-9EC4-4659-AD9A-65DEB974250C}