using CodexClient; using NUnit.Framework; using Utils; namespace CodexReleaseTests.MarketTests { [TestFixture] public class ContractSuccessfulTest : MarketplaceAutoBootstrapDistTest { private const int FilesizeMb = 10; protected override int NumberOfHosts => 6; protected override int NumberOfClients => 1; protected override ByteSize HostAvailabilitySize => (5 * FilesizeMb).MB(); protected override TimeSpan HostAvailabilityMaxDuration => Get8TimesConfiguredPeriodDuration(); private readonly TestToken pricePerBytePerSecond = 10.TstWei(); [Test] public void ContractSuccessful() { var hosts = StartHosts(); var client = StartClients().Single(); var request = CreateStorageRequest(client); request.WaitForStorageContractSubmitted(); AssertContractIsOnChain(request); request.WaitForStorageContractStarted(); AssertContractSlotsAreFilledByHosts(request, hosts); request.WaitForStorageContractFinished(); AssertClientHasPaidForContract(pricePerBytePerSecond, client, request, hosts); AssertHostsWerePaidForContract(pricePerBytePerSecond, request, hosts); AssertHostsCollateralsAreUnchanged(hosts); } private IStoragePurchaseContract CreateStorageRequest(ICodexNode client) { var cid = client.UploadFile(GenerateTestFile(FilesizeMb.MB())); var config = GetContracts().Deployment.Config; return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) { Duration = GetContractDuration(), Expiry = GetContractExpiry(), // TODO: this should work with NumberOfHosts, but // an ongoing issue makes hosts sometimes not pick up slots. // When it's resolved, we can reduce the number of hosts and slim down this test. MinRequiredNumberOfNodes = 3, NodeFailureTolerance = 1, PricePerBytePerSecond = pricePerBytePerSecond, ProofProbability = 20, CollateralPerByte = 1.Tst() }); } private TimeSpan GetContractExpiry() { return GetContractDuration() / 2; } private TimeSpan GetContractDuration() { return Get8TimesConfiguredPeriodDuration() / 2; } private TimeSpan Get8TimesConfiguredPeriodDuration() { return GetPeriodDuration() * 8.0; } } }