private Protocol.RequestInterceptor CreateOcpRangeConfirmationInterceptor <TRequest, TOptions, THeaders>(
            string expectedOcpRange,
            Func <TOptions, string> getOcpRange,
            InvocationTracker invocationTracker)
            where TRequest : Protocol.BatchRequest <TOptions, AzureOperationResponse <Stream, THeaders> >
            where TOptions : IOptions, new()
            where THeaders : IProtocolNodeFile, new()
        {
            return(new Protocol.RequestInterceptor(request =>
            {
                if (request is TRequest getFileRequest)
                {
                    getFileRequest.ServiceRequestFunc = t =>
                    {
                        invocationTracker.Invoke();
                        Assert.Equal(expectedOcpRange, getOcpRange(getFileRequest.Options));

                        THeaders headers = new THeaders();
                        SetFakeProtocolNodeFileHeaders(headers);
                        return Task.FromResult(new AzureOperationResponse <Stream, THeaders>()
                        {
                            Body = new MemoryStream(),
                            Headers = headers
                        });
                    };
                }
            }));
        }
        private static void SetupInvocationTracker(InvocationTracker <SyntaxKind> tracker, TrackerInput input)
        {
            const int parameterCount = 2;

            tracker.Track(input,
                          tracker.MatchMethod(new MemberDescriptor(KnownType.System_Collections_Generic_IDictionary_TKey_TValue, "Add")),
                          tracker.MethodHasParameters(parameterCount),
                          c => IsFirstArgumentAccessControlAllowOrigin((InvocationExpressionSyntax)c.Node, c.SemanticModel) &&
                          IsSecondArgumentStarString((InvocationExpressionSyntax)c.Node, c.SemanticModel),
                          tracker.IsIHeadersDictionary());

            tracker.Track(input,
                          tracker.MatchMethod(new MemberDescriptor(KnownType.Microsoft_AspNetCore_Http_HeaderDictionaryExtensions, "Append"),
                                              new MemberDescriptor(KnownType.System_Web_HttpResponse, "AppendHeader"),
                                              new MemberDescriptor(KnownType.System_Web_HttpResponseBase, "AddHeader"),
                                              new MemberDescriptor(KnownType.System_Collections_Specialized_NameValueCollection, "Add"),
                                              new MemberDescriptor(KnownType.System_Net_Http_Headers_HttpHeaders, "Add")),
                          tracker.MethodHasParameters(parameterCount),
                          c => IsFirstArgumentAccessControlAllowOrigin((InvocationExpressionSyntax)c.Node, c.SemanticModel) &&
                          IsSecondArgumentStarString((InvocationExpressionSyntax)c.Node, c.SemanticModel));

            tracker.Track(input,
                          tracker.MatchMethod(new MemberDescriptor(KnownType.Microsoft_AspNetCore_Cors_Infrastructure_CorsPolicyBuilder, "WithOrigins")),
                          c => ContainsStar(((InvocationExpressionSyntax)c.Node).ArgumentList.Arguments.Select(a => a.Expression), c.SemanticModel));

            tracker.Track(input, tracker.MatchMethod(new MemberDescriptor(KnownType.Microsoft_AspNetCore_Cors_Infrastructure_CorsPolicyBuilder, "AllowAnyOrigin")));
        }
