Setup single and multiple dataset test plans
This commit is contained in:
parent
caa0423bd5
commit
a62c6f5108
@ -0,0 +1,150 @@
|
||||
using CodexPlugin;
|
||||
using CodexTests;
|
||||
using NUnit.Framework;
|
||||
using Utils;
|
||||
|
||||
namespace ExperimentalTests.DownloadConnectivityTests
|
||||
{
|
||||
/// <summary>
|
||||
/// https://hackmd.io/rwPtPJ7KTw6cGjhN0zNYig
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class DatalayerReliabilityTests : AutoBootstrapDistTest
|
||||
{
|
||||
[Test]
|
||||
[Combinatorial]
|
||||
public void SingleSetTest(
|
||||
[Values(1, 10, 100, 1000)] int fileSizeMb,
|
||||
[Values(5, 10, 20, 30)] int numDownloaders
|
||||
)
|
||||
{
|
||||
var file = GenerateTestFile(fileSizeMb.MB());
|
||||
var uploaders = StartCodex(n => n.WithName("uploader"));
|
||||
var downloaders = StartCodex(numDownloaders, n => n.WithName("downloader"));
|
||||
|
||||
var cid = uploaders.UploadFile(file);
|
||||
|
||||
var downloadTasks = new List<Task>();
|
||||
foreach (var dl in downloaders)
|
||||
{
|
||||
downloadTasks.Add(Task.Run(() =>
|
||||
{
|
||||
dl.DownloadContent(cid);
|
||||
}));
|
||||
}
|
||||
|
||||
Task.WaitAll(downloadTasks.ToArray());
|
||||
|
||||
Assert.That(downloadTasks.All(t => !t.IsFaulted));
|
||||
}
|
||||
|
||||
public class TransferPlan
|
||||
{
|
||||
public ICodexNode Uploader { get; set; } = null!;
|
||||
public ContentId Cid { get; set; } = null!;
|
||||
public List<DownloaderPlan> Downloaders { get; } = new List<DownloaderPlan>();
|
||||
}
|
||||
|
||||
public class DownloaderPlan
|
||||
{
|
||||
public ICodexNode Node { get; set; } = null!;
|
||||
public List<TransferPlan> TransferPlans { get; } = new List<TransferPlan>();
|
||||
}
|
||||
|
||||
public class AvailableDownloaders
|
||||
{
|
||||
private readonly List<DownloaderPlan> all = new List<DownloaderPlan>();
|
||||
private readonly List<DownloaderPlan> available = new List<DownloaderPlan>();
|
||||
private readonly int maxUsagePerDownloader;
|
||||
private readonly int numDownloadersPerPlan;
|
||||
|
||||
public AvailableDownloaders(int maxUsagePerDownloader, int numDownloadersPerPlan)
|
||||
{
|
||||
this.maxUsagePerDownloader = maxUsagePerDownloader;
|
||||
this.numDownloadersPerPlan = numDownloadersPerPlan;
|
||||
}
|
||||
|
||||
public void Assign(TransferPlan plan)
|
||||
{
|
||||
while (plan.Downloaders.Count < numDownloadersPerPlan)
|
||||
{
|
||||
var open = available.Where(a => !plan.Downloaders.Contains(a)).ToArray();
|
||||
if (!open.Any())
|
||||
{
|
||||
var dl = new DownloaderPlan();
|
||||
all.Add(dl);
|
||||
available.Add(dl);
|
||||
}
|
||||
else
|
||||
{
|
||||
var dl = RandomUtils.GetOneRandom(open);
|
||||
dl.TransferPlans.Add(plan);
|
||||
plan.Downloaders.Add(dl);
|
||||
|
||||
if (dl.TransferPlans.Count == maxUsagePerDownloader) available.Remove(dl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public DownloaderPlan[] GetAll()
|
||||
{
|
||||
return all.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Combinatorial]
|
||||
public void MultiSetTest(
|
||||
[Values(1, 3, 5, 10)] int numDatasets,
|
||||
[Values(1, 10, 100, 1000)] int fileSizeMb,
|
||||
[Values(5, 10, 20, 30)] int numDownloadersPerDataset,
|
||||
[Values(3, 5)] int maxDatasetsPerDownloader
|
||||
)
|
||||
{
|
||||
var plans = new List<TransferPlan>();
|
||||
var uploaders = StartCodex(numDatasets, n => n.WithName("uploader"));
|
||||
foreach (var n in uploaders)
|
||||
{
|
||||
plans.Add(new TransferPlan
|
||||
{
|
||||
Uploader = n,
|
||||
Cid = n.UploadFile(GenerateTestFile(fileSizeMb.MB()))
|
||||
});
|
||||
}
|
||||
|
||||
Assert.That(plans.Count, Is.GreaterThan(0));
|
||||
|
||||
var available = new AvailableDownloaders(maxDatasetsPerDownloader, numDownloadersPerDataset);
|
||||
foreach (var plan in plans)
|
||||
{
|
||||
available.Assign(plan);
|
||||
}
|
||||
var allDownloaderPlans = available.GetAll();
|
||||
Assert.That(allDownloaderPlans.Length, Is.LessThan(100));
|
||||
Log($"Using {allDownloaderPlans.Length} downloaders...");
|
||||
var nodes = StartCodex(allDownloaderPlans.Length, n => n.WithName("downloader"));
|
||||
for (var i = 0; i < allDownloaderPlans.Length; i++)
|
||||
{
|
||||
allDownloaderPlans[i].Node = nodes[i];
|
||||
}
|
||||
|
||||
var downloadTasks = new List<Task>();
|
||||
foreach (var dlPlan in allDownloaderPlans)
|
||||
{
|
||||
downloadTasks.Add(Task.Run(() =>
|
||||
{
|
||||
var tf = dlPlan.TransferPlans.ToList();
|
||||
while (tf.Count > 0)
|
||||
{
|
||||
var t = tf.PickOneRandom();
|
||||
dlPlan.Node.DownloadContent(t.Cid);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
Task.WaitAll(downloadTasks.ToArray());
|
||||
|
||||
Assert.That(downloadTasks.All(t => !t.IsFaulted));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user