This commit is contained in:
parent
4234719e53
commit
3884a6a7f7
|
@ -7,14 +7,16 @@ namespace ContinuousTests
|
||||||
public class ContinuousLogDownloader
|
public class ContinuousLogDownloader
|
||||||
{
|
{
|
||||||
private readonly TestLifecycle lifecycle;
|
private readonly TestLifecycle lifecycle;
|
||||||
private readonly CodexDeployment deployment;
|
private readonly RunningContainer[] containers;
|
||||||
|
//private readonly CodexDeployment deployment;
|
||||||
private readonly string outputPath;
|
private readonly string outputPath;
|
||||||
private readonly CancellationToken cancelToken;
|
private readonly CancellationToken cancelToken;
|
||||||
|
|
||||||
public ContinuousLogDownloader(TestLifecycle lifecycle, CodexDeployment deployment, string outputPath, CancellationToken cancelToken)
|
public ContinuousLogDownloader(TestLifecycle lifecycle, RunningContainer[] containers, string outputPath, CancellationToken cancelToken)
|
||||||
{
|
{
|
||||||
this.lifecycle = lifecycle;
|
this.lifecycle = lifecycle;
|
||||||
this.deployment = deployment;
|
this.containers = containers;
|
||||||
|
//this.deployment = deployment;
|
||||||
this.outputPath = outputPath;
|
this.outputPath = outputPath;
|
||||||
this.cancelToken = cancelToken;
|
this.cancelToken = cancelToken;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +39,7 @@ namespace ContinuousTests
|
||||||
|
|
||||||
private void UpdateLogs()
|
private void UpdateLogs()
|
||||||
{
|
{
|
||||||
foreach (var container in deployment.CodexContainers)
|
foreach (var container in containers)
|
||||||
{
|
{
|
||||||
UpdateLog(container);
|
UpdateLog(container);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace ContinuousTests
|
||||||
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
|
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
|
||||||
|
|
||||||
var (_, lifecycle) = k8SFactory.CreateFacilities(config.KubeConfigFile, config.LogPath, config.DataPath, config.CodexDeployment.Metadata.KubeNamespace, new DefaultTimeSet(), new NullLog(), config.RunnerLocation);
|
var (_, lifecycle) = k8SFactory.CreateFacilities(config.KubeConfigFile, config.LogPath, config.DataPath, config.CodexDeployment.Metadata.KubeNamespace, new DefaultTimeSet(), new NullLog(), config.RunnerLocation);
|
||||||
var downloader = new ContinuousLogDownloader(lifecycle, config.CodexDeployment, path, cancelToken);
|
var downloader = new ContinuousLogDownloader(lifecycle, config.CodexDeployment.CodexContainers, path, cancelToken);
|
||||||
|
|
||||||
taskFactory.Run(downloader.Run);
|
taskFactory.Run(downloader.Run);
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,7 @@ namespace DistTestCore
|
||||||
return new CodexSetup(numberOfNodes, configuration.GetCodexLogLevel());
|
return new CodexSetup(numberOfNodes, configuration.GetCodexLogLevel());
|
||||||
}
|
}
|
||||||
|
|
||||||
private TestLifecycle Get()
|
public TestLifecycle Get()
|
||||||
{
|
{
|
||||||
lock (lifecycleLock)
|
lock (lifecycleLock)
|
||||||
{
|
{
|
||||||
|
|
|
@ -125,7 +125,14 @@ namespace DistTestCore
|
||||||
|
|
||||||
private T Retry<T>(Func<T> operation, string description)
|
private T Retry<T>(Func<T> operation, string description)
|
||||||
{
|
{
|
||||||
return Time.Retry(operation, timeSet.HttpCallRetryTime(), timeSet.HttpCallRetryDelay(), description);
|
try
|
||||||
|
{
|
||||||
|
return operation();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(description, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private HttpClient GetClient()
|
private HttpClient GetClient()
|
||||||
|
|
|
@ -4,6 +4,7 @@ using DistTestCore.Marketplace;
|
||||||
using DistTestCore.Metrics;
|
using DistTestCore.Metrics;
|
||||||
using Logging;
|
using Logging;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using Utils;
|
||||||
|
|
||||||
namespace DistTestCore
|
namespace DistTestCore
|
||||||
{
|
{
|
||||||
|
@ -66,7 +67,8 @@ namespace DistTestCore
|
||||||
{
|
{
|
||||||
using var fileStream = File.OpenRead(file.Filename);
|
using var fileStream = File.OpenRead(file.Filename);
|
||||||
|
|
||||||
var logMessage = $"Uploading file {file.Describe()}...";
|
var logMessage = $"{CodexAccess.Container.Name} Uploading file {file.Describe()}...";
|
||||||
|
Log(logMessage);
|
||||||
var response = Stopwatch.Measure(lifecycle.Log, logMessage, () =>
|
var response = Stopwatch.Measure(lifecycle.Log, logMessage, () =>
|
||||||
{
|
{
|
||||||
return CodexAccess.UploadFile(fileStream);
|
return CodexAccess.UploadFile(fileStream);
|
||||||
|
@ -81,7 +83,8 @@ namespace DistTestCore
|
||||||
|
|
||||||
public TestFile? DownloadContent(ContentId contentId, string fileLabel = "")
|
public TestFile? DownloadContent(ContentId contentId, string fileLabel = "")
|
||||||
{
|
{
|
||||||
var logMessage = $"Downloading for contentId: '{contentId.Id}'...";
|
var logMessage = $"{CodexAccess.Container.Name} Downloading for contentId: '{contentId.Id}'...";
|
||||||
|
Log(logMessage);
|
||||||
var file = lifecycle.FileManager.CreateEmptyTestFile(fileLabel);
|
var file = lifecycle.FileManager.CreateEmptyTestFile(fileLabel);
|
||||||
Stopwatch.Measure(lifecycle.Log, logMessage, () => DownloadToFile(contentId.Id, file));
|
Stopwatch.Measure(lifecycle.Log, logMessage, () => DownloadToFile(contentId.Id, file));
|
||||||
Log($"Downloaded file {file.Describe()} to '{file.Filename}'.");
|
Log($"Downloaded file {file.Describe()} to '{file.Filename}'.");
|
||||||
|
@ -116,7 +119,7 @@ namespace DistTestCore
|
||||||
|
|
||||||
public void EnsureOnlineGetVersionResponse()
|
public void EnsureOnlineGetVersionResponse()
|
||||||
{
|
{
|
||||||
var debugInfo = CodexAccess.GetDebugInfo();
|
var debugInfo = Time.Retry(CodexAccess.GetDebugInfo, "ensure online");
|
||||||
var nodePeerId = debugInfo.id;
|
var nodePeerId = debugInfo.id;
|
||||||
var nodeName = CodexAccess.Container.Name;
|
var nodeName = CodexAccess.Container.Name;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
using ContinuousTests;
|
||||||
|
using DistTestCore;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using Utils;
|
||||||
|
|
||||||
|
namespace Tests.BasicTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class ContinuousSubstitute : AutoBootstrapDistTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ContinuousTestSubstitute()
|
||||||
|
{
|
||||||
|
var nodes = new List<OnlineCodexNode>();
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
nodes.Add((OnlineCodexNode)SetupCodexNode(o => o
|
||||||
|
.EnableMarketplace(100000.TestTokens(), 0.Eth(), isValidator: i < 2)
|
||||||
|
.WithStorageQuota(2.GB())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
var ct = cts.Token;
|
||||||
|
var dlPath = Path.Combine(new FileInfo(Get().Log.LogFile.FullFilename)!.Directory!.FullName, "continuouslogs");
|
||||||
|
Directory.CreateDirectory(dlPath);
|
||||||
|
|
||||||
|
var containers = nodes.Select(n => n.CodexAccess.Container).ToArray();
|
||||||
|
var cd = new ContinuousLogDownloader(Get(), containers, dlPath, ct);
|
||||||
|
|
||||||
|
var logTask = Task.Run(cd.Run);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var node in nodes)
|
||||||
|
{
|
||||||
|
node.Marketplace.MakeStorageAvailable(
|
||||||
|
size: 1.GB(),
|
||||||
|
minPricePerBytePerSecond: 1.TestTokens(),
|
||||||
|
maxCollateral: 1024.TestTokens(),
|
||||||
|
maxDuration: TimeSpan.FromMinutes(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
var endTime = DateTime.UtcNow + TimeSpan.FromHours(1);
|
||||||
|
while (DateTime.UtcNow < endTime)
|
||||||
|
{
|
||||||
|
var allNodes = nodes.ToList();
|
||||||
|
var primary = allNodes.PickOneRandom();
|
||||||
|
var secondary = allNodes.PickOneRandom();
|
||||||
|
|
||||||
|
Log("Run Test");
|
||||||
|
PerformTest(primary, secondary);
|
||||||
|
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(30));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
cts.Cancel();
|
||||||
|
logTask.Wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void JustWaitFirst()
|
||||||
|
{
|
||||||
|
var nodes = new List<OnlineCodexNode>();
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
nodes.Add((OnlineCodexNode)SetupCodexNode(o => o
|
||||||
|
.EnableMarketplace(100000.TestTokens(), 0.Eth(), isValidator: i < 2)
|
||||||
|
.WithStorageQuota(2.GB())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
var ct = cts.Token;
|
||||||
|
var dlPath = Path.Combine(new FileInfo(Get().Log.LogFile.FullFilename)!.Directory!.FullName, "continuouslogsjustwait");
|
||||||
|
Directory.CreateDirectory(dlPath);
|
||||||
|
|
||||||
|
var containers = nodes.Select(n => n.CodexAccess.Container).ToArray();
|
||||||
|
var cd = new ContinuousLogDownloader(Get(), containers, dlPath, ct);
|
||||||
|
|
||||||
|
var logTask = Task.Run(cd.Run);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var node in nodes)
|
||||||
|
{
|
||||||
|
node.Marketplace.MakeStorageAvailable(
|
||||||
|
size: 1.GB(),
|
||||||
|
minPricePerBytePerSecond: 1.TestTokens(),
|
||||||
|
maxCollateral: 1024.TestTokens(),
|
||||||
|
maxDuration: TimeSpan.FromMinutes(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
Log("Waiting 30 minutes...");
|
||||||
|
Thread.Sleep(TimeSpan.FromMinutes(30));
|
||||||
|
|
||||||
|
var endTime = DateTime.UtcNow + TimeSpan.FromHours(1);
|
||||||
|
while (DateTime.UtcNow < endTime)
|
||||||
|
{
|
||||||
|
var allNodes = nodes.ToList();
|
||||||
|
var primary = allNodes.PickOneRandom();
|
||||||
|
var secondary = allNodes.PickOneRandom();
|
||||||
|
|
||||||
|
Log("Run Test");
|
||||||
|
PerformTest(primary, secondary);
|
||||||
|
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(30));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
cts.Cancel();
|
||||||
|
logTask.Wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PerformTest(IOnlineCodexNode primary, IOnlineCodexNode secondary)
|
||||||
|
{
|
||||||
|
ScopedTestFiles(() =>
|
||||||
|
{
|
||||||
|
var testFile = GenerateTestFile(10.MB());
|
||||||
|
|
||||||
|
var contentId = primary.UploadFile(testFile);
|
||||||
|
|
||||||
|
var downloadedFile = secondary.DownloadContent(contentId);
|
||||||
|
|
||||||
|
testFile.AssertIsEqual(downloadedFile);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,6 +13,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\ContinuousTests\ContinuousTests.csproj" />
|
||||||
<ProjectReference Include="..\DistTestCore\DistTestCore.csproj" />
|
<ProjectReference Include="..\DistTestCore\DistTestCore.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue