aspnetcore/test/Microsoft.AspNetCore.Rewrit.../ModRewrite/TestStringParserTests.cs

142 lines
5.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Rewrite.Internal;
using Microsoft.AspNetCore.Rewrite.Internal.ModRewrite;
using Microsoft.AspNetCore.Rewrite.Internal.PatternSegments;
using Xunit;
namespace Microsoft.AspNetCore.Rewrite
{
public class TestStringParserTests
{
[Fact]
public void ConditionParser_SingleServerVariable()
{
var serverVar = "%{HTTPS}";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new IsHttpsModSegment());
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_MultipleServerVariables()
{
var serverVar = "%{HTTPS}%{REQUEST_URI}";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new IsHttpsModSegment());
list.Add(new UrlSegment());
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParseLiteral()
{
var serverVar = "Hello!";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new LiteralSegment(serverVar));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParseConditionParameters()
{
var serverVar = "%1";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new ConditionMatchSegment(1));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParseMultipleConditionParameters()
{
var serverVar = "%1%2";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new ConditionMatchSegment(1));
list.Add(new ConditionMatchSegment(2));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParseRuleVariable()
{
var serverVar = "$1";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new RuleMatchSegment(1));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParseMultipleRuleVariables()
{
var serverVar = "$1$2";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new RuleMatchSegment(1));
list.Add(new RuleMatchSegment(2));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Fact]
public void ConditionParser_ParserComplexRequest()
{
var serverVar = "%{HTTPS}/$1";
var result = new TestStringParser().Parse(serverVar);
var list = new List<PatternSegment>();
list.Add(new IsHttpsModSegment());
list.Add(new LiteralSegment("/"));
list.Add(new RuleMatchSegment(1));
var expected = new Pattern(list);
AssertPatternsEqual(expected, result);
}
[Theory]
[InlineData(@"%}", "Cannot parse '%}' to integer at string index: '1'")] // no } at end
[InlineData(@"%{", "Missing close brace for parameter at string index: '2'")] // no closing }
[InlineData(@"%a", "Cannot parse '%a' to integer at string index: '1'")] // invalid character after %
[InlineData(@"$a", "Cannot parse '$a' to integer at string index: '1'")] // invalid character after $
[InlineData(@"%{asdf", "Missing close brace for parameter at string index: '6'")] // no closing } with characters
public void ConditionParser_Bad(string testString, string expected)
{
var ex = Assert.Throws<FormatException>(() => new TestStringParser().Parse(testString));
Assert.Equal(ex.Message, expected);
}
private void AssertPatternsEqual(Pattern p1, Pattern p2)
{
Assert.Equal(p1.PatternSegments.Count, p2.PatternSegments.Count);
for (int i = 0; i < p1.PatternSegments.Count; i++)
{
var s1 = p1.PatternSegments[i];
var s2 = p2.PatternSegments[i];
Assert.Equal(s1.GetType(), s2.GetType());
}
}
}
}