// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Text; using Microsoft.TestCommon; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace System.Net.Http { public class HttpContentCollectionExtensionsTests { private const string contentID = "content-id"; private const string matchContentID = "matchID"; private const string matchContentType = "text/plain"; private const string matchDispositionName = "N1"; private const string quotedMatchDispositionName = "\"" + matchDispositionName + "\""; private const string matchDispositionType = "form-data"; private const string quotedMatchDispositionType = "\"" + matchDispositionType + "\""; private const string noMatchContentID = "nomatchID"; private const string noMatchContentType = "text/nomatch"; private const string noMatchDispositionName = "nomatchName"; private const string noMatchDispositionType = "nomatchType"; [Fact] [Trait("Description", "IEnumerableHttpContentExtensionMethods is a public static class.")] public void TypeIsCorrect() { Assert.Type.HasProperties( typeof(HttpContentCollectionExtensions), TypeAssert.TypeProperties.IsPublicVisibleClass | TypeAssert.TypeProperties.IsStatic); } private static IEnumerable CreateContent() { MultipartFormDataContent multipart = new MultipartFormDataContent(); multipart.Add(new StringContent("A", UTF8Encoding.UTF8, matchContentType), matchDispositionName); multipart.Add(new StringContent("B", UTF8Encoding.UTF8, matchContentType), "N2"); multipart.Add(new StringContent("C", UTF8Encoding.UTF8, matchContentType), "N3"); multipart.Add(new ByteArrayContent(new byte[] { 0x65 }), "N4"); multipart.Add(new ByteArrayContent(new byte[] { 0x65 }), "N5"); multipart.Add(new ByteArrayContent(new byte[] { 0x65 }), "N6"); HttpContent cidContent = new StringContent("A", UTF8Encoding.UTF8, "text/html"); cidContent.Headers.Add(contentID, matchContentID); multipart.Add(cidContent); return multipart; } private static void ClearHeaders(IEnumerable contents) { foreach (var c in contents) { c.Headers.Clear(); } } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, string) throws on null.")] public void FindAllContentTypeString() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FindAllContentType(null, "text/plain"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FindAllContentType(content, (string)null); }, "contentType"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FindAllContentType(content, empty); }, "contentType"); } } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, string) no match.")] public void FindAllContentTypeStringNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); IEnumerable result = null; result = content.FindAllContentType(noMatchContentType); Assert.Equal(0, result.Count()); ClearHeaders(content); result = content.FindAllContentType(noMatchContentType); Assert.Equal(0, result.Count()); } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, string) match.")] public void FindAllContentTypeStringMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); IEnumerable result = content.FindAllContentType(matchContentType); Assert.Equal(3, result.Count()); } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, MediaTypeHeaderValue) throws on null.")] public void FindAllContentTypeMediaTypeThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FindAllContentType(null, new MediaTypeHeaderValue("text/plain")); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FindAllContentType(content, (MediaTypeHeaderValue)null); }, "contentType"); } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, MediaTypeHeaderValue) no match.")] public void FindAllContentTypeMediaTypeNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); IEnumerable result = null; result = content.FindAllContentType(new MediaTypeHeaderValue(noMatchContentType)); Assert.Equal(0, result.Count()); ClearHeaders(content); result = content.FindAllContentType(new MediaTypeHeaderValue(noMatchContentType)); Assert.Equal(0, result.Count()); } [Fact] [Trait("Description", "FindAllContentType(IEnumerable, string) match.")] public void FindAllContentTypeMediaTypeMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); IEnumerable result = content.FindAllContentType(new MediaTypeHeaderValue(matchContentType)); Assert.Equal(3, result.Count()); } [Fact] [Trait("Description", "FirstDispositionName(IEnumerable, string) throws on null.")] public void FirstDispositionNameThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionName(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionName(content, null); }, "dispositionName"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionName(content, empty); }, "dispositionName"); } } [Fact] [Trait("Description", "FirstDispositionName(IEnumerable, string) no match.")] public void FirstDispositionNameNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Null(content.FirstDispositionNameOrDefault(noMatchDispositionName)); ClearHeaders(content); Assert.Throws(() => content.FirstDispositionName(noMatchDispositionName)); } [Fact] [Trait("Description", "FirstDispositionName(IEnumerable, string) match.")] public void FirstDispositionNameMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstDispositionName(matchDispositionName)); Assert.NotNull(content.FirstDispositionName(quotedMatchDispositionName)); } [Fact] [Trait("Description", "FirstDispositionNameOrDefault(IEnumerable, string) throws on null.")] public void FirstDispositionNameOrDefaultThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionNameOrDefault(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionNameOrDefault(content, null); }, "dispositionName"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionNameOrDefault(content, empty); }, "dispositionName"); } } [Fact] [Trait("Description", "FirstDispositionName(IEnumerable, string) no match.")] public void FirstDispositionNameOrDefaultNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Null(content.FirstDispositionNameOrDefault(noMatchDispositionName)); ClearHeaders(content); Assert.Null(content.FirstDispositionNameOrDefault(noMatchDispositionName)); } [Fact] [Trait("Description", "FirstDispositionName(IEnumerable, string) match.")] public void FirstDispositionNameOrDefaultMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstDispositionNameOrDefault(matchDispositionName)); Assert.NotNull(content.FirstDispositionNameOrDefault(quotedMatchDispositionName)); } [Fact] [Trait("Description", "FirstDispositionType(IEnumerable, string) throws on null.")] public void FirstDispositionTypeThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionType(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionType(content, null); }, "dispositionType"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionType(content, empty); }, "dispositionType"); } } [Fact] [Trait("Description", "FirstDispositionType(IEnumerable, string) no match.")] public void FirstDispositionTypeNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Throws(() => content.FirstDispositionType(noMatchDispositionType)); Assert.Null(content.FirstDispositionTypeOrDefault(noMatchDispositionType)); ClearHeaders(content); Assert.Throws(() => content.FirstDispositionType(noMatchDispositionType)); } [Fact] [Trait("Description", "FirstDispositionType(IEnumerable, string) match.")] public void FirstDispositionTypeMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstDispositionType(matchDispositionType)); Assert.NotNull(content.FirstDispositionType(quotedMatchDispositionType)); } [Fact] [Trait("Description", "FirstDispositionTypeOrDefault(IEnumerable, string) throws on null.")] public void FirstDispositionTypeOrDefaultThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionTypeOrDefault(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionTypeOrDefault(content, null); }, "dispositionType"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstDispositionTypeOrDefault(content, empty); }, "dispositionType"); } } [Fact] [Trait("Description", "FirstDispositionTypeOrDefault(IEnumerable, string) no match.")] public void FirstDispositionTypeOrDefaultNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Null(content.FirstDispositionTypeOrDefault(noMatchDispositionType)); ClearHeaders(content); Assert.Null(content.FirstDispositionTypeOrDefault(noMatchDispositionType)); } [Fact] [Trait("Description", "FirstDispositionTypeOrDefault(IEnumerable, string) match.")] public void FirstDispositionTypeOrDefaultMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstDispositionTypeOrDefault(matchDispositionType)); Assert.NotNull(content.FirstDispositionTypeOrDefault(quotedMatchDispositionType)); } [Fact] [Trait("Description", "FirstStart(IEnumerable, string) throws on null.")] public void FirstStartThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStart(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStart(content, null); }, "start"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStart(content, empty); }, "start"); } } [Fact] [Trait("Description", "FirstStart(IEnumerable, string) no match.")] public void FirstStartNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Throws(() => content.FirstStart(noMatchContentID)); } [Fact] [Trait("Description", "FirstStart(IEnumerable, string) match.")] public void FirstStartMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstStart(matchContentID)); } [Fact] [Trait("Description", "FirstStartOrDefault(IEnumerable, string) throws on null.")] public void FirstStartOrDefaultThrows() { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStartOrDefault(null, "A"); }, "contents"); IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStartOrDefault(content, null); }, "start"); foreach (string empty in TestData.EmptyStrings) { Assert.ThrowsArgumentNull(() => { HttpContentCollectionExtensions.FirstStartOrDefault(content, empty); }, "start"); } } [Fact] [Trait("Description", "FirstStartOrDefault(IEnumerable, string) no match.")] public void FirstStartOrDefaultNoMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.Null(content.FirstStartOrDefault(noMatchContentID)); } [Fact] [Trait("Description", "FirstStartOrDefault(IEnumerable, string) match.")] public void FirstStartOrDefaultMatch() { IEnumerable content = HttpContentCollectionExtensionsTests.CreateContent(); Assert.NotNull(content.FirstStartOrDefault(matchContentID)); } } }