Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,20 @@ internal class EventGridBinaryDataConverter : EventGridConverterBase
{
protected override ConversionResult ConvertCore(Type targetType, string json)
{
object result = targetType switch
ConversionResult result = targetType switch
{
Type t when t == typeof(BinaryData) => BinaryData.FromString(json),
Type t when t == typeof(BinaryData[]) => () =>
{
var data = JsonSerializer.Deserialize<List<object>>(json);
return data.Select(item => BinaryData.FromString(item.ToString())).ToArray();
},
Type t when t == typeof(BinaryData) => ConversionResult.Success(BinaryData.FromString(json)),
Type t when t == typeof(BinaryData[]) => ConversionResult.Success(ConvertToBinaryDataArray(json)),
_ => ConversionResult.Unhandled()
};

return ConversionResult.Success(result);
return result;
}

private BinaryData[] ConvertToBinaryDataArray(string json)
{
var data = JsonSerializer.Deserialize<List<object>>(json);
return data.Select(item => BinaryData.FromString(item.ToString())).ToArray();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ protected bool CanConvert(ConverterContext context)

if (bindingData.Source is not Constants.TablesExtensionName)
{
throw new InvalidContentTypeException(Constants.JsonContentType);
throw new InvalidBindingSourceException(Constants.TablesExtensionName);
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void StorageFunctions()
AssertDictionary(extensions, new Dictionary<string, string>
{
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Queues", "5.1.3" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" },
});

void ValidateQueueTrigger(ExpandoObject b)
Expand Down Expand Up @@ -270,7 +270,7 @@ public void BlobStorageFunctions_SDKTypeBindings()

AssertDictionary(extensions, new Dictionary<string, string>
{
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" },
});

var blobClientToBlobStringFunction = functions.Single(p => p.Name == "BlobClientToBlobStringFunction");
Expand Down Expand Up @@ -357,7 +357,7 @@ public void BlobCollectionFunctions_SDKTypeBindings()

AssertDictionary(extensions, new Dictionary<string, string>
{
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" },
});

var blobStringToBlobClientEnumerable = functions.Single(p => p.Name == "BlobStringToBlobClientEnumerable");
Expand Down Expand Up @@ -612,7 +612,7 @@ public void MultiOutput_OnReturnType()
AssertDictionary(extensions, new Dictionary<string, string>
{
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Queues", "5.1.3" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" },
{ "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" },
});

void ValidateQueueTrigger(ExpandoObject b)
Expand Down
4 changes: 2 additions & 2 deletions test/SdkE2ETests/PublishTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private async Task RunPublishTest(string outputDir, string additionalParams = nu
"Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader.Startup, Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=551316b6919f366c",
@"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader.dll"),
new Extension("AzureStorageBlobs",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.2.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
@"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.dll"),
new Extension("AzureStorageQueues",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageQueuesWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Queues, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
Expand Down Expand Up @@ -134,7 +134,7 @@ private async Task RunPublishTestForSdkTypeBindings(string outputDir, string add
"Microsoft.Azure.WebJobs.ServiceBus.ServiceBusWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.ServiceBus, Version=5.11.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
@"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.ServiceBus.dll"),
new Extension("AzureStorageBlobs",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.2.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
@"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.dll"),
new Extension("AzureStorageQueues",
"Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageQueuesWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Queues, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8",
Expand Down
25 changes: 3 additions & 22 deletions test/WorkerExtensionTests/Blob/BlobStorageConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -603,25 +603,6 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled()
Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
}

[Fact]
public async Task ConvertAsync_BlobClientIsNull_ReturnsUnhandled()
{
// Arrange
var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "AzureStorageBlobs");
var context = new TestConverterContext(typeof(BlobClient), grpcModelBindingData);

var mockContainer = new Mock<BlobContainerClient>();
mockContainer.Setup(m => m.GetBlobClient(It.IsAny<string>())).Returns((BlobClient)null);

_mockBlobServiceClient.Setup(m => m.GetBlobContainerClient(It.IsAny<string>())).Returns(mockContainer.Object);

// Act
var conversionResult = await _blobStorageConverter.ConvertAsync(context);

// Assert
Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
}

[Fact]
public async Task ConvertAsync_ThrowsException_ReturnsFailure()
{
Expand All @@ -641,7 +622,7 @@ public async Task ConvertAsync_ThrowsException_ReturnsFailure()
}

[Fact]
public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsUnhandled()
public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsFailed()
{
// Arrange
var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "anotherExtensions");
Expand All @@ -651,7 +632,7 @@ public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsUn
var conversionResult = await _blobStorageConverter.ConvertAsync(context);

// Assert
Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
}

