From 5c505a1955f2e2966f58bad32011348b2d9de143 Mon Sep 17 00:00:00 2001 From: Aris Rellegue Date: Thu, 8 Jun 2023 10:43:57 -0700 Subject: [PATCH 01/23] Add SqlConnectionEncryptOptionConverter class which is used to convert string Encrypt option into SqlConnectionEncryptionOption type. --- .../SqlConnectionEncryptOptionConverter.xml | 51 ++++++++++ src/Microsoft.Data.SqlClient.sln | 1 + .../src/Microsoft.Data.SqlClient.csproj | 3 + .../netfx/src/Microsoft.Data.SqlClient.csproj | 3 + .../SqlClient/SqlConnectionEncryptOption.cs | 2 + .../SqlConnectionEncryptOptionConverter.cs | 46 +++++++++ .../Microsoft.Data.SqlClient.Tests.csproj | 1 + .../SqlConnectionStringBuilderTest.cs | 93 +++++++++++++++++++ 8 files changed, 200 insertions(+) create mode 100644 doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml create mode 100644 src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml new file mode 100644 index 0000000000..9f26bc71c7 --- /dev/null +++ b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml @@ -0,0 +1,51 @@ + + + + + Converts a string Sql Connection Encrypt option into SqlConnectionEncryptOption object + + + ## Remarks +Implicit conversions have been added to maintain backwards compatibility with boolean behahavior for the property. When converting from a boolean, a value of `true` converts to and a value of `false` converts to . When converting to a boolean, , , and `null` convert to `true` and converts `false`. + + + + + + If the source type is a string then conversion is allowed . + + A string containing the value to convert. + + if the parameter can be converted successfully; otherwise, . + + This method does not throw an exception. + + + + Converts the specified string representation of a logical value to its equivalent. + + A string containing the value to convert. + + An object that is equivalent to . + + + An object that is equivalent to with value of if conversion was successful; + otherwise, an exception is thrown. + + This method throws an exception if conversion fails. + + + + Converts an object value to its string representation. + + An object containing the value to convert. + + A string representation of the value of . + + + A string representation of the value of . + + This method does not throw an exception if conversion fails. + + + diff --git a/src/Microsoft.Data.SqlClient.sln b/src/Microsoft.Data.SqlClient.sln index c5b34945a0..a94447bf12 100644 --- a/src/Microsoft.Data.SqlClient.sln +++ b/src/Microsoft.Data.SqlClient.sln @@ -121,6 +121,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Data.SqlClient", ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml + ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj index be1eb19b17..41f8374191 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj @@ -330,6 +330,9 @@ Microsoft\Data\SqlClient\SqlConnectionEncryptOption.cs + + Microsoft\Data\SqlClient\SqlConnectionEncryptOptionConverter.cs + Microsoft\Data\SqlClient\SqlConnectionPoolGroupProviderInfo.cs diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj index 4492274116..675dd57fe6 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj @@ -422,6 +422,9 @@ Microsoft\Data\SqlClient\SqlConnectionEncryptOption.cs + + Microsoft\Data\SqlClient\SqlConnectionEncryptOptionConverter.cs + Microsoft\Data\SqlClient\SqlConnectionPoolGroupProviderInfo.cs diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs index ecabdb9f04..997833437f 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOption.cs @@ -3,11 +3,13 @@ // See the LICENSE file in the project root for more information. using System; +using System.ComponentModel; using Microsoft.Data.Common; namespace Microsoft.Data.SqlClient { /// + [TypeConverter(typeof(SqlConnectionEncryptOptionConverter))] public sealed class SqlConnectionEncryptOption { private const string TRUE = "True"; diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs new file mode 100644 index 0000000000..da5eb6f8a1 --- /dev/null +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -0,0 +1,46 @@ +// 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.ComponentModel; +using System.Globalization; +using System.Drawing; + +namespace Microsoft.Data.SqlClient +{ + /// + public class SqlConnectionEncryptOptionConverter : TypeConverter + { + // Overrides the CanConvertFrom method of TypeConverter. + // The ITypeDescriptorContext interface provides the context for the + // conversion. Typically, this interface is used at design time to + // provide information about the design-time container. + /// + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + // Overrides the ConvertFrom method of TypeConverter. + /// + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + if (value is string) + { + return SqlConnectionEncryptOption.Parse(value.ToString()); + } + throw new Exception("Value to convert must be of string type!"); + } + // Overrides the ConvertTo method of TypeConverter. + /// + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + return base.ConvertTo(context, culture, value, destinationType); + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj index 9d1e8d5087..408d7ffa61 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj @@ -66,6 +66,7 @@ + diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 2bc842566a..591a426568 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -4,6 +4,12 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System.Text; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Xunit; namespace Microsoft.Data.SqlClient.Tests @@ -468,6 +474,36 @@ public void EncryptTryParseInvalidValuesReturnsFalse(string value) Assert.Null(result); } + [Theory] + [InlineData("false","False")] + [InlineData("true", "True")] + [InlineData("strict", "Strict")] + [InlineData("mandatory","True")] + [InlineData("optional", "False")] + [InlineData("yes", "True")] + [InlineData("no", "False")] + [InlineData("absolutely", "True")] + [InlineData("affirmative", "True")] + [InlineData("never", "True")] + [InlineData("always", "True")] + [InlineData("none", "True")] + public void ConnectionStringFromJsonTests(string value, string expectedValue) + { + ExecuteConnectionStringFromJsonTests(value, expectedValue); + } + + [Theory] + [InlineData("absolutely")] + [InlineData("affirmative")] + [InlineData("never")] + [InlineData("always")] + [InlineData("none")] + [InlineData(" for sure ")] + public void ConnectionStringFromJsonThrowsException(string value) + { + ExecuteConnectionStringFromJsonThrowsException(value); + } + internal void ExecuteConnectionStringTests(string connectionString) { SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); @@ -495,5 +531,62 @@ internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlCon Assert.IsType(builder.Encrypt); Assert.Equal(expectedValue, builder.Encrypt); } + + internal void ExecuteConnectionStringFromJsonTests(string encryptOption, string result) + { + var settings = LoadSettingsFromJsonStream(encryptOption); + var connectionString = settings!.UserDb!.ToString(); + Assert.Contains($"Encrypt={result}", connectionString, StringComparison.InvariantCultureIgnoreCase); + } + + internal void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) + { + Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); + } + + TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class + { + TSettings settingsOut = null; + + Host.CreateDefaultBuilder() + .ConfigureAppConfiguration((ctx, configBuilder) => + { + // Note: Inside string interpolation, a { should be {{ and a } should be }} + // First, declare a stringified JSON + var json = $"{{ \"UserDb\": {{ \"UserComponents\": {{ \"NetworkLibrary\": \"DBMSSOCN\", \"UserID\": \"user\", \"Password\": \"password\", \"DataSource\": \"localhost\", \"InitialCatalog\": \"catalog\", \"Encrypt\": \"{encryptOption}\" }}}}}}"; + + // Load the stringified JSON as a stream into the configuration builder + configBuilder.AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(json))); + configBuilder.AddEnvironmentVariables(); + }) + .ConfigureServices((ctx, services) => + { + var configuration = ctx.Configuration; + services.AddOptions(); + services.Configure(ctx.Configuration); + settingsOut = configuration.Get(); + }) + .Build(); + + return settingsOut; + } + } + + // These 2 classes will be used by ConnectionStringFromJsonTests only + internal class UserDbConnectionStringSettings + { + [Required] + public UserSqlConnectionString UserDb { get; set; } + } + + internal class UserSqlConnectionString + { + public SqlConnectionStringBuilder UserComponents { get; set; } = new(); + + public override string ToString() + { + return UserComponents!.ConnectionString; + } } + } From 4ebaabd4a89c99f37d3c4a9ca85f01ea1c866c73 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Thu, 8 Jun 2023 12:10:30 -0700 Subject: [PATCH 02/23] Removed added blank line. --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 591a426568..c0396a7000 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -588,5 +588,4 @@ public override string ToString() return UserComponents!.ConnectionString; } } - } From 39a7ea825f5fd948437f07f481c8cfe6722e5baf Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Thu, 8 Jun 2023 12:19:41 -0700 Subject: [PATCH 03/23] Removed redundant InLineData from ConnectionStringFromJsonTests. --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index c0396a7000..7ae9456692 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -482,11 +482,6 @@ public void EncryptTryParseInvalidValuesReturnsFalse(string value) [InlineData("optional", "False")] [InlineData("yes", "True")] [InlineData("no", "False")] - [InlineData("absolutely", "True")] - [InlineData("affirmative", "True")] - [InlineData("never", "True")] - [InlineData("always", "True")] - [InlineData("none", "True")] public void ConnectionStringFromJsonTests(string value, string expectedValue) { ExecuteConnectionStringFromJsonTests(value, expectedValue); From 0a0768ef9a94a5e251340d148b461c0465613ab5 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Thu, 8 Jun 2023 13:43:03 -0700 Subject: [PATCH 04/23] Fix issues found in PR request. --- .../SqlClient/SqlConnectionEncryptOptionConverter.cs | 2 -- .../Microsoft.Data.SqlClient.Tests.csproj | 2 +- .../FunctionalTests/SqlConnectionStringBuilderTest.cs | 10 +++++----- tools/props/Versions.props | 1 + 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index da5eb6f8a1..850afb59ce 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -1,8 +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. - - using System; using System.ComponentModel; using System.Globalization; diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj index 408d7ffa61..a90960bdc5 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj @@ -66,7 +66,7 @@ - + diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 7ae9456692..5c7112533c 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -527,19 +527,19 @@ internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlCon Assert.Equal(expectedValue, builder.Encrypt); } - internal void ExecuteConnectionStringFromJsonTests(string encryptOption, string result) + static internal void ExecuteConnectionStringFromJsonTests(string encryptOption, string result) { - var settings = LoadSettingsFromJsonStream(encryptOption); - var connectionString = settings!.UserDb!.ToString(); + UserDbConnectionStringSettings settings = LoadSettingsFromJsonStream(encryptOption); + string connectionString = settings!.UserDb!.ToString(); Assert.Contains($"Encrypt={result}", connectionString, StringComparison.InvariantCultureIgnoreCase); } - internal void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) + static internal void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) { Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); } - TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class + static TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class { TSettings settingsOut = null; diff --git a/tools/props/Versions.props b/tools/props/Versions.props index 2aab85d890..5bffde7e39 100644 --- a/tools/props/Versions.props +++ b/tools/props/Versions.props @@ -31,6 +31,7 @@ 4.5.1 6.0.0 1.1.0 + 6.0.0 From ab6a4691360389c790cf6e2edceb797c613c7f4e Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Thu, 15 Jun 2023 08:47:44 -0700 Subject: [PATCH 05/23] Changed SqlConnectionEnryptOptionConverter from public to internal. --- .../Data/SqlClient/SqlConnectionEncryptOptionConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index 850afb59ce..9ab3f79188 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -9,7 +9,7 @@ namespace Microsoft.Data.SqlClient { /// - public class SqlConnectionEncryptOptionConverter : TypeConverter + internal class SqlConnectionEncryptOptionConverter : TypeConverter { // Overrides the CanConvertFrom method of TypeConverter. // The ITypeDescriptorContext interface provides the context for the From 892625c316b0bfb575e50fe980d6a03ed4084022 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Thu, 15 Jun 2023 16:45:58 -0700 Subject: [PATCH 06/23] Applied Davoud's suggestions for changes. --- .../SqlConnectionEncryptOptionConverter.cs | 14 +----- .../SqlConnectionStringBuilderTest.cs | 49 +++++++++++-------- tools/props/Versions.props | 2 +- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index 9ab3f79188..3aff57f35f 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -4,7 +4,6 @@ using System; using System.ComponentModel; using System.Globalization; -using System.Drawing; namespace Microsoft.Data.SqlClient { @@ -28,17 +27,8 @@ public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceT /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - if (value is string) - { - return SqlConnectionEncryptOption.Parse(value.ToString()); - } - throw new Exception("Value to convert must be of string type!"); - } - // Overrides the ConvertTo method of TypeConverter. - /// - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - return base.ConvertTo(context, culture, value, destinationType); + return SqlConnectionEncryptOption.Parse(value.ToString()); } + } } diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 5c7112533c..6da428cea1 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -474,17 +474,30 @@ public void EncryptTryParseInvalidValuesReturnsFalse(string value) Assert.Null(result); } - [Theory] - [InlineData("false","False")] - [InlineData("true", "True")] - [InlineData("strict", "Strict")] - [InlineData("mandatory","True")] - [InlineData("optional", "False")] - [InlineData("yes", "True")] - [InlineData("no", "False")] - public void ConnectionStringFromJsonTests(string value, string expectedValue) + #region ConnectionStringFromJson + [Fact] + public void ConnectionStringFromJsonTests() { - ExecuteConnectionStringFromJsonTests(value, expectedValue); + UserDbConnectionStringSettings settings = LoadSettingsFromJsonStream("false"); + Assert.Equal(SqlConnectionEncryptOption.Optional, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("true"); + Assert.Equal(SqlConnectionEncryptOption.Mandatory, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("strict"); + Assert.Equal(SqlConnectionEncryptOption.Strict, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("mandatory"); + Assert.Equal(SqlConnectionEncryptOption.Mandatory, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("optional"); + Assert.Equal(SqlConnectionEncryptOption.Optional, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("yes"); + Assert.Equal(SqlConnectionEncryptOption.Mandatory, settings.UserDb.UserComponents.Encrypt); + + settings = LoadSettingsFromJsonStream("no"); + Assert.Equal(SqlConnectionEncryptOption.Optional, settings.UserDb.UserComponents.Encrypt); } [Theory] @@ -498,6 +511,7 @@ public void ConnectionStringFromJsonThrowsException(string value) { ExecuteConnectionStringFromJsonThrowsException(value); } + #endregion internal void ExecuteConnectionStringTests(string connectionString) { @@ -527,19 +541,12 @@ internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlCon Assert.Equal(expectedValue, builder.Encrypt); } - static internal void ExecuteConnectionStringFromJsonTests(string encryptOption, string result) - { - UserDbConnectionStringSettings settings = LoadSettingsFromJsonStream(encryptOption); - string connectionString = settings!.UserDb!.ToString(); - Assert.Contains($"Encrypt={result}", connectionString, StringComparison.InvariantCultureIgnoreCase); - } - - static internal void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) + internal static void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) { - Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); + Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); } - static TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class + private static TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class { TSettings settingsOut = null; @@ -567,6 +574,7 @@ static internal void ExecuteConnectionStringFromJsonThrowsException(string encry } } + #region ConnectionStringFromJsonRequiredClasses // These 2 classes will be used by ConnectionStringFromJsonTests only internal class UserDbConnectionStringSettings { @@ -583,4 +591,5 @@ public override string ToString() return UserComponents!.ConnectionString; } } + #endregion } diff --git a/tools/props/Versions.props b/tools/props/Versions.props index 5bffde7e39..4c8aa5c6d7 100644 --- a/tools/props/Versions.props +++ b/tools/props/Versions.props @@ -31,7 +31,6 @@ 4.5.1 6.0.0 1.1.0 - 6.0.0 @@ -75,6 +74,7 @@ 160.1000.6 0.13.2 6.0.0 + 6.0.0 $(NugetPackageVersion) From 789670e94c3dc4f92708d257ef86786118f76a95 Mon Sep 17 00:00:00 2001 From: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:46:09 -0700 Subject: [PATCH 07/23] Update src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 6da428cea1..df25b7dedc 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -556,7 +556,6 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry // Note: Inside string interpolation, a { should be {{ and a } should be }} // First, declare a stringified JSON var json = $"{{ \"UserDb\": {{ \"UserComponents\": {{ \"NetworkLibrary\": \"DBMSSOCN\", \"UserID\": \"user\", \"Password\": \"password\", \"DataSource\": \"localhost\", \"InitialCatalog\": \"catalog\", \"Encrypt\": \"{encryptOption}\" }}}}}}"; - // Load the stringified JSON as a stream into the configuration builder configBuilder.AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(json))); configBuilder.AddEnvironmentVariables(); From 545531415cdf243dd8c8915d2fb1e6c64605238b Mon Sep 17 00:00:00 2001 From: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:46:36 -0700 Subject: [PATCH 08/23] Update tools/props/Versions.props --- tools/props/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/props/Versions.props b/tools/props/Versions.props index 4c8aa5c6d7..6588fb2651 100644 --- a/tools/props/Versions.props +++ b/tools/props/Versions.props @@ -74,7 +74,7 @@ 160.1000.6 0.13.2 6.0.0 - 6.0.0 + 6.0.0 $(NugetPackageVersion) From e07547ab6ab68386970f023ba811782d824de424 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Mon, 19 Jun 2023 10:52:47 -0700 Subject: [PATCH 09/23] Add more SqlConnectionEncryptOptionConverter unit tests. --- .../SqlConnectionEncryptOptionConverter.xml | 14 ++- .../SqlConnectionEncryptOptionConverter.cs | 27 ++++- .../SqlConnectionStringBuilderTest.cs | 101 +++++++++++++++++- 3 files changed, 138 insertions(+), 4 deletions(-) diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml index 9f26bc71c7..7c00c693d2 100644 --- a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml +++ b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml @@ -14,12 +14,22 @@ Implicit conversions have been added to maintain backwards compatibility with bo If the source type is a string then conversion is allowed . - A string containing the value to convert. + A value's type to check for conversion. - if the parameter can be converted successfully; otherwise, . + if the type parameter can be converted successfully; otherwise, . This method does not throw an exception. + + + If the target type is a string then conversion is allowed . + + A value's type to check for conversion. + + if the type parameter can be converted successfully; otherwise, . + + This method does not throw an exception. + Converts the specified string representation of a logical value to its equivalent. diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index 3aff57f35f..e19d6cad21 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -23,12 +23,37 @@ public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceT } return base.CanConvertFrom(context, sourceType); } + + // Overrides the CanConvertTo method of TypeConverter. + public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertTo(context, sourceType); + } + // Overrides the ConvertFrom method of TypeConverter. /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - return SqlConnectionEncryptOption.Parse(value.ToString()); + if (value is string) + { + return SqlConnectionEncryptOption.Parse(value.ToString()); + } + throw new ArgumentException(StringsHelper.GetString(Strings.SqlConvert_ConvertFailed, value.GetType().FullName, typeof(SqlConnectionEncryptOption).FullName)); } + // Overrides the ConvertTo method of TypeConverter. + /// + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string)) + { + return base.ConvertTo(context, culture, value, destinationType); + } + throw new ArgumentException(StringsHelper.GetString(Strings.SqlConvert_ConvertFailed, value.GetType().FullName, typeof(SqlConnectionEncryptOption).FullName)); + } } } diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index df25b7dedc..2bebc4d085 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -4,12 +4,14 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.IO; using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Newtonsoft.Json.Linq; using Xunit; namespace Microsoft.Data.SqlClient.Tests @@ -474,7 +476,7 @@ public void EncryptTryParseInvalidValuesReturnsFalse(string value) Assert.Null(result); } - #region ConnectionStringFromJson + #region SqlConnectionEncryptOptionCoverterTests [Fact] public void ConnectionStringFromJsonTests() { @@ -511,6 +513,72 @@ public void ConnectionStringFromJsonThrowsException(string value) { ExecuteConnectionStringFromJsonThrowsException(value); } + + [Fact] + public void SqlConnectionEncryptOptionConverterCanConvertFromTest() + { + // Get a converter + SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); + TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); + // Use the converter to determine if can convert from string data type + Assert.True(converter.CanConvertFrom(null, typeof(string))); + // Use the same converter to determine if can convert from int or bool data types + Assert.False(converter.CanConvertFrom(null, typeof(int))); + Assert.False(converter.CanConvertFrom(null, typeof(bool))); + } + + [Fact] + public void SqlConnectionEncryptOptionConverterCanConvertToTest() + { + // Get a converter + SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); + TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); + // Use the converter to check if can convert from stirng + Assert.True(converter.CanConvertTo(null, typeof(string))); + // Use the same convert to check if can convert to int or bool + Assert.False(converter.CanConvertTo(null, typeof(int))); + Assert.False(converter.CanConvertTo(null, typeof(bool))); + } + + [Fact] + public void SqlConnectionEncryptOptionConverterConvertFromTest() + { + // Create a converter + SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); + TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); + // Use the converter to convert all possible valid values + Assert.Equal(SqlConnectionEncryptOption.Parse("false"), converter.ConvertFrom("false")); + Assert.Equal(SqlConnectionEncryptOption.Parse("true"), converter.ConvertFrom("true")); + Assert.Equal(SqlConnectionEncryptOption.Parse("strict"), converter.ConvertFrom("strict")); + Assert.Equal(SqlConnectionEncryptOption.Parse("mandatory"), converter.ConvertFrom("mandatory")); + Assert.Equal(SqlConnectionEncryptOption.Parse("optional"), converter.ConvertFrom("optional")); + Assert.Equal(SqlConnectionEncryptOption.Parse("yes"), converter.ConvertFrom("yes")); + Assert.Equal(SqlConnectionEncryptOption.Parse("no"), converter.ConvertFrom("no")); + // Use the converter to covert invalid value + Assert.Throws(() => converter.ConvertFrom("affirmative")); + // Use the same converter to convert from bad data types + Assert.Throws(() => converter.ConvertFrom(1)); + Assert.Throws(() => converter.ConvertFrom(true)); + } + + [Fact] + public void SqlConnectionEncryptOptionConverterConvertToTest() + { + // Get a converter + SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); + TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); + // Use the converter to convert all possible valid values to string + Assert.Equal("False", converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(string))); + Assert.Equal("True", converter.ConvertTo(SqlConnectionEncryptOption.Parse("true"), typeof(string))); + Assert.Equal("Strict", converter.ConvertTo(SqlConnectionEncryptOption.Parse("strict"), typeof(string))); + Assert.Equal("True", converter.ConvertTo(SqlConnectionEncryptOption.Parse("mandatory"), typeof(string))); + Assert.Equal("False", converter.ConvertTo(SqlConnectionEncryptOption.Parse("optional"), typeof(string))); + Assert.Equal("True", converter.ConvertTo(SqlConnectionEncryptOption.Parse("yes"), typeof(string))); + Assert.Equal("False", converter.ConvertTo(SqlConnectionEncryptOption.Parse("no"), typeof(string))); + // Use the same converter to try convert to bad data types + Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(int))); + Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(bool))); + } #endregion internal void ExecuteConnectionStringTests(string connectionString) @@ -546,6 +614,11 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); } + internal static void ExecuteConnectionStringFromBadJsonThrowsException(int encryptOption) + { + Assert.Throws(() => LoadSettingsFromBadJsonStream(encryptOption)); + } + private static TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class { TSettings settingsOut = null; @@ -571,6 +644,32 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry return settingsOut; } + + private static TSettings LoadSettingsFromBadJsonStream(int encryptOption) where TSettings : class + { + TSettings settingsOut = null; + + Host.CreateDefaultBuilder() + .ConfigureAppConfiguration((ctx, configBuilder) => + { + // Note: Inside string interpolation, a { should be {{ and a } should be }} + // First, declare a stringified JSON + var json = $"{{ \"UserDb\": {{ \"UserComponents\": {{ \"NetworkLibrary\": \"DBMSSOCN\", \"UserID\": \"user\", \"Password\": \"password\", \"DataSource\": \"localhost\", \"InitialCatalog\": \"catalog\", \"Encrypt\": {encryptOption} }}}}}}"; + // Load the stringified JSON as a stream into the configuration builder + configBuilder.AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(json))); + configBuilder.AddEnvironmentVariables(); + }) + .ConfigureServices((ctx, services) => + { + var configuration = ctx.Configuration; + services.AddOptions(); + services.Configure(ctx.Configuration); + settingsOut = configuration.Get(); + }) + .Build(); + + return settingsOut; + } } #region ConnectionStringFromJsonRequiredClasses From 7197981ac8be3d81d3c643d7821bd47747be61f5 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Mon, 19 Jun 2023 12:06:27 -0700 Subject: [PATCH 10/23] Add assessment of exception thrown in ExecuteConnectionStringFromJsonThrowsException unit test. --- .../SqlConnectionStringBuilderTest.cs | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 2bebc4d085..41e2218c9c 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -578,7 +578,22 @@ public void SqlConnectionEncryptOptionConverterConvertToTest() // Use the same converter to try convert to bad data types Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(int))); Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(bool))); - } + } + internal class UserDbConnectionStringSettings + { + [Required] + public UserSqlConnectionString UserDb { get; set; } + } + + internal class UserSqlConnectionString + { + public SqlConnectionStringBuilder UserComponents { get; set; } = new(); + + public override string ToString() + { + return UserComponents!.ConnectionString; + } + } #endregion internal void ExecuteConnectionStringTests(string connectionString) @@ -611,12 +626,8 @@ internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlCon internal static void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) { - Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); - } - - internal static void ExecuteConnectionStringFromBadJsonThrowsException(int encryptOption) - { - Assert.Throws(() => LoadSettingsFromBadJsonStream(encryptOption)); + var exception = Assert.Throws(() => LoadSettingsFromJsonStream(encryptOption)); + Assert.Contains("Failed to convert configuration", exception.Message, StringComparison.Ordinal); } private static TSettings LoadSettingsFromJsonStream(string encryptOption) where TSettings : class @@ -674,20 +685,6 @@ internal static void ExecuteConnectionStringFromBadJsonThrowsException(int encry #region ConnectionStringFromJsonRequiredClasses // These 2 classes will be used by ConnectionStringFromJsonTests only - internal class UserDbConnectionStringSettings - { - [Required] - public UserSqlConnectionString UserDb { get; set; } - } - internal class UserSqlConnectionString - { - public SqlConnectionStringBuilder UserComponents { get; set; } = new(); - - public override string ToString() - { - return UserComponents!.ConnectionString; - } - } #endregion } From d7f0058000638f0ea1f76cdb0bdffe99396d4020 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Mon, 19 Jun 2023 12:16:36 -0700 Subject: [PATCH 11/23] Added blank line. --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 41e2218c9c..71ab2e796d 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -579,6 +579,7 @@ public void SqlConnectionEncryptOptionConverterConvertToTest() Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(int))); Assert.Throws(() => converter.ConvertTo(SqlConnectionEncryptOption.Parse("false"), typeof(bool))); } + internal class UserDbConnectionStringSettings { [Required] From 7dee6498977855372409c451cbe31c9fd0b14122 Mon Sep 17 00:00:00 2001 From: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> Date: Mon, 19 Jun 2023 17:06:33 -0700 Subject: [PATCH 12/23] Apply suggestions from code review --- .../SqlConnectionStringBuilderTest.cs | 63 +++++++++---------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 71ab2e796d..37a79528f4 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -595,35 +595,6 @@ public override string ToString() return UserComponents!.ConnectionString; } } - #endregion - - internal void ExecuteConnectionStringTests(string connectionString) - { - SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); - string retrievedString = builder.ConnectionString; - SqlConnectionStringBuilder builder2 = new SqlConnectionStringBuilder(retrievedString); - - Assert.Equal(builder, builder2); - Assert.NotNull(builder.Values); - Assert.True(builder.Values.Count > 0); - foreach (string key in builder2.Keys) - { - Assert.True(builder.TryGetValue(key, out object valueBuilder1)); - Assert.True(builder2.TryGetValue(key, out object valueBuilder2)); - Assert.Equal(valueBuilder1, valueBuilder2); - Assert.True(builder2.ContainsKey(key)); - } - using (SqlConnection connection = new SqlConnection(connectionString)) - { - Assert.NotNull(connection); - } - } - - internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlConnectionEncryptOption expectedValue) - { - Assert.IsType(builder.Encrypt); - Assert.Equal(expectedValue, builder.Encrypt); - } internal static void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) { @@ -656,6 +627,35 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry return settingsOut; } + #endregion + + internal void ExecuteConnectionStringTests(string connectionString) + { + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); + string retrievedString = builder.ConnectionString; + SqlConnectionStringBuilder builder2 = new SqlConnectionStringBuilder(retrievedString); + + Assert.Equal(builder, builder2); + Assert.NotNull(builder.Values); + Assert.True(builder.Values.Count > 0); + foreach (string key in builder2.Keys) + { + Assert.True(builder.TryGetValue(key, out object valueBuilder1)); + Assert.True(builder2.TryGetValue(key, out object valueBuilder2)); + Assert.Equal(valueBuilder1, valueBuilder2); + Assert.True(builder2.ContainsKey(key)); + } + using (SqlConnection connection = new SqlConnection(connectionString)) + { + Assert.NotNull(connection); + } + } + + internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlConnectionEncryptOption expectedValue) + { + Assert.IsType(builder.Encrypt); + Assert.Equal(expectedValue, builder.Encrypt); + } private static TSettings LoadSettingsFromBadJsonStream(int encryptOption) where TSettings : class { @@ -683,9 +683,4 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry return settingsOut; } } - - #region ConnectionStringFromJsonRequiredClasses - // These 2 classes will be used by ConnectionStringFromJsonTests only - - #endregion } From c9d115ca00961ebbb4984a70e3859f74c036d025 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Tue, 20 Jun 2023 08:57:00 -0700 Subject: [PATCH 13/23] Removed unnecessary XML file for internal class SqlConnectionEncryptOptionConverter. Removed misplaced region. Removed function that is not used. --- .../SqlConnectionEncryptOptionConverter.xml | 61 -------------- .../SqlConnectionEncryptOptionConverter.cs | 4 - .../SqlConnectionStringBuilderTest.cs | 80 ++++++------------- 3 files changed, 25 insertions(+), 120 deletions(-) delete mode 100644 doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml deleted file mode 100644 index 7c00c693d2..0000000000 --- a/doc/snippets/Microsoft.Data.SqlClient/SqlConnectionEncryptOptionConverter.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Converts a string Sql Connection Encrypt option into SqlConnectionEncryptOption object - - - ## Remarks -Implicit conversions have been added to maintain backwards compatibility with boolean behahavior for the property. When converting from a boolean, a value of `true` converts to and a value of `false` converts to . When converting to a boolean, , , and `null` convert to `true` and converts `false`. - - - - - - If the source type is a string then conversion is allowed . - - A value's type to check for conversion. - - if the type parameter can be converted successfully; otherwise, . - - This method does not throw an exception. - - - - If the target type is a string then conversion is allowed . - - A value's type to check for conversion. - - if the type parameter can be converted successfully; otherwise, . - - This method does not throw an exception. - - - - Converts the specified string representation of a logical value to its equivalent. - - A string containing the value to convert. - - An object that is equivalent to . - - - An object that is equivalent to with value of if conversion was successful; - otherwise, an exception is thrown. - - This method throws an exception if conversion fails. - - - - Converts an object value to its string representation. - - An object containing the value to convert. - - A string representation of the value of . - - - A string representation of the value of . - - This method does not throw an exception if conversion fails. - - - diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index e19d6cad21..8fccc42206 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -7,14 +7,12 @@ namespace Microsoft.Data.SqlClient { - /// internal class SqlConnectionEncryptOptionConverter : TypeConverter { // Overrides the CanConvertFrom method of TypeConverter. // The ITypeDescriptorContext interface provides the context for the // conversion. Typically, this interface is used at design time to // provide information about the design-time container. - /// public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) @@ -35,7 +33,6 @@ public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceTyp } // Overrides the ConvertFrom method of TypeConverter. - /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) @@ -46,7 +43,6 @@ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo c } // Overrides the ConvertTo method of TypeConverter. - /// public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 71ab2e796d..3c97bcb921 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -595,35 +595,6 @@ public override string ToString() return UserComponents!.ConnectionString; } } - #endregion - - internal void ExecuteConnectionStringTests(string connectionString) - { - SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); - string retrievedString = builder.ConnectionString; - SqlConnectionStringBuilder builder2 = new SqlConnectionStringBuilder(retrievedString); - - Assert.Equal(builder, builder2); - Assert.NotNull(builder.Values); - Assert.True(builder.Values.Count > 0); - foreach (string key in builder2.Keys) - { - Assert.True(builder.TryGetValue(key, out object valueBuilder1)); - Assert.True(builder2.TryGetValue(key, out object valueBuilder2)); - Assert.Equal(valueBuilder1, valueBuilder2); - Assert.True(builder2.ContainsKey(key)); - } - using (SqlConnection connection = new SqlConnection(connectionString)) - { - Assert.NotNull(connection); - } - } - - internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlConnectionEncryptOption expectedValue) - { - Assert.IsType(builder.Encrypt); - Assert.Equal(expectedValue, builder.Encrypt); - } internal static void ExecuteConnectionStringFromJsonThrowsException(string encryptOption) { @@ -656,36 +627,35 @@ internal static void ExecuteConnectionStringFromJsonThrowsException(string encry return settingsOut; } + #endregion - private static TSettings LoadSettingsFromBadJsonStream(int encryptOption) where TSettings : class + internal void ExecuteConnectionStringTests(string connectionString) { - TSettings settingsOut = null; - - Host.CreateDefaultBuilder() - .ConfigureAppConfiguration((ctx, configBuilder) => - { - // Note: Inside string interpolation, a { should be {{ and a } should be }} - // First, declare a stringified JSON - var json = $"{{ \"UserDb\": {{ \"UserComponents\": {{ \"NetworkLibrary\": \"DBMSSOCN\", \"UserID\": \"user\", \"Password\": \"password\", \"DataSource\": \"localhost\", \"InitialCatalog\": \"catalog\", \"Encrypt\": {encryptOption} }}}}}}"; - // Load the stringified JSON as a stream into the configuration builder - configBuilder.AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(json))); - configBuilder.AddEnvironmentVariables(); - }) - .ConfigureServices((ctx, services) => - { - var configuration = ctx.Configuration; - services.AddOptions(); - services.Configure(ctx.Configuration); - settingsOut = configuration.Get(); - }) - .Build(); + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); + string retrievedString = builder.ConnectionString; + SqlConnectionStringBuilder builder2 = new SqlConnectionStringBuilder(retrievedString); - return settingsOut; + Assert.Equal(builder, builder2); + Assert.NotNull(builder.Values); + Assert.True(builder.Values.Count > 0); + foreach (string key in builder2.Keys) + { + Assert.True(builder.TryGetValue(key, out object valueBuilder1)); + Assert.True(builder2.TryGetValue(key, out object valueBuilder2)); + Assert.Equal(valueBuilder1, valueBuilder2); + Assert.True(builder2.ContainsKey(key)); + } + using (SqlConnection connection = new SqlConnection(connectionString)) + { + Assert.NotNull(connection); + } } - } - #region ConnectionStringFromJsonRequiredClasses - // These 2 classes will be used by ConnectionStringFromJsonTests only + internal static void CheckEncryptType(SqlConnectionStringBuilder builder, SqlConnectionEncryptOption expectedValue) + { + Assert.IsType(builder.Encrypt); + Assert.Equal(expectedValue, builder.Encrypt); + } - #endregion + } } From 4b5f86d56aaccdd5eed9e4737c6bd19e257c37df Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Tue, 20 Jun 2023 09:21:57 -0700 Subject: [PATCH 14/23] Use ADP.ConvertFailed helper function in SqlConnectionEncryptOptionConverter class. --- .../Data/SqlClient/SqlConnectionEncryptOptionConverter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs index 8fccc42206..0e22e6ce2e 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionEncryptOptionConverter.cs @@ -4,6 +4,7 @@ using System; using System.ComponentModel; using System.Globalization; +using Microsoft.Data.Common; namespace Microsoft.Data.SqlClient { @@ -39,7 +40,7 @@ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo c { return SqlConnectionEncryptOption.Parse(value.ToString()); } - throw new ArgumentException(StringsHelper.GetString(Strings.SqlConvert_ConvertFailed, value.GetType().FullName, typeof(SqlConnectionEncryptOption).FullName)); + throw ADP.ConvertFailed(value.GetType(), typeof(SqlConnectionEncryptOption), null); } // Overrides the ConvertTo method of TypeConverter. @@ -49,7 +50,7 @@ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo cul { return base.ConvertTo(context, culture, value, destinationType); } - throw new ArgumentException(StringsHelper.GetString(Strings.SqlConvert_ConvertFailed, value.GetType().FullName, typeof(SqlConnectionEncryptOption).FullName)); + throw ADP.ConvertFailed(value.GetType(), typeof(SqlConnectionEncryptOption), null); } } } From 9a42b0778856f238c4a3732f1e776df2908db6cf Mon Sep 17 00:00:00 2001 From: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> Date: Tue, 20 Jun 2023 11:40:55 -0700 Subject: [PATCH 15/23] Apply suggestions from code review --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 3c97bcb921..982158a42e 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -11,7 +11,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Newtonsoft.Json.Linq; using Xunit; namespace Microsoft.Data.SqlClient.Tests From 809bbe8b3bc2f184a3f1a1b1f7ae7a968fb4c713 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:11:54 -0700 Subject: [PATCH 16/23] Add message to show more information if CanCanConvert returns false. --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 982158a42e..5f51d65634 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -520,7 +520,7 @@ public void SqlConnectionEncryptOptionConverterCanConvertFromTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to determine if can convert from string data type - Assert.True(converter.CanConvertFrom(null, typeof(string))); + Assert.True(converter.CanConvertFrom(null, typeof(string)),"Value type to convert must a string."); // Use the same converter to determine if can convert from int or bool data types Assert.False(converter.CanConvertFrom(null, typeof(int))); Assert.False(converter.CanConvertFrom(null, typeof(bool))); From 20170ee69b3944277c7674a4b47c8074ec5b7783 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:18:23 -0700 Subject: [PATCH 17/23] Fixed grammar error in the message to show more information if CanConvertFrom test returns false. --- .../tests/FunctionalTests/SqlConnectionStringBuilderTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 5f51d65634..e62b1e7554 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -520,7 +520,7 @@ public void SqlConnectionEncryptOptionConverterCanConvertFromTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to determine if can convert from string data type - Assert.True(converter.CanConvertFrom(null, typeof(string)),"Value type to convert must a string."); + Assert.True(converter.CanConvertFrom(null, typeof(string)),"Value type to convert must be a string."); // Use the same converter to determine if can convert from int or bool data types Assert.False(converter.CanConvertFrom(null, typeof(int))); Assert.False(converter.CanConvertFrom(null, typeof(bool))); From 06b3536a8305717f49369bb84d97133c8a013fb5 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:25:19 -0700 Subject: [PATCH 18/23] Removed entry for EncryptOptionConverter XML. --- src/Microsoft.Data.SqlClient.sln | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient.sln b/src/Microsoft.Data.SqlClient.sln index a94447bf12..c5b34945a0 100644 --- a/src/Microsoft.Data.SqlClient.sln +++ b/src/Microsoft.Data.SqlClient.sln @@ -121,7 +121,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Data.SqlClient", ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml - ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml From 99d12436075f97d6daaad10570a58bcd9a7c7bec Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:27:25 -0700 Subject: [PATCH 19/23] Revert "Removed entry for EncryptOptionConverter XML." This reverts commit 06b3536a8305717f49369bb84d97133c8a013fb5. --- src/Microsoft.Data.SqlClient.sln | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Data.SqlClient.sln b/src/Microsoft.Data.SqlClient.sln index c5b34945a0..a94447bf12 100644 --- a/src/Microsoft.Data.SqlClient.sln +++ b/src/Microsoft.Data.SqlClient.sln @@ -121,6 +121,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Data.SqlClient", ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml + ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml From 766d859e3bc09c52b6e12a8fe77b4327be81a7fb Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:29:06 -0700 Subject: [PATCH 20/23] Remove EncryptOptionConverter xml in MDS solution. --- src/Microsoft.Data.SqlClient.sln | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient.sln b/src/Microsoft.Data.SqlClient.sln index a94447bf12..c5b34945a0 100644 --- a/src/Microsoft.Data.SqlClient.sln +++ b/src/Microsoft.Data.SqlClient.sln @@ -121,7 +121,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Data.SqlClient", ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionAttestationProtocol.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionColumnEncryptionSetting.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOption.xml - ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionEncryptOptionConverter.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlConnectionStringBuilder.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlCredential.xml ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml = ..\doc\snippets\Microsoft.Data.SqlClient\SqlDataAdapter.xml From 1040674ac2a55012bd55712f2c7b7a0c8d665909 Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 12:46:02 -0700 Subject: [PATCH 21/23] Add more messages to show more information if CanConvertFrom and CanConvertTo returns false. --- .../SqlConnectionStringBuilderTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index e62b1e7554..42a77474d9 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -520,10 +520,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertFromTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to determine if can convert from string data type - Assert.True(converter.CanConvertFrom(null, typeof(string)),"Value type to convert must be a string."); + Assert.True(converter.CanConvertFrom(null, typeof(string)), "Value type to convert must be a string."); // Use the same converter to determine if can convert from int or bool data types - Assert.False(converter.CanConvertFrom(null, typeof(int))); - Assert.False(converter.CanConvertFrom(null, typeof(bool))); + Assert.False(converter.CanConvertFrom(null, typeof(int)), "Value type to convert must be a string."); + Assert.False(converter.CanConvertFrom(null, typeof(bool)), "Value type to convert must be a string."); } [Fact] @@ -533,10 +533,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertToTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to check if can convert from stirng - Assert.True(converter.CanConvertTo(null, typeof(string))); + Assert.True(converter.CanConvertTo(null, typeof(string)), "Destination value type must be a string."); // Use the same convert to check if can convert to int or bool - Assert.False(converter.CanConvertTo(null, typeof(int))); - Assert.False(converter.CanConvertTo(null, typeof(bool))); + Assert.False(converter.CanConvertTo(null, typeof(int)), "Destination value type must be a string."); + Assert.False(converter.CanConvertTo(null, typeof(bool)), "Destination value type must be a string."); } [Fact] From f54d699329be5187bbe426514ac429239f2b3f5f Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 13:51:03 -0700 Subject: [PATCH 22/23] Change messages to show the expections when CanConvertFrom and CanConvertTo tests passed or failed. --- .../SqlConnectionStringBuilderTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 42a77474d9..48a34a68b7 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -520,10 +520,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertFromTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to determine if can convert from string data type - Assert.True(converter.CanConvertFrom(null, typeof(string)), "Value type to convert must be a string."); + Assert.True(converter.CanConvertFrom(null, typeof(string)), "Expected a success to convert from string type."); // Use the same converter to determine if can convert from int or bool data types - Assert.False(converter.CanConvertFrom(null, typeof(int)), "Value type to convert must be a string."); - Assert.False(converter.CanConvertFrom(null, typeof(bool)), "Value type to convert must be a string."); + Assert.False(converter.CanConvertFrom(null, typeof(int)), "Expected a failure to convert fron integer type."); + Assert.False(converter.CanConvertFrom(null, typeof(bool)), "Expected a failure to convert fron boolean type."); } [Fact] @@ -533,10 +533,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertToTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to check if can convert from stirng - Assert.True(converter.CanConvertTo(null, typeof(string)), "Destination value type must be a string."); + Assert.True(converter.CanConvertTo(null, typeof(string)), "Expected a success to convert to string type."); // Use the same convert to check if can convert to int or bool - Assert.False(converter.CanConvertTo(null, typeof(int)), "Destination value type must be a string."); - Assert.False(converter.CanConvertTo(null, typeof(bool)), "Destination value type must be a string."); + Assert.False(converter.CanConvertTo(null, typeof(int)), "Expected a failure to convert to integer type."); + Assert.False(converter.CanConvertTo(null, typeof(bool)), "Expected a failure to convert to boolean type."); } [Fact] From 7415ec12a9cffa611f17bf8c1e8c63777e5ed31a Mon Sep 17 00:00:00 2001 From: v-arellegue Date: Wed, 28 Jun 2023 14:04:00 -0700 Subject: [PATCH 23/23] Fix CanConvertTo messages. --- .../SqlConnectionStringBuilderTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs index 48a34a68b7..b3a090f58f 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionStringBuilderTest.cs @@ -520,10 +520,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertFromTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to determine if can convert from string data type - Assert.True(converter.CanConvertFrom(null, typeof(string)), "Expected a success to convert from string type."); + Assert.True(converter.CanConvertFrom(null, typeof(string)), "Expecting to convert from a string type."); // Use the same converter to determine if can convert from int or bool data types - Assert.False(converter.CanConvertFrom(null, typeof(int)), "Expected a failure to convert fron integer type."); - Assert.False(converter.CanConvertFrom(null, typeof(bool)), "Expected a failure to convert fron boolean type."); + Assert.False(converter.CanConvertFrom(null, typeof(int)), "Not expecting to convert from integer type."); + Assert.False(converter.CanConvertFrom(null, typeof(bool)), "Not expecting to convert from boolean type."); } [Fact] @@ -533,10 +533,10 @@ public void SqlConnectionEncryptOptionConverterCanConvertToTest() SqlConnectionEncryptOption option = SqlConnectionEncryptOption.Parse("false"); TypeConverter converter = TypeDescriptor.GetConverter(option.GetType()); // Use the converter to check if can convert from stirng - Assert.True(converter.CanConvertTo(null, typeof(string)), "Expected a success to convert to string type."); + Assert.True(converter.CanConvertTo(null, typeof(string)), "Expecting to convert to a string type."); // Use the same convert to check if can convert to int or bool - Assert.False(converter.CanConvertTo(null, typeof(int)), "Expected a failure to convert to integer type."); - Assert.False(converter.CanConvertTo(null, typeof(bool)), "Expected a failure to convert to boolean type."); + Assert.False(converter.CanConvertTo(null, typeof(int)), "Not expecting to convert from integer type."); + Assert.False(converter.CanConvertTo(null, typeof(bool)), "Not expecting to convert from boolean type."); } [Fact]