// 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 System.Runtime.CompilerServices; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using Xunit.Abstractions; namespace Microsoft.AspNetCore.SignalR.Tests { public class FunctionalTestBase : VerifiableLoggedTest { private readonly Func _globalExpectedErrorsFilter; public FunctionalTestBase(ITestOutputHelper output) : base(output) { // Suppress errors globally here _globalExpectedErrorsFilter = (writeContext) => false; } private Func ResolveExpectedErrorsFilter(Func expectedErrorsFilter) { if (expectedErrorsFilter == null) { return _globalExpectedErrorsFilter; } return (writeContext) => { if (expectedErrorsFilter(writeContext)) { return true; } return _globalExpectedErrorsFilter(writeContext); }; } public IDisposable StartServer(out ILoggerFactory loggerFactory, out InProcessTestServer testServer, LogLevel minLogLevel, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) where T : class { var disposable = base.StartVerifiableLog(out loggerFactory, minLogLevel, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter)); testServer = new InProcessTestServer(loggerFactory); return new MultiDisposable(testServer, disposable); } public IDisposable StartServer(out ILoggerFactory loggerFactory, out InProcessTestServer testServer, [CallerMemberName] string testName = null, Func expectedErrorsFilter = null) where T : class { var disposable = base.StartVerifiableLog(out loggerFactory, testName, ResolveExpectedErrorsFilter(expectedErrorsFilter)); testServer = new InProcessTestServer(loggerFactory); return new MultiDisposable(testServer, disposable); } private class MultiDisposable : IDisposable { List _disposables; public MultiDisposable(params IDisposable[] disposables) { _disposables = new List(disposables); } public void Dispose() { foreach (var disposable in _disposables) { disposable.Dispose(); } } } } }