Skip to content

Commit

Permalink
Add stream conformance tests for SocketsHttpHandler HTTP/1.1 streams (#…
Browse files Browse the repository at this point in the history
…44204)

* Add stream conformance tests for SocketsHttpHandler HTTP/1.1 streams

* Address PR feedback
  • Loading branch information
stephentoub authored Nov 4, 2020
1 parent cd714d6 commit ad6ddf6
Show file tree
Hide file tree
Showing 11 changed files with 308 additions and 150 deletions.
166 changes: 100 additions & 66 deletions src/libraries/Common/tests/Tests/System/IO/StreamConformanceTests.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ public abstract class FileStreamStandaloneConformanceTests : StandaloneStreamCon
protected abstract FileOptions Options { get; }
protected abstract int BufferSize { get; }

private FileStream CreateStream(byte[] initialData, FileAccess access)
private Task<Stream> CreateStream(byte[] initialData, FileAccess access)
{
string path = GetTestFilePath();
if (initialData != null)
{
File.WriteAllBytes(path, initialData);
}

return new FileStream(path, FileMode.OpenOrCreate, access, FileShare.None, BufferSize, Options);
return Task.FromResult<Stream>(new FileStream(path, FileMode.OpenOrCreate, access, FileShare.None, BufferSize, Options));
}

protected override Stream CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Stream CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);

protected override bool NopFlushCompletesSynchronously => OperatingSystem.IsWindows();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System.IO.Tests;
using System.Threading.Tasks;
using Xunit;

namespace System.IO.MemoryMappedFiles.Tests
Expand All @@ -10,15 +11,15 @@ public abstract class MemoryMappedViewStreamConformanceTests : StandaloneStreamC
{
protected override bool CanSetLength => false;

protected override Stream CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Stream CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);

protected abstract MemoryMappedFile CreateFile(int length);

private MemoryMappedViewStream CreateStream(byte[] initialData, FileAccess access)
private Task<Stream> CreateStream(byte[] initialData, FileAccess access)
{
MemoryMappedViewStream stream = null;
Stream stream = null;

if (initialData is not null)
{
Expand All @@ -40,7 +41,7 @@ private MemoryMappedViewStream CreateStream(byte[] initialData, FileAccess acces
}
}

return stream;
return Task.FromResult(stream);
}
}

Expand Down
21 changes: 11 additions & 10 deletions src/libraries/System.IO.UnmanagedMemoryStream/tests/UmsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace System.IO.Tests
{
Expand All @@ -19,7 +20,7 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
}

private unsafe Stream CreateStream(byte[] initialData, FileAccess access)
private unsafe Task<Stream> CreateStream(byte[] initialData, FileAccess access)
{
Stream stream = null;
if (initialData is not null)
Expand All @@ -29,14 +30,14 @@ private unsafe Stream CreateStream(byte[] initialData, FileAccess access)
Marshal.Copy(initialData, 0, ptr, initialData.Length);
stream = new UnmanagedMemoryStream((byte*)ptr, initialData.Length, initialData.Length, access);
}
return stream;
return Task.FromResult(stream);
}

protected override bool CanSetLengthGreaterThanCapacity => false;

protected override unsafe Stream CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Stream CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
}

public class DerivedUmsTests : StandaloneStreamConformanceTests, IDisposable
Expand All @@ -52,7 +53,7 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
}

private unsafe Stream CreateStream(byte[] initialData, FileAccess access)
private unsafe Task<Stream> CreateStream(byte[] initialData, FileAccess access)
{
Stream stream = null;
if (initialData is not null)
Expand All @@ -62,13 +63,13 @@ private unsafe Stream CreateStream(byte[] initialData, FileAccess access)
Marshal.Copy(initialData, 0, ptr, initialData.Length);
stream = new DerivedUnmanagedMemoryStream((byte*)ptr, initialData.Length, initialData.Length, access);
}
return stream;
return Task.FromResult(stream);
}

protected override bool CanSetLengthGreaterThanCapacity => false;

protected override unsafe Stream CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Stream CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Read);
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.Write);
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) => CreateStream(initialData, FileAccess.ReadWrite);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ public class BufferedStreamStandaloneConformanceTests : StandaloneStreamConforma
{
private const int BufferSize = 4;

protected override Stream CreateReadOnlyStreamCore(byte[] initialData) =>
new BufferedStream(new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false), BufferSize);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(new BufferedStream(new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false), BufferSize));

protected override Stream CreateReadWriteStreamCore(byte[] initialData) =>
initialData != null ? new BufferedStream(new MemoryStream(initialData), BufferSize) :
new BufferedStream(new MemoryStream(), BufferSize);
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(
initialData != null ? new BufferedStream(new MemoryStream(initialData), BufferSize) :
new BufferedStream(new MemoryStream(), BufferSize));

protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) =>
null;
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(null);
}

public class BufferedStreamConnectedConformanceTests : WrappingConnectedStreamConformanceTests
Expand Down
17 changes: 9 additions & 8 deletions src/libraries/System.IO/tests/MemoryStream/MemoryStreamTests.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Xunit;
using System.Threading;
using System.Threading.Tasks;
using Xunit;

namespace System.IO.Tests
{
public class MemoryStreamTests : StandaloneStreamConformanceTests
{
protected override Stream CreateReadOnlyStreamCore(byte[] initialData) =>
new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false);
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false));

protected override Stream CreateReadWriteStreamCore(byte[] initialData) =>
initialData != null ? new MemoryStream(initialData) :
new MemoryStream();
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(
initialData != null ? new MemoryStream(initialData) :
new MemoryStream());

protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) =>
null;
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(null);

[Fact]
public static void MemoryStream_WriteToTests()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Threading.Tasks;

namespace System.IO.Tests
{
public class SyncStreamConformanceTests : StandaloneStreamConformanceTests
{
protected override bool NopFlushCompletesSynchronously => false;

protected override Stream CreateReadOnlyStreamCore(byte[] initialData) =>
Stream.Synchronized(new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false));
protected override Task<Stream> CreateReadOnlyStreamCore(byte[] initialData) =>
Task.FromResult(Stream.Synchronized(new MemoryStream(initialData ?? Array.Empty<byte>(), writable: false)));

protected override Stream CreateReadWriteStreamCore(byte[] initialData) =>
Stream.Synchronized(initialData != null ? new MemoryStream(initialData) : new MemoryStream());
protected override Task<Stream> CreateReadWriteStreamCore(byte[] initialData) =>
Task.FromResult(Stream.Synchronized(initialData != null ? new MemoryStream(initialData) : new MemoryStream()));

protected override Stream CreateWriteOnlyStreamCore(byte[] initialData) =>
null;
protected override Task<Stream> CreateWriteOnlyStreamCore(byte[] initialData) =>
Task.FromResult<Stream>(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public HttpContentStream(HttpConnection connection)

public override void Write(byte[] buffer, int offset, int count)
{
ValidateBufferArguments(buffer, offset, count);
Write(new ReadOnlySpan<byte>(buffer, offset, count));
}

Expand Down

This file was deleted.

Loading

0 comments on commit ad6ddf6

Please sign in to comment.