Datei: IntegrationTests/IntegrationTests/TransactionTests.cs
Last Commit (60aa080)
			
| 1 | // | 
| 2 | // Copyright (c) 2002-2016 Mirko Matytschak | 
| 3 | // (www.netdataobjects.de) | 
| 4 | // | 
| 5 | // Author: Mirko Matytschak | 
| 6 | // | 
| 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated | 
| 8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation | 
| 9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the | 
| 10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following | 
| 11 | // conditions: | 
| 12 | |
| 13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions | 
| 14 | // of the Software. | 
| 15 | // | 
| 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | 
| 17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 
| 18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | 
| 19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
| 20 | // DEALINGS IN THE SOFTWARE. | 
| 21 | |
| 22 | |
| 23 | using NUnit.Framework; | 
| 24 | using NDO; | 
| 25 | using Reisekosten.Personal; | 
| 26 | using NDO.Query; | 
| 27 | using Reisekosten; | 
| 28 | using Formfakten.TestLogger; | 
| 29 | |
| 30 | namespace NdoUnitTests | 
| 31 | { | 
| 32 | ····[TestFixture] | 
| 33 | public class TransactionScopeTests : NDOTest | 
| 34 | ····{ | 
| 35 | ········public void Setup() | 
| 36 | ········{ | 
| 37 | ············Logger.ClearTestLogs(); | 
| 38 | ········} | 
| 39 | |
| 40 | ········public void TearDown() | 
| 41 | ········{ | 
| 42 | ············Logger.ClearTestLogs(); | 
| 43 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 44 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>( pm ); | 
| 45 | ············pm.Delete( q.Execute() ); | 
| 46 | ········} | 
| 47 | |
| 48 | |
| 49 | ········/* | 
| 50 | ········forceCommit should be: | 
| 51 | ········ | 
| 52 | ····················Query····Save····Save(true) | 
| 53 | ········Optimistic····1········1········0 | 
| 54 | ········Pessimistic····0········1········0 | 
| 55 | ············ | 
| 56 | ········Deferred Mode············ | 
| 57 | ····················Query····Save····Save(true) | 
| 58 | ········Optimistic····0········1········0 | 
| 59 | ········Pessimistic····0········1········0 | 
| 60 | |
| 61 | ········ */ | 
| 62 | |
| 63 | ········[Test] | 
| 64 | ········public void TestIfQueryWithoutTransactionDoesNotStartAndNotCommit() | 
| 65 | ········{ | 
| 66 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 67 | ············{ | 
| 68 | ················pm.TransactionMode = TransactionMode.None; | 
| 69 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 70 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 71 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 72 | ················Assert.That( startCount == 0, "Transaction shouldn't be started" ); | 
| 73 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 74 | ············} | 
| 75 | ········} | 
| 76 | |
| 77 | |
| 78 | ········[Test] | 
| 79 | ········public void TestIfOptimisticQueryIsImmediatelyCommitted() | 
| 80 | ········{ | 
| 81 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 82 | ············{ | 
| 83 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 84 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 85 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 86 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 87 | ············} | 
| 88 | ········} | 
| 89 | |
| 90 | ········[Test] | 
| 91 | ········public void TestIfPessimisticQueryIsNotCommitted() | 
| 92 | ········{ | 
| 93 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 94 | ············{ | 
| 95 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 96 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 97 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 98 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 99 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 100 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 101 | ············} | 
| 102 | ········} | 
| 103 | |
| 104 | ········[Test] | 
| 105 | ········public void TestIfOptimisticSaveIsCommitted() | 
| 106 | ········{ | 
| 107 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 108 | ············{ | 
| 109 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 110 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 111 | ················pm.MakePersistent( m ); | 
| 112 | ················pm.Save(); | 
| 113 | |
| 114 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 115 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 116 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 117 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 118 | ············} | 
| 119 | ········} | 
| 120 | |
| 121 | ········[Test] | 
| 122 | ········public void TestIfPessimisticSaveIsCommitted() | 
| 123 | ········{ | 
| 124 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 125 | ············{ | 
| 126 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 127 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 128 | ················pm.MakePersistent( m ); | 
| 129 | ················pm.Save(); | 
| 130 | |
| 131 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 132 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 133 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 134 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 135 | ············} | 
| 136 | ········} | 
| 137 | |
| 138 | ········[Test] | 
| 139 | ········public void OptimisticQueryAndSaveShouldHaveTwoTransactions() | 
| 140 | ········{ | 
| 141 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 142 | ············{ | 
| 143 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 144 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 145 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 146 | ················pm.MakePersistent( m ); | 
| 147 | ················pm.Save(); | 
| 148 | |
| 149 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 150 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 151 | ················Assert.That( startCount == 2, "Two Transactions should be started" ); | 
| 152 | ················Assert.That( commitCount == 2, "Two Transactions should be committed" ); | 
| 153 | ············} | 
| 154 | ········} | 
| 155 | |
| 156 | ········[Test] | 
| 157 | ········public void PessimisticQueryAndSaveShouldHaveOneTransaction() | 
| 158 | ········{ | 
| 159 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 160 | ············{ | 
| 161 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 162 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 163 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 164 | ················pm.MakePersistent( m ); | 
| 165 | ················pm.Save(); | 
| 166 | |
| 167 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 168 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 169 | ················Assert.That( startCount == 1, "One Transaction should be started" ); | 
| 170 | ················Assert.That( commitCount == 1, "One Transaction should be committed" ); | 
| 171 | ············} | 
| 172 | ········} | 
| 173 | |
| 174 | ········[Test] | 
| 175 | ········public void OptimisticDeferredSaveShouldNotCommit() | 
| 176 | ········{ | 
| 177 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 178 | ············{ | 
| 179 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 180 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 181 | ················pm.MakePersistent( m ); | 
| 182 | ················pm.Save( true ); | 
| 183 | |
| 184 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 185 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 186 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 187 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 188 | ············} | 
| 189 | ········} | 
| 190 | |
| 191 | ········[Test] | 
| 192 | ········public void PessimisticDeferredSaveShouldNotCommit() | 
| 193 | ········{ | 
| 194 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 195 | ············{ | 
| 196 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 197 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 198 | ················pm.MakePersistent( m ); | 
| 199 | ················pm.Save( true ); | 
| 200 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 201 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 202 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 203 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 204 | ············} | 
| 205 | ········} | 
| 206 | |
| 207 | ········[Test] | 
| 208 | ········public void OptimisticDeferredSaveAndQueryShouldNotCommit() | 
| 209 | ········{ | 
| 210 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 211 | ············{ | 
| 212 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 213 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 214 | ················pm.MakePersistent( m ); | 
| 215 | ················pm.Save( true ); | 
| 216 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 217 | |
| 218 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 219 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 220 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 221 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 222 | ············} | 
| 223 | ········} | 
| 224 | |
| 225 | ········[Test] | 
| 226 | ········public void PessimisticDeferredSaveAndQueryShouldNotCommit() | 
| 227 | ········{ | 
| 228 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 229 | ············{ | 
| 230 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 231 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 232 | ················pm.MakePersistent( m ); | 
| 233 | ················pm.Save( true ); | 
| 234 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 235 | |
| 236 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 237 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 238 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 239 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 240 | ············} | 
| 241 | ········} | 
| 242 | |
| 243 | ········[Test] | 
| 244 | ········public void OptimisticSaveAfterDeferredSaveShouldCommit() | 
| 245 | ········{ | 
| 246 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 247 | ············{ | 
| 248 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 249 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 250 | ················pm.MakePersistent( m ); | 
| 251 | ················pm.Save( true ); | 
| 252 | ················m.Nachname = "Test"; | 
| 253 | ················pm.Save(); | 
| 254 | |
| 255 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 256 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 257 | ················Assert.That( startCount == 1, "Transaction should be started" ); | 
| 258 | ················Assert.That( commitCount == 1, "Transaction should be committed" ); | 
| 259 | ············} | 
| 260 | ········} | 
| 261 | |
| 262 | ········[Test] | 
| 263 | ········public void PessimisticSaveAfterDeferredSaveShouldCommit() | 
| 264 | ········{ | 
| 265 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 266 | ············{ | 
| 267 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 268 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 269 | ················pm.MakePersistent( m ); | 
| 270 | ················pm.Save( true ); | 
| 271 | ················m.Nachname = "Test"; | 
| 272 | ················pm.Save(); | 
| 273 | |
| 274 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 275 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 276 | ················Assert.That( startCount == 1, "Transaction should be started" ); | 
| 277 | ················Assert.That( commitCount == 1, "Transaction should be committed" ); | 
| 278 | ············} | 
| 279 | ········} | 
| 280 | |
| 281 | |
| 282 | ········[Test] | 
| 283 | ········public void DirectSqlPassThroughWithoutTransactionShouldNotCommit() | 
| 284 | ········{ | 
| 285 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 286 | ············{ | 
| 287 | ················pm.TransactionMode = TransactionMode.None; | 
| 288 | ················using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 289 | ················{ | 
| 290 | ····················var reader = sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 291 | ····················Assert.That( reader == null, "Reader should be null" ); | 
| 292 | ················} | 
| 293 | |
| 294 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 295 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 296 | ················Assert.That( startCount == 0, "Transaction shouldn't be started" ); | 
| 297 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 298 | ············} | 
| 299 | ········} | 
| 300 | |
| 301 | ········int FlughafenCount( PersistenceManager pm ) | 
| 302 | ········{ | 
| 303 | ············NDOQuery<Flughafen> q = new NDOQuery<Flughafen>( pm ); | 
| 304 | ············return (int) (decimal) q.ExecuteAggregate( "oid", AggregateType.Count ); | 
| 305 | ········} | 
| 306 | |
| 307 | ········int LänderCount( PersistenceManager pm ) | 
| 308 | ········{ | 
| 309 | ············NDOQuery<Land> q = new NDOQuery<Land>( pm ); | 
| 310 | ············return (int) (decimal) q.ExecuteAggregate( "oid", AggregateType.Count ); | 
| 311 | ········} | 
| 312 | |
| 313 | ········[Test] | 
| 314 | ········public void AbortedDeferredMultiStepTransactionDoesNotCommit() | 
| 315 | ········{ | 
| 316 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 317 | ············{ | 
| 318 | ················var landCount = LänderCount( pm ); | 
| 319 | ················var fhCount = FlughafenCount( pm ); | 
| 320 | |
| 321 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 322 | |
| 323 | ················Land land = new Land(); | 
| 324 | ················land.Name = "Germany"; | 
| 325 | ················pm.MakePersistent( land ); | 
| 326 | ················pm.Save( true ); | 
| 327 | |
| 328 | ················var flughafen = new Flughafen(); | 
| 329 | ················flughafen.Kürzel = "MUC"; | 
| 330 | ················pm.MakePersistent( flughafen ); | 
| 331 | ················land.AddFlughafen( flughafen ); | 
| 332 | ················pm.Save( true ); | 
| 333 | |
| 334 | ················pm.Abort(); | 
| 335 | |
| 336 | ················Assert.That( landCount == LänderCount( pm ) ); | 
| 337 | ················Assert.That( fhCount == FlughafenCount( pm ) ); | 
| 338 | ············} | 
| 339 | ········} | 
| 340 | |
| 341 | ········[Test] | 
| 342 | ········public void DirectSqlPassThroughWithTransactionShouldCommit() | 
| 343 | ········{ | 
| 344 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 345 | ············{ | 
| 346 | ················using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 347 | ················{ | 
| 348 | ····················sqlHandler.BeginTransaction(); | 
| 349 | ····················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 350 | ····················sqlHandler.Execute( "DELETE FROM Reise" ); | 
| 351 | ····················sqlHandler.CommitTransaction(); | 
| 352 | ················} | 
| 353 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 354 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 355 | ················Assert.That( startCount == 1, "1 Transaction should be started" ); | 
| 356 | ················Assert.That( commitCount == 1, "1 Transaction should be committed" ); | 
| 357 | ············} | 
| 358 | ········} | 
| 359 | |
| 360 | ········[Test] | 
| 361 | ········public void DirectSqlPassThroughWithCombinedStatementsDoesNotCommit() | 
| 362 | ········{ | 
| 363 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 364 | |
| 365 | ············using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 366 | ············{ | 
| 367 | ················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 368 | ················sqlHandler.Execute( "DELETE FROM Reise" ); | 
| 369 | ············} | 
| 370 | |
| 371 | ············var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 372 | ············Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 373 | ········} | 
| 374 | |
| 375 | ········[Test] | 
| 376 | ········public void DirectSqlPassWithAbortWorks() | 
| 377 | ········{ | 
| 378 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 379 | ············var m = new Mitarbeiter(); | 
| 380 | ············pm.MakePersistent( m ); | 
| 381 | ············pm.Save(); | 
| 382 | ············pm.UnloadCache(); | 
| 383 | |
| 384 | ············using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 385 | ············{ | 
| 386 | ················sqlHandler.BeginTransaction(); | 
| 387 | ················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 388 | ················pm.Abort(); | 
| 389 | ············} | 
| 390 | |
| 391 | ············pm = PmFactory.NewPersistenceManager(); | 
| 392 | ············bool hasRecords = new NDOQuery<Mitarbeiter>( pm ).Execute().Count > 0; | 
| 393 | ············Assert.That( hasRecords, "At least one record should be present" ); | 
| 394 | ········} | 
| 395 | ····} | 
| 396 | } | 
| 397 | 
New Commit (ab2cdbc)
			
