1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Concurrent;
using System.Web.Razor;
using System.Web.SessionState;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.WebPages.Test
{
public class SessionStateUtilTest
{
[Fact]
public void SetUpSessionStateDoesNotInvokeSessionStateBehaviorIfNoPageHasDirective()
{
// Arrange
var page = new Mock<WebPage>(MockBehavior.Strict);
var startPage = new Mock<StartPage>(MockBehavior.Strict);
var webPageHttpHandler = new WebPageHttpHandler(page.Object, startPage: new Lazy<WebPageRenderingBase>(() => startPage.Object));
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
// Act
SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, new ConcurrentDictionary<Type, SessionStateBehavior?>());
// Assert
context.Verify(c => c.SetSessionStateBehavior(It.IsAny<SessionStateBehavior>()), Times.Never());
}
[Fact]
public void SetUpSessionStateUsesSessionStateValueFromRequestingPageIfAvailable()
{
// Arrange
var page = new DisabledSessionWebPage();
var webPageHttpHandler = new WebPageHttpHandler(page, startPage: null);
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.Setup(c => c.SetSessionStateBehavior(SessionStateBehavior.Disabled)).Verifiable();
// Act
SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, new ConcurrentDictionary<Type, SessionStateBehavior?>());
// Assert
context.Verify();
}
[Fact]
public void SetUpSessionStateUsesSessionStateValueFromStartPageHierarchy()
{
// Arrange
var page = new Mock<WebPage>(MockBehavior.Strict);
var startPage = new DefaultSessionWebPage
{
ChildPage = new ReadOnlySessionWebPage()
};
var webPageHttpHandler = new WebPageHttpHandler(page.Object, startPage: new Lazy<WebPageRenderingBase>(() => startPage));
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.Setup(c => c.SetSessionStateBehavior(SessionStateBehavior.ReadOnly)).Verifiable();
// Act
SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, new ConcurrentDictionary<Type, SessionStateBehavior?>());
// Assert
context.Verify();
}
[Fact]
public void SetUpSessionStateThrowsIfSessionStateValueIsInvalid()
{
// Arrange
var page = new Mock<WebPage>(MockBehavior.Strict);
var startPage = new InvalidSessionState();
var webPageHttpHandler = new WebPageHttpHandler(page.Object, startPage: new Lazy<WebPageRenderingBase>(() => startPage));
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
// Act
Assert.Throws<ArgumentException>(() => SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, new ConcurrentDictionary<Type, SessionStateBehavior?>()),
"Value \"jabberwocky\" specified in \"~/_Invalid.cshtml\" is an invalid value for the SessionState directive. Possible values are: \"Default, Required, ReadOnly, Disabled\".");
}
[Fact]
public void SetUpSessionStateThrowsIfMultipleSessionStateValueIsInvalid()
{
// Arrange
var page = new PageWithMultipleSesionStateAttributes();
var webPageHttpHandler = new WebPageHttpHandler(page, startPage: null);
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
// Act
Assert.Throws<InvalidOperationException>(() => SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, new ConcurrentDictionary<Type, SessionStateBehavior?>()),
"At most one SessionState value can be declared per page.");
}
[Fact]
public void SetUpSessionStateUsesCache()
{
// Arrange
var page = new PageWithBadAttribute();
var webPageHttpHandler = new WebPageHttpHandler(page, startPage: null);
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
var dictionary = new ConcurrentDictionary<Type, SessionStateBehavior?>();
dictionary.TryAdd(webPageHttpHandler.GetType(), SessionStateBehavior.Default);
context.Setup(c => c.SetSessionStateBehavior(SessionStateBehavior.Default)).Verifiable();
// Act
SessionStateUtil.SetUpSessionState(context.Object, webPageHttpHandler, dictionary);
// Assert
context.Verify();
Assert.Throws<Exception>(() => page.GetType().GetCustomAttributes(inherit: false), "Can't call me!");
}
[RazorDirective("sessionstate", "disabled")]
private sealed class DisabledSessionWebPage : WebPage
{
public override void Execute()
{
throw new NotSupportedException();
}
}
[RazorDirective("sessionstate", "ReadOnly")]
private sealed class ReadOnlySessionWebPage : StartPage
{
public override void Execute()
{
throw new NotSupportedException();
}
}
[RazorDirective("SessionState", "Default")]
private sealed class DefaultSessionWebPage : StartPage
{
public override void Execute()
{
throw new NotSupportedException();
}
}
[RazorDirective("SessionState", "jabberwocky")]
private sealed class InvalidSessionState : StartPage
{
public override string VirtualPath
{
get
{
return "~/_Invalid.cshtml";
}
set
{
VirtualPath = value;
}
}
public override void Execute()
{
throw new NotSupportedException();
}
}
private sealed class BadAttribute : Attribute
{
public BadAttribute()
{
throw new Exception("Can't call me!");
}
}
[RazorDirective("SessionState", "Default"), Bad]
private sealed class PageWithBadAttribute : WebPage
{
public override void Execute()
{
throw new NotSupportedException();
}
}
[RazorDirective("SessionState", "Disabled"), RazorDirective("SessionState", "ReadOnly")]
private sealed class PageWithMultipleSesionStateAttributes : WebPage
{
public override void Execute()
{
throw new NotSupportedException();
}
}
}
}
|