diff --git a/ProjectPlugins/CodexPlugin/CodexNode.cs b/ProjectPlugins/CodexPlugin/CodexNode.cs index 004ab72..43edb1a 100644 --- a/ProjectPlugins/CodexPlugin/CodexNode.cs +++ b/ProjectPlugins/CodexPlugin/CodexNode.cs @@ -37,6 +37,8 @@ namespace CodexPlugin /// void DeleteRepoFolder(); void Stop(bool waitTillStopped); + void DownloadStreamless(ContentId cid); + Manifest DownloadManifestOnly(ContentId cid); } public class CodexNode : ICodexNode diff --git a/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs b/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs new file mode 100644 index 0000000..3b7de2e --- /dev/null +++ b/Tests/CodexReleaseTests/DataTests/ManifestOnlyDownloadTest.cs @@ -0,0 +1,31 @@ +using CodexTests; +using NUnit.Framework; +using Utils; + +namespace CodexReleaseTests.DataTests +{ + [TestFixture] + public class ManifestOnlyDownloadTest : CodexDistTest + { + [Test] + public void StreamlessTest() + { + var uploader = StartCodex(); + var downloader = StartCodex(s => s.WithBootstrapNode(uploader)); + + var file = GenerateTestFile(2.GB()); + var size = Convert.ToInt64(file.GetFilesize()); + var cid = uploader.UploadFile(file); + + var startSpace = downloader.Space(); + var manifest = downloader.DownloadManifestOnly(cid); + + Thread.Sleep(1000); + + var spaceDiff = startSpace.FreeBytes - downloader.Space().FreeBytes; + + Assert.That(spaceDiff, Is.LessThan(64.KB().SizeInBytes)); + Assert.That(manifest.OriginalBytes.SizeInBytes, Is.EqualTo(file.GetFilesize().SizeInBytes)); + } + } +} diff --git a/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs b/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs new file mode 100644 index 0000000..7f2223b --- /dev/null +++ b/Tests/CodexReleaseTests/DataTests/StreamlessDownloadTest.cs @@ -0,0 +1,43 @@ +using CodexTests; +using NUnit.Framework; +using Utils; + +namespace CodexReleaseTests.DataTests +{ + [TestFixture] + public class StreamlessDownloadTest : CodexDistTest + { + [Test] + public void StreamlessTest() + { + var uploader = StartCodex(); + var downloader = StartCodex(s => s.WithBootstrapNode(uploader)); + + var file = GenerateTestFile(10.MB()); + var size = Convert.ToInt64(file.GetFilesize()); + var cid = uploader.UploadFile(file); + + var startSpace = downloader.Space(); + var start = DateTime.UtcNow; + downloader.DownloadStreamless(cid); + + // TODO: We have no way to inspect the status or progress of the download. + // We use local space information to estimate. + var retry = new Retry("Checking local space", + maxTimeout: TimeSpan.FromMinutes(2), + sleepAfterFail: TimeSpan.FromSeconds(3), + onFail: f => { }); + + retry.Run(() => + { + var space = downloader.Space(); + Assert.That(space.FreeBytes, Is.LessThanOrEqualTo(startSpace.FreeBytes - size)); + }); + + // Stop the uploader node and verify that the downloader has the data. + uploader.Stop(waitTillStopped: true); + var downloaded = downloader.DownloadContent(cid); + file.AssertIsEqual(downloaded); + } + } +}