< Summary

Class:Azure.Core.TestFramework.RecordedTestBase
Assembly:Azure.Core.TestFramework
File(s):C:\Git\azure-sdk-for-net\sdk\core\Azure.Core.TestFramework\src\RecordedTestBase.cs
Covered lines:45
Uncovered lines:1
Coverable lines:46
Total lines:127
Line coverage:97.8% (45 of 46)
Covered branches:15
Total branches:20
Branch coverage:75% (15 of 20)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
get_Sanitizer()-100%100%
get_Matcher()-100%100%
get_Recording()-100%100%
get_Mode()-100%100%
.cctor()-100%100%
.ctor(...)-100%100%
.ctor(...)-100%100%
GetSessionFilePath()-100%75%
get_Logger()-100%100%
StartLoggingEvents()-66.67%50%
StopLoggingEvents()-100%50%
StartTestRecording()-100%100%
StopTestRecording()-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\core\Azure.Core.TestFramework\src\RecordedTestBase.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System.Collections.Generic;
 5using System.Diagnostics;
 6using System.IO;
 7using System.Linq;
 8using NUnit.Framework;
 9
 10namespace Azure.Core.TestFramework
 11{
 12    [Category("Recorded")]
 13    public abstract class RecordedTestBase : ClientTestBase
 14    {
 1051315        protected RecordedTestSanitizer Sanitizer { get; set; }
 16
 1053317        protected RecordMatcher Matcher { get; set; }
 18
 13401919        public TestRecording Recording { get; private set; }
 20
 8716521        public RecordedTestMode Mode { get; }
 22
 23        // copied the Windows version https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib
 24        // as it is the most restrictive of all platforms
 6425        private static readonly HashSet<char> s_invalidChars = new HashSet<char>(new char[]
 6426        {
 6427            '\"', '<', '>', '|', '\0',
 6428            (char)1, (char)2, (char)3, (char)4, (char)5, (char)6, (char)7, (char)8, (char)9, (char)10,
 6429            (char)11, (char)12, (char)13, (char)14, (char)15, (char)16, (char)17, (char)18, (char)19, (char)20,
 6430            (char)21, (char)22, (char)23, (char)24, (char)25, (char)26, (char)27, (char)28, (char)29, (char)30,
 6431            (char)31, ':', '*', '?', '\\', '/'
 6432        });
 33
 34#if DEBUG
 35        /// <summary>
 36        /// Flag you can (temporarily) enable to save failed test recordings
 37        /// and debug/re-run at the point of failure without re-running
 38        /// potentially lengthy live tests.  This should never be checked in
 39        /// and will be compiled out of release builds to help make that easier
 40        /// to spot.
 41        /// </summary>
 42        public bool SaveDebugRecordingsOnFailure { get; set; } = false;
 43#endif
 44
 54445        protected RecordedTestBase(bool isAsync) : this(isAsync, RecordedTestUtilities.GetModeFromEnvironment())
 46        {
 54447        }
 48
 97849        protected RecordedTestBase(bool isAsync, RecordedTestMode mode) : base(isAsync)
 50        {
 97851            Sanitizer = new RecordedTestSanitizer();
 97852            Matcher = new RecordMatcher();
 97853            Mode = mode;
 97854        }
 55
 56        private string GetSessionFilePath()
 57        {
 910958            TestContext.TestAdapter testAdapter = TestContext.CurrentContext.Test;
 59
 28325760            string name = new string(testAdapter.Name.Select(c => s_invalidChars.Contains(c) ? '%' : c).ToArray());
 910961            string additionalParameterName = testAdapter.Properties.ContainsKey(ClientTestFixtureAttribute.RecordingDire
 910962                testAdapter.Properties.Get(ClientTestFixtureAttribute.RecordingDirectorySuffixKey).ToString() :
 910963                null;
 64
 910965            string className = testAdapter.ClassName.Substring(testAdapter.ClassName.LastIndexOf('.') + 1);
 66
 910967            string fileName = name + (IsAsync ? "Async" : string.Empty) + ".json";
 910968            return Path.Combine(TestContext.CurrentContext.TestDirectory,
 910969                "SessionRecords",
 910970                additionalParameterName == null ? className : $"{className}({additionalParameterName})",
 910971                fileName);
 72        }
 73
 74        /// <summary>
 75        /// Add a static TestEventListener which will redirect SDK logging
 76        /// to Console.Out for easy debugging.
 77        /// </summary>
 189278        private static TestLogger Logger { get; set; }
 79
 80        /// <summary>
 81        /// Start logging events to the console if debugging or in Live mode.
 82        /// This will run once before any tests.
 83        /// </summary>
 84        [OneTimeSetUp]
 85        public void StartLoggingEvents()
 86        {
 94687            if (Mode == RecordedTestMode.Live || Debugger.IsAttached)
 88            {
 089                Logger = new TestLogger();
 90            }
 94691        }
 92
 93        /// <summary>
 94        /// Stop logging events and do necessary cleanup.
 95        /// This will run once after all tests have finished.
 96        /// </summary>
 97        [OneTimeTearDown]
 98        public void StopLoggingEvents()
 99        {
 946100            Logger?.Dispose();
 946101            Logger = null;
 946102        }
 103
 104        [SetUp]
 105        public virtual void StartTestRecording()
 106        {
 107            // Only create test recordings for the latest version of the service
 17979108            TestContext.TestAdapter test = TestContext.CurrentContext.Test;
 17979109            if (Mode != RecordedTestMode.Live &&
 17979110                test.Properties.ContainsKey("SkipRecordings"))
 111            {
 8870112                throw new IgnoreException((string) test.Properties.Get("SkipRecordings"));
 113            }
 9109114            Recording = new TestRecording(Mode, GetSessionFilePath(), Sanitizer, Matcher);
 9109115        }
 116
 117        [TearDown]
 118        public virtual void StopTestRecording()
 119        {
 17979120            bool save = TestContext.CurrentContext.Result.FailCount == 0;
 121#if DEBUG
 122            save |= SaveDebugRecordingsOnFailure;
 123#endif
 17979124            Recording?.Dispose(save);
 9109125        }
 126    }
 127}