Beispiel #3
0
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.Microsoft_EntityFrameworkCore_RelationalQueryableExtensions, "FromSql")),
                                    Conditions.And(
                                        MethodHasRawSqlQueryParameter(),
                                        Conditions.Or(
                                            Conditions.Or(ArgumentAtIndexIsConcat(0), ArgumentAtIndexIsFormat(0), ArgumentAtIndexIsInterpolated(0)),
                                            Conditions.Or(ArgumentAtIndexIsConcat(1), ArgumentAtIndexIsFormat(1), ArgumentAtIndexIsInterpolated(1))
                                            )
                                        ),
                                    Conditions.ExceptWhen(
                                        InvocationTracker.ArgumentAtIndexIsConstant(0)));

            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.Microsoft_EntityFrameworkCore_RelationalDatabaseFacadeExtensions, "ExecuteSqlCommandAsync"),
                                        new MemberDescriptor(KnownType.Microsoft_EntityFrameworkCore_RelationalDatabaseFacadeExtensions, "ExecuteSqlCommand")),
                                    Conditions.And(
                                        MethodHasRawSqlQueryParameter(),
                                        Conditions.Or(
                                            Conditions.Or(ArgumentAtIndexIsConcat(0), ArgumentAtIndexIsFormat(0), ArgumentAtIndexIsInterpolated(0)),
                                            Conditions.Or(ArgumentAtIndexIsConcat(1), ArgumentAtIndexIsFormat(1), ArgumentAtIndexIsInterpolated(1))
                                            )
                                        ),
                                    Conditions.ExceptWhen(
                                        InvocationTracker.ArgumentAtIndexIsConstant(0)));

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.System_Data_Odbc_OdbcCommand, "CommandText"),
                                            new MemberDescriptor(KnownType.System_Data_OracleClient_OracleCommand, "CommandText"),
                                            new MemberDescriptor(KnownType.System_Data_SqlClient_SqlCommand, "CommandText"),
                                            new MemberDescriptor(KnownType.System_Data_SqlServerCe_SqlCeCommand, "CommandText")),
                                        PropertyAccessTracker.MatchSetter(),
                                        Conditions.Or(SetterIsConcat(), SetterIsFormat(), SetterIsInterpolation()),
                                        Conditions.ExceptWhen(
                                            PropertyAccessTracker.AssignedValueIsConstant()));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.Microsoft_EntityFrameworkCore_RawSqlString,
                                            KnownType.System_Data_SqlClient_SqlCommand,
                                            KnownType.System_Data_SqlClient_SqlDataAdapter,
                                            KnownType.System_Data_Odbc_OdbcCommand,
                                            KnownType.System_Data_Odbc_OdbcDataAdapter,
                                            KnownType.System_Data_SqlServerCe_SqlCeCommand,
                                            KnownType.System_Data_SqlServerCe_SqlCeDataAdapter,
                                            KnownType.System_Data_OracleClient_OracleCommand,
                                            KnownType.System_Data_OracleClient_OracleDataAdapter),
                                        ObjectCreationTracker.ArgumentAtIndexIs(0, KnownType.System_String),
                                        Conditions.Or(FirstArgumentIsConcat(), FirstArgumentIsFormat(), FirstArgumentIsInterpolation()),
                                        Conditions.ExceptWhen(
                                            ObjectCreationTracker.ArgumentAtIndexIsConst(0)));
        }
        public void Verify_VerifiableSetupsButNoInvocations_ThrowsVerificationException()
        {
            var setup = new Setup(TestDataFactory.CreateMethodCallInfo());

            setup.Verifiable();
            ConfigureSetups(setup);

            var subject = new InvocationTracker(_setupManagerMock.Object);

            Assert.Throws <VerificationException>(() => subject.Verify());
        }
        public void Verify_NoVerifiableSetupsOrInvocations_DoesntThrow()
        {
            // We have a setup, but it's not verifiable
            var setup = new Setup(TestDataFactory.CreateMethodCallInfo());

            ConfigureSetups(setup);

            var subject = new InvocationTracker(_setupManagerMock.Object);

            Assert.DoesNotThrow(() => subject.Verify());
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.WhenDerivesFrom(KnownType.System_Security_Cryptography_HashAlgorithm));

            InvocationTracker.Track(context,
                                    InvocationTracker.MethodNameIs("Create"),
                                    InvocationTracker.MethodReturnTypeIs(KnownType.System_Security_Cryptography_HashAlgorithm));

            BaseTypeTracker.Track(context,
                                  BaseTypeTracker.MatchSubclassesOf(KnownType.System_Security_Cryptography_HashAlgorithm));
        }
        public void Verify_VerifiableSetupsWithMatchingInvocations_DoesntThrow()
        {
            var setup = new Setup(TestDataFactory.CreateMethodCallInfo(() => Console.WriteLine()));

            setup.Verifiable();
            ConfigureSetups(setup);

            var subject = new InvocationTracker(_setupManagerMock.Object);

            subject.Track(ReflectionUtility.GetMethod(() => Console.WriteLine()), new object[0], setup);

            Assert.DoesNotThrow(() => subject.Verify());
        }
        public void Verify_VerifiableSetupsButNoMatchingInvocations_ThrowsVerificationException()
        {
            var setup = new Setup(TestDataFactory.CreateMethodCallInfo(() => Console.WriteLine()));

            setup.Verifiable();
            ConfigureSetups(setup);

            var subject = new InvocationTracker(_setupManagerMock.Object);

            subject.Track(ReflectionUtility.GetMethod(() => Console.ReadKey()), new object[0], null);

            Assert.Throws <VerificationException>(() => subject.Verify());
        }
