cs-codex-dist-tests/Tests/CodexLongTests/ScalabilityTests/ScalabilityTests.cs

133 lines
3.9 KiB
C#
Raw Normal View History

2024-04-13 13:27:47 +00:00
using CodexPlugin;
2024-04-13 14:33:21 +00:00
using DistTestCore;
2024-04-15 06:12:57 +00:00
using FileUtils;
2024-04-13 13:27:47 +00:00
using NUnit.Framework;
using Utils;
namespace CodexTests.ScalabilityTests;
[TestFixture]
public class ScalabilityTests : CodexDistTest
{
2024-04-15 06:12:57 +00:00
/// <summary>
/// We upload a file to node A, then download it with B.
/// Then we stop node A, and download again with node C.
/// </summary>
2024-04-13 13:27:47 +00:00
[Test]
[Combinatorial]
2024-04-13 14:33:21 +00:00
[UseLongTimeouts]
2024-04-15 05:36:12 +00:00
[DontDownloadLogs]
[WaitForCleanup]
2024-04-13 13:27:47 +00:00
public void ShouldMaintainFileInNetwork(
2024-06-08 08:36:23 +00:00
[Values(4, 5, 6)] int numberOfNodes, // TODO: include 10, 40, 80 and 100, not 5
2024-06-13 06:51:52 +00:00
[Values(4000, 5000, 6000, 7000, 8000, 9000, 10000)] int fileSizeInMb
2024-04-13 13:27:47 +00:00
)
{
2024-06-08 08:50:30 +00:00
var logLevel = CodexLogLevel.Trace;
2024-05-09 07:32:48 +00:00
var bootstrap = StartCodex(s => s.WithLogLevel(logLevel));
var nodes = StartCodex(numberOfNodes - 1, s => s
.WithBootstrapNode(bootstrap)
.WithLogLevel(logLevel)
.WithStorageQuota((fileSizeInMb + 50).MB())
).ToList();
2024-04-13 13:27:47 +00:00
var uploader = nodes.PickOneRandom();
var downloader = nodes.PickOneRandom();
var testFile = GenerateTestFile(fileSizeInMb.MB());
LogNodeStatus(uploader);
var contentId = uploader.UploadFile(testFile, f => LogNodeStatus(uploader));
2024-06-08 08:36:23 +00:00
LogNodeStatus(uploader);
LogNodeStatus(downloader);
var downloadedFile = downloader.DownloadContent(contentId, f => LogNodeStatus(downloader));
2024-06-08 08:36:23 +00:00
LogNodeStatus(downloader);
2024-04-13 13:27:47 +00:00
downloadedFile!.AssertIsEqual(testFile);
2024-06-13 06:51:52 +00:00
uploader.DeleteRepoFolder();
2024-04-13 13:27:47 +00:00
uploader.Stop(true);
var otherDownloader = nodes.PickOneRandom();
downloadedFile = otherDownloader.DownloadContent(contentId);
downloadedFile!.AssertIsEqual(testFile);
2024-06-13 06:51:52 +00:00
downloader.DeleteRepoFolder();
otherDownloader.DeleteRepoFolder();
2024-04-13 13:27:47 +00:00
}
2024-04-15 06:12:57 +00:00
/// <summary>
/// We upload a file to each node, to put a more wide-spread load on the network.
/// Then we run the same test as ShouldMaintainFileInNetwork.
/// </summary>
2024-05-07 07:49:00 +00:00
[Ignore("Fix ShouldMaintainFileInNetwork for all values first")]
2024-04-15 06:12:57 +00:00
[Test]
[Combinatorial]
[UseLongTimeouts]
[DontDownloadLogs]
[WaitForCleanup]
2024-04-15 06:12:57 +00:00
public void EveryoneGetsAFile(
[Values(10, 40, 80, 100)] int numberOfNodes,
[Values(100, 1000, 5000, 10000)] int fileSizeInMb
2024-04-15 06:12:57 +00:00
)
{
var logLevel = CodexLogLevel.Info;
2024-05-09 07:32:48 +00:00
var bootstrap = StartCodex(s => s.WithLogLevel(logLevel));
var nodes = StartCodex(numberOfNodes - 1, s => s
2024-04-15 06:12:57 +00:00
.WithBootstrapNode(bootstrap)
.WithLogLevel(logLevel)
.WithStorageQuota((fileSizeInMb + 50).MB())
).ToList();
var pairTasks = nodes.Select(n =>
{
return Task.Run(() =>
{
var file = GenerateTestFile(fileSizeInMb.MB());
var cid = n.UploadFile(file);
return new NodeFilePair(n, file, cid);
});
});
var pairs = pairTasks.Select(t => Time.Wait(t)).ToList();
RunDoubleDownloadTest(
pairs.PickOneRandom(),
pairs.PickOneRandom(),
pairs.PickOneRandom()
);
}
private void RunDoubleDownloadTest(NodeFilePair source, NodeFilePair dl1, NodeFilePair dl2)
{
var expectedFile = source.File;
var cid = source.Cid;
var file1 = dl1.Node.DownloadContent(cid);
file1!.AssertIsEqual(expectedFile);
source.Node.Stop(true);
var file2 = dl2.Node.DownloadContent(cid);
file2!.AssertIsEqual(expectedFile);
}
public class NodeFilePair
{
public NodeFilePair(ICodexNode node, TrackedFile file, ContentId cid)
{
Node = node;
File = file;
Cid = cid;
}
public ICodexNode Node { get; }
public TrackedFile File { get; }
public ContentId Cid { get; }
}
}