3
3
// See the LICENSE file in the project root for more information.
4
4
5
5
using System ;
6
+ using System . Collections . Generic ;
7
+ using System . Data ;
8
+ using System . Linq ;
9
+ using System . Net ;
10
+ using System . Net . Sockets ;
6
11
using System . Reflection ;
12
+ using Microsoft . Data . SqlClient . ManualTesting . Tests . SystemDataInternals ;
7
13
using Xunit ;
8
14
9
15
using static Microsoft . Data . SqlClient . ManualTesting . Tests . DataTestUtility ;
@@ -16,19 +22,68 @@ public class ConfigurableIpPreferenceTest
16
22
private const string CnnPrefIPv6 = ";IPAddressPreference=IPv6First" ;
17
23
private const string CnnPrefIPv4 = ";IPAddressPreference=IPv4First" ;
18
24
25
+ private static bool IsTCPConnectionStringSetup ( ) => ! string . IsNullOrEmpty ( TCPConnectionString ) ;
26
+ private static bool IsValidDataSource ( )
27
+ {
28
+ SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder ( TCPConnectionString ) ;
29
+ int startIdx = builder . DataSource . IndexOf ( ':' ) + 1 ;
30
+ int endIdx = builder . DataSource . IndexOf ( ',' ) ;
31
+ string serverName ;
32
+ if ( endIdx == - 1 )
33
+ {
34
+ serverName = builder . DataSource . Substring ( startIdx ) ;
35
+ }
36
+ else
37
+ {
38
+ serverName = builder . DataSource . Substring ( startIdx , endIdx - startIdx ) ;
39
+ }
40
+
41
+ List < IPAddress > ipAddresses = Dns . GetHostAddresses ( serverName ) . ToList ( ) ;
42
+ return ipAddresses . Exists ( ip => ip . AddressFamily == AddressFamily . InterNetwork ) &&
43
+ ipAddresses . Exists ( ip => ip . AddressFamily == AddressFamily . InterNetworkV6 ) ;
44
+ }
45
+
46
+ [ ConditionalTheory ( nameof ( IsTCPConnectionStringSetup ) , nameof ( IsValidDataSource ) ) ]
47
+ [ InlineData ( CnnPrefIPv6 ) ]
48
+ [ InlineData ( CnnPrefIPv4 ) ]
49
+ [ InlineData ( ";IPAddressPreference=UsePlatformDefault" ) ]
50
+ public void ConfigurableIpPreference ( string ipPreference )
51
+ {
52
+ using ( SqlConnection connection = new SqlConnection ( TCPConnectionString + ipPreference ) )
53
+ {
54
+ connection . Open ( ) ;
55
+ Assert . Equal ( ConnectionState . Open , connection . State ) ;
56
+ Tuple < string , string , string , string > DNSInfo = connection . GetSQLDNSInfo ( ) ;
57
+ if ( ipPreference == CnnPrefIPv4 )
58
+ {
59
+ Assert . NotNull ( DNSInfo . Item2 ) ; //IPv4
60
+ Assert . Null ( DNSInfo . Item3 ) ; //IPv6
61
+ }
62
+ else if ( ipPreference == CnnPrefIPv6 )
63
+ {
64
+ Assert . Null ( DNSInfo . Item2 ) ;
65
+ Assert . NotNull ( DNSInfo . Item3 ) ;
66
+ }
67
+ else
68
+ {
69
+ Assert . True ( ( DNSInfo . Item2 != null && DNSInfo . Item3 == null ) || ( DNSInfo . Item2 == null && DNSInfo . Item3 != null ) ) ;
70
+ }
71
+ }
72
+ }
73
+
19
74
[ ConditionalTheory ( typeof ( DataTestUtility ) , nameof ( DoesHostAddressContainBothIPv4AndIPv6 ) ) ]
20
75
[ InlineData ( CnnPrefIPv6 ) ]
21
76
[ InlineData ( CnnPrefIPv4 ) ]
22
77
public void ConfigurableIpPreferenceManagedSni ( string ipPreference )
23
78
{
24
79
AppContext . SetSwitch ( "Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows" , true ) ;
25
- TestConfigurableIpPreference ( ipPreference ) ;
80
+ TestCachedConfigurableIpPreference ( ipPreference , DNSCachingConnString ) ;
26
81
AppContext . SetSwitch ( "Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows" , false ) ;
27
82
}
28
83
29
- private void TestConfigurableIpPreference ( string ipPreference )
84
+ private void TestCachedConfigurableIpPreference ( string ipPreference , string cnnString )
30
85
{
31
- using ( SqlConnection connection = new SqlConnection ( DNSCachingConnString + ipPreference ) )
86
+ using ( SqlConnection connection = new SqlConnection ( cnnString + ipPreference ) )
32
87
{
33
88
// each successful connection updates the dns cache entry for the data source
34
89
connection . Open ( ) ;
@@ -43,6 +98,7 @@ private void TestConfigurableIpPreference(string ipPreference)
43
98
const string AddrIPv6Property = "AddrIPv6" ;
44
99
const string FQDNProperty = "FQDN" ;
45
100
101
+ Assert . NotNull ( dnsCacheEntry ) ;
46
102
Assert . Equal ( connection . DataSource , GetPropertyValueFromCacheEntry ( FQDNProperty , dnsCacheEntry ) ) ;
47
103
48
104
if ( ipPreference == CnnPrefIPv4 )
0 commit comments