|
|
|
@ -18,6 +18,8 @@ namespace TestSuite.ApiTests |
|
|
|
{ |
|
|
|
public class AssetTests : IClassFixture<AssetFixture> |
|
|
|
{ |
|
|
|
private ProgressHandler progress = new ProgressHandler(); |
|
|
|
|
|
|
|
public AssetFixture _ { get; } |
|
|
|
|
|
|
|
public AssetTests(AssetFixture fixture) |
|
|
|
@ -46,42 +48,19 @@ namespace TestSuite.ApiTests |
|
|
|
// STEP 1: Create asset
|
|
|
|
var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); |
|
|
|
|
|
|
|
var reportedException = (Exception)null; |
|
|
|
var reportedProgress = new List<int>(); |
|
|
|
var reportedAsset = (AssetDto)null; |
|
|
|
|
|
|
|
await using (fileParameter.Data) |
|
|
|
{ |
|
|
|
await _.Assets.UploadNewAssetAsync(_.AppName, fileParameter, new AssetUploadOptions |
|
|
|
{ |
|
|
|
ProgressHandler = new AssetDelegatingProgressHandler |
|
|
|
{ |
|
|
|
OnProgressAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedProgress.Add(@event.Progress); |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnCompletedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedAsset = @event.Asset; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnFailedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedException = @event.Exception; |
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
await _.Assets.UploadAssetAsync(_.AppName, fileParameter, |
|
|
|
progress.AsOptions()); |
|
|
|
} |
|
|
|
|
|
|
|
Assert.NotEmpty(reportedProgress); |
|
|
|
Assert.NotNull(reportedAsset); |
|
|
|
Assert.Null(reportedException); |
|
|
|
Assert.NotEmpty(progress.Progress); |
|
|
|
Assert.NotNull(progress.Asset); |
|
|
|
Assert.Null(progress.Exception); |
|
|
|
|
|
|
|
await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) |
|
|
|
{ |
|
|
|
var downloaded = await _.DownloadAsync(reportedAsset); |
|
|
|
var downloaded = await _.DownloadAsync(progress.Asset); |
|
|
|
|
|
|
|
// Should dowload with correct size.
|
|
|
|
Assert.Equal(stream.Length, downloaded.Length); |
|
|
|
@ -94,58 +73,25 @@ namespace TestSuite.ApiTests |
|
|
|
for (var i = 0; i < 5; i++) |
|
|
|
{ |
|
|
|
// STEP 1: Create asset
|
|
|
|
progress = new ProgressHandler(); |
|
|
|
|
|
|
|
var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); |
|
|
|
|
|
|
|
var pausingStream = new PauseStream(fileParameter.Data, 0.5); |
|
|
|
var pausingFile = new FileParameter(pausingStream, fileParameter.FileName, fileParameter.ContentType); |
|
|
|
|
|
|
|
var numUploads = 0; |
|
|
|
var reportedException = (Exception)null; |
|
|
|
var reportedProgress = new List<int>(); |
|
|
|
var reportedAsset = (AssetDto)null; |
|
|
|
var fileId = (string)null; |
|
|
|
|
|
|
|
await using (pausingFile.Data) |
|
|
|
{ |
|
|
|
using var cts = new CancellationTokenSource(5000); |
|
|
|
|
|
|
|
while (reportedAsset == null) |
|
|
|
while (progress.Asset == null && progress.Exception == null) |
|
|
|
{ |
|
|
|
pausingStream.Reset(); |
|
|
|
|
|
|
|
await _.Assets.UploadNewAssetAsync(_.AppName, pausingFile, new AssetUploadOptions |
|
|
|
{ |
|
|
|
ProgressHandler = new AssetDelegatingProgressHandler |
|
|
|
{ |
|
|
|
OnCreatedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
fileId = @event.FileId; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnProgressAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedProgress.Add(@event.Progress); |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnCompletedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedAsset = @event.Asset; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnFailedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
if (!@event.Exception.ToString().Contains("PAUSED", StringComparison.OrdinalIgnoreCase)) |
|
|
|
{ |
|
|
|
reportedException = @event.Exception; |
|
|
|
} |
|
|
|
|
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
}, |
|
|
|
FileId = fileId |
|
|
|
}, cts.Token); |
|
|
|
|
|
|
|
Assert.Null(reportedException); |
|
|
|
await _.Assets.UploadAssetAsync(_.AppName, pausingFile, |
|
|
|
progress.AsOptions(), cts.Token); |
|
|
|
|
|
|
|
await Task.Delay(50, cts.Token); |
|
|
|
|
|
|
|
@ -153,14 +99,14 @@ namespace TestSuite.ApiTests |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Assert.NotEmpty(reportedProgress); |
|
|
|
Assert.NotNull(reportedAsset); |
|
|
|
Assert.Null(reportedException); |
|
|
|
Assert.NotEmpty(progress.Progress); |
|
|
|
Assert.NotNull(progress.Asset); |
|
|
|
Assert.Null(progress.Exception); |
|
|
|
Assert.True(numUploads > 1); |
|
|
|
|
|
|
|
await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) |
|
|
|
{ |
|
|
|
var downloaded = await _.DownloadAsync(reportedAsset); |
|
|
|
var downloaded = await _.DownloadAsync(progress.Asset); |
|
|
|
|
|
|
|
// Should dowload with correct size.
|
|
|
|
Assert.Equal(stream.Length, downloaded.Length); |
|
|
|
@ -179,6 +125,20 @@ namespace TestSuite.ApiTests |
|
|
|
Assert.Equal(id, asset_1.Id); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_upload_asset_with_custom_id_using_tus() |
|
|
|
{ |
|
|
|
var id = Guid.NewGuid().ToString(); |
|
|
|
|
|
|
|
// STEP 1: Create asset
|
|
|
|
var fileParameter = FileParameter.FromPath("Assets/logo-squared.png"); |
|
|
|
|
|
|
|
await _.Assets.UploadAssetAsync(_.AppName, fileParameter, |
|
|
|
progress.AsOptions(id)); |
|
|
|
|
|
|
|
Assert.Equal(id, progress.Asset?.Id); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_not_create_asset_with_custom_id_twice() |
|
|
|
{ |
|
|
|
@ -237,41 +197,19 @@ namespace TestSuite.ApiTests |
|
|
|
// STEP 2: Reupload asset
|
|
|
|
var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); |
|
|
|
|
|
|
|
var reportedException = (Exception)null; |
|
|
|
var reportedProgress = new List<int>(); |
|
|
|
var reportedAsset = (AssetDto)null; |
|
|
|
|
|
|
|
await using (fileParameter.Data) |
|
|
|
{ |
|
|
|
await _.Assets.UploadExistingAssetAsync(_.AppName, asset_1.Id, fileParameter, new AssetUploadOptions |
|
|
|
{ |
|
|
|
ProgressHandler = new AssetDelegatingProgressHandler |
|
|
|
{ |
|
|
|
OnProgressAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedProgress.Add(@event.Progress); |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnCompletedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedAsset = @event.Asset; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnFailedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedException = @event.Exception; |
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
await _.Assets.UploadAssetAsync(_.AppName, fileParameter, |
|
|
|
progress.AsOptions(asset_1.Id)); |
|
|
|
} |
|
|
|
|
|
|
|
Assert.NotNull(reportedAsset); |
|
|
|
Assert.Equal(Enumerable.Range(1, 100).ToArray(), reportedProgress.ToArray()); |
|
|
|
Assert.NotNull(progress.Asset); |
|
|
|
Assert.NotEmpty(progress.Progress); |
|
|
|
Assert.Null(progress.Exception); |
|
|
|
|
|
|
|
await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) |
|
|
|
{ |
|
|
|
var downloaded = await _.DownloadAsync(reportedAsset); |
|
|
|
var downloaded = await _.DownloadAsync(progress.Asset); |
|
|
|
|
|
|
|
// Should dowload with correct size.
|
|
|
|
Assert.Equal(stream.Length, downloaded.Length); |
|
|
|
@ -288,58 +226,25 @@ namespace TestSuite.ApiTests |
|
|
|
|
|
|
|
|
|
|
|
// STEP 2: Reupload asset
|
|
|
|
progress = new ProgressHandler(); |
|
|
|
|
|
|
|
var fileParameter = FileParameter.FromPath("Assets/SampleVideo_1280x720_1mb.mp4"); |
|
|
|
|
|
|
|
var pausingStream = new PauseStream(fileParameter.Data, 0.5); |
|
|
|
var pausingFile = new FileParameter(pausingStream, fileParameter.FileName, fileParameter.ContentType); |
|
|
|
|
|
|
|
var numUploads = 0; |
|
|
|
var reportedException = (Exception)null; |
|
|
|
var reportedProgress = new List<int>(); |
|
|
|
var reportedAsset = (AssetDto)null; |
|
|
|
var fileId = (string)null; |
|
|
|
|
|
|
|
await using (pausingFile.Data) |
|
|
|
{ |
|
|
|
using var cts = new CancellationTokenSource(5000); |
|
|
|
|
|
|
|
while (reportedAsset == null) |
|
|
|
while (progress.Asset == null && progress.Exception == null) |
|
|
|
{ |
|
|
|
pausingStream.Reset(); |
|
|
|
|
|
|
|
await _.Assets.UploadExistingAssetAsync(_.AppName, asset_1.Id, pausingFile, new AssetUploadOptions |
|
|
|
{ |
|
|
|
ProgressHandler = new AssetDelegatingProgressHandler |
|
|
|
{ |
|
|
|
OnCreatedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
fileId = @event.FileId; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnProgressAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedProgress.Add(@event.Progress); |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnCompletedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
reportedAsset = @event.Asset; |
|
|
|
return Task.CompletedTask; |
|
|
|
}, |
|
|
|
OnFailedAsync = (@event, _) => |
|
|
|
{ |
|
|
|
if (!@event.Exception.ToString().Contains("PAUSED", StringComparison.OrdinalIgnoreCase)) |
|
|
|
{ |
|
|
|
reportedException = @event.Exception; |
|
|
|
} |
|
|
|
|
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
}, |
|
|
|
FileId = fileId |
|
|
|
}, cts.Token); |
|
|
|
|
|
|
|
Assert.Null(reportedException); |
|
|
|
await _.Assets.UploadAssetAsync(_.AppName, pausingFile, |
|
|
|
progress.AsOptions(asset_1.Id), cts.Token); |
|
|
|
|
|
|
|
await Task.Delay(50, cts.Token); |
|
|
|
|
|
|
|
@ -347,14 +252,14 @@ namespace TestSuite.ApiTests |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Assert.NotEmpty(reportedProgress); |
|
|
|
Assert.NotNull(reportedAsset); |
|
|
|
Assert.Null(reportedException); |
|
|
|
Assert.NotEmpty(progress.Progress); |
|
|
|
Assert.NotNull(progress.Asset); |
|
|
|
Assert.Null(progress.Exception); |
|
|
|
Assert.True(numUploads > 1); |
|
|
|
|
|
|
|
await using (var stream = new FileStream("Assets/SampleVideo_1280x720_1mb.mp4", FileMode.Open)) |
|
|
|
{ |
|
|
|
var downloaded = await _.DownloadAsync(reportedAsset); |
|
|
|
var downloaded = await _.DownloadAsync(progress.Asset); |
|
|
|
|
|
|
|
// Should dowload with correct size.
|
|
|
|
Assert.Equal(stream.Length, downloaded.Length); |
|
|
|
@ -621,6 +526,59 @@ namespace TestSuite.ApiTests |
|
|
|
Assert.NotEqual(asset_1.FileSize, asset_2.FileSize); |
|
|
|
} |
|
|
|
|
|
|
|
public class ProgressHandler : IAssetProgressHandler |
|
|
|
{ |
|
|
|
public string FileId { get; private set; } |
|
|
|
|
|
|
|
public List<int> Progress { get; } = new List<int>(); |
|
|
|
|
|
|
|
public Exception Exception { get; private set; } |
|
|
|
|
|
|
|
public AssetDto Asset { get; private set; } |
|
|
|
|
|
|
|
public AssetUploadOptions AsOptions(string id = null) |
|
|
|
{ |
|
|
|
var options = default(AssetUploadOptions); |
|
|
|
options.ProgressHandler = this; |
|
|
|
options.FileId = FileId; |
|
|
|
options.Id = id; |
|
|
|
|
|
|
|
return options; |
|
|
|
} |
|
|
|
|
|
|
|
public Task OnCompletedAsync(AssetUploadCompletedEvent @event, |
|
|
|
CancellationToken ct) |
|
|
|
{ |
|
|
|
Asset = @event.Asset; |
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
|
|
|
|
public Task OnCreatedAsync(AssetUploadCreatedEvent @event, |
|
|
|
CancellationToken ct) |
|
|
|
{ |
|
|
|
FileId = @event.FileId; |
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
|
|
|
|
public Task OnProgressAsync(AssetUploadProgressEvent @event, |
|
|
|
CancellationToken ct) |
|
|
|
{ |
|
|
|
Progress.Add(@event.Progress); |
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
|
|
|
|
public Task OnFailedAsync(AssetUploadExceptionEvent @event, |
|
|
|
CancellationToken ct) |
|
|
|
{ |
|
|
|
if (!@event.Exception.ToString().Contains("PAUSED", StringComparison.OrdinalIgnoreCase)) |
|
|
|
{ |
|
|
|
Exception = @event.Exception; |
|
|
|
} |
|
|
|
|
|
|
|
return Task.CompletedTask; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class PauseStream : DelegateStream |
|
|
|
{ |
|
|
|
private readonly double pauseAfter = 1; |
|
|
|
|