2023-06-06 14:10:30 +00:00
|
|
|
|
using NUnit.Framework;
|
2023-06-06 12:36:37 +00:00
|
|
|
|
|
|
|
|
|
namespace DistTestCore.Helpers
|
2023-05-29 07:13:38 +00:00
|
|
|
|
{
|
|
|
|
|
public class PeerDownloadTestHelpers
|
|
|
|
|
{
|
|
|
|
|
private readonly DistTest test;
|
|
|
|
|
|
|
|
|
|
public PeerDownloadTestHelpers(DistTest test)
|
|
|
|
|
{
|
|
|
|
|
this.test = test;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void AssertFullDownloadInterconnectivity(IEnumerable<IOnlineCodexNode> nodes, ByteSize testFileSize)
|
|
|
|
|
{
|
2023-05-31 11:15:41 +00:00
|
|
|
|
test.Log($"Asserting full download interconnectivity for nodes: '{string.Join(",", nodes.Select(n => n.GetName()))}'...");
|
2023-06-06 12:36:37 +00:00
|
|
|
|
var start = DateTime.UtcNow;
|
|
|
|
|
|
2023-05-29 07:13:38 +00:00
|
|
|
|
foreach (var node in nodes)
|
|
|
|
|
{
|
|
|
|
|
var uploader = node;
|
|
|
|
|
var downloaders = nodes.Where(n => n != uploader).ToArray();
|
|
|
|
|
|
|
|
|
|
test.ScopedTestFiles(() =>
|
|
|
|
|
{
|
2023-05-29 07:27:25 +00:00
|
|
|
|
PerformTest(uploader, downloaders, testFileSize);
|
2023-05-29 07:13:38 +00:00
|
|
|
|
});
|
|
|
|
|
}
|
2023-05-29 07:25:03 +00:00
|
|
|
|
|
2023-05-31 11:15:41 +00:00
|
|
|
|
test.Log($"Success! Full download interconnectivity for nodes: {string.Join(",", nodes.Select(n => n.GetName()))}");
|
2023-06-06 12:36:37 +00:00
|
|
|
|
var timeTaken = DateTime.UtcNow - start;
|
|
|
|
|
|
2023-06-06 14:10:30 +00:00
|
|
|
|
AssertTimePerDownload(timeTaken, nodes.Count(), testFileSize);
|
2023-06-06 12:36:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-06 14:10:30 +00:00
|
|
|
|
private void AssertTimePerDownload(TimeSpan timeTaken, int numberOfNodes, ByteSize size)
|
2023-06-06 12:36:37 +00:00
|
|
|
|
{
|
|
|
|
|
var numberOfDownloads = numberOfNodes * (numberOfNodes - 1);
|
|
|
|
|
var timePerDownload = timeTaken / numberOfDownloads;
|
2023-06-06 14:10:30 +00:00
|
|
|
|
float sizeInMB = size.SizeInBytes / (1024.0f * 1024.0f);
|
|
|
|
|
var timePerMB = timePerDownload.TotalSeconds / sizeInMB;
|
|
|
|
|
|
|
|
|
|
test.Log($"Performed {numberOfDownloads} downloads of {size} in {timeTaken.TotalSeconds} seconds, for an average of {timePerMB} seconds per MB.");
|
2023-06-06 12:36:37 +00:00
|
|
|
|
|
2023-06-06 14:10:30 +00:00
|
|
|
|
var maxTimePerMB = 2.0f;
|
2023-06-06 12:36:37 +00:00
|
|
|
|
|
2023-06-06 14:10:30 +00:00
|
|
|
|
Assert.That(timePerMB, Is.LessThan(maxTimePerMB), "Seconds-per-MB performance threshold breached.");
|
2023-05-29 07:13:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-29 07:27:25 +00:00
|
|
|
|
private void PerformTest(IOnlineCodexNode uploader, IOnlineCodexNode[] downloaders, ByteSize testFileSize)
|
2023-05-29 07:13:38 +00:00
|
|
|
|
{
|
2023-06-04 06:59:51 +00:00
|
|
|
|
// Generate 1 test file per downloader.
|
|
|
|
|
var files = downloaders.Select(d => GenerateTestFile(uploader, d, testFileSize)).ToArray();
|
2023-05-29 07:13:38 +00:00
|
|
|
|
|
|
|
|
|
// Upload all the test files to the uploader.
|
|
|
|
|
var contentIds = files.Select(uploader.UploadFile).ToArray();
|
|
|
|
|
|
|
|
|
|
// Each downloader should retrieve its own test file.
|
|
|
|
|
for (var i = 0; i < downloaders.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
var expectedFile = files[i];
|
2023-06-04 06:59:51 +00:00
|
|
|
|
var downloadedFile = downloaders[i].DownloadContent(contentIds[i], $"{expectedFile.Label}DOWNLOADED");
|
2023-05-29 07:13:38 +00:00
|
|
|
|
|
|
|
|
|
expectedFile.AssertIsEqual(downloadedFile);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-06-04 06:59:51 +00:00
|
|
|
|
|
|
|
|
|
private TestFile GenerateTestFile(IOnlineCodexNode uploader, IOnlineCodexNode downloader, ByteSize testFileSize)
|
|
|
|
|
{
|
|
|
|
|
var up = uploader.GetName().Replace("<", "").Replace(">", "");
|
|
|
|
|
var down = downloader.GetName().Replace("<", "").Replace(">", "");
|
|
|
|
|
var label = $"FROM{up}TO{down}";
|
|
|
|
|
return test.GenerateTestFile(testFileSize, label);
|
|
|
|
|
}
|
2023-05-29 07:13:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|