mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-10 01:01:34 +00:00
This allows us to generate 404s when someone attempts to download from a non-existent container. At the moment we generate a 500 which isn't useful, or very good looks-wise.
98 lines
3.3 KiB
C#
98 lines
3.3 KiB
C#
|
|
using System;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using IntegrationTests.Fakes;
|
|
using Microsoft.OneFuzz.Service;
|
|
using Microsoft.OneFuzz.Service.Functions;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
using Async = System.Threading.Tasks;
|
|
|
|
namespace IntegrationTests;
|
|
|
|
[Trait("Category", "Live")]
|
|
public class AzureStorageDownloadTest : DownloadTestBase {
|
|
public AzureStorageDownloadTest(ITestOutputHelper output)
|
|
: base(output, Integration.AzureStorage.FromEnvironment()) { }
|
|
}
|
|
|
|
public class AzuriteDownloadTest : DownloadTestBase {
|
|
public AzuriteDownloadTest(ITestOutputHelper output)
|
|
: base(output, new Integration.AzuriteStorage()) { }
|
|
}
|
|
|
|
public abstract class DownloadTestBase : FunctionTestBase {
|
|
public DownloadTestBase(ITestOutputHelper output, IStorage storage)
|
|
: base(output, storage) { }
|
|
|
|
[Fact]
|
|
public async Async.Task Download_WithoutContainer_IsRejected() {
|
|
var req = TestHttpRequestData.Empty("GET");
|
|
var url = new UriBuilder(req.Url) { Query = "filename=xxx" }.Uri;
|
|
req.SetUrl(url);
|
|
|
|
var func = new Download(Context);
|
|
var result = await func.Run(req);
|
|
Assert.Equal(HttpStatusCode.BadRequest, result.StatusCode);
|
|
|
|
var err = BodyAs<ProblemDetails>(result);
|
|
Assert.Equal(ErrorCode.INVALID_REQUEST.ToString(), err.Title);
|
|
}
|
|
|
|
[Fact]
|
|
public async Async.Task Download_WithoutFilename_IsRejected() {
|
|
var req = TestHttpRequestData.Empty("GET");
|
|
var url = new UriBuilder(req.Url) { Query = "container=xxx" }.Uri;
|
|
req.SetUrl(url);
|
|
|
|
var func = new Download(Context);
|
|
|
|
var result = await func.Run(req);
|
|
Assert.Equal(HttpStatusCode.BadRequest, result.StatusCode);
|
|
|
|
var err = BodyAs<ProblemDetails>(result);
|
|
Assert.Equal(ErrorCode.INVALID_REQUEST.ToString(), err.Title);
|
|
}
|
|
|
|
[Fact]
|
|
public async Async.Task Container_NotFound_Generates404() {
|
|
var req = TestHttpRequestData.Empty("GET");
|
|
// this container won't exist because we haven't explicitly created it
|
|
var url = new UriBuilder(req.Url) { Query = "container=xxx&filename=yyy" }.Uri;
|
|
req.SetUrl(url);
|
|
|
|
var func = new Download(Context);
|
|
|
|
var result = await func.Run(req);
|
|
Assert.Equal(HttpStatusCode.NotFound, result.StatusCode);
|
|
|
|
var err = BodyAs<ProblemDetails>(result);
|
|
Assert.Equal(ErrorCode.INVALID_CONTAINER.ToString(), err.Title);
|
|
}
|
|
|
|
[Fact]
|
|
public async Async.Task Download_RedirectsToResult_WithLocationHeader() {
|
|
// set up a file to download
|
|
var containerName = Container.Parse("xxx");
|
|
var container = GetContainerClient(containerName);
|
|
_ = await container.CreateAsync();
|
|
_ = await container.UploadBlobAsync("yyy", new BinaryData("content"));
|
|
|
|
var req = TestHttpRequestData.Empty("GET");
|
|
var url = new UriBuilder(req.Url) { Query = "container=xxx&filename=yyy" }.Uri;
|
|
req.SetUrl(url);
|
|
|
|
var func = new Download(Context);
|
|
|
|
var result = await func.Run(req);
|
|
Assert.Equal(HttpStatusCode.Found, result.StatusCode);
|
|
var location = Assert.Single(result.Headers.GetValues("Location"));
|
|
|
|
// check that the SAS URI works
|
|
using var client = new HttpClient();
|
|
var blobContent = await client.GetStringAsync(location);
|
|
Assert.Equal("content", blobContent);
|
|
}
|
|
}
|