using System; using System.Data.Common; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace EntityFrameworkCore.Jet.Data.Tests { [TestClass] public class CreateNorthwindTest { private const string StoreName = nameof(CreateNorthwindTest) + ".accdb"; private string _scriptPath; private DbConnection _connection; [TestInitialize] public void Setup() { // ReSharper disable once AssignNullToNotNullAttribute _scriptPath = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "Northwind.sql"); _connection = Helpers.CreateAndOpenDatabase(StoreName); } [TestCleanup] public void TearDown() { _connection.Dispose(); } [TestMethod] public void CreateE2ETestRun() { var showSqlStatements = JetConfiguration.ShowSqlStatements; JetConfiguration.ShowSqlStatements = false; ExecuteScript(); JetConfiguration.ShowSqlStatements = showSqlStatements; } private void ExecuteScript() { using var command = _connection.CreateCommand(); var script = File.ReadAllText(_scriptPath); var batches = new Regex(@"\s*;\s*", RegexOptions.IgnoreCase | RegexOptions.Multiline, TimeSpan.FromMilliseconds(1000.0)) .Split(script) .Where(b => !string.IsNullOrEmpty(b)) .ToList(); var retryWaitTime = TimeSpan.FromMilliseconds(250); const int maxRetryCount = 6; var retryCount = 0; foreach (var batch in batches) { command.CommandText = batch; try { command.ExecuteNonQuery(); retryCount = 0; } catch (Exception e) { if (retryCount >= maxRetryCount) { Console.WriteLine(e.Message); Console.WriteLine(batch); throw; } retryCount++; Thread.Sleep(retryWaitTime); } } } } }