Beispiel #9
0
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(new MemberDescriptor(KnownType.System_Diagnostics_Process, "Start")),
                                    c => IsInvalid(FirstArgument(c)));

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(new MemberDescriptor(KnownType.System_Diagnostics_ProcessStartInfo, "FileName")),
                                        PropertyAccessTracker.MatchSetter(),
                                        c => IsInvalid((string)PropertyAccessTracker.AssignedValue(c)));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(KnownType.System_Diagnostics_ProcessStartInfo),
                                        c => ObjectCreationTracker.ConstArgumentForParameter(c, "fileName") is string value && IsInvalid(value));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_Text_RegularExpressions_Regex, "IsMatch"),
                                        new MemberDescriptor(KnownType.System_Text_RegularExpressions_Regex, "Match"),
                                        new MemberDescriptor(KnownType.System_Text_RegularExpressions_Regex, "Matches"),
                                        new MemberDescriptor(KnownType.System_Text_RegularExpressions_Regex, "Replace"),
                                        new MemberDescriptor(KnownType.System_Text_RegularExpressions_Regex, "Split")),
                                    InvocationTracker.MethodIsStatic());

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.System_Text_RegularExpressions_Regex));
        }
Beispiel #11
0
        private async Task VerifyOcpRangeSetWhenDownloadingFileAsync <
            TPropertiesRequest, TPropertiesOptions, TPropertiesHeaders, TDownloadRequest, TDownloadOptions, TDownloadHeaders>(
            Func <TDownloadOptions, string> getOcpRangeFunc,
            Func <BatchClient, Task <Microsoft.Azure.Batch.NodeFile> > getNodeFilePropertiesFunc,
            Func <Microsoft.Azure.Batch.NodeFile, GetFileRequestByteRange, Task> downloadFileFunc)
            where TPropertiesRequest : Protocol.BatchRequest <TPropertiesOptions, AzureOperationHeaderResponse <TPropertiesHeaders> >
            where TPropertiesOptions : IOptions, new()
            where TPropertiesHeaders : IProtocolNodeFile, new()
            where TDownloadRequest : Protocol.BatchRequest <TDownloadOptions, AzureOperationResponse <Stream, TDownloadHeaders> >
            where TDownloadOptions : IOptions, new()
            where TDownloadHeaders : IProtocolNodeFile, new()
        {
            const int startRange              = 100;
            const int endRange                = 200;
            string    expectedOcpRange        = "bytes=100-200";
            GetFileRequestByteRange byteRange = new GetFileRequestByteRange(startRange, endRange);

            // This interceptor verifies that the OcpRange header was properly set according to the
            // GetFileRequestByteRange object defined above.
            InvocationTracker   invocationTracker     = new InvocationTracker();
            BatchClientBehavior confirmByteRangeIsSet = CreateOcpRangeConfirmationInterceptor <
                TDownloadRequest,
                TDownloadOptions,
                TDownloadHeaders>(
                expectedOcpRange,
                getOcpRangeFunc,
                invocationTracker);

            // In order to perform the "get file" API to verify that the OcpRange was set, we need to invoke the
            // "get file properties" API first to get a NodeFile instance. This interceptor skips the "get file
            // properties" call to the Batch service and instead builds a fake NodeFile.
            BatchClientBehavior getFakeNodeFile = CreateFakeNodeFileInterceptor <TPropertiesRequest, TPropertiesOptions, TPropertiesHeaders>();

            using (BatchClient client = ClientUnitTestCommon.CreateDummyClient())
            {
                client.CustomBehaviors.Add(confirmByteRangeIsSet);
                client.CustomBehaviors.Add(getFakeNodeFile);
                // Get a NodeFile object by invoking the "get file properties" API.
                Microsoft.Azure.Batch.NodeFile nodeFile = await getNodeFilePropertiesFunc(client);

                // The download func invokes the "get file" API where the OcpRange header is actually set
                await downloadFileFunc(nodeFile, byteRange);

                // Verify the OcpRange validation interceptor was actually invoked
                Assert.True(invocationTracker.WasInvoked);
            }
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_Console, nameof(Console.OpenStandardInput))));

            InvocationTracker.Track(context,
                                    WhenResultIsNotIgnored, // This is syntax-only check and we can execute it first
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_Console, nameof(Console.Read)),
                                        new MemberDescriptor(KnownType.System_Console, nameof(Console.ReadKey)),
                                        new MemberDescriptor(KnownType.System_Console, nameof(Console.ReadLine))));

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.System_Console, nameof(Console.In))));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(new MemberDescriptor(KnownType.System_Diagnostics_Process, "Start")),
                                    Conditions.ExceptWhen(
                                        InvocationTracker.ArgumentAtIndexIs(0, KnownType.System_Diagnostics_ProcessStartInfo)),
                                    InvocationTracker.MethodHasParameters());

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.System_Diagnostics_ProcessStartInfo, "FileName")),
                                        PropertyAccessTracker.MatchSetter());

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(KnownType.System_Diagnostics_ProcessStartInfo),
                                        ObjectCreationTracker.ArgumentAtIndexIs(0, KnownType.System_String));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        // "RSA" is the base class for all RSA algorithm implementations
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "Encrypt"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "EncryptValue"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "Decrypt"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "DecryptValue"),

                                        // RSA methods added in NET Core 2.1
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "TryEncrypt"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "TryDecrypt"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_SymmetricAlgorithm, "CreateEncryptor"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_SymmetricAlgorithm, "CreateDecryptor")));

            BaseTypeTracker.Track(context,
                                  BaseTypeTracker.MatchSubclassesOf(
                                      KnownType.System_Security_Cryptography_AsymmetricAlgorithm,
                                      KnownType.System_Security_Cryptography_SymmetricAlgorithm));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "Encrypt"),
                                        new MemberDescriptor(KnownType.System_Security_Cryptography_RSA, "TryEncrypt")),
                                    Conditions.Or(
                                        InvocationTracker.ArgumentIsBoolConstant("fOAEP", false),
                                        HasPkcs1PaddingArgument()));

            // There exist no GCM mode with AesManaged, so any mode we set will be insecure. We do not raise
            // when inside an ObjectInitializerExpression, as the issue is already raised on the constructor
            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.System_Security_Cryptography_AesManaged, "Mode")),
                                        PropertyAccessTracker.MatchSetter(),
                                        Conditions.ExceptWhen(IsInsideObjectInitializer()));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(KnownType.System_Security_Cryptography_AesManaged));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(invocationsForFirstTwoArguments),
                                    Conditions.And(
                                        MethodHasRawSqlQueryParameter(),
                                        Conditions.Or(ArgumentAtIndexIsTracked(0), ArgumentAtIndexIsTracked(1))
                                        ),
                                    Conditions.ExceptWhen(InvocationTracker.ArgumentAtIndexIsConstant(0)));

            TrackInvocations(context, invocationsForFirstArgument, FirstArgumentIndex);
            TrackInvocations(context, invocationsForSecondArgument, SecondArgumentIndex);

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(properties),
                                        PropertyAccessTracker.MatchSetter(),
                                        c => IsTracked(GetSetValue(c), c),
                                        Conditions.ExceptWhen(PropertyAccessTracker.AssignedValueIsConstant()));

            TrackObjectCreation(context, constructorsForFirstArgument, FirstArgumentIndex);
            TrackObjectCreation(context, constructorsForSecondArgument, SecondArgumentIndex);
        }
