2023-06-06 12:36:37 +00:00
using Nethereum.Model ;
using NUnit.Framework ;
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 )
{
AssertFullDownloadInterconnectivity ( nodes , 1. MB ( ) ) ;
}
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 ;
AssertTimePerDownload ( timeTaken , nodes . Count ( ) ) ;
}
private void AssertTimePerDownload ( TimeSpan timeTaken , int numberOfNodes )
{
var numberOfDownloads = numberOfNodes * ( numberOfNodes - 1 ) ;
var timePerDownload = timeTaken / numberOfDownloads ;
test . Log ( $"Performed {numberOfDownloads} downloads in {timeTaken.TotalSeconds} seconds, for an average of {timePerDownload.TotalSeconds} seconds per download." ) ;
Assert . That ( timePerDownload . TotalSeconds , Is . LessThan ( 20.0f ) , "Seconds-per-Download breached performance threshold." ) ;
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
}
}