diff --git a/eng/Analyzers.props b/eng/Analyzers.props index 438ae20b4fe..760c10297da 100644 --- a/eng/Analyzers.props +++ b/eng/Analyzers.props @@ -1,9 +1,10 @@ - $(MSBuildThisFileDirectory)CodeAnalysis.ruleset - true + true - - + + + + diff --git a/eng/CodeAnalysis.Repository.ruleset b/eng/CodeAnalysis.Repository.ruleset deleted file mode 100644 index 0d127e147e1..00000000000 --- a/eng/CodeAnalysis.Repository.ruleset +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/eng/CodeAnalysis.Security.ruleset b/eng/CodeAnalysis.Security.ruleset deleted file mode 100644 index 792c1a3a72e..00000000000 --- a/eng/CodeAnalysis.Security.ruleset +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eng/CodeAnalysis.globalconfig b/eng/CodeAnalysis.globalconfig new file mode 100644 index 00000000000..13c3a3306ae --- /dev/null +++ b/eng/CodeAnalysis.globalconfig @@ -0,0 +1,1610 @@ +is_global = true + +# AD0001: Analyzer threw an exception +dotnet_diagnostic.AD0001.severity = suggestion + +# BCL0001: Ensure minimum API surface is respected +dotnet_diagnostic.BCL0001.severity = warning + +# BCL0010: AppContext default value expected to be true +dotnet_diagnostic.BCL0010.severity = warning + +# BCL0011: AppContext default value defined in if statement with incorrect pattern +dotnet_diagnostic.BCL0011.severity = warning + +# BCL0012: AppContext default value defined in if statement at root of switch case +dotnet_diagnostic.BCL0012.severity = warning + +# BCL0015: Invalid P/Invoke call +dotnet_diagnostic.BCL0015.severity = none + +# BCL0020: Invalid SR.Format call +dotnet_diagnostic.BCL0020.severity = warning + +# CA1000: Do not declare static members on generic types +dotnet_diagnostic.CA1000.severity = none + +# CA1001: Types that own disposable fields should be disposable +dotnet_diagnostic.CA1001.severity = none + +# CA1002: Do not expose generic lists +dotnet_diagnostic.CA1002.severity = none + +# CA1003: Use generic event handler instances +dotnet_diagnostic.CA1003.severity = none + +# CA1005: Avoid excessive parameters on generic types +dotnet_diagnostic.CA1005.severity = none + +# CA1008: Enums should have zero value +dotnet_diagnostic.CA1008.severity = none + +# CA1010: Generic interface should also be implemented +dotnet_diagnostic.CA1010.severity = none + +# CA1012: Abstract types should not have public constructors +dotnet_diagnostic.CA1012.severity = none + +# CA1014: Mark assemblies with CLSCompliant +dotnet_diagnostic.CA1014.severity = none + +# CA1016: Mark assemblies with assembly version +dotnet_diagnostic.CA1016.severity = none + +# CA1017: Mark assemblies with ComVisible +dotnet_diagnostic.CA1017.severity = none + +# CA1018: Mark attributes with AttributeUsageAttribute +dotnet_diagnostic.CA1018.severity = warning + +# CA1019: Define accessors for attribute arguments +dotnet_diagnostic.CA1019.severity = none + +# CA1021: Avoid out parameters +dotnet_diagnostic.CA1021.severity = none + +# CA1024: Use properties where appropriate +dotnet_diagnostic.CA1024.severity = none + +# CA1027: Mark enums with FlagsAttribute +dotnet_diagnostic.CA1027.severity = none + +# CA1028: Enum Storage should be Int32 +dotnet_diagnostic.CA1028.severity = none + +# CA1030: Use events where appropriate +dotnet_diagnostic.CA1030.severity = none + +# CA1031: Do not catch general exception types +dotnet_diagnostic.CA1031.severity = none + +# CA1032: Implement standard exception constructors +dotnet_diagnostic.CA1032.severity = none + +# CA1033: Interface methods should be callable by child types +dotnet_diagnostic.CA1033.severity = none + +# CA1034: Nested types should not be visible +dotnet_diagnostic.CA1034.severity = none + +# CA1036: Override methods on comparable types +dotnet_diagnostic.CA1036.severity = none + +# CA1040: Avoid empty interfaces +dotnet_diagnostic.CA1040.severity = none + +# CA1041: Provide ObsoleteAttribute message +dotnet_diagnostic.CA1041.severity = none + +# CA1043: Use Integral Or String Argument For Indexers +dotnet_diagnostic.CA1043.severity = none + +# CA1044: Properties should not be write only +dotnet_diagnostic.CA1044.severity = none + +# CA1045: Do not pass types by reference +dotnet_diagnostic.CA1045.severity = none + +# CA1046: Do not overload equality operator on reference types +dotnet_diagnostic.CA1046.severity = none + +# CA1047: Do not declare protected member in sealed type +dotnet_diagnostic.CA1047.severity = warning + +# CA1050: Declare types in namespaces +dotnet_diagnostic.CA1050.severity = warning + +# CA1051: Do not declare visible instance fields +dotnet_diagnostic.CA1051.severity = none + +# CA1052: Static holder types should be Static or NotInheritable +dotnet_diagnostic.CA1052.severity = warning +dotnet_code_quality.CA1052.api_surface = private, internal + +# CA1054: URI-like parameters should not be strings +dotnet_diagnostic.CA1054.severity = none + +# CA1055: URI-like return values should not be strings +dotnet_diagnostic.CA1055.severity = none + +# CA1056: URI-like properties should not be strings +dotnet_diagnostic.CA1056.severity = none + +# CA1058: Types should not extend certain base types +dotnet_diagnostic.CA1058.severity = none + +# CA1060: Move pinvokes to native methods class +dotnet_diagnostic.CA1060.severity = none + +# CA1061: Do not hide base class methods +dotnet_diagnostic.CA1061.severity = none + +# CA1062: Validate arguments of public methods +dotnet_diagnostic.CA1062.severity = none + +# CA1063: Implement IDisposable Correctly +dotnet_diagnostic.CA1063.severity = none + +# CA1064: Exceptions should be public +dotnet_diagnostic.CA1064.severity = none + +# CA1065: Do not raise exceptions in unexpected locations +dotnet_diagnostic.CA1065.severity = none + +# CA1066: Implement IEquatable when overriding Object.Equals +dotnet_diagnostic.CA1066.severity = warning + +# CA1067: Override Object.Equals(object) when implementing IEquatable +dotnet_diagnostic.CA1067.severity = warning + +# CA1068: CancellationToken parameters must come last +dotnet_diagnostic.CA1068.severity = none + +# CA1069: Enums values should not be duplicated +dotnet_diagnostic.CA1069.severity = none + +# CA1070: Do not declare event fields as virtual +dotnet_diagnostic.CA1070.severity = suggestion + +# CA1200: Avoid using cref tags with a prefix +dotnet_diagnostic.CA1200.severity = suggestion + +# CA1303: Do not pass literals as localized parameters +dotnet_diagnostic.CA1303.severity = none + +# CA1304: Specify CultureInfo +dotnet_diagnostic.CA1304.severity = none + +# CA1305: Specify IFormatProvider +dotnet_diagnostic.CA1305.severity = none + +# CA1307: Specify StringComparison for clarity +dotnet_diagnostic.CA1307.severity = none + +# CA1308: Normalize strings to uppercase +dotnet_diagnostic.CA1308.severity = none + +# CA1309: Use ordinal string comparison +dotnet_diagnostic.CA1309.severity = none + +# CA1310: Specify StringComparison for correctness +dotnet_diagnostic.CA1310.severity = suggestion + +# CA1311: Specify a culture or use an invariant version +dotnet_diagnostic.CA1311.severity = warning + +# CA1401: P/Invokes should not be visible +dotnet_diagnostic.CA1401.severity = warning + +# CA1416: Validate platform compatibility +dotnet_diagnostic.CA1416.severity = warning + +# CA1417: Do not use 'OutAttribute' on string parameters for P/Invokes +dotnet_diagnostic.CA1417.severity = warning + +# CA1418: Use valid platform string +dotnet_diagnostic.CA1418.severity = warning + +# CA1419: Provide a parameterless constructor that is as visible as the containing type for concrete types derived from 'System.Runtime.InteropServices.SafeHandle' +dotnet_diagnostic.CA1419.severity = warning + +# CA1420: Property, type, or attribute requires runtime marshalling +dotnet_diagnostic.CA1420.severity = warning + +# CA1421: This method uses runtime marshalling even when the 'DisableRuntimeMarshallingAttribute' is applied +dotnet_diagnostic.CA1421.severity = suggestion + +# CA1501: Avoid excessive inheritance +dotnet_diagnostic.CA1501.severity = none + +# CA1502: Avoid excessive complexity +dotnet_diagnostic.CA1502.severity = none + +# CA1505: Avoid unmaintainable code +dotnet_diagnostic.CA1505.severity = none + +# CA1506: Avoid excessive class coupling +dotnet_diagnostic.CA1506.severity = none + +# CA1507: Use nameof to express symbol names +dotnet_diagnostic.CA1507.severity = warning + +# CA1508: Avoid dead conditional code +dotnet_diagnostic.CA1508.severity = none + +# CA1509: Invalid entry in code metrics rule specification file +dotnet_diagnostic.CA1509.severity = none + +# CA1700: Do not name enum values 'Reserved' +dotnet_diagnostic.CA1700.severity = none + +# CA1707: Identifiers should not contain underscores +dotnet_diagnostic.CA1707.severity = none + +# CA1708: Identifiers should differ by more than case +dotnet_diagnostic.CA1708.severity = none + +# CA1710: Identifiers should have correct suffix +dotnet_diagnostic.CA1710.severity = none + +# CA1711: Identifiers should not have incorrect suffix +dotnet_diagnostic.CA1711.severity = none + +# CA1712: Do not prefix enum values with type name +dotnet_diagnostic.CA1712.severity = none + +# CA1713: Events should not have 'Before' or 'After' prefix +dotnet_diagnostic.CA1713.severity = none + +# CA1715: Identifiers should have correct prefix +dotnet_diagnostic.CA1715.severity = none + +# CA1716: Identifiers should not match keywords +dotnet_diagnostic.CA1716.severity = none + +# CA1720: Identifier contains type name +dotnet_diagnostic.CA1720.severity = none + +# CA1721: Property names should not match get methods +dotnet_diagnostic.CA1721.severity = none + +# CA1724: Type names should not match namespaces +dotnet_diagnostic.CA1724.severity = none + +# CA1725: Parameter names should match base declaration +dotnet_diagnostic.CA1725.severity = suggestion + +# CA1727: Use PascalCase for named placeholders +dotnet_diagnostic.CA1727.severity = warning + +# CA1802: Use literals where appropriate +dotnet_diagnostic.CA1802.severity = warning +dotnet_code_quality.CA1802.api_surface = private, internal + +# CA1805: Do not initialize unnecessarily +dotnet_diagnostic.CA1805.severity = warning + +# CA1806: Do not ignore method results +dotnet_diagnostic.CA1806.severity = none + +# CA1810: Initialize reference type static fields inline +dotnet_diagnostic.CA1810.severity = warning + +# CA1812: Avoid uninstantiated internal classes +dotnet_diagnostic.CA1812.severity = none + +# CA1813: Avoid unsealed attributes +dotnet_diagnostic.CA1813.severity = none + +# CA1814: Prefer jagged arrays over multidimensional +dotnet_diagnostic.CA1814.severity = none + +# CA1815: Override equals and operator equals on value types +dotnet_diagnostic.CA1815.severity = none + +# CA1816: Dispose methods should call SuppressFinalize +dotnet_diagnostic.CA1816.severity = none + +# CA1819: Properties should not return arrays +dotnet_diagnostic.CA1819.severity = none + +# CA1820: Test for empty strings using string length +dotnet_diagnostic.CA1820.severity = none + +# CA1821: Remove empty Finalizers +dotnet_diagnostic.CA1821.severity = warning + +# CA1822: Mark members as static +dotnet_diagnostic.CA1822.severity = warning +dotnet_code_quality.CA1822.api_surface = private, internal + +# CA1823: Avoid unused private fields +dotnet_diagnostic.CA1823.severity = warning + +# CA1824: Mark assemblies with NeutralResourcesLanguageAttribute +dotnet_diagnostic.CA1824.severity = warning + +# CA1825: Avoid zero-length array allocations +dotnet_diagnostic.CA1825.severity = warning + +# CA1826: Do not use Enumerable methods on indexable collections +dotnet_diagnostic.CA1826.severity = warning + +# CA1827: Do not use Count() or LongCount() when Any() can be used +dotnet_diagnostic.CA1827.severity = warning + +# CA1828: Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used +dotnet_diagnostic.CA1828.severity = warning + +# CA1829: Use Length/Count property instead of Count() when available +dotnet_diagnostic.CA1829.severity = warning + +# CA1830: Prefer strongly-typed Append and Insert method overloads on StringBuilder +dotnet_diagnostic.CA1830.severity = warning + +# CA1831: Use AsSpan or AsMemory instead of Range-based indexers when appropriate +dotnet_diagnostic.CA1831.severity = warning + +# CA1832: Use AsSpan or AsMemory instead of Range-based indexers when appropriate +dotnet_diagnostic.CA1832.severity = warning + +# CA1833: Use AsSpan or AsMemory instead of Range-based indexers when appropriate +dotnet_diagnostic.CA1833.severity = warning + +# CA1834: Consider using 'StringBuilder.Append(char)' when applicable +dotnet_diagnostic.CA1834.severity = warning + +# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync' +dotnet_diagnostic.CA1835.severity = warning + +# CA1836: Prefer IsEmpty over Count +dotnet_diagnostic.CA1836.severity = warning + +# CA1837: Use 'Environment.ProcessId' +dotnet_diagnostic.CA1837.severity = warning + +# CA1838: Avoid 'StringBuilder' parameters for P/Invokes +dotnet_diagnostic.CA1838.severity = warning + +# CA1839: Use 'Environment.ProcessPath' +dotnet_diagnostic.CA1839.severity = warning + +# CA1840: Use 'Environment.CurrentManagedThreadId' +dotnet_diagnostic.CA1840.severity = warning + +# CA1841: Prefer Dictionary.Contains methods +dotnet_diagnostic.CA1841.severity = warning + +# CA1842: Do not use 'WhenAll' with a single task +dotnet_diagnostic.CA1842.severity = warning + +# CA1843: Do not use 'WaitAll' with a single task +dotnet_diagnostic.CA1843.severity = warning + +# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream' +dotnet_diagnostic.CA1844.severity = warning + +# CA1845: Use span-based 'string.Concat' +dotnet_diagnostic.CA1845.severity = warning + +# CA1846: Prefer 'AsSpan' over 'Substring' +dotnet_diagnostic.CA1846.severity = warning + +# CA1847: Use char literal for a single character lookup +dotnet_diagnostic.CA1847.severity = warning + +# CA1848: Use the LoggerMessage delegates +dotnet_diagnostic.CA1848.severity = none + +# CA1849: Call async methods when in an async method +dotnet_diagnostic.CA1849.severity = suggestion + +# CA1850: Prefer static 'HashData' method over 'ComputeHash' +dotnet_diagnostic.CA1850.severity = warning + +# CA1851: Possible multiple enumerations of 'IEnumerable' collection +dotnet_diagnostic.CA1851.severity = suggestion + +# CA1852: Seal internal types +dotnet_diagnostic.CA1852.severity = warning + +# CA1853: Unnecessary call to 'Dictionary.ContainsKey(key)' +dotnet_diagnostic.CA1853.severity = warning + +# CA1854: Prefer the 'IDictionary.TryGetValue(TKey, out TValue)' method +dotnet_diagnostic.CA1854.severity = warning + +# CA2000: Dispose objects before losing scope +dotnet_diagnostic.CA2000.severity = none + +# CA2002: Do not lock on objects with weak identity +dotnet_diagnostic.CA2002.severity = none + +# CA2007: Consider calling ConfigureAwait on the awaited task +# TODO: Change to warning +dotnet_diagnostic.CA2007.severity = none + +# CA2008: Do not create tasks without passing a TaskScheduler +dotnet_diagnostic.CA2008.severity = warning + +# CA2009: Do not call ToImmutableCollection on an ImmutableCollection value +dotnet_diagnostic.CA2009.severity = warning + +# CA2011: Avoid infinite recursion +dotnet_diagnostic.CA2011.severity = warning + +# CA2012: Use ValueTasks correctly +dotnet_diagnostic.CA2012.severity = warning + +# CA2013: Do not use ReferenceEquals with value types +dotnet_diagnostic.CA2013.severity = warning + +# CA2014: Do not use stackalloc in loops +dotnet_diagnostic.CA2014.severity = warning + +# CA2015: Do not define finalizers for types derived from MemoryManager +dotnet_diagnostic.CA2015.severity = warning + +# CA2016: Forward the 'CancellationToken' parameter to methods +dotnet_diagnostic.CA2016.severity = warning + +# CA2017: Parameter count mismatch +dotnet_diagnostic.CA2017.severity = warning + +# CA2018: 'Buffer.BlockCopy' expects the number of bytes to be copied for the 'count' argument +dotnet_diagnostic.CA2018.severity = warning + +# CA2019: Improper 'ThreadStatic' field initialization +dotnet_diagnostic.CA2019.severity = warning + +# CA2100: Review SQL queries for security vulnerabilities +dotnet_diagnostic.CA2100.severity = none + +# CA2101: Specify marshaling for P/Invoke string arguments +dotnet_diagnostic.CA2101.severity = none + +# CA2109: Review visible event handlers +dotnet_diagnostic.CA2109.severity = none + +# CA2119: Seal methods that satisfy private interfaces +dotnet_diagnostic.CA2119.severity = none + +# CA2153: Do Not Catch Corrupted State Exceptions +dotnet_diagnostic.CA2153.severity = none + +# CA2200: Rethrow to preserve stack details +dotnet_diagnostic.CA2200.severity = warning + +# CA2201: Do not raise reserved exception types +dotnet_diagnostic.CA2201.severity = none + +# CA2207: Initialize value type static fields inline +dotnet_diagnostic.CA2207.severity = warning + +# CA2208: Instantiate argument exceptions correctly +dotnet_diagnostic.CA2208.severity = warning +dotnet_code_quality.CA2208.api_surface = public + +# CA2211: Non-constant fields should not be visible +dotnet_diagnostic.CA2211.severity = none + +# CA2213: Disposable fields should be disposed +dotnet_diagnostic.CA2213.severity = none + +# CA2214: Do not call overridable methods in constructors +dotnet_diagnostic.CA2214.severity = none + +# CA2215: Dispose methods should call base class dispose +dotnet_diagnostic.CA2215.severity = none + +# CA2216: Disposable types should declare finalizer +dotnet_diagnostic.CA2216.severity = none + +# CA2217: Do not mark enums with FlagsAttribute +dotnet_diagnostic.CA2217.severity = none + +# CA2218: Override GetHashCode on overriding Equals +dotnet_diagnostic.CA2218.severity = none + +# CA2219: Do not raise exceptions in finally clauses +dotnet_diagnostic.CA2219.severity = none + +# CA2224: Override Equals on overloading operator equals +dotnet_diagnostic.CA2224.severity = none + +# CA2225: Operator overloads have named alternates +dotnet_diagnostic.CA2225.severity = none + +# CA2226: Operators should have symmetrical overloads +dotnet_diagnostic.CA2226.severity = none + +# CA2227: Collection properties should be read only +dotnet_diagnostic.CA2227.severity = none + +# CA2229: Implement serialization constructors +dotnet_diagnostic.CA2229.severity = warning + +# CA2231: Overload operator equals on overriding value type Equals +dotnet_diagnostic.CA2231.severity = none + +# CA2234: Pass system uri objects instead of strings +dotnet_diagnostic.CA2234.severity = none + +# CA2235: Mark all non-serializable fields +dotnet_diagnostic.CA2235.severity = none + +# CA2237: Mark ISerializable types with serializable +dotnet_diagnostic.CA2237.severity = none + +# CA2241: Provide correct arguments to formatting methods +dotnet_diagnostic.CA2241.severity = warning + +# CA2242: Test for NaN correctly +dotnet_diagnostic.CA2242.severity = warning + +# CA2243: Attribute string literals should parse correctly +dotnet_diagnostic.CA2243.severity = warning + +# CA2244: Do not duplicate indexed element initializations +dotnet_diagnostic.CA2244.severity = warning + +# CA2245: Do not assign a property to itself +dotnet_diagnostic.CA2245.severity = warning + +# CA2246: Assigning symbol and its member in the same statement +dotnet_diagnostic.CA2246.severity = warning + +# CA2247: Argument passed to TaskCompletionSource constructor should be TaskCreationOptions enum instead of TaskContinuationOptions enum +dotnet_diagnostic.CA2247.severity = warning + +# CA2248: Provide correct 'enum' argument to 'Enum.HasFlag' +dotnet_diagnostic.CA2248.severity = warning + +# CA2249: Consider using 'string.Contains' instead of 'string.IndexOf' +dotnet_diagnostic.CA2249.severity = warning + +# CA2250: Use 'ThrowIfCancellationRequested' +dotnet_diagnostic.CA2250.severity = warning + +# CA2251: Use 'string.Equals' +dotnet_diagnostic.CA2251.severity = warning + +# CA2252: This API requires opting into preview features +dotnet_diagnostic.CA2252.severity = error + +# CA2253: Named placeholders should not be numeric values +dotnet_diagnostic.CA2253.severity = warning + +# CA2254: Template should be a static expression +dotnet_diagnostic.CA2254.severity = none + +# CA2255: The 'ModuleInitializer' attribute should not be used in libraries +dotnet_diagnostic.CA2255.severity = warning + +# CA2256: All members declared in parent interfaces must have an implementation in a DynamicInterfaceCastableImplementation-attributed interface +dotnet_diagnostic.CA2256.severity = warning + +# CA2257: Members defined on an interface with the 'DynamicInterfaceCastableImplementationAttribute' should be 'static' +dotnet_diagnostic.CA2257.severity = warning + +# CA2258: Providing a 'DynamicInterfaceCastableImplementation' interface in Visual Basic is unsupported +dotnet_diagnostic.CA2258.severity = warning + +# CA2259: 'ThreadStatic' only affects static fields +dotnet_diagnostic.CA2259.severity = warning + +# CA2300: Do not use insecure deserializer BinaryFormatter +dotnet_diagnostic.CA2300.severity = none + +# CA2301: Do not call BinaryFormatter.Deserialize without first setting BinaryFormatter.Binder +dotnet_diagnostic.CA2301.severity = none + +# CA2302: Ensure BinaryFormatter.Binder is set before calling BinaryFormatter.Deserialize +dotnet_diagnostic.CA2302.severity = none + +# CA2305: Do not use insecure deserializer LosFormatter +dotnet_diagnostic.CA2305.severity = none + +# CA2310: Do not use insecure deserializer NetDataContractSerializer +dotnet_diagnostic.CA2310.severity = none + +# CA2311: Do not deserialize without first setting NetDataContractSerializer.Binder +dotnet_diagnostic.CA2311.severity = none + +# CA2312: Ensure NetDataContractSerializer.Binder is set before deserializing +dotnet_diagnostic.CA2312.severity = none + +# CA2315: Do not use insecure deserializer ObjectStateFormatter +dotnet_diagnostic.CA2315.severity = none + +# CA2321: Do not deserialize with JavaScriptSerializer using a SimpleTypeResolver +dotnet_diagnostic.CA2321.severity = none + +# CA2322: Ensure JavaScriptSerializer is not initialized with SimpleTypeResolver before deserializing +dotnet_diagnostic.CA2322.severity = none + +# CA2326: Do not use TypeNameHandling values other than None +dotnet_diagnostic.CA2326.severity = none + +# CA2327: Do not use insecure JsonSerializerSettings +dotnet_diagnostic.CA2327.severity = none + +# CA2328: Ensure that JsonSerializerSettings are secure +dotnet_diagnostic.CA2328.severity = none + +# CA2329: Do not deserialize with JsonSerializer using an insecure configuration +dotnet_diagnostic.CA2329.severity = none + +# CA2330: Ensure that JsonSerializer has a secure configuration when deserializing +dotnet_diagnostic.CA2330.severity = none + +# CA2350: Do not use DataTable.ReadXml() with untrusted data +dotnet_diagnostic.CA2350.severity = none + +# CA2351: Do not use DataSet.ReadXml() with untrusted data +dotnet_diagnostic.CA2351.severity = none + +# CA2352: Unsafe DataSet or DataTable in serializable type can be vulnerable to remote code execution attacks +dotnet_diagnostic.CA2352.severity = none + +# CA2353: Unsafe DataSet or DataTable in serializable type +dotnet_diagnostic.CA2353.severity = none + +# CA2354: Unsafe DataSet or DataTable in deserialized object graph can be vulnerable to remote code execution attacks +dotnet_diagnostic.CA2354.severity = none + +# CA2355: Unsafe DataSet or DataTable type found in deserializable object graph +dotnet_diagnostic.CA2355.severity = none + +# CA2356: Unsafe DataSet or DataTable type in web deserializable object graph +dotnet_diagnostic.CA2356.severity = none + +# CA2361: Ensure auto-generated class containing DataSet.ReadXml() is not used with untrusted data +dotnet_diagnostic.CA2361.severity = none + +# CA2362: Unsafe DataSet or DataTable in auto-generated serializable type can be vulnerable to remote code execution attacks +dotnet_diagnostic.CA2362.severity = none + +# CA3001: Review code for SQL injection vulnerabilities +dotnet_diagnostic.CA3001.severity = none + +# CA3002: Review code for XSS vulnerabilities +dotnet_diagnostic.CA3002.severity = none + +# CA3003: Review code for file path injection vulnerabilities +dotnet_diagnostic.CA3003.severity = none + +# CA3004: Review code for information disclosure vulnerabilities +dotnet_diagnostic.CA3004.severity = none + +# CA3005: Review code for LDAP injection vulnerabilities +dotnet_diagnostic.CA3005.severity = none + +# CA3006: Review code for process command injection vulnerabilities +dotnet_diagnostic.CA3006.severity = none + +# CA3007: Review code for open redirect vulnerabilities +dotnet_diagnostic.CA3007.severity = none + +# CA3008: Review code for XPath injection vulnerabilities +dotnet_diagnostic.CA3008.severity = none + +# CA3009: Review code for XML injection vulnerabilities +dotnet_diagnostic.CA3009.severity = none + +# CA3010: Review code for XAML injection vulnerabilities +dotnet_diagnostic.CA3010.severity = none + +# CA3011: Review code for DLL injection vulnerabilities +dotnet_diagnostic.CA3011.severity = none + +# CA3012: Review code for regex injection vulnerabilities +dotnet_diagnostic.CA3012.severity = none + +# CA3061: Do Not Add Schema By URL +dotnet_diagnostic.CA3061.severity = warning + +# CA3075: Insecure DTD processing in XML +dotnet_diagnostic.CA3075.severity = warning + +# CA3076: Insecure XSLT script processing. +dotnet_diagnostic.CA3076.severity = warning + +# CA3077: Insecure Processing in API Design, XmlDocument and XmlTextReader +dotnet_diagnostic.CA3077.severity = warning + +# CA3147: Mark Verb Handlers With Validate Antiforgery Token +dotnet_diagnostic.CA3147.severity = warning + +# CA5350: Do Not Use Weak Cryptographic Algorithms +dotnet_diagnostic.CA5350.severity = warning + +# CA5351: Do Not Use Broken Cryptographic Algorithms +dotnet_diagnostic.CA5351.severity = warning + +# CA5358: Review cipher mode usage with cryptography experts +dotnet_diagnostic.CA5358.severity = none + +# CA5359: Do Not Disable Certificate Validation +dotnet_diagnostic.CA5359.severity = warning + +# CA5360: Do Not Call Dangerous Methods In Deserialization +dotnet_diagnostic.CA5360.severity = warning + +# CA5361: Do Not Disable SChannel Use of Strong Crypto +dotnet_diagnostic.CA5361.severity = warning + +# CA5362: Potential reference cycle in deserialized object graph +dotnet_diagnostic.CA5362.severity = none + +# CA5363: Do Not Disable Request Validation +dotnet_diagnostic.CA5363.severity = warning + +# CA5364: Do Not Use Deprecated Security Protocols +dotnet_diagnostic.CA5364.severity = warning + +# CA5365: Do Not Disable HTTP Header Checking +dotnet_diagnostic.CA5365.severity = warning + +# CA5366: Use XmlReader for 'DataSet.ReadXml()' +dotnet_diagnostic.CA5366.severity = none + +# CA5367: Do Not Serialize Types With Pointer Fields +dotnet_diagnostic.CA5367.severity = none + +# CA5368: Set ViewStateUserKey For Classes Derived From Page +dotnet_diagnostic.CA5368.severity = warning + +# CA5369: Use XmlReader for 'XmlSerializer.Deserialize()' +dotnet_diagnostic.CA5369.severity = none + +# CA5370: Use XmlReader for XmlValidatingReader constructor +dotnet_diagnostic.CA5370.severity = warning + +# CA5371: Use XmlReader for 'XmlSchema.Read()' +dotnet_diagnostic.CA5371.severity = none + +# CA5372: Use XmlReader for XPathDocument constructor +dotnet_diagnostic.CA5372.severity = none + +# CA5373: Do not use obsolete key derivation function +dotnet_diagnostic.CA5373.severity = warning + +# CA5374: Do Not Use XslTransform +dotnet_diagnostic.CA5374.severity = warning + +# CA5375: Do Not Use Account Shared Access Signature +dotnet_diagnostic.CA5375.severity = none + +# CA5376: Use SharedAccessProtocol HttpsOnly +dotnet_diagnostic.CA5376.severity = warning + +# CA5377: Use Container Level Access Policy +dotnet_diagnostic.CA5377.severity = warning + +# CA5378: Do not disable ServicePointManagerSecurityProtocols +dotnet_diagnostic.CA5378.severity = warning + +# CA5379: Ensure Key Derivation Function algorithm is sufficiently strong +dotnet_diagnostic.CA5379.severity = warning + +# CA5380: Do Not Add Certificates To Root Store +dotnet_diagnostic.CA5380.severity = warning + +# CA5381: Ensure Certificates Are Not Added To Root Store +dotnet_diagnostic.CA5381.severity = warning + +# CA5382: Use Secure Cookies In ASP.NET Core +dotnet_diagnostic.CA5382.severity = none + +# CA5383: Ensure Use Secure Cookies In ASP.NET Core +dotnet_diagnostic.CA5383.severity = none + +# CA5384: Do Not Use Digital Signature Algorithm (DSA) +dotnet_diagnostic.CA5384.severity = warning + +# CA5385: Use Rivest-Shamir-Adleman (RSA) Algorithm With Sufficient Key Size +dotnet_diagnostic.CA5385.severity = warning + +# CA5386: Avoid hardcoding SecurityProtocolType value +dotnet_diagnostic.CA5386.severity = none + +# CA5387: Do Not Use Weak Key Derivation Function With Insufficient Iteration Count +dotnet_diagnostic.CA5387.severity = none + +# CA5388: Ensure Sufficient Iteration Count When Using Weak Key Derivation Function +dotnet_diagnostic.CA5388.severity = none + +# CA5389: Do Not Add Archive Item's Path To The Target File System Path +dotnet_diagnostic.CA5389.severity = none + +# CA5390: Do not hard-code encryption key +dotnet_diagnostic.CA5390.severity = none + +# CA5391: Use antiforgery tokens in ASP.NET Core MVC controllers +dotnet_diagnostic.CA5391.severity = none + +# CA5392: Use DefaultDllImportSearchPaths attribute for P/Invokes +dotnet_diagnostic.CA5392.severity = none + +# CA5393: Do not use unsafe DllImportSearchPath value +dotnet_diagnostic.CA5393.severity = none + +# CA5394: Do not use insecure randomness +dotnet_diagnostic.CA5394.severity = none + +# CA5395: Miss HttpVerb attribute for action methods +dotnet_diagnostic.CA5395.severity = none + +# CA5396: Set HttpOnly to true for HttpCookie +dotnet_diagnostic.CA5396.severity = none + +# CA5397: Do not use deprecated SslProtocols values +dotnet_diagnostic.CA5397.severity = none + +# CA5398: Avoid hardcoded SslProtocols values +dotnet_diagnostic.CA5398.severity = none + +# CA5399: HttpClients should enable certificate revocation list checks +dotnet_diagnostic.CA5399.severity = none + +# CA5400: Ensure HttpClient certificate revocation list check is not disabled +dotnet_diagnostic.CA5400.severity = none + +# CA5401: Do not use CreateEncryptor with non-default IV +dotnet_diagnostic.CA5401.severity = none + +# CA5402: Use CreateEncryptor with the default IV +dotnet_diagnostic.CA5402.severity = none + +# CA5403: Do not hard-code certificate +dotnet_diagnostic.CA5403.severity = none + +# CA5404: Do not disable token validation checks +dotnet_diagnostic.CA5404.severity = none + +# CA5405: Do not always skip token validation in delegates +dotnet_diagnostic.CA5405.severity = none + +# IL3000: Avoid using accessing Assembly file path when publishing as a single-file +dotnet_diagnostic.IL3000.severity = warning + +# IL3001: Avoid using accessing Assembly file path when publishing as a single-file +dotnet_diagnostic.IL3001.severity = warning + +# IL3002: Using member with RequiresAssemblyFilesAttribute can break functionality when embedded in a single-file app +dotnet_diagnostic.IL3002.severity = warning + +# SA0001: XML comments +dotnet_diagnostic.SA0001.severity = none + +# SA1000: Spacing around keywords +# suggestion until https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3478 is resolved +dotnet_diagnostic.SA1000.severity = suggestion + +# SA1001: Commas should not be preceded by whitespace +dotnet_diagnostic.SA1001.severity = warning + +# SA1002: Semicolons should not be preceded by a space +dotnet_diagnostic.SA1002.severity = none + +# SA1003: Operator should not appear at the end of a line +dotnet_diagnostic.SA1003.severity = none + +# SA1004: Documentation line should begin with a space +dotnet_diagnostic.SA1004.severity = none + +# SA1005: Single line comment should begin with a space +dotnet_diagnostic.SA1005.severity = none + +# SA1008: Opening parenthesis should not be preceded by a space +dotnet_diagnostic.SA1008.severity = none + +# SA1009: Closing parenthesis should not be followed by a space +dotnet_diagnostic.SA1009.severity = none + +# SA1010: Opening square brackets should not be preceded by a space +dotnet_diagnostic.SA1010.severity = none + +# SA1011: Closing square bracket should be followed by a space +dotnet_diagnostic.SA1011.severity = none + +# SA1012: Opening brace should be followed by a space +dotnet_diagnostic.SA1012.severity = none + +# SA1013: Closing brace should be preceded by a space +dotnet_diagnostic.SA1013.severity = none + +# SA1014: Opening generic brackets should not be preceded by a space +dotnet_diagnostic.SA1014.severity = warning + +# SA1015: Closing generic bracket should not be followed by a space +dotnet_diagnostic.SA1015.severity = none + +# SA1018: Nullable type symbol should not be preceded by a space +dotnet_diagnostic.SA1018.severity = warning + +# SA1020: Increment symbol should not be preceded by a space +dotnet_diagnostic.SA1020.severity = warning + +# SA1021: Negative sign should be preceded by a space +dotnet_diagnostic.SA1021.severity = none + +# SA1023: Dereference symbol '*' should not be preceded by a space." +dotnet_diagnostic.SA1023.severity = none + +# SA1024: Colon should be followed by a space +dotnet_diagnostic.SA1024.severity = none + +# SA1025: Code should not contain multiple whitespace characters in a row +dotnet_diagnostic.SA1025.severity = none + +# SA1026: Keyword followed by span or blank line +dotnet_diagnostic.SA1026.severity = warning + +# SA1027: Tabs and spaces should be used correctly +dotnet_diagnostic.SA1027.severity = warning + +# SA1028: Code should not contain trailing whitespace +dotnet_diagnostic.SA1028.severity = warning + +# SA1100: Do not prefix calls with base unless local implementation exists +dotnet_diagnostic.SA1100.severity = none + +# SA1101: Prefix local calls with this +dotnet_diagnostic.SA1101.severity = none + +# SA1102: Query clause should follow previous clause +dotnet_diagnostic.SA1102.severity = warning + +# SA1105: Query clauses spanning multiple lines should begin on own line +dotnet_diagnostic.SA1105.severity = warning + +# SA1106: Code should not contain empty statements +dotnet_diagnostic.SA1106.severity = none + +# SA1107: Code should not contain multiple statements on one line +dotnet_diagnostic.SA1107.severity = none + +# SA1108: Block statements should not contain embedded comments +dotnet_diagnostic.SA1108.severity = none + +# SA1110: Opening parenthesis or bracket should be on declaration line +dotnet_diagnostic.SA1110.severity = none + +# SA1111: Closing parenthesis should be on line of last parameter +dotnet_diagnostic.SA1111.severity = none + +# SA1113: Comma should be on the same line as previous parameter +dotnet_diagnostic.SA1113.severity = warning + +# SA1114: Parameter list should follow declaration +dotnet_diagnostic.SA1114.severity = none + +# SA1115: Parameter should begin on the line after the previous parameter +dotnet_diagnostic.SA1115.severity = warning + +# SA1116: Split parameters should start on line after declaration +dotnet_diagnostic.SA1116.severity = none + +# SA1117: Parameters should be on same line or separate lines +dotnet_diagnostic.SA1117.severity = none + +# SA1118: Parameter should not span multiple lines +dotnet_diagnostic.SA1118.severity = none + +# SA1119: Statement should not use unnecessary parenthesis +dotnet_diagnostic.SA1119.severity = none + +# SA1120: Comments should contain text +dotnet_diagnostic.SA1120.severity = none + +# SA1121: Use built-in type alias +dotnet_diagnostic.SA1121.severity = warning + +# SA1122: Use string.Empty for empty strings +dotnet_diagnostic.SA1122.severity = none + +# SA1123: Region should not be located within a code element +dotnet_diagnostic.SA1123.severity = none + +# SA1124: Do not use regions +dotnet_diagnostic.SA1124.severity = none + +# SA1125: Use shorthand for nullable types +dotnet_diagnostic.SA1125.severity = none + +# SA1127: Generic type constraints should be on their own line +dotnet_diagnostic.SA1127.severity = none + +# SA1128: Put constructor initializers on their own line +dotnet_diagnostic.SA1128.severity = none + +# SA1129: Do not use default value type constructor +dotnet_diagnostic.SA1129.severity = warning + +# SA1130: Use lambda syntax +dotnet_diagnostic.SA1130.severity = none + +# SA1131: Constant values should appear on the right-hand side of comparisons +dotnet_diagnostic.SA1131.severity = none + +# SA1132: Do not combine fields +dotnet_diagnostic.SA1132.severity = none + +# SA1133: Do not combine attributes +dotnet_diagnostic.SA1133.severity = none + +# SA1134: Each attribute should be placed on its own line of code +dotnet_diagnostic.SA1134.severity = none + +# SA1135: Using directive should be qualified +dotnet_diagnostic.SA1135.severity = none + +# SA1136: Enum values should be on separate lines +dotnet_diagnostic.SA1136.severity = none + +# SA1137: Elements should have the same indentation +dotnet_diagnostic.SA1137.severity = none + +# SA1139: Use literal suffix notation instead of casting +dotnet_diagnostic.SA1139.severity = none + +# SA1141: Use tuple syntax +dotnet_diagnostic.SA1141.severity = warning + +# SA1142: Refer to tuple elements by name +dotnet_diagnostic.SA1142.severity = warning + +# SA1200: Using directive should appear within a namespace declaration +dotnet_diagnostic.SA1200.severity = none + +# SA1201: Elements should appear in the correct order +dotnet_diagnostic.SA1201.severity = none + +# SA1202: Elements should be ordered by access +dotnet_diagnostic.SA1202.severity = none + +# SA1203: Constants should appear before fields +dotnet_diagnostic.SA1203.severity = none + +# SA1204: Static elements should appear before instance elements +dotnet_diagnostic.SA1204.severity = none + +# SA1205: Partial elements should declare an access modifier +dotnet_diagnostic.SA1205.severity = warning + +# SA1206: Keyword ordering - TODO Re-enable as warning after https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3527 +dotnet_diagnostic.SA1206.severity = suggestion + +# SA1208: Using directive ordering +dotnet_diagnostic.SA1208.severity = none + +# SA1209: Using alias directives should be placed after all using namespace directives +dotnet_diagnostic.SA1209.severity = none + +# SA1210: Using directives should be ordered alphabetically by the namespaces +dotnet_diagnostic.SA1210.severity = none + +# SA1211: Using alias directive ordering +dotnet_diagnostic.SA1211.severity = none + +# SA1212: A get accessor appears after a set accessor within a property or indexer +dotnet_diagnostic.SA1212.severity = warning + +# SA1214: Readonly fields should appear before non-readonly fields +dotnet_diagnostic.SA1214.severity = none + +# SA1216: Using static directives should be placed at the correct location +dotnet_diagnostic.SA1216.severity = none + +# SA1300: Element should begin with an uppercase letter +dotnet_diagnostic.SA1300.severity = none + +# SA1302: Interface names should begin with I +dotnet_diagnostic.SA1302.severity = warning + +# SA1303: Const field names should begin with upper-case letter +dotnet_diagnostic.SA1303.severity = none + +# SA1304: Non-private readonly fields should begin with upper-case letter +dotnet_diagnostic.SA1304.severity = none + +# SA1306: Field should begin with lower-case letter +dotnet_diagnostic.SA1306.severity = none + +# SA1307: Field should begin with upper-case letter +dotnet_diagnostic.SA1307.severity = none + +# SA1308: Field should not begin with the prefix 's_' +dotnet_diagnostic.SA1308.severity = none + +# SA1309: Field names should not begin with underscore +dotnet_diagnostic.SA1309.severity = none + +# SA1310: Field should not contain an underscore +dotnet_diagnostic.SA1310.severity = none + +# SA1311: Static readonly fields should begin with upper-case letter +dotnet_diagnostic.SA1311.severity = none + +# SA1312: Variable should begin with lower-case letter +dotnet_diagnostic.SA1312.severity = none + +# SA1313: Parameter should begin with lower-case letter +dotnet_diagnostic.SA1313.severity = none + +# SA1314: Type parameter names should begin with T +dotnet_diagnostic.SA1314.severity = none + +# SA1316: Tuple element names should use correct casing +dotnet_diagnostic.SA1316.severity = none + +# SA1400: Member should declare an access modifier +dotnet_diagnostic.SA1400.severity = warning + +# SA1401: Fields should be private +dotnet_diagnostic.SA1401.severity = none + +# SA1402: File may only contain a single type +dotnet_diagnostic.SA1402.severity = none + +# SA1403: File may only contain a single namespace +dotnet_diagnostic.SA1403.severity = none + +# SA1404: Code analysis suppression should have justification +dotnet_diagnostic.SA1404.severity = warning + +# SA1405: Debug.Assert should provide message text +dotnet_diagnostic.SA1405.severity = none + +# SA1407: Arithmetic expressions should declare precedence +dotnet_diagnostic.SA1407.severity = none + +# SA1408: Conditional expressions should declare precedence +dotnet_diagnostic.SA1408.severity = none + +# SA1410: Remove delegate parens when possible +dotnet_diagnostic.SA1410.severity = warning + +# SA1411: Attribute constructor shouldn't use unnecessary parenthesis +dotnet_diagnostic.SA1411.severity = warning + +# SA1413: Use trailing comma in multi-line initializers +dotnet_diagnostic.SA1413.severity = none + +# SA1414: Tuple types in signatures should have element names +dotnet_diagnostic.SA1414.severity = none + +# SA1500: Braces for multi-line statements should not share line +dotnet_diagnostic.SA1500.severity = none + +# SA1501: Statement should not be on a single line +dotnet_diagnostic.SA1501.severity = none + +# SA1502: Element should not be on a single line +dotnet_diagnostic.SA1502.severity = none + +# SA1503: Braces should not be omitted +dotnet_diagnostic.SA1503.severity = none + +# SA1504: All accessors should be single-line or multi-line +dotnet_diagnostic.SA1504.severity = none + +# SA1505: An opening brace should not be followed by a blank line +dotnet_diagnostic.SA1505.severity = none + +# SA1506: Element documentation headers should not be followed by blank line +dotnet_diagnostic.SA1506.severity = none + +# SA1507: Code should not contain multiple blank lines in a row +dotnet_diagnostic.SA1507.severity = none + +# SA1508: A closing brace should not be preceded by a blank line +dotnet_diagnostic.SA1508.severity = none + +# SA1509: Opening braces should not be preceded by blank line +dotnet_diagnostic.SA1509.severity = none + +# SA1510: 'else' statement should not be preceded by a blank line +dotnet_diagnostic.SA1510.severity = none + +# SA1512: Single-line comments should not be followed by blank line +dotnet_diagnostic.SA1512.severity = none + +# SA1513: Closing brace should be followed by blank line +dotnet_diagnostic.SA1513.severity = none + +# SA1514: Element documentation header should be preceded by blank line +dotnet_diagnostic.SA1514.severity = none + +# SA1515: Single-line comment should be preceded by blank line +dotnet_diagnostic.SA1515.severity = none + +# SA1516: Elements should be separated by blank line +dotnet_diagnostic.SA1516.severity = none + +# SA1517: Code should not contain blank lines at start of file +dotnet_diagnostic.SA1517.severity = warning + +# SA1518: Code should not contain blank lines at the end of the file +dotnet_diagnostic.SA1518.severity = warning + +# SA1519: Braces should not be omitted from multi-line child statement +dotnet_diagnostic.SA1519.severity = none + +# SA1520: Use braces consistently +dotnet_diagnostic.SA1520.severity = none + +# SA1600: Elements should be documented +dotnet_diagnostic.SA1600.severity = none + +# SA1601: Partial elements should be documented +dotnet_diagnostic.SA1601.severity = none + +# SA1602: Enumeration items should be documented +dotnet_diagnostic.SA1602.severity = none + +# SA1604: Element documentation should have summary +dotnet_diagnostic.SA1604.severity = none + +# SA1605: Partial element documentation should have summary +dotnet_diagnostic.SA1605.severity = none + +# SA1606: Element documentation should have summary text +dotnet_diagnostic.SA1606.severity = none + +# SA1608: Element documentation should not have default summary +dotnet_diagnostic.SA1608.severity = none + +# SA1610: Property documentation should have value text +dotnet_diagnostic.SA1610.severity = none + +# SA1611: The documentation for parameter 'message' is missing +dotnet_diagnostic.SA1611.severity = none + +# SA1612: The parameter documentation is at incorrect position +dotnet_diagnostic.SA1612.severity = none + +# SA1614: Element parameter documentation should have text +dotnet_diagnostic.SA1614.severity = none + +# SA1615: Element return value should be documented +dotnet_diagnostic.SA1615.severity = none + +# SA1616: Element return value documentation should have text +dotnet_diagnostic.SA1616.severity = none + +# SA1618: The documentation for type parameter is missing +dotnet_diagnostic.SA1618.severity = none + +# SA1619: The documentation for type parameter is missing +dotnet_diagnostic.SA1619.severity = none + +# SA1622: Generic type parameter documentation should have text +dotnet_diagnostic.SA1622.severity = none + +# SA1623: Property documentation text +dotnet_diagnostic.SA1623.severity = none + +# SA1624: Because the property only contains a visible get accessor, the documentation summary text should begin with 'Gets' +dotnet_diagnostic.SA1624.severity = none + +# SA1625: Element documentation should not be copied and pasted +dotnet_diagnostic.SA1625.severity = none + +# SA1626: Single-line comments should not use documentation style slashes +dotnet_diagnostic.SA1626.severity = none + +# SA1627: The documentation text within the \'exception\' tag should not be empty +dotnet_diagnostic.SA1627.severity = none + +# SA1629: Documentation text should end with a period +dotnet_diagnostic.SA1629.severity = none + +# SA1633: File should have header +dotnet_diagnostic.SA1633.severity = none + +# SA1642: Constructor summary documentation should begin with standard text +dotnet_diagnostic.SA1642.severity = none + +# SA1643: Destructor summary documentation should begin with standard text +dotnet_diagnostic.SA1643.severity = none + +# SA1649: File name should match first type name +dotnet_diagnostic.SA1649.severity = none + +# IDE0001: Simplify name +dotnet_diagnostic.IDE0001.severity = suggestion + +# IDE0002: Simplify member access +dotnet_diagnostic.IDE0002.severity = suggestion + +# IDE0003: Remove this or Me qualification +dotnet_diagnostic.IDE0003.severity = suggestion + +# IDE0004: Remove Unnecessary Cast +dotnet_diagnostic.IDE0004.severity = suggestion + +# IDE0005: Using directive is unnecessary. +dotnet_diagnostic.IDE0005.severity = suggestion + +# IDE0007: Use implicit type +dotnet_diagnostic.IDE0007.severity = silent + +# IDE0008: Use explicit type +dotnet_diagnostic.IDE0008.severity = suggestion + +# IDE0009: Add this or Me qualification +dotnet_diagnostic.IDE0009.severity = silent + +# IDE0010: Add missing cases +dotnet_diagnostic.IDE0010.severity = silent + +# IDE0011: Add braces +dotnet_diagnostic.IDE0011.severity = silent + +# IDE0016: Use 'throw' expression +dotnet_diagnostic.IDE0016.severity = silent + +# IDE0017: Simplify object initialization +dotnet_diagnostic.IDE0017.severity = suggestion + +# IDE0018: Inline variable declaration +dotnet_diagnostic.IDE0018.severity = suggestion + +# IDE0019: Use pattern matching to avoid as followed by a null check +dotnet_diagnostic.IDE0019.severity = suggestion + +# IDE0020: Use pattern matching to avoid is check followed by a cast (with variable) +dotnet_diagnostic.IDE0020.severity = warning + +# IDE0021: Use expression body for constructors +dotnet_diagnostic.IDE0021.severity = silent + +# IDE0022: Use expression body for methods +dotnet_diagnostic.IDE0022.severity = silent + +# IDE0023: Use expression body for operators +dotnet_diagnostic.IDE0023.severity = silent + +# IDE0024: Use expression body for operators +dotnet_diagnostic.IDE0024.severity = silent + +# IDE0025: Use expression body for properties +dotnet_diagnostic.IDE0025.severity = silent + +# IDE0026: Use expression body for indexers +dotnet_diagnostic.IDE0026.severity = silent + +# IDE0027: Use expression body for accessors +dotnet_diagnostic.IDE0027.severity = silent + +# IDE0028: Simplify collection initialization +dotnet_diagnostic.IDE0028.severity = suggestion + +# IDE0029: Use coalesce expression +dotnet_diagnostic.IDE0029.severity = warning + +# IDE0030: Use coalesce expression +dotnet_diagnostic.IDE0030.severity = warning + +# IDE0031: Use null propagation +dotnet_diagnostic.IDE0031.severity = warning + +# IDE0032: Use auto property +dotnet_diagnostic.IDE0032.severity = silent + +# IDE0033: Use explicitly provided tuple name +dotnet_diagnostic.IDE0033.severity = suggestion + +# IDE0034: Simplify 'default' expression +dotnet_diagnostic.IDE0034.severity = suggestion + +# IDE0035: Remove unreachable code +dotnet_diagnostic.IDE0035.severity = suggestion + +# IDE0036: Order modifiers +dotnet_diagnostic.IDE0036.severity = warning + +# IDE0037: Use inferred member name +dotnet_diagnostic.IDE0037.severity = silent + +# IDE0038: Use pattern matching to avoid is check followed by a cast (without variable) +dotnet_diagnostic.IDE0038.severity = suggestion + +# IDE0039: Use local function +dotnet_diagnostic.IDE0039.severity = suggestion + +# IDE0040: Add accessibility modifiers +dotnet_diagnostic.IDE0040.severity = suggestion + +# IDE0041: Use 'is null' check +dotnet_diagnostic.IDE0041.severity = warning + +# IDE0042: Deconstruct variable declaration +dotnet_diagnostic.IDE0042.severity = silent + +# IDE0043: Invalid format string +dotnet_diagnostic.IDE0043.severity = warning + +# IDE0044: Add readonly modifier +dotnet_diagnostic.IDE0044.severity = suggestion + +# IDE0045: Use conditional expression for assignment +dotnet_diagnostic.IDE0045.severity = suggestion + +# IDE0046: Use conditional expression for return +dotnet_diagnostic.IDE0046.severity = suggestion + +# IDE0047: Remove unnecessary parentheses +dotnet_diagnostic.IDE0047.severity = silent + +# IDE0048: Add parentheses for clarity +dotnet_diagnostic.IDE0048.severity = silent + +# IDE0049: Use language keywords instead of framework type names for type references +dotnet_diagnostic.IDE0049.severity = warning + +# IDE0051: Remove unused private members +dotnet_diagnostic.IDE0051.severity = suggestion + +# IDE0052: Remove unread private members +dotnet_diagnostic.IDE0052.severity = suggestion + +# IDE0053: Use expression body for lambdas +dotnet_diagnostic.IDE0053.severity = silent + +# IDE0054: Use compound assignment +dotnet_diagnostic.IDE0054.severity = warning + +# IDE0055: Fix formatting +dotnet_diagnostic.IDE0055.severity = suggestion + +# IDE0056: Use index operator +dotnet_diagnostic.IDE0056.severity = suggestion + +# IDE0057: Use range operator +dotnet_diagnostic.IDE0057.severity = suggestion + +# IDE0058: Expression value is never used +dotnet_diagnostic.IDE0058.severity = silent + +# IDE0059: Unnecessary assignment of a value +dotnet_diagnostic.IDE0059.severity = warning + +# IDE0060: Remove unused parameter +dotnet_diagnostic.IDE0060.severity = silent +dotnet_code_quality_unused_parameters = non_public + +# IDE0061: Use expression body for local functions +dotnet_diagnostic.IDE0061.severity = silent + +# IDE0062: Make local function 'static' +dotnet_diagnostic.IDE0062.severity = warning + +# IDE0063: Use simple 'using' statement +dotnet_diagnostic.IDE0063.severity = silent + +# IDE0064: Make readonly fields writable +dotnet_diagnostic.IDE0064.severity = silent + +# IDE0065: Misplaced using directive +dotnet_diagnostic.IDE0065.severity = warning + +# IDE0066: Convert switch statement to expression +dotnet_diagnostic.IDE0066.severity = suggestion + +# IDE0070: Use 'System.HashCode' +dotnet_diagnostic.IDE0070.severity = suggestion + +# IDE0071: Simplify interpolation +dotnet_diagnostic.IDE0071.severity = warning + +# IDE0072: Add missing cases +dotnet_diagnostic.IDE0072.severity = silent + +# IDE0073: The file header is missing or not located at the top of the file +dotnet_diagnostic.IDE0073.severity = warning + +# IDE0074: Use compound assignment +dotnet_diagnostic.IDE0074.severity = warning + +# IDE0075: Simplify conditional expression +dotnet_diagnostic.IDE0075.severity = silent + +# IDE0076: Invalid global 'SuppressMessageAttribute' +dotnet_diagnostic.IDE0076.severity = warning + +# IDE0077: Avoid legacy format target in 'SuppressMessageAttribute' +dotnet_diagnostic.IDE0077.severity = silent + +# IDE0078: Use pattern matching +dotnet_diagnostic.IDE0078.severity = suggestion + +# IDE0079: Remove unnecessary suppression +dotnet_diagnostic.IDE0079.severity = suggestion + +# IDE0080: Remove unnecessary suppression operator +dotnet_diagnostic.IDE0080.severity = warning + +# IDE0081: Remove unnecessary suppression operator +dotnet_diagnostic.IDE0081.severity = none + +# IDE0082: 'typeof' can be converted to 'nameof' +dotnet_diagnostic.IDE0082.severity = warning + +# IDE0083: Use pattern matching +dotnet_diagnostic.IDE0083.severity = silent + +# IDE0084: Use pattern matching (IsNot operator) +dotnet_diagnostic.IDE0084.severity = none + +# IDE0090: Use 'new(...)' +dotnet_diagnostic.IDE0090.severity = silent + +# IDE0100: Remove redundant equality +dotnet_diagnostic.IDE0100.severity = warning + +# IDE0110: Remove unnecessary discard +dotnet_diagnostic.IDE0110.severity = warning + +# IDE0120: Simplify LINQ expression +dotnet_diagnostic.IDE0120.severity = none + +# IDE0130: Namespace does not match folder structure +dotnet_diagnostic.IDE0130.severity = silent + +# IDE0140: Simplify object creation +dotnet_diagnostic.IDE0140.severity = none + +# IDE0150: Prefer 'null' check over type check +dotnet_diagnostic.IDE0150.severity = silent + +# IDE0160: Convert to block scoped namespace +dotnet_diagnostic.IDE0160.severity = silent + +# IDE0161: Convert to file-scoped namespace +dotnet_diagnostic.IDE0161.severity = silent + +# IDE0170: Simplify property pattern +dotnet_diagnostic.IDE0170.severity = warning + +# IDE0180: Use tuple swap +dotnet_diagnostic.IDE0180.severity = suggestion + +# IDE0200: Remove unnecessary lambda expression +dotnet_diagnostic.IDE0200.severity = warning + +# IDE0210: Use top-level statements +dotnet_diagnostic.IDE0210.severity = silent + +# IDE0211: Use program main +dotnet_diagnostic.IDE0211.severity = silent + +# IDE0220: foreach cast +dotnet_diagnostic.IDE0220.severity = silent + +# IDE0230: Use UTF8 string literal +dotnet_diagnostic.IDE0230.severity = suggestion + +# IDE1005: Delegate invocation can be simplified. +dotnet_diagnostic.IDE1005.severity = warning + +# IDE1006: Naming styles +dotnet_diagnostic.IDE1006.severity = silent + +# IDE2000: Allow multiple blank lines +dotnet_diagnostic.IDE2000.severity = silent + +# IDE2001: Embedded statements must be on their own line +dotnet_diagnostic.IDE2001.severity = silent + +# IDE2002: Consecutive braces must not have blank line between them +dotnet_diagnostic.IDE2002.severity = silent + +# IDE2003: Allow statement immediately after block +dotnet_diagnostic.IDE2003.severity = silent + +# IDE2004: Blank line not allowed after constructor initializer colon +dotnet_diagnostic.IDE2004.severity = silent \ No newline at end of file diff --git a/eng/CodeAnalysis.ruleset b/eng/CodeAnalysis.ruleset deleted file mode 100644 index 6e46bfdde84..00000000000 --- a/eng/CodeAnalysis.ruleset +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 83cb0ab9298..8735b9f5fae 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,10 +18,18 @@ https://github.com/dotnet/aspnetcore d50065c4a4fe31a66a1cc2e1a31896d30464da13 + + https://github.com/dotnet/roslyn-analyzers + 19f02959e8a039ed4e27cce1feff462b37bf0df6 + https://github.com/dotnet/arcade 02e28316bf35d1028683ee313f0794776bff18d1 + + https://github.com/dotnet/arcade + 02e28316bf35d1028683ee313f0794776bff18d1 + https://github.com/dotnet/arcade 02e28316bf35d1028683ee313f0794776bff18d1 diff --git a/eng/Versions.props b/eng/Versions.props index 2ffae056fe1..76e59990f82 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -46,12 +46,15 @@ --> + 7.0.0-beta.22513.4 7.0.0-beta.22513.4 7.0.0 7.0.0-rtm.22513.7 2.0.0-beta4.22504.1 + + 7.0.0-preview1.22524.2 7.0.0 7.0.0-rtm.22512.2 diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/DiagnosticPortOptionsDefaults.cs b/src/Microsoft.Diagnostics.Monitoring.Options/DiagnosticPortOptionsDefaults.cs index d4d42b10bb5..8115879f35c 100644 --- a/src/Microsoft.Diagnostics.Monitoring.Options/DiagnosticPortOptionsDefaults.cs +++ b/src/Microsoft.Diagnostics.Monitoring.Options/DiagnosticPortOptionsDefaults.cs @@ -4,7 +4,7 @@ namespace Microsoft.Diagnostics.Monitoring.WebApi { - internal class DiagnosticPortOptionsDefaults + internal static class DiagnosticPortOptionsDefaults { public const DiagnosticPortConnectionMode ConnectionMode = DiagnosticPortConnectionMode.Connect; public const bool DeleteEndpointOnStartup = false; diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsDefaults.cs b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsDefaults.cs index bcb35600d3e..4496a590944 100644 --- a/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsDefaults.cs +++ b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsDefaults.cs @@ -4,7 +4,7 @@ namespace Microsoft.Diagnostics.Monitoring.WebApi { - internal class MetricsOptionsDefaults + internal static class MetricsOptionsDefaults { public const bool Enabled = true; diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/CommandLineHelper.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/CommandLineHelper.cs index 5b71196f390..0e6c7f93235 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/CommandLineHelper.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/CommandLineHelper.cs @@ -6,7 +6,7 @@ namespace Microsoft.Diagnostics.Monitoring.WebApi { - internal class CommandLineHelper + internal static class CommandLineHelper { public static string ExtractExecutablePath(string commandLine, bool isWindows) { diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/Controllers/DiagController.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/Controllers/DiagController.cs index 2d95fed3bda..313faa8e0f7 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/Controllers/DiagController.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/Controllers/DiagController.cs @@ -710,15 +710,15 @@ private Task StartLogs( { return LogFormat.JsonSequence; } - if (acceptedHeaders.Any(h => TextPlainHeader.IsSubsetOf(h))) + if (acceptedHeaders.Any(TextPlainHeader.IsSubsetOf)) { return LogFormat.PlainText; } - if (acceptedHeaders.Any(h => NdJsonHeader.IsSubsetOf(h))) + if (acceptedHeaders.Any(NdJsonHeader.IsSubsetOf)) { return LogFormat.NewlineDelimitedJson; } - if (acceptedHeaders.Any(h => JsonSequenceHeader.IsSubsetOf(h))) + if (acceptedHeaders.Any(JsonSequenceHeader.IsSubsetOf)) { return LogFormat.JsonSequence; } diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/DiagnosticServices.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/DiagnosticServices.cs index 6d167ce27e3..9468a4ae372 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/DiagnosticServices.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/DiagnosticServices.cs @@ -66,7 +66,7 @@ public async Task> GetProcessesAsync(DiagProcessFilter public Task GetProcessAsync(ProcessKey? processKey, CancellationToken token) { - DiagProcessFilter filterOptions = null; + DiagProcessFilter filterOptions; if (processKey.HasValue) { filterOptions = DiagProcessFilter.FromProcessKey(processKey.Value); diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/KeyValueLogScope.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/KeyValueLogScope.cs index 1191d0f90cd..75aaaed00c0 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/KeyValueLogScope.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/KeyValueLogScope.cs @@ -41,10 +41,10 @@ public override string ToString() { if (builder.Length > 0) { - builder.Append(" "); + builder.Append(' '); } builder.Append(kvp.Key); - builder.Append(":"); + builder.Append(':'); builder.Append(kvp.Value); } return builder.ToString(); diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/OperationTrackerService.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/OperationTrackerService.cs index 714dadb292d..4e88ff19a40 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/OperationTrackerService.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/OperationTrackerService.cs @@ -14,7 +14,7 @@ internal sealed class OperationTrackerService private sealed class OperationsTracker : IDisposable { - private int _count = 0; + private int _count; public IDisposable Register() { diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/ProcessInfoImpl.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/ProcessInfoImpl.cs index 6eaa99eabb2..60d2f4186a3 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/ProcessInfoImpl.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/ProcessInfoImpl.cs @@ -22,7 +22,7 @@ internal sealed class ProcessInfoImpl : IProcessInfo // String returned for a process field when its value could not be retrieved. This is the same // value that is returned by the runtime when it could not determine the value for each of those fields. - private static readonly string ProcessFieldUnknownValue = "unknown"; + private const string ProcessFieldUnknownValue = "unknown"; // The value of the operating system field of the ProcessInfo result when the target process is running // on a Windows operating system. @@ -43,12 +43,6 @@ public ProcessInfoImpl( ProcessName = processName ?? ProcessFieldUnknownValue; } - public static async Task FromEndpointInfoAsync(IEndpointInfo endpointInfo) - { - using CancellationTokenSource extendedInfoCancellation = new(ExtendedProcessInfoTimeout); - return await FromEndpointInfoAsync(endpointInfo, extendedInfoCancellation.Token); - } - // Creates an IProcessInfo object from the IEndpointInfo. Attempts to get the command line using event pipe // if the endpoint information doesn't provide it. The cancelation token can be used to timebox this fallback // mechanism. @@ -102,7 +96,7 @@ public static async Task FromEndpointInfoAsync(IEndpointInfo endpo { if (null != pipeline) { - _ = Task.Run(() => pipeline.DisposeAsync()); + _ = Task.Run(pipeline.DisposeAsync); } } } diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/RequestThrottling/RequestLimitTracker.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/RequestThrottling/RequestLimitTracker.cs index 97a17368417..9906c26d8a6 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/RequestThrottling/RequestLimitTracker.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/RequestThrottling/RequestLimitTracker.cs @@ -1,4 +1,8 @@ -using Microsoft.Extensions.Logging; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Extensions.Logging; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -10,7 +14,7 @@ internal sealed class RequestLimitTracker { private sealed class RequestCount : IDisposable { - private int _count = 0; + private int _count; public int Increment() => Interlocked.Increment(ref _count); public void Decrement() => Interlocked.Decrement(ref _count); diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/StacksFormatter.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/StacksFormatter.cs index 58293b3f9e6..f3584b7c66e 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/StacksFormatter.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/StacksFormatter.cs @@ -34,7 +34,7 @@ public StacksFormatter(Stream outputStream) public abstract Task FormatStack(CallStackResult stackResult, CancellationToken token); - protected string GetModuleName(NameCache cache, ulong moduleId) + protected static string GetModuleName(NameCache cache, ulong moduleId) { string moduleName = UnknownModule; if (cache.ModuleData.TryGetValue(moduleId, out ModuleData moduleData)) @@ -90,7 +90,7 @@ private void BuildClassName(StringBuilder builder, NameCache cache, ulong classI } } - private void BuildClassName(StringBuilder builder, NameCache cache, ulong moduleId, uint token) + private static void BuildClassName(StringBuilder builder, NameCache cache, ulong moduleId, uint token) { var classNames = new Stack(); diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/TextStacksFormatter.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/TextStacksFormatter.cs index b5bcb144cea..21be8b36fbf 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/TextStacksFormatter.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/Stacks/TextStacksFormatter.cs @@ -48,7 +48,7 @@ private void BuildFrame(StringBuilder builder, NameCache cache, CallStackFrame f } else if (cache.FunctionData.TryGetValue(frame.FunctionId, out FunctionData functionData)) { - builder.Append(base.GetModuleName(cache, functionData.ModuleId)); + builder.Append(GetModuleName(cache, functionData.ModuleId)); builder.Append(ModuleSeparator); BuildClassName(builder, cache, functionData); builder.Append(ClassSeparator); diff --git a/src/Microsoft.Diagnostics.Monitoring.WebApi/Validation/IntegerOrHexStringAttribute.cs b/src/Microsoft.Diagnostics.Monitoring.WebApi/Validation/IntegerOrHexStringAttribute.cs index 9c8413572a6..79cf8d9e374 100644 --- a/src/Microsoft.Diagnostics.Monitoring.WebApi/Validation/IntegerOrHexStringAttribute.cs +++ b/src/Microsoft.Diagnostics.Monitoring.WebApi/Validation/IntegerOrHexStringAttribute.cs @@ -37,7 +37,7 @@ public static bool TryParse(string value, out long result, out string error) { // AllowHexSpecifier requires that the "0x" is removed before attempting to parse. // It parses the actual value, not the "0x" syntax prefix. - if (!long.TryParse(value.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out result)) + if (!long.TryParse(value.AsSpan(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out result)) { error = string.Format(CultureInfo.InvariantCulture, Strings.ErrorMessage_ValueNotHex, value); return false; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema.UnitTests/SchemaGenerationTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema.UnitTests/SchemaGenerationTests.cs index f49a79e5ed2..05bacc699dc 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema.UnitTests/SchemaGenerationTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema.UnitTests/SchemaGenerationTests.cs @@ -116,10 +116,10 @@ private static void PrintSection(ITestOutputHelper outputHelper, string header, } } - private async Task> ReadAllLines(TextReader reader) + private static async Task> ReadAllLines(TextReader reader) { var lines = new List(); - string line = null; + string line; while ((line = await reader.ReadLineAsync()) != null) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/ExperimentalSchemaProcessor.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/ExperimentalSchemaProcessor.cs index 8bb28b61912..b42fd540439 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/ExperimentalSchemaProcessor.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/ExperimentalSchemaProcessor.cs @@ -8,7 +8,7 @@ namespace Microsoft.Diagnostics.Monitoring.ConfigurationSchema { - internal class ExperimentalSchemaProcessor : ISchemaProcessor + internal sealed class ExperimentalSchemaProcessor : ISchemaProcessor { private const string ExperimentalPrefix = "[Experimental]"; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/Program.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/Program.cs index 51f21dd5b2c..c6074116cef 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/Program.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/Program.cs @@ -7,7 +7,7 @@ namespace Microsoft.Diagnostics.Monitoring.ConfigurationSchema { - class Program + internal static class Program { static void Main(string[] args) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/SchemaGenerator.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/SchemaGenerator.cs index d8408340829..ce2c53f27d5 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/SchemaGenerator.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.ConfigurationSchema/SchemaGenerator.cs @@ -264,7 +264,7 @@ private static JsonSchemaProperty AddDiscriminatedSubSchema( return discriminatedProperty; } - private class GenerationContext + private sealed class GenerationContext { private readonly JsonSchemaGenerator _generator; private readonly JsonSchemaResolver _resolver; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/ResponseNames.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/ResponseNames.cs index 3ca18669d4c..9cbf68890af 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/ResponseNames.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/ResponseNames.cs @@ -4,10 +4,10 @@ namespace Microsoft.Diagnostics.Monitoring.OpenApiGen { - internal class ResponseNames + internal static class ResponseNames { - public static readonly string BadRequestResponse = nameof(BadRequestResponse); - public static readonly string UnauthorizedResponse = nameof(UnauthorizedResponse); - public static readonly string TooManyRequestsResponse = nameof(TooManyRequestsResponse); + public const string BadRequestResponse = nameof(BadRequestResponse); + public const string UnauthorizedResponse = nameof(UnauthorizedResponse); + public const string TooManyRequestsResponse = nameof(TooManyRequestsResponse); } } diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/StatusCodeStrings.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/StatusCodeStrings.cs index 716d5de3247..b7acef4094e 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/StatusCodeStrings.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.OpenApiGen/StatusCodeStrings.cs @@ -7,7 +7,7 @@ namespace Microsoft.Diagnostics.Monitoring.OpenApiGen { - internal class StatusCodeStrings + internal static class StatusCodeStrings { public static readonly string Status400BadRequest = StatusCodes.Status400BadRequest.ToString(CultureInfo.InvariantCulture); public static readonly string Status401Unauthorized = StatusCodes.Status401Unauthorized.ToString(CultureInfo.InvariantCulture); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Program.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Program.cs index 3131a90a4df..0af2d562875 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Program.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Program.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp { - internal class Program + internal static class Program { public static Task Main(string[] args) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCatchScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCatchScenario.cs index efbc2f37dfd..cfeafa40279 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCatchScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCatchScenario.cs @@ -10,7 +10,7 @@ namespace Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp.Scenarios /// /// Async waits until it receives the Continue command. /// - internal class ExceptionThrowCatchScenario + internal static class ExceptionThrowCatchScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCrashScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCrashScenario.cs index d81a52c4d63..e3ff735fc9c 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCrashScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp/Scenarios/ExceptionThrowCrashScenario.cs @@ -10,7 +10,7 @@ namespace Microsoft.Diagnostics.Monitoring.Profiler.UnitTestApp.Scenarios /// /// Async waits until it receives the Continue command. /// - internal class ExceptionThrowCrashScenario + internal static class ExceptionThrowCrashScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/DumpTestUtilities.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/DumpTestUtilities.cs index fea8b2e3430..7d6366cd78a 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/DumpTestUtilities.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/DumpTestUtilities.cs @@ -84,13 +84,13 @@ public static async Task ValidateDump(bool expectElfDump, Stream dumpStream) public class MinidumpHeader : TStruct { - public uint Signature = 0; - public uint Version = 0; - public uint NumberOfStreams = 0; - public uint StreamDirectoryRva = 0; - public uint CheckSum = 0; - public uint TimeDateStamp = 0; - public ulong Flags = 0; + public uint Signature; + public uint Version; + public uint NumberOfStreams; + public uint StreamDirectoryRva; + public uint CheckSum; + public uint TimeDateStamp; + public ulong Flags; // 50,4D,44,4D = PMDM public ValidationRule IsSignatureValid => new ValidationRule("Invalid Signature", () => Signature == 0x504D444DU); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Fixtures/AzuriteFixture.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Fixtures/AzuriteFixture.cs index a37e43ca6e6..ebc001e5195 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Fixtures/AzuriteFixture.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Fixtures/AzuriteFixture.cs @@ -115,7 +115,7 @@ public AzuriteFixture() } } - private ProcessStartInfo ConstructAzuriteProcessStartInfo(AzuriteAccount authorizedAccount, string workspaceDirectory) + private static ProcessStartInfo ConstructAzuriteProcessStartInfo(AzuriteAccount authorizedAccount, string workspaceDirectory) { bool isVSCopy = false; string azuriteFolder = null; @@ -225,7 +225,7 @@ private void ParseAzuriteStartupError(object sender, DataReceivedEventArgs e) _azuriteStartupStderr.AppendLine(e.Data); } - private int ParseAzuritePort(string outputLine) + private static int ParseAzuritePort(string outputLine) { int portDelimiterIndex = outputLine.LastIndexOf(':') + 1; if (portDelimiterIndex == 0 || portDelimiterIndex >= outputLine.Length) @@ -236,7 +236,7 @@ private int ParseAzuritePort(string outputLine) return int.Parse(outputLine[portDelimiterIndex..]); } - private string ErrorMessage(string specificReason) + private static string ErrorMessage(string specificReason) { return $"Could not run Azurite based test: {specificReason}.\n" + "Make sure that:\n" + diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LiveMetricsTestUtilities.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LiveMetricsTestUtilities.cs index feac173258b..9e7e2b0cca6 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LiveMetricsTestUtilities.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LiveMetricsTestUtilities.cs @@ -11,7 +11,7 @@ namespace Microsoft.Diagnostics.Monitoring.TestCommon { - internal class LiveMetricsTestUtilities + internal static class LiveMetricsTestUtilities { internal static async Task ValidateMetrics(IEnumerable expectedProviders, IEnumerable expectedNames, IAsyncEnumerable actualMetrics, bool strict) diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LogsTestUtilities.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LogsTestUtilities.cs index a8db8716d61..3b79ab510bc 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LogsTestUtilities.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/LogsTestUtilities.cs @@ -16,7 +16,7 @@ namespace Microsoft.Diagnostics.Monitoring.TestCommon { - internal class LogsTestUtilities + internal static class LogsTestUtilities { const char JsonSequenceRecordSeparator = '\u001E'; @@ -151,10 +151,10 @@ private static LogEntry CreateTraceEntry(string category) Message = "Trace message with values 3 and True.", State = new Dictionary() { - { "{OriginalFormat}", "Trace message with values {value1} and {value2}." }, + { "{OriginalFormat}", "Trace message with values {Value1} and {Value2}." }, { "Message", "Trace message with values 3 and True." }, - { "value1", "3" }, - { "value2", "True" } + { "Value1", "3" }, + { "Value2", "True" } } }; } @@ -171,10 +171,10 @@ private static LogEntry CreateDebugEntry(string category) Message = "Debug message with values f39a5065-732b-4cce-89d1-52e4af39e233 and (null).", State = new Dictionary() { - { "{OriginalFormat}", "Debug message with values {value1} and {value2}." }, + { "{OriginalFormat}", "Debug message with values {Value1} and {Value2}." }, { "Message", "Debug message with values f39a5065-732b-4cce-89d1-52e4af39e233 and (null)." }, - { "value1", "f39a5065-732b-4cce-89d1-52e4af39e233" }, - { "value2", "(null)" } + { "Value1", "f39a5065-732b-4cce-89d1-52e4af39e233" }, + { "Value2", "(null)" } } }; } @@ -191,10 +191,10 @@ private static LogEntry CreateInformationEntry(string category) Message = "Information message with values hello and goodbye.", State = new Dictionary() { - { "{OriginalFormat}", "Information message with values {value1} and {value2}." }, + { "{OriginalFormat}", "Information message with values {Value1} and {Value2}." }, { "Message", "Information message with values hello and goodbye." }, - { "value1", "hello" }, - { "value2", "goodbye" } + { "Value1", "hello" }, + { "Value2", "goodbye" } } }; } @@ -231,10 +231,10 @@ private static LogEntry CreateErrorEntry(string category) Message = "Error message with values a and 42.", State = new Dictionary() { - { "{OriginalFormat}", "Error message with values {value1} and {value2}." }, + { "{OriginalFormat}", "Error message with values {Value1} and {Value2}." }, { "Message", "Error message with values a and 42." }, - { "value1", "a" }, - { "value2", "42" } + { "Value1", "a" }, + { "Value2", "42" } } }; } diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/AppRunner.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/AppRunner.cs index eec0447b21a..58d4a3b9688 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/AppRunner.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/AppRunner.cs @@ -73,7 +73,7 @@ public Architecture? Architecture public bool SetRuntimeIdentifier { get; set; } = true; - public string ProfilerLogLevel { get; set; } = null; + public string ProfilerLogLevel { get; set; } public AppRunner(ITestOutputHelper outputHelper, Assembly testAssembly, int appId = 1, TargetFrameworkMoniker tfm = TargetFrameworkMoniker.Current) { @@ -112,7 +112,7 @@ public async Task StartAsync(CancellationToken token) { if (string.IsNullOrEmpty(ScenarioName)) { - throw new ArgumentNullException(nameof(ScenarioName)); + throw new InvalidOperationException($"'{nameof(ScenarioName)}' is required."); } if (!File.Exists(_appPath)) @@ -130,7 +130,7 @@ public async Task StartAsync(CancellationToken token) { if (string.IsNullOrEmpty(DiagnosticPortPath)) { - throw new ArgumentNullException(nameof(DiagnosticPortPath)); + throw new InvalidOperationException($"'{nameof(DiagnosticPortPath)}' is required."); } _adapter.Environment.Add("DOTNET_DiagnosticPorts", DiagnosticPortPath); @@ -210,7 +210,7 @@ private void HandleProgramEvent(ConsoleLogEvent logEvent) switch ((TestAppLogEventIds)logEvent.EventId) { case TestAppLogEventIds.ScenarioState: - Assert.True(logEvent.State.TryGetValue("state", out TestAppScenarios.SenarioState state)); + Assert.True(logEvent.State.TryGetValue("State", out TestAppScenarios.SenarioState state)); switch (state) { case TestAppScenarios.SenarioState.Ready: @@ -220,8 +220,8 @@ private void HandleProgramEvent(ConsoleLogEvent logEvent) break; case TestAppLogEventIds.ReceivedCommand: Assert.NotNull(_currentCommandSource); - Assert.True(logEvent.State.TryGetValue("expected", out bool expected)); - Assert.True(logEvent.State.TryGetValue("command", out _)); + Assert.True(logEvent.State.TryGetValue("Expected", out bool expected)); + Assert.True(logEvent.State.TryGetValue("Command", out _)); if (expected) { Assert.True(_currentCommandSource.TrySetResult(null)); @@ -232,8 +232,8 @@ private void HandleProgramEvent(ConsoleLogEvent logEvent) } break; case TestAppLogEventIds.EnvironmentVariable: - Assert.True(logEvent.State.TryGetValue("name", out string name)); - Assert.True(logEvent.State.TryGetValue("value", out string value)); + Assert.True(logEvent.State.TryGetValue("Name", out string name)); + Assert.True(logEvent.State.TryGetValue("Value", out string value)); lock (_waitingForEnvironmentVariables) { if (_waitingForEnvironmentVariables.TryGetValue(name, out TaskCompletionSource completedGettingVal)) diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/DotNetRunner.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/DotNetRunner.cs index 547ef08e439..3a62ce0f966 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/DotNetRunner.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/DotNetRunner.cs @@ -1,6 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information +// See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; @@ -32,7 +32,7 @@ public sealed class DotNetRunner : IDisposable /// /// The architecture of the dotnet host. /// - public Architecture? Architecture { get; set; } = null; + public Architecture? Architecture { get; set; } /// /// The arguments to the entrypoint method. @@ -52,7 +52,7 @@ public sealed class DotNetRunner : IDisposable /// /// Gets a indicating if has been called and the process has been started. /// - public bool HasStarted { get; private set; } = false; + public bool HasStarted { get; private set; } /// /// Retrieves the exit code of the process. @@ -133,7 +133,7 @@ public async Task StartAsync(CancellationToken token) argsBuilder.Append(Path.ChangeExtension(EntrypointAssemblyPath, ".runtimeconfig.test.json")); argsBuilder.Append("\" "); } - argsBuilder.Append("\""); + argsBuilder.Append('\"'); argsBuilder.Append(EntrypointAssemblyPath); argsBuilder.Append("\" "); argsBuilder.Append(Arguments); @@ -163,7 +163,7 @@ public async Task StartAsync(CancellationToken token) break; } - await Task.Delay(TimeSpan.FromMilliseconds(100)); + await Task.Delay(TimeSpan.FromMilliseconds(100), token); } } } diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/LoggingRunnerAdapter.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/LoggingRunnerAdapter.cs index 7a7220f54a1..46b5573e0cc 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/LoggingRunnerAdapter.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/Runners/LoggingRunnerAdapter.cs @@ -158,20 +158,26 @@ public async Task ReadToEnd(CancellationToken token) private async Task ReadLinesAsync(StreamReader reader, List lines, Action callback, CancellationToken cancelToken) { +#if !NET7_0_OR_GREATER // Closing the reader to cancel the async await will dispose the underlying stream. // Technically, this means the reader/stream cannot be used after canceling reading of lines // from the process, but this is probably okay since the adapter is already logging each line // and providing a callback to callers to read each line. It's unlikely the reader/stream will // be accessed after this adapter is disposed. - using var cancelReg = cancelToken.Register(() => reader.Close()); + using var cancelReg = cancelToken.Register(reader.Close); +#endif try { bool readAborted = false; while (!_finishReads) { - // ReadLineAsync does not have cancellation +#if NET7_0_OR_GREATER + string line = await reader.ReadLineAsync(cancelToken).ConfigureAwait(false); +#else + // ReadLineAsync does not have cancellation in 6.0 or lower string line = await reader.ReadLineAsync().ConfigureAwait(false); +#endif if (null == line) { @@ -184,10 +190,15 @@ private async Task ReadLinesAsync(StreamReader reader, List lines, Actio } // If the loop ended because _finishReads was set, we should read to the end of the - // stream if readAborded is not set. This is so we can ensure that the entire stream is read. + // stream if readAborted is not set. This is so we can ensure that the entire stream is read. if (!readAborted && _finishReads) { +#if NET7_0_OR_GREATER + string remainder = await reader.ReadToEndAsync(cancelToken).ConfigureAwait(false); +#else + // ReadToEndAsync does not have cancellation in 6.0 or lower string remainder = await reader.ReadToEndAsync().ConfigureAwait(false); +#endif foreach (string line in remainder.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)) { lines.Add(line); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/StreamExtensions.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/StreamExtensions.cs index 4ae4bcb6b49..55e144346e6 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/StreamExtensions.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.TestCommon/StreamExtensions.cs @@ -1,4 +1,9 @@ -using System.IO; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; using System.Threading; using System.Threading.Tasks; using Xunit; @@ -10,10 +15,11 @@ internal static class StreamExtensions public static async Task ReadBytesAsync(this Stream stream, int length, CancellationToken cancellationToken) { byte[] buffer = new byte[length]; + Memory memory = buffer; int read; int total = 0; - while (total < buffer.Length && 0 != (read = await stream.ReadAsync(buffer, total, buffer.Length - total, cancellationToken))) + while (total < buffer.Length && 0 != (read = await stream.ReadAsync(memory.Slice(total), cancellationToken))) { total += read; } diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/CollectionRuleDescriptionTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/CollectionRuleDescriptionTests.cs index f1bf3d163a0..d6f06fb41b6 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/CollectionRuleDescriptionTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/CollectionRuleDescriptionTests.cs @@ -347,7 +347,7 @@ await ScenarioRunner.SingleTarget( }); } - private void ValidateCollectionRuleDescriptions(Dictionary expectedCollectionRuleDescriptions, Dictionary actualCollectionRuleDescriptions) + private static void ValidateCollectionRuleDescriptions(Dictionary expectedCollectionRuleDescriptions, Dictionary actualCollectionRuleDescriptions) { Assert.Equal(actualCollectionRuleDescriptions.Keys.Count, expectedCollectionRuleDescriptions.Keys.Count); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/EgressTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/EgressTests.cs index a0063520647..d065f63b68a 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/EgressTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/EgressTests.cs @@ -297,7 +297,7 @@ public static bool IsNotCore31OnOSX() #endif } - private async Task TraceWithDelay(ApiClient client, int processId, bool delay = true) + private static async Task TraceWithDelay(ApiClient client, int processId, bool delay = true) { HttpResponseMessage message = await client.ApiCall(FormattableString.Invariant($"/trace?pid={processId}&durationSeconds=-1")); if (delay) @@ -307,12 +307,12 @@ private async Task TraceWithDelay(ApiClient client, int pro return message; } - private Task EgressDirect(ApiClient client, int processId) + private static Task EgressDirect(ApiClient client, int processId) { return client.ApiCall(FormattableString.Invariant($"/trace?pid={processId}&egressProvider={FileProviderName}")); } - private async Task EgressTraceWithDelay(ApiClient apiClient, int processId, bool delay = true) + private static async Task EgressTraceWithDelay(ApiClient apiClient, int processId, bool delay = true) { try { @@ -329,13 +329,13 @@ private async Task EgressTraceWithDelay(ApiClient apiClient, } } - private async Task CancelEgressOperation(ApiClient apiClient, OperationResponse response) + private static async Task CancelEgressOperation(ApiClient apiClient, OperationResponse response) { HttpStatusCode deleteStatus = await apiClient.CancelEgressOperation(response.OperationUri); Assert.Equal(HttpStatusCode.OK, deleteStatus); } - private void ValidateOperation(OperationStatus expected, OperationSummary summary) + private static void ValidateOperation(OperationStatus expected, OperationSummary summary) { Assert.Equal(expected.OperationId, summary.OperationId); Assert.Equal(expected.Status, summary.Status); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/HttpApi/ApiClient.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/HttpApi/ApiClient.cs index 5cc7bffb987..fe165f03967 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/HttpApi/ApiClient.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/HttpApi/ApiClient.cs @@ -216,7 +216,7 @@ public Task CaptureDumpAsync(Guid uid, DumpType dumpType, private async Task CaptureDumpAsync(string processQuery, DumpType dumpType, CancellationToken token) { - using HttpRequestMessage request = new(HttpMethod.Get, $"/dump?{processQuery}&type={dumpType.ToString("G")}"); + using HttpRequestMessage request = new(HttpMethod.Get, $"/dump?{processQuery}&type={dumpType:G}"); request.Headers.Add(HeaderNames.Accept, ContentTypes.ApplicationOctetStream); using DisposableBox responseBox = new( @@ -416,7 +416,7 @@ public async Task GetMetricsAsync(CancellationToken token) { case HttpStatusCode.OK: ValidateContentType(response, ContentTypes.TextPlain); - return await response.Content.ReadAsStringAsync().ConfigureAwait(false); + return await response.Content.ReadAsStringAsync(token).ConfigureAwait(false); case HttpStatusCode.BadRequest: ValidateContentType(response, ContentTypes.ApplicationProblemJson); throw await CreateValidationProblemDetailsExceptionAsync(response).ConfigureAwait(false); @@ -655,7 +655,7 @@ private static void ThrowIfNotSuccess(HttpResponseMessage responseMessage) } } - private void ValidateContentType(HttpResponseMessage responseMessage, string expectedMediaType) + private static void ValidateContentType(HttpResponseMessage responseMessage, string expectedMediaType) { Assert.Equal(expectedMediaType, responseMessage.Content.Headers.ContentType?.MediaType); } @@ -665,7 +665,7 @@ private static string CreateLogsUriString(string processIdentifierQuery, TimeSpa StringBuilder routeBuilder = new(); routeBuilder.Append("/logs?"); routeBuilder.Append(processIdentifierQuery); - routeBuilder.Append("&"); + routeBuilder.Append('&'); AppendDuration(routeBuilder, duration); if (logLevel.HasValue) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/ProcessTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/ProcessTests.cs index b6bce7da05b..76df47c9fba 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/ProcessTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/ProcessTests.cs @@ -267,7 +267,7 @@ private void VerifyProcessInfoEquality(List processInfos) /// /// Verifies that an invalid Process request throws the correct exception (ValidationProblemDetailsException) and has the correct Status and StatusCode. /// - private async Task VerifyInvalidRequestException(ApiClient client, int? pid, Guid? uid, string name) + private static async Task VerifyInvalidRequestException(ApiClient client, int? pid, Guid? uid, string name) { ValidationProblemDetailsException validationProblemDetailsException = await Assert.ThrowsAsync( () => client.GetProcessAsync(pid: pid, uid: uid, name: name)); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Runners/MonitorGenerateKeyRunner.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Runners/MonitorGenerateKeyRunner.cs index 82e702d8750..a120839a159 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Runners/MonitorGenerateKeyRunner.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.FunctionalTests/Runners/MonitorGenerateKeyRunner.cs @@ -80,11 +80,11 @@ internal sealed class MonitorGenerateKeyRunner : MonitorRunner /// /// A bool indicating if has been called and the field should not be updated. /// - private bool _executionStarted = false; + private bool _executionStarted; /// /// A value indicating which format is being used. This should not be updated after is called. /// - private OutputFormat? _selectedFormat = null; + private OutputFormat? _selectedFormat; /// /// Gets the that was used to execute dotnet-monitor. If is set to then diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestHostingStartup/BuildOutputSharedLibraryInitializer.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestHostingStartup/BuildOutputSharedLibraryInitializer.cs index 3a93456dd05..63b7c5edbc8 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestHostingStartup/BuildOutputSharedLibraryInitializer.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestHostingStartup/BuildOutputSharedLibraryInitializer.cs @@ -31,7 +31,7 @@ public INativeFileProviderFactory Initialize() return new Factory(); } - private class Factory : INativeFileProviderFactory + private sealed class Factory : INativeFileProviderFactory { public IFileProvider Create(string runtimeIdentifier) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestStartupHook/StartupHook.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestStartupHook/StartupHook.cs index 53d7c52a138..0a83e0235e5 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestStartupHook/StartupHook.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.TestStartupHook/StartupHook.cs @@ -6,7 +6,9 @@ using System.Reflection; using System.Runtime.Loader; +#pragma warning disable CA1050 // Declare types in namespaces public sealed class StartupHook +#pragma warning restore CA1050 // Declare types in namespaces { private const string TestHostingStartupAssemblyName = "Microsoft.Diagnostics.Monitoring.Tool.TestHostingStartup"; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/BuiltInTriggerTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/BuiltInTriggerTests.cs index d0139b1b87c..271285f1665 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/BuiltInTriggerTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/BuiltInTriggerTests.cs @@ -149,7 +149,7 @@ public void CPUUsageTrigger_CorrectDefaultOptions() ValidateEventCounterOptionsTranslation(expectedSettings, eventCounterOptions); } - private void ValidateEventCounterOptionsTranslation(EventCounterOptions expected, EventCounterOptions actual) + private static void ValidateEventCounterOptionsTranslation(EventCounterOptions expected, EventCounterOptions actual) { Assert.Equal(expected.CounterName, actual.CounterName); Assert.Equal(expected.ProviderName, actual.ProviderName); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTests.cs index 5fad31b754e..b5a45fd64f3 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTests.cs @@ -364,7 +364,7 @@ private void VerifyExecutionCount(CallbackActionService service, int expectedCou Assert.Equal(expectedCount, service.ExecutionTimestamps.Count); } - private async Task ManualTriggerBurstAsync(ManualTriggerService service, int count = 10) + private static async Task ManualTriggerBurstAsync(ManualTriggerService service, int count = 10) { for (int i = 0; i < count; i++) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTestsHelper.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTestsHelper.cs index 1bc8af516a0..cb44cc6ccf2 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTestsHelper.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRulePipelineTestsHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class CollectionRulePipelineTestsHelper + internal static class CollectionRulePipelineTestsHelper { internal static async Task ExecuteScenario( TargetFrameworkMoniker tfm, @@ -96,7 +96,7 @@ await TestHostHelper.CreateCollectionRulesHost( /// that the actions are invoked for the number of expected iterations () and /// are throttled for the remaining number of iterations. /// - internal async static Task ManualTriggerAsync( + internal static async Task ManualTriggerAsync( ManualTriggerService triggerService, CallbackActionService callbackService, PipelineCallbacks callbacks, @@ -184,7 +184,7 @@ internal async static Task ManualTriggerAsync( Assert.False(actionStartedTask.IsCompleted); } - internal class PipelineCallbacks + internal sealed class PipelineCallbacks { private readonly List _entries = new(); @@ -247,7 +247,7 @@ private void NotifyCompletions(PipelineCallbackType callbackType) public int StartedCount => _startedCount; - private class CompletionEntry + private sealed class CompletionEntry { private readonly TaskCompletionSource _source = new(TaskCreationOptions.RunContinuationsAsynchronously); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/CallbackAction.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/CallbackAction.cs index e7b1e81ee80..52017652397 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/CallbackAction.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/CallbackAction.cs @@ -32,7 +32,7 @@ public ICollectionRuleAction Create(IEndpointInfo endpointInfo, BaseRecordOption internal sealed class CallbackAction : ICollectionRuleAction { - public static readonly string ActionName = nameof(CallbackAction); + public const string ActionName = nameof(CallbackAction); private readonly CallbackActionService _service; @@ -74,7 +74,7 @@ public ICollectionRuleAction Create(IEndpointInfo endpointInfo, BaseRecordOption internal sealed class DelayedCallbackAction : ICollectionRuleAction { - public static readonly string ActionName = nameof(DelayedCallbackAction); + public const string ActionName = nameof(DelayedCallbackAction); private readonly CallbackActionService _service; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/PassThroughAction.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/PassThroughAction.cs index ccab972b3a2..40252e24f95 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/PassThroughAction.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/CollectionRules/Actions/PassThroughAction.cs @@ -11,7 +11,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests.CollectionRules.Actions { - internal class PassThroughActionFactory : ICollectionRuleActionFactory + internal sealed class PassThroughActionFactory : ICollectionRuleActionFactory { public ICollectionRuleAction Create(IEndpointInfo endpointInfo, PassThroughOptions options) { @@ -19,7 +19,7 @@ public ICollectionRuleAction Create(IEndpointInfo endpointInfo, PassThroughOptio } } - internal class PassThroughAction : CollectionRuleActionBase + internal sealed class PassThroughAction : CollectionRuleActionBase { public PassThroughAction(IEndpointInfo endpointInfo, PassThroughOptions settings) : base(endpointInfo, settings) diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ConfigurationTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ConfigurationTests.cs index f1ab50ef65a..8aeda4c26fb 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ConfigurationTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ConfigurationTests.cs @@ -361,12 +361,12 @@ private string WriteAndRetrieveConfiguration(IConfiguration configuration, bool } } - private string CleanWhitespace(string rawText) + private static string CleanWhitespace(string rawText) { return string.Concat(rawText.Where(c => !char.IsWhiteSpace(c))); } - private string ConstructSettingsJson(params string[] permittedFileNames) + private static string ConstructSettingsJson(params string[] permittedFileNames) { string[] filePaths = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), SampleConfigurationsDirectory)); @@ -390,7 +390,7 @@ private string ConstructSettingsJson(params string[] permittedFileNames) return generatedUserSettings; } - private string ConstructExpectedOutput(bool redact, string directoryNameLocation) + private static string ConstructExpectedOutput(bool redact, string directoryNameLocation) { Dictionary categoryMapping = GetConfigurationFileNames(redact); @@ -421,7 +421,7 @@ private string ConstructExpectedOutput(bool redact, string directoryNameLocation return Encoding.UTF8.GetString(stream.ToArray()); } - private Dictionary GetConfigurationFileNames(bool redact) + private static Dictionary GetConfigurationFileNames(bool redact) { return new Dictionary() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTests.cs index 575db974b58..69cff048d79 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTests.cs @@ -74,7 +74,7 @@ await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions => { } }, overrideSource: GetConfigurationSources(DiagnosticPortTestsConstants.AllListen_EnvironmentVariables)); } - private List GetConfigurationSources(IDictionary initialData) + private static List GetConfigurationSources(IDictionary initialData) { List sources = new(); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTestsConstants.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTestsConstants.cs index ca4b54856e6..a72894a5f61 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTestsConstants.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/DiagnosticPortTestsConstants.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class DiagnosticPortTestsConstants + internal static class DiagnosticPortTestsConstants { public const string SimplifiedDiagnosticPort = "SimplifiedDiagnosticPort"; public const string FullDiagnosticPort = "FullDiagnosticPort"; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/Egress/AzureBlob/AzureBlobEgressProviderTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/Egress/AzureBlob/AzureBlobEgressProviderTests.cs index 28b7c1a462e..92cef8db2cc 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/Egress/AzureBlob/AzureBlobEgressProviderTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/Egress/AzureBlob/AzureBlobEgressProviderTests.cs @@ -71,7 +71,7 @@ public async Task AzureBlobEgress_UploadsCorrectData(UploadAction uploadAction) EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -100,7 +100,7 @@ public async Task AzureBlobEgress_Supports_QueueMessages(UploadAction uploadActi EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -128,7 +128,7 @@ public async Task AzureBlobEgress_Supports_RestrictiveSasToken(UploadAction uplo EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -158,7 +158,7 @@ public async Task AzureBlobEgress_Supports_RestrictiveQueueSasToken(UploadAction EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -190,7 +190,7 @@ public async Task AzureBlobEgress_Supports_OnlyRestrictiveSasTokens(UploadAction EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -242,7 +242,7 @@ public async Task AzureBlobEgress_DoesNotThrowWhen_QueueDoesNotExistAndUsingRest EgressArtifactSettings artifactSettings = ConstructArtifactSettings(); // Act - string identifier = await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); + await EgressAsync(uploadAction, egressProvider, providerOptions, artifactSettings, CancellationToken.None); // Assert List blobs = await GetAllBlobsAsync(containerClient); @@ -263,12 +263,12 @@ private async Task WriteToEgressStreamAsync(Stream stream, CancellationToken tok await fs.CopyToAsync(stream, token); } - private async Task EgressAsync(UploadAction uploadAction, AzureBlobEgressProvider egressProvider, AzureBlobEgressProviderOptions options, EgressArtifactSettings artifactSettings, CancellationToken token) + private Task EgressAsync(UploadAction uploadAction, AzureBlobEgressProvider egressProvider, AzureBlobEgressProviderOptions options, EgressArtifactSettings artifactSettings, CancellationToken token) { return uploadAction switch { - UploadAction.ProvideUploadStream => await egressProvider.EgressAsync(options, ProvideUploadStreamAsync, artifactSettings, token), - UploadAction.WriteToProviderStream => await egressProvider.EgressAsync(options, WriteToEgressStreamAsync, artifactSettings, token), + UploadAction.ProvideUploadStream => egressProvider.EgressAsync(options, ProvideUploadStreamAsync, artifactSettings, token), + UploadAction.WriteToProviderStream => egressProvider.EgressAsync(options, WriteToEgressStreamAsync, artifactSettings, token), _ => throw new ArgumentException(nameof(uploadAction)), }; } @@ -303,7 +303,7 @@ private async Task ConstructQueueContainerClientAsync(string queueN return queueClient; } - private EgressArtifactSettings ConstructArtifactSettings(int numberOfMetadataEntries = 2) + private static EgressArtifactSettings ConstructArtifactSettings(int numberOfMetadataEntries = 2) { EgressArtifactSettings settings = new() { @@ -343,7 +343,7 @@ private AzureBlobEgressProviderOptions ConstructEgressProviderSettings(BlobConta return options; } - private async Task> GetAllBlobsAsync(BlobContainerClient containerClient) + private static async Task> GetAllBlobsAsync(BlobContainerClient containerClient) { List blobs = new(); @@ -366,7 +366,7 @@ private async Task> GetAllBlobsAsync(BlobContainerClient containe return blobs; } - private async Task> GetAllMessagesAsync(QueueClient queueClient) + private static async Task> GetAllMessagesAsync(QueueClient queueClient) { try { @@ -382,7 +382,7 @@ private async Task> GetAllMessagesAsync(QueueClient queueClie return new List(); } - private string DecodeQueueMessageBody(BinaryData body) + private static string DecodeQueueMessageBody(BinaryData body) { // Our queue messages are UTF-8 encoded text that is then Base64 encoded and then stored as a byte array. return Encoding.UTF8.GetString(Convert.FromBase64String(body.ToString())); @@ -400,14 +400,14 @@ private async Task DownloadBlobAsync(BlobContainerClient containerClient return downloadPath; } - private string GetFileSHA256(string filePath) + private static string GetFileSHA256(string filePath) { using SHA256 sha = SHA256.Create(); using FileStream fileStream = File.OpenRead(filePath); return BitConverter.ToString(sha.ComputeHash(fileStream)); } - private void ValidateQueue(List blobs, List messages, int expectedCount) + private static void ValidateQueue(List blobs, List messages, int expectedCount) { Assert.Equal(expectedCount, messages.Count); Assert.Equal(expectedCount, blobs.Count); @@ -419,7 +419,7 @@ private void ValidateQueue(List blobs, List messages, in } } - private string ConstructBlobContainerSasToken(BlobContainerClient containerClient) + private static string ConstructBlobContainerSasToken(BlobContainerClient containerClient) { // Requires: // - Add for UploadAction.ProvideUploadStream @@ -435,7 +435,7 @@ private string ConstructBlobContainerSasToken(BlobContainerClient containerClien return sasUri.Query; } - private string ConstructQueueSasToken(QueueClient queueClient) + private static string ConstructQueueSasToken(QueueClient queueClient) { QueueSasBuilder sasBuilder = new(QueueSasPermissions.Add, DateTimeOffset.MaxValue) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EndpointUtilities.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EndpointUtilities.cs index ddaf5ffafb8..1be85f70f8c 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EndpointUtilities.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EndpointUtilities.cs @@ -17,7 +17,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class EndpointUtilities + internal sealed class EndpointUtilities { private readonly ITestOutputHelper _outputHelper; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ExecuteActionTestHelper.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ExecuteActionTestHelper.cs index d6fa86e824e..86efbea7296 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ExecuteActionTestHelper.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ExecuteActionTestHelper.cs @@ -7,7 +7,7 @@ namespace Microsoft.Diagnostics.Monitoring.TestCommon { - internal class ExecuteActionTestHelper + internal static class ExecuteActionTestHelper { public static string GenerateArgumentsString(string[] additionalArgs) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LimitsTestsConstants.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LimitsTestsConstants.cs index f89beb62673..19474bfe093 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LimitsTestsConstants.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LimitsTestsConstants.cs @@ -4,7 +4,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class LimitsTestsConstants + internal static class LimitsTestsConstants { public const int ExpectedActionCount = 4; public const int UnknownActionCount = 40; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LoadProfilerActionTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LoadProfilerActionTests.cs index 2f717f609db..80dbc48cdc9 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LoadProfilerActionTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/LoadProfilerActionTests.cs @@ -77,7 +77,7 @@ await runner.ExecuteAsync(async () => /// /// Set profiler as startup profiler before the runtime instance is resumed. /// - private class LoadProfilerCallback : + private sealed class LoadProfilerCallback : EndpointInfoSourceCallback { private readonly IHost _host; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/MockSystemClock.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/MockSystemClock.cs index 19b093b074d..34f3acc45b2 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/MockSystemClock.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/MockSystemClock.cs @@ -7,7 +7,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class MockSystemClock : ISystemClock + internal sealed class MockSystemClock : ISystemClock { private DateTimeOffset _utcNow = DateTimeOffset.UtcNow; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ShowSourcesTestsConstants.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ShowSourcesTestsConstants.cs index fe0e646d0c2..ba9e43d4b77 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ShowSourcesTestsConstants.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/ShowSourcesTestsConstants.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class ShowSourcesTestsConstants + internal static class ShowSourcesTestsConstants { // The values used here correspond to the ones used in SampleConfigurations diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TemplatesTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TemplatesTests.cs index abd18cff867..3505304f6db 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TemplatesTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TemplatesTests.cs @@ -105,7 +105,7 @@ await TestHostHelper.CreateCollectionRulesHost(_outputHelper, rootOptions => { } }, overrideSource: GetConfigurationSources()); } - private List GetConfigurationSources() + private static List GetConfigurationSources() { string[] filePaths = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), SampleConfigurationsDirectory)); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TestLogger.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TestLogger.cs index 942196e4fae..28216894582 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TestLogger.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TestLogger.cs @@ -17,7 +17,7 @@ internal sealed class LogRecord public IList<(EventId EventId, string Message)> Events => _events; } - internal class TestLoggerProvider : ILoggerProvider + internal sealed class TestLoggerProvider : ILoggerProvider { private readonly LogRecord _logRecord; @@ -28,7 +28,7 @@ internal class TestLoggerProvider : ILoggerProvider public void Dispose() { } } - internal class TestLogger : ILogger + internal sealed class TestLogger : ILogger { private readonly string _categoryName; private readonly LogRecord _logRecord; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TriggerTestsConstants.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TriggerTestsConstants.cs index d02bbeaf7cb..8be468f5331 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TriggerTestsConstants.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/TriggerTestsConstants.cs @@ -4,7 +4,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { - internal class TriggerTestsConstants + internal static class TriggerTestsConstants { public static readonly string[] ExpectedStatusCodes = { "400", "500" }; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/LoggingExtensions.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/LoggingExtensions.cs index 0582bb72617..cec8f74e6ba 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/LoggingExtensions.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/LoggingExtensions.cs @@ -14,19 +14,19 @@ internal static class LoggingExtensions LoggerMessage.Define( eventId: TestAppLogEventIds.ScenarioState.EventId(), logLevel: LogLevel.Information, - formatString: "State: {state}"); + formatString: "State: {State}"); private static readonly Action _receivedCommand = LoggerMessage.Define( eventId: TestAppLogEventIds.ReceivedCommand.EventId(), logLevel: LogLevel.Debug, - formatString: "Received command: {command}; Expected: {expected}"); + formatString: "Received command: {Command}; Expected: {Expected}"); private static readonly Action _environmentVariable = LoggerMessage.Define( eventId: TestAppLogEventIds.EnvironmentVariable.EventId(), logLevel: LogLevel.Information, - formatString: "Environment Variable: {name} = {value}"); + formatString: "Environment Variable: {Name} = {Value}"); public static void ScenarioState(this ILogger logger, TestAppScenarios.SenarioState state) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Program.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Program.cs index c93730d39d9..eda6c15b7c2 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Program.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Program.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp { - internal class Program + internal sealed class Program { public static Task Main(string[] args) { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/ScenarioHelpers.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/ScenarioHelpers.cs index 9afd925a5b8..5aa10410e77 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/ScenarioHelpers.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/ScenarioHelpers.cs @@ -101,7 +101,7 @@ public static async Task WaitForCommandAsync(string[] expectedCommands, return commandReceived; } - private class JsonConsoleLoggerProvider : ILoggerProvider + private sealed class JsonConsoleLoggerProvider : ILoggerProvider { private readonly ConcurrentDictionary _loggers = new(); @@ -114,7 +114,7 @@ public void Dispose() { } - private class JsonConsoleLogger : ILogger + private sealed class JsonConsoleLogger : ILogger { private string _categoryName; diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/AsyncWaitScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/AsyncWaitScenario.cs index 85c497307ff..fc66f845c62 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/AsyncWaitScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/AsyncWaitScenario.cs @@ -12,7 +12,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios /// /// Async waits until it receives the Continue command. /// - internal class AsyncWaitScenario + internal static class AsyncWaitScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/EnvironmentVariablesScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/EnvironmentVariablesScenario.cs index 986133b6d47..933a85146ef 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/EnvironmentVariablesScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/EnvironmentVariablesScenario.cs @@ -13,7 +13,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios /// /// Prints out the environment variables. /// - internal class EnvironmentVariablesScenario + internal static class EnvironmentVariablesScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/ExecuteScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/ExecuteScenario.cs index f4991bb25eb..d68e67bf76a 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/ExecuteScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/ExecuteScenario.cs @@ -13,7 +13,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios /// /// Async waits until it receives the Continue command. /// - internal class ExecuteScenario + internal static class ExecuteScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/LoggerScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/LoggerScenario.cs index 2e022cf8992..a6deb775d0f 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/LoggerScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/LoggerScenario.cs @@ -14,7 +14,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios { - internal class LoggerScenario + internal static class LoggerScenario { public static Command Command() { @@ -85,17 +85,17 @@ public static async Task ExecuteAsync(InvocationContext context) private static void LogTraceMessage(ILogger logger) { - logger.LogTrace(new EventId(1, "EventIdTrace"), "Trace message with values {value1} and {value2}.", 3, true); + logger.LogTrace(new EventId(1, "EventIdTrace"), "Trace message with values {Value1} and {Value2}.", 3, true); } private static void LogDebugMessage(ILogger logger) { - logger.LogDebug(new EventId(1, "EventIdDebug"), "Debug message with values {value1} and {value2}.", new Guid("F39A5065-732B-4CCE-89D1-52E4AF39E233"), null); + logger.LogDebug(new EventId(1, "EventIdDebug"), "Debug message with values {Value1} and {Value2}.", new Guid("F39A5065-732B-4CCE-89D1-52E4AF39E233"), null); } private static void LogInformationMessage(ILogger logger) { - logger.LogInformation("Information message with values {value1} and {value2}.", "hello", "goodbye"); + logger.LogInformation("Information message with values {Value1} and {Value2}.", "hello", "goodbye"); } private static void LogWarningMessage(ILogger logger) @@ -113,7 +113,7 @@ private static void LogWarningMessage(ILogger logger) private static void LogErrorMessage(ILogger logger) { - logger.LogError(new EventId(1, "EventIdError"), "Error message with values {value1} and {value2}.", 'a', new IntPtr(42)); + logger.LogError(new EventId(1, "EventIdError"), "Error message with values {Value1} and {Value2}.", 'a', new IntPtr(42)); } private static void LogCriticalMessage(ILogger logger) diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/SpinWaitScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/SpinWaitScenario.cs index acdc71fa7b4..70b10e6351e 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/SpinWaitScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/SpinWaitScenario.cs @@ -13,7 +13,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios /// /// Synchronously spins until it receives the Continue command. /// - internal class SpinWaitScenario + internal static class SpinWaitScenario { public static Command Command() { diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksScenario.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksScenario.cs index 2170dc627b5..01e4a8b8b0c 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksScenario.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksScenario.cs @@ -13,7 +13,7 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios { - internal class StacksScenario + internal static class StacksScenario { [DllImport(ProfilerIdentifiers.LibraryRootFileName, CallingConvention = CallingConvention.StdCall, PreserveSig = true)] public static extern int TestHook([MarshalAs(UnmanagedType.FunctionPtr)] Action callback); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksWorker.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksWorker.cs index b2059fca71c..6d20e56bf81 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksWorker.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.UnitTestApp/Scenarios/StacksWorker.cs @@ -8,11 +8,11 @@ namespace Microsoft.Diagnostics.Monitoring.UnitTestApp.Scenarios { - internal class StacksWorker : IDisposable + internal sealed class StacksWorker : IDisposable { private EventWaitHandle _eventWaitHandle = new ManualResetEvent(false); - public class StacksWorkerNested + public sealed class StacksWorkerNested { private WaitHandle _handle; diff --git a/src/Tools/dotnet-monitor/CollectionRules/ActionOptionsDependencyAnalyzer.cs b/src/Tools/dotnet-monitor/CollectionRules/ActionOptionsDependencyAnalyzer.cs index fe78106def7..1eec350b7ac 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/ActionOptionsDependencyAnalyzer.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/ActionOptionsDependencyAnalyzer.cs @@ -188,7 +188,7 @@ private void EnsureDependencies(CollectionRuleActionOptions options, int actionI continue; } - int foundIndex = 0; + int foundIndex; int startIndex = 0; PropertyDependency propertyDependency = null; @@ -210,10 +210,7 @@ private void EnsureDependencies(CollectionRuleActionOptions options, int actionI continue; } - if (propertyDependency == null) - { - propertyDependency = GetOrCreateDependency(actionIndex, property, originalValue); - } + propertyDependency ??= GetOrCreateDependency(actionIndex, property, originalValue); var dependency = new ActionDependency(dependencyOptions, actionResultName, foundIndex, suffixIndex); propertyDependency.ActionDependencies.Add(dependency); @@ -278,9 +275,9 @@ private bool GetActionResultReference(string actionReference, int actionIndex, return true; } - private IEnumerable GetDependencyPropertiesFromSettings(CollectionRuleActionOptions options) + private static IEnumerable GetDependencyPropertiesFromSettings(CollectionRuleActionOptions options) { - return _tokenParser.GetPropertiesFromSettings(options.Settings, p => p.GetCustomAttributes(typeof(ActionOptionsDependencyPropertyAttribute), inherit: true).Any()); + return ConfigurationTokenParser.GetPropertiesFromSettings(options.Settings, p => p.GetCustomAttributes(typeof(ActionOptionsDependencyPropertyAttribute), inherit: true).Any()); } diff --git a/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleContainer.cs b/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleContainer.cs index 49dcbcbf2b8..54ce55bfc42 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleContainer.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleContainer.cs @@ -244,7 +244,7 @@ private async Task StopRulesCore(CancellationToken token) } } - private bool TrySetCanceledAndReturnTrue(OperationCanceledException ex, TaskCompletionSource source) + private static bool TrySetCanceledAndReturnTrue(OperationCanceledException ex, TaskCompletionSource source) { // Always attempt to cancel the completion source source.TrySetCanceled(ex.CancellationToken); diff --git a/src/Tools/dotnet-monitor/CollectionRules/CollectionRulePipeline.cs b/src/Tools/dotnet-monitor/CollectionRules/CollectionRulePipeline.cs index dfd495f7421..96b7ffcc97d 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/CollectionRulePipeline.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/CollectionRulePipeline.cs @@ -28,7 +28,7 @@ internal class CollectionRulePipeline : Pipeline private readonly ICollectionRuleTriggerOperations _triggerOperations; // Flag used to guard against multiple invocations of _startCallback. - private bool _invokedStartCallback = false; + private bool _invokedStartCallback; private CollectionRulePipelineState _stateHolder; diff --git a/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleService.cs b/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleService.cs index 9aca6174a73..4e8dee2b92b 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleService.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/CollectionRuleService.cs @@ -97,7 +97,11 @@ public async Task ApplyRules( throw new ArgumentNullException(nameof(endpointInfo)); } - IProcessInfo processInfo = await ProcessInfoImpl.FromEndpointInfoAsync(endpointInfo); + IProcessInfo processInfo; + { + using CancellationTokenSource extendedInfoCancellation = new(ProcessInfoImpl.ExtendedProcessInfoTimeout); + processInfo = await ProcessInfoImpl.FromEndpointInfoAsync(endpointInfo, extendedInfoCancellation.Token); + } IReadOnlyCollection ruleNames = _provider.GetCollectionRuleNames(); diff --git a/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRuleBindingHelper.cs b/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRuleBindingHelper.cs index be8860621b1..7fbee9f368f 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRuleBindingHelper.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRuleBindingHelper.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Tools.Monitor.CollectionRules.Configuration { - internal class CollectionRuleBindingHelper + internal static class CollectionRuleBindingHelper { public static void BindActionSettings(IConfigurationSection actionSection, CollectionRuleActionOptions actionOptions, ICollectionRuleActionOperations actionOperations) { diff --git a/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRulePostConfigureNamedOptions.cs b/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRulePostConfigureNamedOptions.cs index 4e9c05c8a79..f76bbc696a6 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRulePostConfigureNamedOptions.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Configuration/CollectionRulePostConfigureNamedOptions.cs @@ -126,7 +126,7 @@ private void ResolveLimits(CollectionRuleOptions ruleOptions, IConfigurationSect } } - private bool TryGetTemplate(CollectionRuleOptions ruleOptions, IDictionary templatesOptions, string templateKey, out T templatesValue) where T : new() + private static bool TryGetTemplate(CollectionRuleOptions ruleOptions, IDictionary templatesOptions, string templateKey, out T templatesValue) where T : new() { if (!templatesOptions.TryGetValue(templateKey, out templatesValue)) { @@ -138,7 +138,7 @@ private void ResolveLimits(CollectionRuleOptions ruleOptions, IConfigurationSect return true; } - private bool SectionHasValue(IConfigurationSection section) + private static bool SectionHasValue(IConfigurationSection section) { // If the section has a value, the value is the name of a template. return !string.IsNullOrEmpty(section.Value); diff --git a/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptions.cs b/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptions.cs index 426945cfee6..282035dee1a 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptions.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptions.cs @@ -21,7 +21,7 @@ internal enum CallStackFormat #if SCHEMAGEN [NJsonSchema.Annotations.JsonSchemaFlatten] #endif - internal partial record class CollectStacksOptions : BaseRecordOptions, IEgressProviderProperties + internal sealed partial record class CollectStacksOptions : BaseRecordOptions, IEgressProviderProperties { [Experimental] [Display( diff --git a/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptionsDefaults.cs b/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptionsDefaults.cs index a16661b846c..b393536f3cd 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptionsDefaults.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Options/Actions/CollectStacksOptionsDefaults.cs @@ -6,6 +6,6 @@ namespace Microsoft.Diagnostics.Tools.Monitor.CollectionRules.Options.Actions { internal static class CollectStacksOptionsDefaults { - public static readonly CallStackFormat Format = CallStackFormat.Json; + public const CallStackFormat Format = CallStackFormat.Json; } } diff --git a/src/Tools/dotnet-monitor/CollectionRules/Options/RegularExpressionsAttribute.cs b/src/Tools/dotnet-monitor/CollectionRules/Options/RegularExpressionsAttribute.cs index a2ab2359b30..9318d74ab6e 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Options/RegularExpressionsAttribute.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Options/RegularExpressionsAttribute.cs @@ -8,7 +8,7 @@ namespace Microsoft.Diagnostics.Tools.Monitor.CollectionRules.Options { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] - internal class RegularExpressionsAttribute : RegularExpressionAttribute + internal sealed class RegularExpressionsAttribute : RegularExpressionAttribute { public RegularExpressionsAttribute(string pattern) : base(pattern) { diff --git a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestCountTriggerFactory.cs b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestCountTriggerFactory.cs index 37c66086dab..73e1d44542b 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestCountTriggerFactory.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestCountTriggerFactory.cs @@ -42,7 +42,7 @@ public ICollectionRuleTrigger Create(IEndpointInfo endpointInfo, Action callback var aspnetTriggerSourceConfiguration = new AspNetTriggerSourceConfiguration(); - return _eventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); + return EventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); } } } diff --git a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestDurationTriggerFactory.cs b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestDurationTriggerFactory.cs index f3fbfd623c6..48de8655a05 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestDurationTriggerFactory.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetRequestDurationTriggerFactory.cs @@ -47,7 +47,7 @@ public ICollectionRuleTrigger Create(IEndpointInfo endpointInfo, Action callback var aspnetTriggerSourceConfiguration = new AspNetTriggerSourceConfiguration(_counterOptions.CurrentValue.GetIntervalSeconds()); - return _eventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); + return EventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); } } } diff --git a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetResponseStatusTriggerFactory.cs b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetResponseStatusTriggerFactory.cs index 23217365764..c107ee6251d 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetResponseStatusTriggerFactory.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Triggers/AspNetResponseStatusTriggerFactory.cs @@ -45,7 +45,7 @@ public ICollectionRuleTrigger Create(IEndpointInfo endpointInfo, Action callback var aspnetTriggerSourceConfiguration = new AspNetTriggerSourceConfiguration(); - return _eventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); + return EventPipeTriggerFactory.Create(endpointInfo, aspnetTriggerSourceConfiguration, _traceEventTriggerFactory, settings, callback); } private static StatusCodeRange ParseRange(string range) diff --git a/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventCounterTriggerFactory.cs b/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventCounterTriggerFactory.cs index d4afd574619..79307a72614 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventCounterTriggerFactory.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventCounterTriggerFactory.cs @@ -48,7 +48,7 @@ public ICollectionRuleTrigger Create(IEndpointInfo endpointInfo, Action callback SlidingWindowDuration = options.SlidingWindowDuration.GetValueOrDefault(TimeSpan.Parse(EventCounterOptionsDefaults.SlidingWindowDuration)) }; - return _eventPipeTriggerFactory.Create( + return EventPipeTriggerFactory.Create( endpointInfo, EventCounterTrigger.CreateConfiguration(settings), _traceEventTriggerFactory, diff --git a/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventPipeTriggerFactory.cs b/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventPipeTriggerFactory.cs index 1045165927c..c6d4e2d6dea 100644 --- a/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventPipeTriggerFactory.cs +++ b/src/Tools/dotnet-monitor/CollectionRules/Triggers/EventPipeTriggerFactory.cs @@ -19,7 +19,7 @@ internal sealed class EventPipeTriggerFactory /// Creates a collection rule trigger sourced from the event pipe of the target /// process represented by the specified endpoint. /// - public ICollectionRuleTrigger Create( + public static ICollectionRuleTrigger Create( IEndpointInfo endpointInfo, MonitoringSourceConfiguration configuration, ITraceEventTriggerFactory factory, diff --git a/src/Tools/dotnet-monitor/ConfigurationJsonWriter.cs b/src/Tools/dotnet-monitor/ConfigurationJsonWriter.cs index a89814f272f..747f3a6ca7a 100644 --- a/src/Tools/dotnet-monitor/ConfigurationJsonWriter.cs +++ b/src/Tools/dotnet-monitor/ConfigurationJsonWriter.cs @@ -277,7 +277,7 @@ private string GetConfigurationProvider(IConfigurationSection section, bool show return string.Empty; } - private bool CanWriteChildren(IConfigurationSection section, IEnumerable children) + private static bool CanWriteChildren(IConfigurationSection section, IEnumerable children) { if (section.Path.Equals(nameof(RootOptions.DiagnosticPort))) { @@ -305,7 +305,7 @@ private void ProcessChildren(IConfigurationSection section, bool includeChildSec } } - private bool CheckForSequentialIndices(IEnumerable children) + private static bool CheckForSequentialIndices(IEnumerable children) { int indexValue = 0; diff --git a/src/Tools/dotnet-monitor/ConfigurationTokenParser.cs b/src/Tools/dotnet-monitor/ConfigurationTokenParser.cs index 5f09941bf1f..42e09a40d1f 100644 --- a/src/Tools/dotnet-monitor/ConfigurationTokenParser.cs +++ b/src/Tools/dotnet-monitor/ConfigurationTokenParser.cs @@ -91,7 +91,7 @@ public bool TryCloneSettings(object originalSettings, ref object settings) return true; } - public IEnumerable GetPropertiesFromSettings(object settings, Predicate predicate = null) => + public static IEnumerable GetPropertiesFromSettings(object settings, Predicate predicate = null) => settings?.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType == typeof(string) && (predicate?.Invoke(p) ?? true)) ?? diff --git a/src/Tools/dotnet-monitor/DisposableHelper.cs b/src/Tools/dotnet-monitor/DisposableHelper.cs index aa81c551545..295dc68a161 100644 --- a/src/Tools/dotnet-monitor/DisposableHelper.cs +++ b/src/Tools/dotnet-monitor/DisposableHelper.cs @@ -14,8 +14,8 @@ namespace Microsoft.Diagnostics.Tools.Monitor { internal static class DisposableHelper { - private static readonly long DisposeStateActive = default(long); - private static readonly long DisposeStateDisposed = 1; + private const long DisposeStateActive = default(long); + private const long DisposeStateDisposed = 1; /// /// Inspects the parameter to check if the object has been disposed already. diff --git a/src/Tools/dotnet-monitor/DynamicNamedOptionsCache.cs b/src/Tools/dotnet-monitor/DynamicNamedOptionsCache.cs index 07505356e11..7a7278fd2f0 100644 --- a/src/Tools/dotnet-monitor/DynamicNamedOptionsCache.cs +++ b/src/Tools/dotnet-monitor/DynamicNamedOptionsCache.cs @@ -67,7 +67,7 @@ public override bool TryRemove(string name) return base.TryRemove(name); } - private bool IsDefaultName(string name) + private static bool IsDefaultName(string name) { return string.Equals(name, Options.DefaultName, StringComparison.Ordinal); } diff --git a/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.AutoFlushStream.cs b/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.AutoFlushStream.cs index 30fa036c9b1..c7ae2ddf49f 100644 --- a/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.AutoFlushStream.cs +++ b/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.AutoFlushStream.cs @@ -42,6 +42,8 @@ public override Task CopyToAsync(Stream destination, int bufferSize, Cancellatio _baseStream.CopyToAsync(destination, bufferSize, cancellationToken); public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => _baseStream.ReadAsync(buffer, offset, count, cancellationToken); + public override ValueTask ReadAsync(Memory buffer, CancellationToken cancellationToken = default) => + _baseStream.ReadAsync(buffer, cancellationToken); public override int ReadByte() => _baseStream.ReadByte(); //CONSIDER These are not really used, but should still autoflush. @@ -66,8 +68,13 @@ public override void WriteByte(byte value) public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - await _baseStream.WriteAsync(buffer, offset, count, cancellationToken); - await ProcessWriteAsync(count, cancellationToken); + await WriteAsync(buffer.AsMemory(offset, count), cancellationToken); + } + + public override async ValueTask WriteAsync(ReadOnlyMemory buffer, CancellationToken cancellationToken = default) + { + await _baseStream.WriteAsync(buffer, cancellationToken); + await ProcessWriteAsync(buffer.Length, cancellationToken); } public override void Flush() diff --git a/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.cs b/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.cs index 55b3a9c3d6b..e9f9fcbf75d 100644 --- a/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.cs +++ b/src/Tools/dotnet-monitor/Egress/AzureBlob/AzureBlobEgressProvider.cs @@ -212,7 +212,7 @@ private bool CheckQueueEgressOptions(AzureBlobEgressProviderOptions options) return queueNameSet && queueAccountUriSet; } - private Uri GetBlobAccountUri(AzureBlobEgressProviderOptions options, out string accountName) + private static Uri GetBlobAccountUri(AzureBlobEgressProviderOptions options, out string accountName) { var blobUriBuilder = new BlobUriBuilder(options.AccountUri); blobUriBuilder.Query = null; @@ -224,7 +224,7 @@ private Uri GetBlobAccountUri(AzureBlobEgressProviderOptions options, out string return blobUriBuilder.ToUri(); } - private Uri GetQueueAccountUri(AzureBlobEgressProviderOptions options, out string accountName) + private static Uri GetQueueAccountUri(AzureBlobEgressProviderOptions options, out string accountName) { var queueUriBuilder = new QueueUriBuilder(options.QueueAccountUri); @@ -253,7 +253,7 @@ private async Task EgressMessageToQueue(string blobName, AzureBlobEgressProvider } } - private async Task GetQueueClientAsync(AzureBlobEgressProviderOptions options, CancellationToken token) + private static async Task GetQueueClientAsync(AzureBlobEgressProviderOptions options, CancellationToken token) { QueueClientOptions clientOptions = new() { @@ -322,7 +322,7 @@ private async Task GetQueueClientAsync(AzureBlobEgressProviderOptio return queueClient; } - private async Task GetBlobContainerClientAsync(AzureBlobEgressProviderOptions options, CancellationToken token) + private static async Task GetBlobContainerClientAsync(AzureBlobEgressProviderOptions options, CancellationToken token) { bool mayHaveLimitedPermissions = false; BlobServiceClient serviceClient; @@ -376,7 +376,7 @@ private async Task GetBlobContainerClientAsync(AzureBlobEgr return containerClient; } - private string GetBlobName(AzureBlobEgressProviderOptions options, EgressArtifactSettings artifactSettings) + private static string GetBlobName(AzureBlobEgressProviderOptions options, EgressArtifactSettings artifactSettings) { if (string.IsNullOrEmpty(options.BlobPrefix)) { @@ -388,7 +388,7 @@ private string GetBlobName(AzureBlobEgressProviderOptions options, EgressArtifac } } - private BlobHttpHeaders CreateHttpHeaders(EgressArtifactSettings artifactSettings) + private static BlobHttpHeaders CreateHttpHeaders(EgressArtifactSettings artifactSettings) { BlobHttpHeaders headers = new BlobHttpHeaders(); headers.ContentEncoding = artifactSettings.ContentEncoding; diff --git a/src/Tools/dotnet-monitor/EndpointInfo/ServerEndpointInfoSource.cs b/src/Tools/dotnet-monitor/EndpointInfo/ServerEndpointInfoSource.cs index 7738a7582ab..928621100f5 100644 --- a/src/Tools/dotnet-monitor/EndpointInfo/ServerEndpointInfoSource.cs +++ b/src/Tools/dotnet-monitor/EndpointInfo/ServerEndpointInfoSource.cs @@ -210,7 +210,7 @@ private async Task MonitorEndpointsAsync(CancellationToken token) { while (!token.IsCancellationRequested) { - await Task.Delay(PruningInterval); + await Task.Delay(PruningInterval, token); await PruneEndpointsAsync(validEndpoints: null, token); } diff --git a/src/Tools/dotnet-monitor/FilteredEndpointInfoSource.cs b/src/Tools/dotnet-monitor/FilteredEndpointInfoSource.cs index c04b6f82f4e..2f9ee0db046 100644 --- a/src/Tools/dotnet-monitor/FilteredEndpointInfoSource.cs +++ b/src/Tools/dotnet-monitor/FilteredEndpointInfoSource.cs @@ -51,7 +51,7 @@ public FilteredEndpointInfoSource( // Filter out the current process based on the connection mode. if (RuntimeInfo.IsDiagnosticsEnabled) { - int pid = Process.GetCurrentProcess().Id; + int pid = Environment.ProcessId; // Regardless of connection mode, can use the runtime instance cookie to filter self out. try diff --git a/src/Tools/dotnet-monitor/Program.cs b/src/Tools/dotnet-monitor/Program.cs index 0abc4ffdd48..6bd0026ee89 100644 --- a/src/Tools/dotnet-monitor/Program.cs +++ b/src/Tools/dotnet-monitor/Program.cs @@ -11,7 +11,7 @@ namespace Microsoft.Diagnostics.Tools.Monitor { - class Program + internal static class Program { private static Command GenerateApiKeyCommand() { diff --git a/src/Tools/dotnet-monitor/RootOptions.cs b/src/Tools/dotnet-monitor/RootOptions.cs index 1dfd8f21549..7658335c2ae 100644 --- a/src/Tools/dotnet-monitor/RootOptions.cs +++ b/src/Tools/dotnet-monitor/RootOptions.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.Tools.Monitor { - internal partial class RootOptions + internal sealed partial class RootOptions { public AuthenticationOptions Authentication { get; set; } diff --git a/src/Tools/dotnet-monitor/Startup.cs b/src/Tools/dotnet-monitor/Startup.cs index f08788c6486..f91b19437ed 100644 --- a/src/Tools/dotnet-monitor/Startup.cs +++ b/src/Tools/dotnet-monitor/Startup.cs @@ -70,7 +70,7 @@ public void ConfigureServices(IServiceCollection services) } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions corsOptions) + public static void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions corsOptions) { if (env.IsDevelopment()) { diff --git a/src/Tools/dotnet-monitor/TaskExtensions.cs b/src/Tools/dotnet-monitor/TaskExtensions.cs index 77c7b81a856..8929720448d 100644 --- a/src/Tools/dotnet-monitor/TaskExtensions.cs +++ b/src/Tools/dotnet-monitor/TaskExtensions.cs @@ -21,7 +21,11 @@ internal static class TaskExtensions /// public static Task SafeAwait(this Task task) { - return task.ContinueWith(_ => { }, TaskContinuationOptions.ExecuteSynchronously); + return task.ContinueWith( + _ => { }, + CancellationToken.None, + TaskContinuationOptions.ExecuteSynchronously, + TaskScheduler.Default); } public static async Task WithCancellation(this Task task, CancellationToken token)