public void RemoveSpecialValue_AddRemoveSpecialValue_SpecialValueGetsRemoved() { MockHeaders headers = new MockHeaders(); HttpHeaderValueCollection <Uri> collection = new HttpHeaderValueCollection <Uri>(knownUriHeader, headers, specialValue); collection.SetSpecialValue(); Assert.True(collection.IsSpecialValueSet, "Special value not set."); Assert.Equal(1, headers.GetValues(knownUriHeader).Count()); collection.RemoveSpecialValue(); Assert.False(collection.IsSpecialValueSet, "Special value is set."); // Since the only header value was the "special value", removing it will remove the whole header // from the collection. Assert.False(headers.Contains(knownUriHeader)); }
public void Add_SingleAddInvalidValueToNonExistingHeader_ThrowAndDontAddHeader() { // Since Add() immediately parses the value, it will throw an exception if the value is invalid. MockHeaders headers = new MockHeaders(); Assert.Throws<FormatException>(() => { headers.Add(knownHeader, invalidHeaderValue); }); // Make sure the header did not get added to the store. Assert.False(headers.Contains(knownHeader), "No header expected to be added since header value was invalid."); }
public void TryAddWithoutValidation_MultipleAddValidValueThenAddInvalidValuesToNonExistingHeader_AddHeader() { MockHeaders headers = new MockHeaders(); headers.TryAddWithoutValidation(knownHeader, new string[] { rawPrefix + "1", invalidHeaderValue }); Assert.True(headers.Contains(knownHeader)); Assert.Equal(2, headers.First().Value.Count()); Assert.Equal(parsedPrefix + "1", headers.First().Value.ElementAt(0)); Assert.Equal(invalidHeaderValue, headers.First().Value.ElementAt(1)); }
public void TryAddWithoutValidation_MultipleAddInvalidValuesToNonExistingHeader_AddHeader() { MockHeaders headers = new MockHeaders(); headers.TryAddWithoutValidation(knownHeader, new string[] { invalidHeaderValue }); // Make sure the header did not get added since we just tried to add an invalid value. Assert.True(headers.Contains(knownHeader)); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal(invalidHeaderValue, headers.First().Value.ElementAt(0)); }
public void GetParsedValues_AddInvalidValueToHeader_HeaderGetsRemovedAndNullReturned() { MockHeaders headers = new MockHeaders(); headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\ninvalid"); Assert.Equal(0, headers.Parser.TryParseValueCallCount); object storeValue = headers.GetParsedValues(knownHeader); Assert.Null(storeValue); Assert.False(headers.Contains(knownHeader)); }
public void Add_MultipleAddValidValueThenAddInvalidValuesToExistingHeader_ThrowAndDontAddHeader() { MockHeaders headers = new MockHeaders(); headers.Add(knownHeader, rawPrefix + "1"); Assert.Throws<FormatException>(() => { headers.Add(knownHeader, new string[] { rawPrefix + "2", invalidHeaderValue }); }); // Make sure the header did not get removed due to the failed add. Note that the first value in the array // is valid, so it gets added. I.e. we have 2 values. Assert.True(headers.Contains(knownHeader), "Header was removed even if there is a valid header value."); Assert.Equal(2, headers.First().Value.Count()); Assert.Equal(parsedPrefix + "1", headers.First().Value.ElementAt(0)); Assert.Equal(parsedPrefix + "2", headers.First().Value.ElementAt(1)); }
public void RemoveParsedValue_AddOneValueToKnownHeaderAndCompareWithValueThatDiffersInCase_CustomComparerUsedForComparison() { MockHeaders headers = new MockHeaders(); headers.AddParsedValue(knownHeader, "value"); // Our custom comparer (MockComparer) does case-insensitive value comparison. Verify that our custom // comparer is used to compare the header value. Assert.True(headers.RemoveParsedValue(knownHeader, "VALUE")); Assert.False(headers.Contains(knownHeader), "Header should be removed after removing value."); Assert.Equal(1, headers.Parser.MockComparer.EqualsCount); }
public void Contains_AddValuesWithInvalidNewlineChars_HeadersGetRemovedWhenCallingContains() { MockHeaders headers = new MockHeaders(); headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\ninvalid"); headers.TryAddWithoutValidation("custom", "invalid\r\nvalue"); Assert.False(headers.Contains(knownHeader), "Store should not have an entry for 'knownHeader'."); Assert.False(headers.Contains("custom"), "Store should not have an entry for 'custom'."); }
public void AddParsedValue_FirstAddInvalidNewlineCharsValueThenAddValidValueThenCallAddParsedValue_ParsedValueAdded() { MockHeaders headers = new MockHeaders(); // Add header value with invalid newline chars. headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\ninvalid"); headers.TryAddWithoutValidation(knownHeader, rawPrefix + "0"); Assert.Equal(0, headers.Parser.TryParseValueCallCount); headers.AddParsedValue(knownHeader, parsedPrefix + "1"); Assert.True(headers.Contains(knownHeader), "Store should have an entry for 'knownHeader'."); Assert.Equal(2, headers.GetValues(knownHeader).Count()); Assert.Equal(parsedPrefix + "0", headers.GetValues(knownHeader).ElementAt(0)); Assert.Equal(parsedPrefix + "1", headers.GetValues(knownHeader).ElementAt(1)); }
public void Contains_CallContainsForEmptyHeader_ReturnsFalse() { MockHeaders headers = new MockHeaders(); headers.Add(knownHeader, string.Empty); Assert.False(headers.Contains(knownHeader)); }
public void Contains_CallContainsForExistingHeader_ReturnsTrue() { MockHeaders headers = new MockHeaders(); headers.Add("custom1", "customValue1"); headers.Add("custom2", "customValue2"); headers.Add("custom3", "customValue3"); headers.Add("custom4", "customValue4"); headers.TryAddWithoutValidation(knownHeader, rawPrefix); // Nothing got parsed so far since we just added custom headers and for the known header we called // TryAddWithoutValidation(). Assert.Equal(0, headers.Parser.TryParseValueCallCount); Assert.True(headers.Contains(knownHeader)); // Contains() should trigger parsing of values added with TryAddWithoutValidation(): If the value was invalid, // i.e. contains invalid newline chars, then the header will be removed from the collection. Assert.Equal(1, headers.Parser.TryParseValueCallCount); }
public void Contains_CallContainsForNonExistingHeader_ReturnsFalse() { MockHeaders headers = new MockHeaders(); headers.Add(knownHeader, rawPrefix); Assert.False(headers.Contains("doesntexist")); }
public void Contains_CallContainsFromUninitializedHeaderStore_ReturnsFalse() { MockHeaders headers = new MockHeaders(); Assert.False(headers.Contains("doesntexist")); }
public void Contains_UseNullHeader_Throw() { MockHeaders headers = new MockHeaders(); Assert.Throws<ArgumentException>(() => { headers.Contains(null); }); }
public void Add_SingleAddValidValueThenAddInvalidValue_ThrowAndHeaderContainsValidValue() { MockHeaders headers = new MockHeaders(); headers.Add(knownHeader, rawPrefix); Assert.Throws<FormatException>(() => { headers.Add(knownHeader, invalidHeaderValue); }); // Make sure the header did not get removed due to the failed add. Assert.True(headers.Contains(knownHeader), "Header was removed even if there is a valid header value."); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal(parsedPrefix, headers.First().Value.ElementAt(0)); }
public void ContainsParsedValue_CallFromEmptyHeaderStore_ReturnsFalse() { MockHeaders headers = new MockHeaders(); // This will create a header entry with no value. headers.Add(knownHeader, string.Empty); Assert.False(headers.Contains(knownHeader), "Expected known header to be in the store."); // This will just return fals and not touch the header. Assert.False(headers.ContainsParsedValue(knownHeader, "x"), "Expected 'ContainsParsedValue' to return false."); }
public void Add_MultipleAddInvalidValuesToNonExistingHeader_ThrowAndDontAddHeader() { MockHeaders headers = new MockHeaders(); Assert.Throws<FormatException>(() => { headers.Add(knownHeader, new string[] { invalidHeaderValue }); }); // Make sure the header did not get added since we just tried to add an invalid value. Assert.False(headers.Contains(knownHeader), "Header was added even if we just added an invalid value."); }
public void AddHeaders_SourceAndDestinationStoreHaveMultipleHeaders_OnlyHeadersNotInDestinationAreCopiedFromSource() { Dictionary<string, HttpHeaderParser> parserStore = new Dictionary<string, HttpHeaderParser>(); parserStore.Add("known1", new MockHeaderParser()); parserStore.Add("known2", new MockHeaderParser()); parserStore.Add("known3", new MockHeaderParser()); parserStore.Add("known4", new CustomTypeHeaderParser()); // Add header values to the source store. MockHeaders source = new MockHeaders(parserStore); source.Add("custom1", "source10"); source.Add("custom1", "source11"); source.TryAddWithoutValidation("custom2", "source2"); source.Add("known1", rawPrefix + "3"); source.TryAddWithoutValidation("known1", rawPrefix + "4"); source.TryAddWithoutValidation("known2", rawPrefix + "5"); source.TryAddWithoutValidation("known2", invalidHeaderValue); source.TryAddWithoutValidation("known2", rawPrefix + "7"); // this header value gets removed when it gets parsed. source.TryAddWithoutValidation("known3", (string)null); source.Add("known3", string.Empty); DateTimeOffset known4Value1 = new DateTimeOffset(2010, 6, 15, 18, 31, 34, TimeSpan.Zero); DateTimeOffset known4Value2 = new DateTimeOffset(2010, 4, 8, 11, 21, 04, TimeSpan.Zero); source.AddParsedValue("known4", known4Value1); source.AddParsedValue("known4", known4Value2); source.Add("custom5", "source5"); source.TryAddWithoutValidation("custom6", (string)null); // This header value gets added even though it doesn't have values. But since this is a custom header we // assume it supports empty values. source.TryAddWithoutValidation("custom7", (string)null); source.Add("custom7", string.Empty); // Add header values to the destination store. MockHeaders destination = new MockHeaders(parserStore); destination.Add("custom2", "destination1"); destination.Add("known1", rawPrefix + "9"); // Now add all headers that are in source but not destination to destination. destination.AddHeaders(source); Assert.Equal(8, destination.Count()); Assert.Equal(2, destination.GetValues("custom1").Count()); Assert.Equal("source10", destination.GetValues("custom1").ElementAt(0)); Assert.Equal("source11", destination.GetValues("custom1").ElementAt(1)); // This value was set in destination. The header in source was ignored. Assert.Equal(1, destination.GetValues("custom2").Count()); Assert.Equal("destination1", destination.GetValues("custom2").First()); // This value was set in destination. The header in source was ignored. Assert.Equal(1, destination.GetValues("known1").Count()); Assert.Equal(parsedPrefix + "9", destination.GetValues("known1").First()); // The header in source gets first parsed and then copied to destination. Note that here we have one // invalid value. Assert.Equal(3, destination.GetValues("known2").Count()); Assert.Equal(parsedPrefix + "5", destination.GetValues("known2").ElementAt(0)); Assert.Equal(parsedPrefix + "7", destination.GetValues("known2").ElementAt(1)); Assert.Equal(invalidHeaderValue, destination.GetValues("known2").ElementAt(2)); // Header 'known3' should not be copied, since it doesn't contain any values. Assert.False(destination.Contains("known3"), "'known3' header value count."); Assert.Equal(2, destination.GetValues("known4").Count()); Assert.Equal(known4Value1.ToString(), destination.GetValues("known4").ElementAt(0)); Assert.Equal(known4Value2.ToString(), destination.GetValues("known4").ElementAt(1)); Assert.Equal("source5", destination.GetValues("custom5").First()); Assert.Equal(string.Empty, destination.GetValues("custom6").First()); // Unlike 'known3', 'custom7' was added even though it only had empty values. The reason is that 'custom7' // is a custom header so we just add whatever value we get passed in. Assert.Equal(2, destination.GetValues("custom7").Count()); Assert.Equal("", destination.GetValues("custom7").ElementAt(0)); Assert.Equal("", destination.GetValues("custom7").ElementAt(1)); }
public void Add_MultipleAddValidValueThenAddInvalidValuesToNonExistingHeader_ThrowAndDontAddHeader() { MockHeaders headers = new MockHeaders(); Assert.Throws<FormatException>(() => { headers.Add(knownHeader, new string[] { rawPrefix + "1", invalidHeaderValue }); }); // Make sure the header got added due to the valid add. Note that the first value in the array // is valid, so it gets added. Assert.True(headers.Contains(knownHeader), "Header was not added even though we added 1 valid value."); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal(parsedPrefix + "1", headers.First().Value.ElementAt(0)); }
public void AddHeaders_SourceHasInvalidHeaderValues_InvalidHeadersRemovedFromSourceAndNotCopiedToDestination() { Dictionary<string, HttpHeaderParser> parserStore = new Dictionary<string, HttpHeaderParser>(); parserStore.Add("known", new MockHeaderParser()); MockHeaders source = new MockHeaders(parserStore); source.TryAddWithoutValidation("known", invalidHeaderValue + "\r\ninvalid"); source.TryAddWithoutValidation("custom", "invalid\r\nvalue"); MockHeaders destination = new MockHeaders(parserStore); destination.AddHeaders(source); Assert.Equal(0, source.Count()); Assert.False(source.Contains("known"), "source contains 'known' header."); Assert.False(source.Contains("custom"), "source contains 'custom' header."); Assert.Equal(0, destination.Count()); Assert.False(destination.Contains("known"), "destination contains 'known' header."); Assert.False(destination.Contains("custom"), "destination contains 'custom' header."); }
public void RemoveParsedValue_FirstAddInvalidNewlineCharsValueThenAddValidValueThenCallAddParsedValue_HeaderRemoved() { MockHeaders headers = new MockHeaders(); // Add header value with invalid newline chars. headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\ninvalid"); headers.TryAddWithoutValidation(knownHeader, rawPrefix + "1"); Assert.Equal(0, headers.Parser.TryParseValueCallCount); headers.RemoveParsedValue(knownHeader, parsedPrefix + "1"); Assert.False(headers.Contains(knownHeader), "Store should not have an entry for 'knownHeader'."); }
public void TryAddWithoutValidation_AddValueContainingNewLine_NewLineFollowedByWhitespaceIsOKButNewLineFollowedByNonWhitespaceIsRejected() { MockHeaders headers = new MockHeaders(); // The header parser rejects both of the following values. Both values contain new line chars. According // to the RFC, LWS supports newlines followed by whitespaces. I.e. the first value gets rejected by the // parser, but added to the list of invalid values. headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\n other: value"); // OK, LWS is allowed Assert.Equal(1, headers.Count()); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal(invalidHeaderValue + "\r\n other: value", headers.First().Value.First()); Assert.Equal(1, headers.Parser.TryParseValueCallCount); // This value is considered invalid (newline char followed by non-whitepace). However, since // TryAddWithoutValidation() only causes the header value to be analyzed when it gets actually accessed, no // exception is thrown. Instead the value is discarded and a warning is logged. headers.Clear(); headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\nother:value"); Assert.False(headers.Contains(knownHeader)); Assert.Equal(0, headers.Count()); // Adding newline followed by whitespace to a custom header is OK. headers.Clear(); headers.TryAddWithoutValidation("custom", "value\r\n other: value"); // OK, LWS is allowed Assert.Equal(1, headers.Count()); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal("value\r\n other: value", headers.First().Value.First()); // Adding newline followed by non-whitespace chars is invalid. The value is discarded and a warning is // logged. headers.Clear(); headers.TryAddWithoutValidation("custom", "value\r\nother: value"); Assert.False(headers.Contains("custom")); Assert.Equal(0, headers.Count()); // Also ending a value with newline is invalid. Verify that valid values are added. headers.Clear(); headers.Parser.TryParseValueCallCount = 0; headers.TryAddWithoutValidation(knownHeader, rawPrefix + "\rvalid"); headers.TryAddWithoutValidation(knownHeader, invalidHeaderValue + "\r\n"); headers.TryAddWithoutValidation(knownHeader, rawPrefix + "\n," + invalidHeaderValue + "\r\nother"); Assert.Equal(1, headers.Count()); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal(parsedPrefix + "\rvalid", headers.First().Value.First()); Assert.Equal(4, headers.Parser.TryParseValueCallCount); headers.Clear(); headers.TryAddWithoutValidation("custom", "value\r\ninvalid"); headers.TryAddWithoutValidation("custom", "value\r\n valid"); headers.TryAddWithoutValidation("custom", "validvalue, invalid\r\nvalue"); Assert.Equal(1, headers.Count()); Assert.Equal(1, headers.First().Value.Count()); Assert.Equal("value\r\n valid", headers.First().Value.First()); }
public void RemoveSpecialValue_AddRemoveSpecialValue_SpecialValueGetsRemoved() { MockHeaders headers = new MockHeaders(knownHeader, new MockHeaderParser(typeof(Uri))); HttpHeaderValueCollection<Uri> collection = new HttpHeaderValueCollection<Uri>(knownHeader, headers, specialValue); collection.SetSpecialValue(); Assert.True(collection.IsSpecialValueSet, "Special value not set."); Assert.Equal(1, headers.GetValues(knownHeader).Count()); collection.RemoveSpecialValue(); Assert.False(collection.IsSpecialValueSet, "Special value is set."); // Since the only header value was the "special value", removing it will remove the whole header // from the collection. Assert.False(headers.Contains(knownHeader)); }
public void GetValues_HeadersWithEmptyValues_ReturnsEmptyArray() { MockHeaders headers = new MockHeaders(); headers.TryAddWithoutValidation(customHeader, (string)null); headers.Add(knownHeader, string.Empty); // In the known header case, the MockParser accepts empty values but tells the store to not add the value. // Since no value is added for 'knownHeader', HttpHeaders removes the header from the store. This is only // done for known headers. Custom headers are allowed to have empty/null values as shown by // 'valuesForCustomHeaders' below Assert.False(headers.Contains(knownHeader)); // In the custom header case, we add whatever the users adds (besides that we add string.Empty if the // user adds null). So here we do have 1 value: string.Empty. IEnumerable<string> valuesForCustomHeader = headers.GetValues(customHeader); Assert.NotNull(valuesForCustomHeader); Assert.Equal(1, valuesForCustomHeader.Count()); Assert.Equal(string.Empty, valuesForCustomHeader.First()); }