1- // Copyright (C) 2003-2010 Xtensive LLC.
1+ // Copyright (C) 2009-2021 Xtensive LLC.
22// This code is distributed under MIT license terms.
33// See the License.txt file in the project root for more information.
44
88using Xtensive . Orm ;
99using Xtensive . Orm . Building . Builders ;
1010using 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+ }
1149
1250namespace Xtensive . Orm . Tests . Sql
1351{
@@ -95,6 +133,61 @@ public void SqlServerConnectionCheckTest()
95133 Assert . That ( GetCheckConnectionIsAliveFlag ( driver ) , Is . False ) ;
96134 }
97135
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+ }
98191
99192 private static void TestProvider ( string providerName , string connectionString , string connectionUrl )
100193 {
@@ -109,5 +202,25 @@ private static bool GetCheckConnectionIsAliveFlag(SqlDriver driver)
109202 return ( bool ) type . GetField ( fieldName , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . NonPublic )
110203 . GetValue ( driver ) ;
111204 }
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+ }
112225 }
113226}
0 commit comments