[Fact]
Expand All @@ -666,7 +647,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa

// Assert
Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message);
Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message);
}

[Fact]
Expand Down
22 changes: 3 additions & 19 deletions test/WorkerExtensionTests/Cosmos/CosmosDBConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Converters;
using Microsoft.Azure.Functions.Worker.Grpc.Messages;
using Microsoft.Azure.Functions.Worker.Tests.Converters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
Expand Down Expand Up @@ -264,21 +263,6 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled()
Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
}

[Fact] // Should we fail if the result is ever null?
public async Task ConvertAsync_ResultIsNull_ReturnsUnhandled()
{
var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "CosmosDB");
var context = new TestConverterContext(typeof(Database), grpcModelBindingData);

_mockCosmosClient
.Setup(m => m.GetDatabase(It.IsAny<string>()))
.Returns<Database>(null);

var conversionResult = await _cosmosDBConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
}

[Fact]
public async Task ConvertAsync_ThrowsException_ReturnsFailure()
{
Expand Down Expand Up @@ -320,14 +304,14 @@ public async Task ConvertAsync_ItemResponse_ResourceIsNull_ThrowsException_Retur
}

[Fact]
public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsUnhandled()
public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsFailed()
{
var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "anotherExtensions");
var context = new TestConverterContext(typeof(CosmosClient), grpcModelBindingData);

var conversionResult = await _cosmosDBConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
}

[Fact]
Expand All @@ -339,7 +323,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa
var conversionResult = await _cosmosDBConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message);
Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,71 +20,64 @@ public EventGridBinaryDataConverterTests()
}

[Fact]
public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled()
public async Task ConvertAsync_Source_IsNotAString_ReturnsFailed()
{
var context = new TestConverterContext(typeof(BinaryData), new object());

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
Assert.Equal("Context source must be a non-null string", conversionResult.Error.Message);
}

[Fact]
public async Task ConvertAsync_Returns_Success()
public async Task ConvertAsync_UnsupportedTargetType_ReturnsUnhandled()
{
var context = new TestConverterContext(typeof(BinaryData), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}");

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status);
Assert.True(conversionResult.Value is BinaryData);
}

[Fact]
public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type()
{
var context = new TestConverterContext(typeof(string), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}");
var context = new TestConverterContext(typeof(string), "");

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
}

[Fact]
public async Task ConvertAsync_SourceAsObject_BinaryDataCollectible_ReturnsUnhandled()
public async Task ConvertAsync_InvalidJson_ThrowsJsonException_ReturnsFailed()
{
var context = new TestConverterContext(typeof(BinaryData[]), new object());
var context = new TestConverterContext(typeof(BinaryData[]), @"{""invalid"" :json""}");

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Failed, conversionResult.Status);
Assert.Contains("Binding parameters to complex objects uses JSON serialization", conversionResult.Error.Message);
}

[Fact]
public async Task ConvertAsync_BinaryDataCollectible_Returns_Success()
public async Task ConvertAsync_SingleBinaryData_ReturnsSuccess()
{
var context = new TestConverterContext(typeof(BinaryData[]), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]");
var context = new TestConverterContext(typeof(BinaryData), EventGridTestHelper.GetEventGridJsonData());

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status);
Assert.True(conversionResult.Value is BinaryData[]);
Assert.Equal(2, ((BinaryData[])conversionResult.Value).Length);
Assert.True(conversionResult.Value is BinaryData);
}

[Fact]
public async Task ConvertAsync_BinaryDataCollectible_Returns_Unhandled_For_Unsupported_Type()
public async Task ConvertAsync_BinaryDataArray_ReturnsSuccess()
{
var context = new TestConverterContext(typeof(string), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]");
var context = new TestConverterContext(typeof(BinaryData[]), EventGridTestHelper.GetEventGridJsonDataArray());

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status);
Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status);
Assert.True(conversionResult.Value is BinaryData[]);
Assert.Equal(2, ((BinaryData[])conversionResult.Value).Length);
}

[Fact]
public async Task ConvertAsync_SingleElement_Returns_Success()
public async Task ConvertAsync_BinaryDataArray_SingleElement_ReturnsSuccess()
{
var context = new TestConverterContext(typeof(BinaryData[]), "[{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}]");
var context = new TestConverterContext(typeof(BinaryData[]), $"[{EventGridTestHelper.GetEventGridJsonData()}]");

var conversionResult = await _eventGridConverter.ConvertAsync(context);

Expand Down
Loading