Beispiel #17
0
        protected override void Initialize(SonarAnalysisContext context)
        {
            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.System_Security_Permissions_PrincipalPermission));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.WhenDerivesOrImplementsAny(
                                            KnownType.System_Security_Principal_IIdentity,
                                            KnownType.System_Security_Principal_IPrincipal));

            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_Security_Principal_WindowsIdentity, "GetCurrent"),
                                        new MemberDescriptor(KnownType.System_IdentityModel_Tokens_SecurityTokenHandler, "ValidateToken"),
                                        new MemberDescriptor(KnownType.System_AppDomain, "SetPrincipalPolicy"),
                                        new MemberDescriptor(KnownType.System_AppDomain, "SetThreadPrincipal")));

            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.System_Web_HttpContext, "User"),
                                            new MemberDescriptor(KnownType.System_Threading_Thread, "CurrentPrincipal")));

            MethodDeclarationTracker.Track(context,
                                           MethodDeclarationTracker.AnyParameterIsOfType(
                                               KnownType.System_Security_Principal_IIdentity,
                                               KnownType.System_Security_Principal_IPrincipal),
                                           MethodDeclarationTracker.IsOrdinaryMethod());

            MethodDeclarationTracker.Track(context,
                                           MethodDeclarationTracker.DecoratedWithAnyAttribute(
                                               KnownType.System_Security_Permissions_PrincipalPermissionAttribute));

            BaseTypeTracker.Track(context,
                                  BaseTypeTracker.MatchSubclassesOf(
                                      KnownType.System_Security_Principal_IIdentity,
                                      KnownType.System_Security_Principal_IPrincipal));
        }
