cs-codex-dist-tests/DistTestCore/Marketplace/MarketplaceAccess.cs

149 lines
5.5 KiB
C#
Raw Normal View History

using DistTestCore.Codex;
using Logging;
2023-04-14 08:51:35 +00:00
using NUnit.Framework;
using NUnit.Framework.Constraints;
using System.Numerics;
2023-04-19 07:57:37 +00:00
using Utils;
2023-04-14 08:51:35 +00:00
namespace DistTestCore.Marketplace
{
public interface IMarketplaceAccess
{
string MakeStorageAvailable(ByteSize size, TestToken minPricePerBytePerSecond, TestToken maxCollateral, TimeSpan maxDuration);
string RequestStorage(ContentId contentId, TestToken pricePerBytePerSecond, TestToken requiredCollateral, uint minRequiredNumberOfNodes, int proofProbability, TimeSpan duration);
2023-04-14 08:51:35 +00:00
void AssertThatBalance(IResolveConstraint constraint, string message = "");
2023-04-19 07:57:37 +00:00
TestToken GetBalance();
2023-04-14 08:51:35 +00:00
}
public class MarketplaceAccess : IMarketplaceAccess
{
private readonly TestLog log;
private readonly MarketplaceNetwork marketplaceNetwork;
2023-04-14 10:37:05 +00:00
private readonly GethCompanionNodeInfo companionNode;
private readonly CodexAccess codexAccess;
2023-04-14 08:51:35 +00:00
public MarketplaceAccess(TestLog log, MarketplaceNetwork marketplaceNetwork, GethCompanionNodeInfo companionNode, CodexAccess codexAccess)
2023-04-14 08:51:35 +00:00
{
this.log = log;
this.marketplaceNetwork = marketplaceNetwork;
2023-04-14 10:37:05 +00:00
this.companionNode = companionNode;
this.codexAccess = codexAccess;
2023-04-14 08:51:35 +00:00
}
public string RequestStorage(ContentId contentId, TestToken pricePerBytePerSecond, TestToken requiredCollateral, uint minRequiredNumberOfNodes, int proofProbability, TimeSpan duration)
2023-04-14 08:51:35 +00:00
{
var request = new CodexSalesRequestStorageRequest
{
duration = ToHexBigInt(duration.TotalSeconds),
proofProbability = ToHexBigInt(proofProbability),
reward = ToHexBigInt(pricePerBytePerSecond),
collateral = ToHexBigInt(requiredCollateral),
expiry = null,
nodes = minRequiredNumberOfNodes,
tolerance = null,
};
2023-04-19 07:57:37 +00:00
Log($"Requesting storage for: {contentId.Id}... (" +
$"pricePerBytePerSecond: {pricePerBytePerSecond}," +
$"requiredCollateral: {requiredCollateral}," +
$"minRequiredNumberOfNodes: {minRequiredNumberOfNodes}," +
$"proofProbability: {proofProbability}," +
$"duration: {Time.FormatDuration(duration)})");
var response = codexAccess.RequestStorage(request, contentId.Id);
2023-04-19 07:57:37 +00:00
Log($"Storage requested successfully. PurchaseId: {response.purchaseId}");
return response.purchaseId;
}
2023-04-19 07:57:37 +00:00
public string MakeStorageAvailable(ByteSize size, TestToken minPricePerBytePerSecond, TestToken maxCollateral, TimeSpan maxDuration)
{
var request = new CodexSalesAvailabilityRequest
{
size = ToHexBigInt(size.SizeInBytes),
2023-04-19 07:57:37 +00:00
duration = ToHexBigInt(maxDuration.TotalSeconds),
maxCollateral = ToHexBigInt(maxCollateral),
minPrice = ToHexBigInt(minPricePerBytePerSecond)
};
2023-04-19 07:57:37 +00:00
Log($"Making storage available... (" +
$"size: {size}," +
$"minPricePerBytePerSecond: {minPricePerBytePerSecond}," +
$"maxCollateral: {maxCollateral}," +
$"maxDuration: {Time.FormatDuration(maxDuration)}");
var response = codexAccess.SalesAvailability(request);
2023-04-19 07:57:37 +00:00
Log($"Storage successfully made available. Id: {response.id}");
return response.id;
}
private string ToHexBigInt(double d)
{
return "0x" + string.Format("{0:X}", Convert.ToInt64(d));
2023-04-14 08:51:35 +00:00
}
public string ToHexBigInt(TestToken t)
2023-04-14 08:51:35 +00:00
{
var bigInt = new BigInteger(t.Amount);
return "0x" + bigInt.ToString("X");
2023-04-14 08:51:35 +00:00
}
public void AssertThatBalance(IResolveConstraint constraint, string message = "")
{
2023-04-14 10:37:05 +00:00
Assert.That(GetBalance(), constraint, message);
2023-04-14 08:51:35 +00:00
}
2023-04-19 07:57:37 +00:00
public TestToken GetBalance()
2023-04-14 08:51:35 +00:00
{
var interaction = marketplaceNetwork.StartInteraction(log);
2023-04-19 07:57:37 +00:00
var account = companionNode.Account;
var amount = interaction.GetBalance(marketplaceNetwork.Marketplace.TokenAddress, account);
var balance = new TestToken(amount);
Log($"Balance of {codexAccess.Container.GetName()}({account}) is {balance}.");
return balance;
}
private void Log(string msg)
{
log.Log(msg);
2023-04-14 08:51:35 +00:00
}
}
public class MarketplaceUnavailable : IMarketplaceAccess
{
public string RequestStorage(ContentId contentId, TestToken pricePerBytePerSecond, TestToken requiredCollateral, uint minRequiredNumberOfNodes, int proofProbability, TimeSpan duration)
2023-04-14 08:51:35 +00:00
{
Unavailable();
return string.Empty;
2023-04-14 08:51:35 +00:00
}
public string MakeStorageAvailable(ByteSize size, TestToken minPricePerBytePerSecond, TestToken maxCollateral, TimeSpan duration)
2023-04-14 08:51:35 +00:00
{
Unavailable();
return string.Empty;
2023-04-14 08:51:35 +00:00
}
public void AssertThatBalance(IResolveConstraint constraint, string message = "")
{
Unavailable();
}
2023-04-19 07:57:37 +00:00
public TestToken GetBalance()
2023-04-14 08:51:35 +00:00
{
Unavailable();
2023-04-19 07:57:37 +00:00
return new TestToken(0);
2023-04-14 08:51:35 +00:00
}
private void Unavailable()
{
Assert.Fail("Incorrect test setup: Marketplace was not enabled for this group of Codex nodes. Add 'EnableMarketplace(...)' after 'SetupCodexNodes()' to enable it.");
throw new InvalidOperationException();
}
}
}