1
- // Copyright (C) 2003-2010 Xtensive LLC.
1
+ // Copyright (C) 2009-2021 Xtensive LLC.
2
2
// This code is distributed under MIT license terms.
3
3
// See the License.txt file in the project root for more information.
4
4
8
8
using Xtensive . Orm ;
9
9
using Xtensive . Orm . Building . Builders ;
10
10
using Xtensive . Sql ;
11
+ using Xtensive . Orm . Tests . Sql . DriverFactoryTestTypes ;
12
+
13
+ namespace Xtensive . Orm . Tests . Sql . DriverFactoryTestTypes
14
+ {
15
+ public class TestConnectionHandler : IConnectionHandler
16
+ {
17
+ public int OpeningCounter = 0 ;
18
+ public int OpenedCounter = 0 ;
19
+ public int OpeningInitCounter = 0 ;
20
+ public int OpeningFailedCounter = 0 ;
21
+
22
+ public void ConnectionOpening ( ConnectionEventData eventData )
23
+ {
24
+ OpeningCounter ++ ;
25
+ }
26
+
27
+ public void ConnectionOpened ( ConnectionEventData eventData )
28
+ {
29
+ OpenedCounter ++ ;
30
+ }
31
+
32
+ public void ConnectionInitialization ( ConnectionInitEventData eventData )
33
+ {
34
+ OpeningInitCounter ++ ;
35
+ }
36
+
37
+ public void ConnectionOpeningFailed ( ConnectionErrorEventData eventData )
38
+ {
39
+ OpeningFailedCounter ++ ;
40
+ }
41
+ }
42
+
43
+ public static class StaticCounter
44
+ {
45
+ public static int OpeningReached ;
46
+ public static int OpenedReached ;
47
+ }
48
+ }
11
49
12
50
namespace Xtensive . Orm . Tests . Sql
13
51
{
@@ -95,6 +133,61 @@ public void SqlServerConnectionCheckTest()
95
133
Assert . That ( GetCheckConnectionIsAliveFlag ( driver ) , Is . False ) ;
96
134
}
97
135
136
+ [ Test ]
137
+ public void ConnectionHandlerTest ( )
138
+ {
139
+ var handlerInstance = new TestConnectionHandler ( ) ;
140
+ var handlersArray = new [ ] { handlerInstance } ;
141
+ var descriptor = ProviderDescriptor . Get ( provider ) ;
142
+ var factory = ( SqlDriverFactory ) Activator . CreateInstance ( descriptor . DriverFactory ) ;
143
+
144
+ Assert . That ( handlerInstance . OpeningCounter , Is . EqualTo ( 0 ) ) ;
145
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 0 ) ) ;
146
+ Assert . That ( handlerInstance . OpenedCounter , Is . EqualTo ( 0 ) ) ;
147
+ Assert . That ( handlerInstance . OpeningFailedCounter , Is . EqualTo ( 0 ) ) ;
148
+
149
+ var configuration = new SqlDriverConfiguration ( handlersArray ) ;
150
+ _ = factory . GetDriver ( new ConnectionInfo ( Url ) , configuration ) ;
151
+ Assert . That ( handlerInstance . OpeningCounter , Is . EqualTo ( 1 ) ) ;
152
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 0 ) ) ;
153
+ Assert . That ( handlerInstance . OpenedCounter , Is . EqualTo ( 1 ) ) ;
154
+ Assert . That ( handlerInstance . OpeningFailedCounter , Is . EqualTo ( 0 ) ) ;
155
+
156
+ configuration = new SqlDriverConfiguration ( handlersArray ) { EnsureConnectionIsAlive = true } ;
157
+ _ = factory . GetDriver ( new ConnectionInfo ( Url ) , configuration ) ;
158
+ Assert . That ( handlerInstance . OpeningCounter , Is . EqualTo ( 2 ) ) ;
159
+ if ( provider == WellKnown . Provider . SqlServer )
160
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 1 ) ) ;
161
+ else
162
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 0 ) ) ;
163
+ Assert . That ( handlerInstance . OpenedCounter , Is . EqualTo ( 2 ) ) ;
164
+ Assert . That ( handlerInstance . OpeningFailedCounter , Is . EqualTo ( 0 ) ) ;
165
+
166
+ configuration = new SqlDriverConfiguration ( handlersArray ) { ConnectionInitializationSql = InitQueryPerProvider ( provider ) } ;
167
+ _ = factory . GetDriver ( new ConnectionInfo ( Url ) , configuration ) ;
168
+ Assert . That ( handlerInstance . OpeningCounter , Is . EqualTo ( 3 ) ) ;
169
+ if ( provider == WellKnown . Provider . SqlServer )
170
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 2 ) ) ;
171
+ else
172
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 1 ) ) ;
173
+ Assert . That ( handlerInstance . OpenedCounter , Is . EqualTo ( 3 ) ) ;
174
+ Assert . That ( handlerInstance . OpeningFailedCounter , Is . EqualTo ( 0 ) ) ;
175
+
176
+ configuration = new SqlDriverConfiguration ( handlersArray ) { ConnectionInitializationSql = "dummy string to trigger error" } ;
177
+ try {
178
+ _ = factory . GetDriver ( new ConnectionInfo ( Url ) , configuration ) ;
179
+ }
180
+ catch {
181
+ //skip it
182
+ }
183
+ Assert . That ( handlerInstance . OpeningCounter , Is . EqualTo ( 4 ) ) ;
184
+ if ( provider == WellKnown . Provider . SqlServer )
185
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 3 ) ) ;
186
+ else
187
+ Assert . That ( handlerInstance . OpeningInitCounter , Is . EqualTo ( 2 ) ) ;
188
+ Assert . That ( handlerInstance . OpenedCounter , Is . EqualTo ( 3 ) ) ;
189
+ Assert . That ( handlerInstance . OpeningFailedCounter , Is . EqualTo ( 1 ) ) ;
190
+ }
98
191
99
192
private static void TestProvider ( string providerName , string connectionString , string connectionUrl )
100
193
{
@@ -109,5 +202,25 @@ private static bool GetCheckConnectionIsAliveFlag(SqlDriver driver)
109
202
return ( bool ) type . GetField ( fieldName , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . NonPublic )
110
203
. GetValue ( driver ) ;
111
204
}
205
+
206
+ private static string InitQueryPerProvider ( string currentProvider )
207
+ {
208
+ switch ( currentProvider ) {
209
+ case WellKnown . Provider . Firebird :
210
+ return "select current_timestamp from RDB$DATABASE;" ;
211
+ case WellKnown . Provider . MySql :
212
+ return "SELECT 0" ;
213
+ case WellKnown . Provider . Oracle :
214
+ return "select current_timestamp from DUAL" ;
215
+ case WellKnown . Provider . PostgreSql :
216
+ return "SELECT 0" ;
217
+ case WellKnown . Provider . SqlServer :
218
+ return "SELECT 0" ;
219
+ case WellKnown . Provider . Sqlite :
220
+ return "SELECT 0" ;
221
+ default :
222
+ throw new ArgumentOutOfRangeException ( currentProvider ) ;
223
+ }
224
+ }
112
225
}
113
226
}
0 commit comments