Beispiel #18
0
        protected override void Initialize(SonarAnalysisContext context)
        {
            // ASP.NET Core
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.Microsoft_AspNetCore_Hosting_WebHostBuilderExtensions, "ConfigureLogging"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_DependencyInjection_LoggingServiceCollectionExtensions, "AddLogging"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_ConsoleLoggerExtensions, "AddConsole"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_DebugLoggerFactoryExtensions, "AddDebug"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_EventLoggerFactoryExtensions, "AddEventLog"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_EventLoggerFactoryExtensions, "AddEventSourceLogger"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_EventSourceLoggerFactoryExtensions, "AddEventSourceLogger"),
                                        new MemberDescriptor(KnownType.Microsoft_Extensions_Logging_AzureAppServicesLoggerFactoryExtensions, "AddAzureWebAppDiagnostics")),
                                    InvocationTracker.MethodIsExtension());

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.WhenImplements(KnownType.Microsoft_Extensions_Logging_ILoggerFactory));

            // log4net
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.log4net_Config_XmlConfigurator, "Configure"),
                                        new MemberDescriptor(KnownType.log4net_Config_XmlConfigurator, "ConfigureAndWatch"),
                                        new MemberDescriptor(KnownType.log4net_Config_DOMConfigurator, "Configure"),
                                        new MemberDescriptor(KnownType.log4net_Config_DOMConfigurator, "ConfigureAndWatch"),
                                        new MemberDescriptor(KnownType.log4net_Config_BasicConfigurator, "Configure")));

            // NLog
            PropertyAccessTracker.Track(context,
                                        PropertyAccessTracker.MatchSetter(),
                                        PropertyAccessTracker.MatchProperty(
                                            new MemberDescriptor(KnownType.NLog_LogManager, "Configuration")));

            // Serilog
            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.WhenDerivesFrom(KnownType.Serilog_LoggerConfiguration));
        }
        protected override void Initialize(SonarAnalysisContext context)
        {
            InvocationTracker.Track(context,
                                    InvocationTracker.MatchMethod(
                                        new MemberDescriptor(KnownType.System_IO_File, "AppendAllLines"),
                                        new MemberDescriptor(KnownType.System_IO_File, "AppendAllText"),
                                        new MemberDescriptor(KnownType.System_IO_File, "AppendText"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Copy"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Create"),
                                        new MemberDescriptor(KnownType.System_IO_File, "CreateText"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Decrypt"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Delete"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Encrypt"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Exists"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetAccessControl"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetAttributes"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetCreationTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetCreationTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetLastAccessTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetLastAccessTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetLastWriteTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "GetLastWriteTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Move"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Open"),
                                        new MemberDescriptor(KnownType.System_IO_File, "OpenRead"),
                                        new MemberDescriptor(KnownType.System_IO_File, "OpenText"),
                                        new MemberDescriptor(KnownType.System_IO_File, "OpenWrite"),
                                        new MemberDescriptor(KnownType.System_IO_File, "ReadAllBytes"),
                                        new MemberDescriptor(KnownType.System_IO_File, "ReadAllLines"),
                                        new MemberDescriptor(KnownType.System_IO_File, "ReadAllText"),
                                        new MemberDescriptor(KnownType.System_IO_File, "ReadLines"),
                                        new MemberDescriptor(KnownType.System_IO_File, "Replace"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetAccessControl"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetAttributes"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetCreationTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetCreationTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetLastAccessTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetLastAccessTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetLastWriteTime"),
                                        new MemberDescriptor(KnownType.System_IO_File, "SetLastWriteTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_File, "WriteAllBytes"),
                                        new MemberDescriptor(KnownType.System_IO_File, "WriteAllLines"),
                                        new MemberDescriptor(KnownType.System_IO_File, "WriteAllText"),

                                        new MemberDescriptor(KnownType.System_IO_Directory, "CreateDirectory"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "Delete"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "EnumerateDirectories"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "EnumerateFiles"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "EnumerateFileSystemEntries"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "Exists"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetAccessControl"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetCreationTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetCreationTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetCurrentDirectory"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetDirectories"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetDirectoryRoot"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetFiles"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetFileSystemEntries"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetLastAccessTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetLastAccessTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetLastWriteTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetLastWriteTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetLogicalDrives"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "GetParent"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "Move"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetAccessControl"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetCreationTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetCreationTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetCurrentDirectory"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetLastAccessTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetLastAccessTimeUtc"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetLastWriteTime"),
                                        new MemberDescriptor(KnownType.System_IO_Directory, "SetLastWriteTimeUtc"),

                                        new MemberDescriptor(KnownType.System_IO_Path, "GetTempFileName"),
                                        new MemberDescriptor(KnownType.System_IO_Path, "GetTempPath"),

                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetEnumerator"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetMachineStoreForApplication"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetMachineStoreForAssembly"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetMachineStoreForDomain"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetStore"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetUserStoreForApplication"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetUserStoreForAssembly"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetUserStoreForDomain"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "GetUserStoreForSite"),
                                        new MemberDescriptor(KnownType.System_IO_IsolatedStorage_IsolatedStorageFile, "Remove"),

                                        new MemberDescriptor(KnownType.System_IO_MemoryMappedFiles_MemoryMappedFile, "CreateFromFile"),
                                        new MemberDescriptor(KnownType.System_IO_MemoryMappedFiles_MemoryMappedFile, "CreateNew"),
                                        new MemberDescriptor(KnownType.System_IO_MemoryMappedFiles_MemoryMappedFile, "CreateOrOpen"),
                                        new MemberDescriptor(KnownType.System_IO_MemoryMappedFiles_MemoryMappedFile, "OpenExisting"),

                                        new MemberDescriptor(KnownType.System_IO_Compression_ZipFile, "CreateFromDirectory"),
                                        new MemberDescriptor(KnownType.System_IO_Compression_ZipFile, "ExtractToDirectory"),
                                        new MemberDescriptor(KnownType.System_IO_Compression_ZipFile, "Open"),
                                        new MemberDescriptor(KnownType.System_IO_Compression_ZipFile, "OpenRead")));

            InvocationTracker.Track(context,
                                    InvocationTracker.MethodNameIs("CreateFile"),
                                    InvocationTracker.MethodIsExtern());

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.System_IO_StreamWriter,
                                            KnownType.System_IO_StreamReader,
                                            KnownType.System_Security_AccessControl_FileSecurity),
                                        ObjectCreationTracker.ArgumentAtIndexIs(0, KnownType.System_String));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.System_IO_FileInfo,
                                            KnownType.System_IO_DirectoryInfo,
                                            KnownType.System_IO_IsolatedStorage_IsolatedStorageFileStream,
                                            KnownType.Microsoft_Win32_SafeHandles_SafeFileHandle));

            ObjectCreationTracker.Track(context,
                                        ObjectCreationTracker.MatchConstructor(
                                            KnownType.System_IO_FileStream),
                                        Conditions.ExceptWhen(
                                            ObjectCreationTracker.ArgumentAtIndexIs(0, KnownType.Microsoft_Win32_SafeHandles_SafeFileHandle)));
        }
 private void TrackInvocations(SonarAnalysisContext context, MemberDescriptor[] incovationsDescriptors, int argumentIndex) =>
 InvocationTracker.Track(context,
                         InvocationTracker.MatchMethod(incovationsDescriptors),
                         ArgumentAtIndexIsTracked(argumentIndex),
                         Conditions.ExceptWhen(InvocationTracker.ArgumentAtIndexIsConstant(argumentIndex)));
        public void Verify_NoSetupsOrInvocations_DoesntThrow()
        {
            var subject = new InvocationTracker(_setupManagerMock.Object);

            Assert.DoesNotThrow(() => subject.Verify());
        }