From 0e13f212647837a77f0d0aad5d0f0a168b14c09c Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Tue, 12 May 2026 15:11:40 +0100 Subject: [PATCH] Make unit tests run on .NET 4.8 on Windows. This doesn't run the tests in CI yet, but it's a start. Signed-off-by: Jon Skeet --- Directory.Packages.props | 3 ++- .../JsonEventFormatter.cs | 5 ++--- .../AspNetCore/HttpResponseExtensionsTest.cs | 4 ++-- .../CloudNative.CloudEvents.UnitTests.csproj | 14 +++++++++++--- .../Core/MimeUtilitiesTest.cs | 4 ++-- .../Http/HttpClientExtensionsTest.cs | 1 + .../Http/HttpListenerExtensionsTest.cs | 12 +++++++----- .../Http/HttpTestBase.cs | 4 ++-- .../Kafka/KafkaTest.cs | 7 +++++++ 9 files changed, 36 insertions(+), 18 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f19f00e..e89ef8d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -14,6 +14,7 @@ + @@ -21,4 +22,4 @@ - \ No newline at end of file + diff --git a/src/CloudNative.CloudEvents.SystemTextJson/JsonEventFormatter.cs b/src/CloudNative.CloudEvents.SystemTextJson/JsonEventFormatter.cs index 011dd56..c261134 100644 --- a/src/CloudNative.CloudEvents.SystemTextJson/JsonEventFormatter.cs +++ b/src/CloudNative.CloudEvents.SystemTextJson/JsonEventFormatter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Cloud Native Foundation. +// Copyright (c) Cloud Native Foundation. // Licensed under the Apache 2.0 license. // See LICENSE file in the project root for full license information. @@ -198,8 +198,7 @@ private async Task ReadDocumentAsync(Stream data, ContentType? con using var reader = new StreamReader(data, encoding); var json = async ? await reader.ReadToEndAsync().ConfigureAwait(false) - : reader.ReadToEnd(); - + : reader.ReadToEnd(); return JsonDocument.Parse(json, DocumentOptions); #endif } diff --git a/test/CloudNative.CloudEvents.UnitTests/AspNetCore/HttpResponseExtensionsTest.cs b/test/CloudNative.CloudEvents.UnitTests/AspNetCore/HttpResponseExtensionsTest.cs index 4233727..8d71c4c 100644 --- a/test/CloudNative.CloudEvents.UnitTests/AspNetCore/HttpResponseExtensionsTest.cs +++ b/test/CloudNative.CloudEvents.UnitTests/AspNetCore/HttpResponseExtensionsTest.cs @@ -31,7 +31,7 @@ public async Task CopyToHttpResponseAsync_BinaryMode() var content = GetContent(response); Assert.Equal("text/plain", response.ContentType); - Assert.Equal("plain text", Encoding.UTF8.GetString(content.Span)); + Assert.Equal("plain text", Encoding.UTF8.GetString(content.Span.ToArray())); Assert.Equal("1.0", response.Headers["ce-specversion"]); Assert.Equal(cloudEvent.Type, response.Headers["ce-type"]); Assert.Equal(cloudEvent.Id, response.Headers["ce-id"]); @@ -66,7 +66,7 @@ public async Task CopyToHttpResponseAsync_NonBinaryDataButNoDataContentType_Cont var content = GetContent(response); // The formatter infers that it should encode the string as a JSON value (so it includes the double quotes) Assert.Equal("application/json", response.ContentType); - Assert.Equal("\"plain text\"", Encoding.UTF8.GetString(content.Span)); + Assert.Equal("\"plain text\"", Encoding.UTF8.GetString(content.Span.ToArray())); } [Fact] diff --git a/test/CloudNative.CloudEvents.UnitTests/CloudNative.CloudEvents.UnitTests.csproj b/test/CloudNative.CloudEvents.UnitTests/CloudNative.CloudEvents.UnitTests.csproj index 82f4828..2cbbdce 100644 --- a/test/CloudNative.CloudEvents.UnitTests/CloudNative.CloudEvents.UnitTests.csproj +++ b/test/CloudNative.CloudEvents.UnitTests/CloudNative.CloudEvents.UnitTests.csproj @@ -2,12 +2,20 @@ net8.0;net10.0 + $(TargetFrameworks);net48 + latest enable - - - + + + + + + + + + diff --git a/test/CloudNative.CloudEvents.UnitTests/Core/MimeUtilitiesTest.cs b/test/CloudNative.CloudEvents.UnitTests/Core/MimeUtilitiesTest.cs index 6064da7..df3545d 100644 --- a/test/CloudNative.CloudEvents.UnitTests/Core/MimeUtilitiesTest.cs +++ b/test/CloudNative.CloudEvents.UnitTests/Core/MimeUtilitiesTest.cs @@ -31,8 +31,8 @@ public void ContentTypeConversions(string text) // This just makes them deterministic. void AssertEqualParts(string expected, string actual) { - expected = string.Join(";", expected.Split(";").OrderBy(x => x)); - actual = string.Join(";", actual.Split(";").OrderBy(x => x)); + expected = string.Join(";", expected.Split(';').OrderBy(x => x)); + actual = string.Join(";", actual.Split(';').OrderBy(x => x)); Assert.Equal(expected, actual); } } diff --git a/test/CloudNative.CloudEvents.UnitTests/Http/HttpClientExtensionsTest.cs b/test/CloudNative.CloudEvents.UnitTests/Http/HttpClientExtensionsTest.cs index 1a2cf7e..064b8a0 100644 --- a/test/CloudNative.CloudEvents.UnitTests/Http/HttpClientExtensionsTest.cs +++ b/test/CloudNative.CloudEvents.UnitTests/Http/HttpClientExtensionsTest.cs @@ -492,6 +492,7 @@ internal static void CopyHeaders(IDictionary? source, HttpHeader internal static HttpRequestMessage CreateRequestMessage(ReadOnlyMemory content, ContentType contentType) => new HttpRequestMessage { + Method = HttpMethod.Post, Content = new ByteArrayContent(content.ToArray()) { Headers = { ContentType = MimeUtilities.ToMediaTypeHeaderValue(contentType) } diff --git a/test/CloudNative.CloudEvents.UnitTests/Http/HttpListenerExtensionsTest.cs b/test/CloudNative.CloudEvents.UnitTests/Http/HttpListenerExtensionsTest.cs index a66c744..26143e1 100644 --- a/test/CloudNative.CloudEvents.UnitTests/Http/HttpListenerExtensionsTest.cs +++ b/test/CloudNative.CloudEvents.UnitTests/Http/HttpListenerExtensionsTest.cs @@ -1,4 +1,4 @@ -// Copyright 2021 Cloud Native Foundation. +// Copyright 2021 Cloud Native Foundation. // Licensed under the Apache 2.0 license. // See LICENSE file in the project root for full license information. @@ -26,7 +26,7 @@ public async Task IsCloudEvent_True(string description, HttpContent content, IDi // Really only present for display purposes. Assert.NotNull(description); - var request = new HttpRequestMessage(HttpMethod.Get, ListenerAddress) { Content = content }; + var request = new HttpRequestMessage(HttpMethod.Post, ListenerAddress) { Content = content }; HttpClientExtensionsTest.CopyHeaders(headers, request.Headers); var result = await SendRequestAsync(request, context => Task.FromResult(context.Request.IsCloudEvent())); Assert.True(result); @@ -40,7 +40,7 @@ public async Task IsCloudEvent_False(string description, HttpContent content, ID // Really only present for display purposes. Assert.NotNull(description); - var request = new HttpRequestMessage(HttpMethod.Get, ListenerAddress) { Content = content }; + var request = new HttpRequestMessage(HttpMethod.Post, ListenerAddress) { Content = content }; HttpClientExtensionsTest.CopyHeaders(headers, request.Headers); var result = await SendRequestAsync(request, context => Task.FromResult(context.Request.IsCloudEvent())); Assert.False(result); @@ -53,7 +53,7 @@ public async Task IsCloudEventBatch_True(string description, HttpContent content // Really only present for display purposes. Assert.NotNull(description); - var request = new HttpRequestMessage(HttpMethod.Get, ListenerAddress) { Content = content }; + var request = new HttpRequestMessage(HttpMethod.Post, ListenerAddress) { Content = content }; HttpClientExtensionsTest.CopyHeaders(headers, request.Headers); var result = await SendRequestAsync(request, context => Task.FromResult(context.Request.IsCloudEventBatch())); Assert.True(result); @@ -67,7 +67,7 @@ public async Task IsCloudEventBatch_False(string description, HttpContent conten // Really only present for display purposes. Assert.NotNull(description); - var request = new HttpRequestMessage(HttpMethod.Get, ListenerAddress) { Content = content }; + var request = new HttpRequestMessage(HttpMethod.Post, ListenerAddress) { Content = content }; HttpClientExtensionsTest.CopyHeaders(headers, request.Headers); var result = await SendRequestAsync(request, context => Task.FromResult(context.Request.IsCloudEventBatch())); Assert.False(result); @@ -80,6 +80,7 @@ public async Task ToCloudEvent_BinaryMode(bool async) { var request = new HttpRequestMessage { + Method = HttpMethod.Post, RequestUri = new Uri(ListenerAddress), Headers = { @@ -121,6 +122,7 @@ public async Task ToCloudEvent_StructuredMode(bool async) var bytes = new JsonEventFormatter().EncodeStructuredModeMessage(originalCloudEvent, out var contentType); var request = new HttpRequestMessage { + Method = HttpMethod.Post, RequestUri = new Uri(ListenerAddress), Content = new ByteArrayContent(bytes.ToArray()) { diff --git a/test/CloudNative.CloudEvents.UnitTests/Http/HttpTestBase.cs b/test/CloudNative.CloudEvents.UnitTests/Http/HttpTestBase.cs index 4ec056c..eedb092 100644 --- a/test/CloudNative.CloudEvents.UnitTests/Http/HttpTestBase.cs +++ b/test/CloudNative.CloudEvents.UnitTests/Http/HttpTestBase.cs @@ -1,4 +1,4 @@ -// Copyright 2021 Cloud Native Foundation. +// Copyright 2021 Cloud Native Foundation. // Licensed under the Apache 2.0 license. // See LICENSE file in the project root for full license information. @@ -99,7 +99,7 @@ private async Task ProcessRequestsAsync() var responseContent = Encoding.UTF8.GetBytes($"Error processing request: {e}"); response.ContentLength64 = responseContent.Length; response.StatusCode = 500; - response.OutputStream.Write(responseContent); + response.OutputStream.Write(responseContent, 0, responseContent.Length); } context.Response.Close(); } diff --git a/test/CloudNative.CloudEvents.UnitTests/Kafka/KafkaTest.cs b/test/CloudNative.CloudEvents.UnitTests/Kafka/KafkaTest.cs index bdea690..db560fd 100644 --- a/test/CloudNative.CloudEvents.UnitTests/Kafka/KafkaTest.cs +++ b/test/CloudNative.CloudEvents.UnitTests/Kafka/KafkaTest.cs @@ -131,8 +131,15 @@ public void KafkaBinaryMessageTest() [Theory] [InlineData(MediaTypeNames.Application.Octet, new byte[0])] +#if NET8_0_OR_GREATER [InlineData(MediaTypeNames.Application.Json, null)] [InlineData(MediaTypeNames.Application.Xml, new byte[0])] +#else + // Equivalent to the above, but those constants don't exist + // in .NET Framework + [InlineData("application/json", null)] + [InlineData("application/xml", new byte[0])] +#endif [InlineData(MediaTypeNames.Text.Plain, "")] [InlineData(null, null)] public void KafkaBinaryMessageTombstoneTest(string? contentType, object? expectedDecodedResult)