2023-06-07 06:30:10 +00:00
using DistTestCore.Codex ;
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-07 06:30:10 +00:00
AssertTimePerMB ( timeTaken , nodes . Count ( ) , testFileSize ) ;
2023-06-06 12:36:37 +00:00
}
2023-06-07 06:30:10 +00:00
private void AssertTimePerMB ( 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-07 06:30:10 +00:00
float sizeInMB = size . ToMB ( ) ;
var timePerMB = timePerDownload / sizeInMB ;
2023-06-06 14:10:30 +00:00
2023-06-20 11:37:58 +00:00
test . Log ( $"Performed {numberOfDownloads} downloads of {size} in {timeTaken.TotalSeconds} seconds, for an average of {timePerMB.TotalSeconds} seconds per MB." ) ;
2023-06-06 12:36:37 +00:00
2023-06-07 06:30:10 +00:00
Assert . That ( timePerMB , Is . LessThan ( CodexContainerRecipe . MaxDownloadTimePerMegabyte ) , "MaxDownloadTimePerMegabyte 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
}
}