| 1 | // | 
| 2 | // Copyright (c) 2002-2016 Mirko Matytschak | 
| 3 | // (www.netdataobjects.de) | 
| 4 | // | 
| 5 | // Author: Mirko Matytschak | 
| 6 | // | 
| 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated | 
| 8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation | 
| 9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the | 
| 10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following | 
| 11 | // conditions: | 
| 12 | |
| 13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions | 
| 14 | // of the Software. | 
| 15 | // | 
| 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | 
| 17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 
| 18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | 
| 19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
| 20 | // DEALINGS IN THE SOFTWARE. | 
| 21 | |
| 22 | |
| 23 | using NUnit.Framework; | 
| 24 | using NDO; | 
| 25 | using Reisekosten.Personal; | 
| 26 | using NDO.Query; | 
| 27 | using Reisekosten; | 
| 28 | using Formfakten.TestLogger; | 
| 29 | |
| 30 | namespace NdoUnitTests | 
| 31 | { | 
| 32 | ····[TestFixture] | 
| 33 | public class TransactionTests : NDOTest | 
| 34 | ····{ | 
| 35 | ········[SetUp] | 
| 36 | ········public void Setup() | 
| 37 | ········{ | 
| 38 | ············Logger.ClearTestLogs(); | 
| 39 | ········} | 
| 40 | |
| 41 | ········[TearDown] | 
| 42 | ········public void TearDown() | 
| 43 | ········{ | 
| 44 | ············Logger.ClearTestLogs(); | 
| 45 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 46 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>( pm ); | 
| 47 | ············pm.Delete( q.Execute() ); | 
| 48 | ········} | 
| 49 | |
| 50 | |
| 51 | ········/* | 
| 52 | ········forceCommit should be: | 
| 53 | ········ | 
| 54 | ····················Query····Save····Save(true) | 
| 55 | ········Optimistic····1········1········0 | 
| 56 | ········Pessimistic····0········1········0 | 
| 57 | ············ | 
| 58 | ········Deferred Mode············ | 
| 59 | ····················Query····Save····Save(true) | 
| 60 | ········Optimistic····0········1········0 | 
| 61 | ········Pessimistic····0········1········0 | 
| 62 | |
| 63 | ········ */ | 
| 64 | |
| 65 | ········[Test] | 
| 66 | ········public void TestIfQueryWithoutTransactionDoesNotStartAndNotCommit() | 
| 67 | ········{ | 
| 68 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 69 | ············{ | 
| 70 | ················pm.TransactionMode = TransactionMode.None; | 
| 71 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 72 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 73 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 74 | ················Assert.That( startCount == 0, "Transaction shouldn't be started" ); | 
| 75 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 76 | ············} | 
| 77 | ········} | 
| 78 | |
| 79 | |
| 80 | ········[Test] | 
| 81 | ········public void TestIfOptimisticQueryIsImmediatelyCommitted() | 
| 82 | ········{ | 
| 83 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 84 | ············{ | 
| 85 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 86 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 87 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 88 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 89 | ············} | 
| 90 | ········} | 
| 91 | |
| 92 | ········[Test] | 
| 93 | ········public void TestIfPessimisticQueryIsNotCommitted() | 
| 94 | ········{ | 
| 95 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 96 | ············{ | 
| 97 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 98 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 99 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 100 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 101 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 102 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 103 | ············} | 
| 104 | ········} | 
| 105 | |
| 106 | ········[Test] | 
| 107 | ········public void TestIfOptimisticSaveIsCommitted() | 
| 108 | ········{ | 
| 109 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 110 | ············{ | 
| 111 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 112 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 113 | ················pm.MakePersistent( m ); | 
| 114 | ················pm.Save(); | 
| 115 | |
| 116 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 117 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 118 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 119 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 120 | ············} | 
| 121 | ········} | 
| 122 | |
| 123 | ········[Test] | 
| 124 | ········public void TestIfPessimisticSaveIsCommitted() | 
| 125 | ········{ | 
| 126 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 127 | ············{ | 
| 128 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 129 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 130 | ················pm.MakePersistent( m ); | 
| 131 | ················pm.Save(); | 
| 132 | |
| 133 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 134 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 135 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 136 | ················Assert.That( commitCount > 0, "Transaction should be committed" ); | 
| 137 | ············} | 
| 138 | ········} | 
| 139 | |
| 140 | ········[Test] | 
| 141 | ········public void OptimisticQueryAndSaveShouldHaveTwoTransactions() | 
| 142 | ········{ | 
| 143 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 144 | ············{ | 
| 145 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 146 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 147 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 148 | ················pm.MakePersistent( m ); | 
| 149 | ················pm.Save(); | 
| 150 | |
| 151 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 152 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 153 | ················Assert.That( startCount == 2, "Two Transactions should be started" ); | 
| 154 | ················Assert.That( commitCount == 2, "Two Transactions should be committed" ); | 
| 155 | ············} | 
| 156 | ········} | 
| 157 | |
| 158 | ········[Test] | 
| 159 | ········public void PessimisticQueryAndSaveShouldHaveOneTransaction() | 
| 160 | ········{ | 
| 161 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 162 | ············{ | 
| 163 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 164 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 165 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 166 | ················pm.MakePersistent( m ); | 
| 167 | ················pm.Save(); | 
| 168 | |
| 169 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 170 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 171 | ················Assert.That( startCount == 1, "One Transaction should be started" ); | 
| 172 | ················Assert.That( commitCount == 1, "One Transaction should be committed" ); | 
| 173 | ············} | 
| 174 | ········} | 
| 175 | |
| 176 | ········[Test] | 
| 177 | ········public void OptimisticDeferredSaveShouldNotCommit() | 
| 178 | ········{ | 
| 179 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 180 | ············{ | 
| 181 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 182 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 183 | ················pm.MakePersistent( m ); | 
| 184 | ················pm.Save( true ); | 
| 185 | |
| 186 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 187 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 188 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 189 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 190 | ············} | 
| 191 | ········} | 
| 192 | |
| 193 | ········[Test] | 
| 194 | ········public void PessimisticDeferredSaveShouldNotCommit() | 
| 195 | ········{ | 
| 196 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 197 | ············{ | 
| 198 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 199 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 200 | ················pm.MakePersistent( m ); | 
| 201 | ················pm.Save( true ); | 
| 202 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 203 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 204 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 205 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 206 | ············} | 
| 207 | ········} | 
| 208 | |
| 209 | ········[Test] | 
| 210 | ········public void OptimisticDeferredSaveAndQueryShouldNotCommit() | 
| 211 | ········{ | 
| 212 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 213 | ············{ | 
| 214 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 215 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 216 | ················pm.MakePersistent( m ); | 
| 217 | ················pm.Save( true ); | 
| 218 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 219 | |
| 220 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 221 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 222 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 223 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 224 | ············} | 
| 225 | ········} | 
| 226 | |
| 227 | ········[Test] | 
| 228 | ········public void PessimisticDeferredSaveAndQueryShouldNotCommit() | 
| 229 | ········{ | 
| 230 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 231 | ············{ | 
| 232 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 233 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 234 | ················pm.MakePersistent( m ); | 
| 235 | ················pm.Save( true ); | 
| 236 | ················new NDOQuery<Mitarbeiter>( pm ).Execute(); | 
| 237 | |
| 238 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 239 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 240 | ················Assert.That( startCount > 0, "Transaction should be started" ); | 
| 241 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 242 | ············} | 
| 243 | ········} | 
| 244 | |
| 245 | ········[Test] | 
| 246 | ········public void OptimisticSaveAfterDeferredSaveShouldCommit() | 
| 247 | ········{ | 
| 248 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 249 | ············{ | 
| 250 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 251 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 252 | ················pm.MakePersistent( m ); | 
| 253 | ················pm.Save( true ); | 
| 254 | ················m.Nachname = "Test"; | 
| 255 | ················pm.Save(); | 
| 256 | |
| 257 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 258 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 259 | ················Assert.That( startCount == 1, "Transaction should be started" ); | 
| 260 | ················Assert.That( commitCount == 1, "Transaction should be committed" ); | 
| 261 | ············} | 
| 262 | ········} | 
| 263 | |
| 264 | ········[Test] | 
| 265 | ········public void PessimisticSaveAfterDeferredSaveShouldCommit() | 
| 266 | ········{ | 
| 267 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 268 | ············{ | 
| 269 | ················pm.TransactionMode = TransactionMode.Pessimistic; | 
| 270 | ················Mitarbeiter m = new Mitarbeiter(); | 
| 271 | ················pm.MakePersistent( m ); | 
| 272 | ················pm.Save( true ); | 
| 273 | ················m.Nachname = "Test"; | 
| 274 | ················pm.Save(); | 
| 275 | |
| 276 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 277 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 278 | ················Assert.That( startCount == 1, "Transaction should be started" ); | 
| 279 | ················Assert.That( commitCount == 1, "Transaction should be committed" ); | 
| 280 | ············} | 
| 281 | ········} | 
| 282 | |
| 283 | |
| 284 | ········[Test] | 
| 285 | ········public void DirectSqlPassThroughWithoutTransactionShouldNotCommit() | 
| 286 | ········{ | 
| 287 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 288 | ············{ | 
| 289 | ················pm.TransactionMode = TransactionMode.None; | 
| 290 | ················using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 291 | ················{ | 
| 292 | ····················var reader = sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 293 | ····················Assert.That( reader == null, "Reader should be null" ); | 
| 294 | ················} | 
| 295 | |
| 296 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 297 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 298 | ················Assert.That( startCount == 0, "Transaction shouldn't be started" ); | 
| 299 | ················Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 300 | ············} | 
| 301 | ········} | 
| 302 | |
| 303 | ········int FlughafenCount( PersistenceManager pm ) | 
| 304 | ········{ | 
| 305 | ············NDOQuery<Flughafen> q = new NDOQuery<Flughafen>( pm ); | 
| 306 | ············return (int) (decimal) q.ExecuteAggregate( "oid", AggregateType.Count ); | 
| 307 | ········} | 
| 308 | |
| 309 | ········int LänderCount( PersistenceManager pm ) | 
| 310 | ········{ | 
| 311 | ············NDOQuery<Land> q = new NDOQuery<Land>( pm ); | 
| 312 | ············return (int) (decimal) q.ExecuteAggregate( "oid", AggregateType.Count ); | 
| 313 | ········} | 
| 314 | |
| 315 | ········[Test] | 
| 316 | ········public void AbortedDeferredMultiStepTransactionDoesNotCommit() | 
| 317 | ········{ | 
| 318 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 319 | ············{ | 
| 320 | ················var landCount = LänderCount( pm ); | 
| 321 | ················var fhCount = FlughafenCount( pm ); | 
| 322 | |
| 323 | ················pm.TransactionMode = TransactionMode.Optimistic; | 
| 324 | |
| 325 | ················Land land = new Land(); | 
| 326 | ················land.Name = "Germany"; | 
| 327 | ················pm.MakePersistent( land ); | 
| 328 | ················pm.Save( true ); | 
| 329 | |
| 330 | ················var flughafen = new Flughafen(); | 
| 331 | ················flughafen.Kürzel = "MUC"; | 
| 332 | ················pm.MakePersistent( flughafen ); | 
| 333 | ················land.AddFlughafen( flughafen ); | 
| 334 | ················pm.Save( true ); | 
| 335 | |
| 336 | ················pm.Abort(); | 
| 337 | |
| 338 | ················Assert.That( landCount == LänderCount( pm ) ); | 
| 339 | ················Assert.That( fhCount == FlughafenCount( pm ) ); | 
| 340 | ············} | 
| 341 | ········} | 
| 342 | |
| 343 | ········[Test] | 
| 344 | ········public void DirectSqlPassThroughWithTransactionShouldCommit() | 
| 345 | ········{ | 
| 346 | ············using (var pm = PmFactory.NewPersistenceManager()) | 
| 347 | ············{ | 
| 348 | ················using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 349 | ················{ | 
| 350 | ····················sqlHandler.BeginTransaction(); | 
| 351 | ····················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 352 | ····················sqlHandler.Execute( "DELETE FROM Reise" ); | 
| 353 | ····················sqlHandler.CommitTransaction(); | 
| 354 | ················} | 
| 355 | ················var startCount = Logger.FindLogsWith("Starting transaction").Count; | 
| 356 | ················var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 357 | ················Assert.That( startCount == 1, "1 Transaction should be started" ); | 
| 358 | ················Assert.That( commitCount == 1, "1 Transaction should be committed" ); | 
| 359 | ············} | 
| 360 | ········} | 
| 361 | |
| 362 | ········[Test] | 
| 363 | ········public void DirectSqlPassThroughWithCombinedStatementsDoesNotCommit() | 
| 364 | ········{ | 
| 365 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 366 | |
| 367 | ············using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 368 | ············{ | 
| 369 | ················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 370 | ················sqlHandler.Execute( "DELETE FROM Reise" ); | 
| 371 | ············} | 
| 372 | |
| 373 | ············var commitCount = Logger.FindLogsWith("Committing transaction").Count; | 
| 374 | ············Assert.That( commitCount == 0, "Transaction shouldn't be committed" ); | 
| 375 | ········} | 
| 376 | |
| 377 | ········[Test] | 
| 378 | ········public void DirectSqlPassWithAbortWorks() | 
| 379 | ········{ | 
| 380 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 381 | ············var m = new Mitarbeiter(); | 
| 382 | ············pm.MakePersistent( m ); | 
| 383 | ············pm.Save(); | 
| 384 | ············pm.UnloadCache(); | 
| 385 | |
| 386 | ············using (ISqlPassThroughHandler sqlHandler = pm.GetSqlPassThroughHandler()) | 
| 387 | ············{ | 
| 388 | ················sqlHandler.BeginTransaction(); | 
| 389 | ················sqlHandler.Execute( "DELETE FROM Mitarbeiter" ); | 
| 390 | ················pm.Abort(); | 
| 391 | ············} | 
| 392 | |
| 393 | ············pm = PmFactory.NewPersistenceManager(); | 
| 394 | ············bool hasRecords = new NDOQuery<Mitarbeiter>( pm ).Execute().Count > 0; | 
| 395 | ············Assert.That( hasRecords, "At least one record should be present" ); | 
| 396 | ········} | 
| 397 | ····} | 
| 398 | } | 
| 399 |