Skip to content

Commit

Permalink
Simplify test store.
Browse files Browse the repository at this point in the history
  • Loading branch information
lauxjpn committed Nov 16, 2022
1 parent a14861f commit a896e1f
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 61 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
development.props
QueryBaseline.txt
.docker/

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con
{
base.OnModelCreating(modelBuilder, context);

var ciCollation = ((MySqlTestStore)TestStore).GetCaseInsensitiveUtf8Mb4Collation();
var ciCollation = ((MySqlTestStore)TestStore).ServerVersion.Value.DefaultUtf8CiCollation;

// Needed to make Can_insert_and_read_back_with_case_insensitive_string_key() work.
modelBuilder.Entity<StringForeignKeyDataType>()
Expand Down
6 changes: 3 additions & 3 deletions test/EFCore.MySql.FunctionalTests/MigrationsMySqlTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1300,9 +1300,9 @@ public override Task Rename_table()
protected virtual string DefaultCollation => ((MySqlTestStore)Fixture.TestStore).DatabaseCollation;

protected override string NonDefaultCollation
=> DefaultCollation == ((MySqlTestStore)Fixture.TestStore).GetCaseSensitiveUtf8Mb4Collation()
? ((MySqlTestStore)Fixture.TestStore).GetCaseInsensitiveUtf8Mb4Collation()
: ((MySqlTestStore)Fixture.TestStore).GetCaseSensitiveUtf8Mb4Collation();
=> DefaultCollation == ((MySqlTestStore)Fixture.TestStore).ServerVersion.Value.DefaultUtf8CsCollation
? ((MySqlTestStore)Fixture.TestStore).ServerVersion.Value.DefaultUtf8CiCollation
: ((MySqlTestStore)Fixture.TestStore).ServerVersion.Value.DefaultUtf8CsCollation;

protected virtual string NonDefaultCollation2
=> "utf8mb4_german2_ci";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
using Microsoft.EntityFrameworkCore.TestUtilities;
using Pomelo.EntityFrameworkCore.MySql.Tests;

namespace Pomelo.EntityFrameworkCore.MySql.FunctionalTests.TestUtilities
{
public class MySqlNorthwindTestStoreFactory : MySqlTestStoreFactory
{
public static new MySqlNorthwindTestStoreFactory Instance => InstanceCi;
public static MySqlNorthwindTestStoreFactory InstanceCi { get; } = new MySqlNorthwindTestStoreFactory(databaseCollation: MySqlTestStore.ModernCiCollation);
public static MySqlNorthwindTestStoreFactory InstanceCs { get; } = new MySqlNorthwindTestStoreFactory(databaseCollation: MySqlTestStore.ModernCsCollation);
public static MySqlNorthwindTestStoreFactory InstanceCi { get; } = new MySqlNorthwindTestStoreFactory(databaseCollation: AppConfig.ServerVersion.DefaultUtf8CiCollation);
public static MySqlNorthwindTestStoreFactory InstanceCs { get; } = new MySqlNorthwindTestStoreFactory(databaseCollation: AppConfig.ServerVersion.DefaultUtf8CsCollation);
public static new MySqlNorthwindTestStoreFactory NoBackslashEscapesInstance { get; } = new MySqlNorthwindTestStoreFactory(true);

protected MySqlNorthwindTestStoreFactory(bool noBackslashEscapes = false, string databaseCollation = null)
Expand Down
63 changes: 8 additions & 55 deletions test/EFCore.MySql.FunctionalTests/TestUtilities/MySqlTestStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,22 +66,20 @@ public static MySqlTestStore RecreateInitialized(string name)
MySqlGuidFormat guidFormat = MySqlGuidFormat.Default)
: base(name, shared)
{
DatabaseCharSet = databaseCharSet ?? "utf8mb4";
DatabaseCollation = databaseCollation ?? ModernCsCollation;
_useConnectionString = useConnectionString;
_noBackslashEscapes = noBackslashEscapes;
ConnectionString = CreateConnectionString(name, _noBackslashEscapes, guidFormat);
Connection = new MySqlConnection(ConnectionString);
ServerVersion = new Lazy<ServerVersion>(() => Microsoft.EntityFrameworkCore.ServerVersion.AutoDetect((MySqlConnection)Connection));
DatabaseCharSet = databaseCharSet ?? "utf8mb4";
DatabaseCollation = databaseCollation ?? ServerVersion.Value.DefaultUtf8CsCollation;

if (scriptPath != null)
{
_scriptPath = Path.Combine(
Path.GetDirectoryName(
typeof(MySqlTestStore).GetTypeInfo()
.Assembly.Location), scriptPath);
Path.GetDirectoryName(typeof(MySqlTestStore).GetTypeInfo().Assembly.Location) ?? string.Empty,
scriptPath);
}

ConnectionString = CreateConnectionString(name, _noBackslashEscapes, guidFormat);
Connection = new MySqlConnection(ConnectionString);
ServerVersion = new Lazy<ServerVersion>(() => Microsoft.EntityFrameworkCore.ServerVersion.AutoDetect((MySqlConnection)Connection));
}

public static string CreateConnectionString(string name, bool noBackslashEscapes = false, MySqlGuidFormat guidFormat = MySqlGuidFormat.Default)
Expand Down Expand Up @@ -151,8 +149,6 @@ private bool CreateDatabase(Action<DbContext> clean)
using var master = new MySqlConnection(CreateAdminConnectionString());
master.Open();

SetupCurrentDatabaseCollation(master);

string databaseSetupSql;
if (DatabaseExists(Name))
{
Expand Down Expand Up @@ -217,7 +213,7 @@ public void ExecuteScript(string script)
{
foreach (var batch in
new Regex(@"^/\*\s*GO\s*\*/", RegexOptions.IgnoreCase | RegexOptions.Multiline, TimeSpan.FromMilliseconds(1000.0))
.Split(EnsureBackwardsCompatibleCollations(Connection, script))
.Split(script)
.Where(b => !string.IsNullOrEmpty(b)))
{
command.CommandText = batch;
Expand Down Expand Up @@ -338,48 +334,5 @@ public virtual Task AppendToSqlModeAsync(string mode, MySqlConnection connection

return command.ExecuteNonQueryAsync();
}

public const string ModernCsCollation = "utf8mb4_0900_as_cs";
public const string LegacyCsCollation = "utf8mb4_bin";
public const string ModernCiCollation = "utf8mb4_0900_ai_ci";
public const string LegacyCiCollation = "utf8mb4_general_ci";

private string EnsureBackwardsCompatibleCollations(DbConnection connection, string script)
{
if (GetCaseSensitiveUtf8Mb4Collation((MySqlConnection)connection) != ModernCsCollation)
{
script = script.Replace(ModernCsCollation, LegacyCsCollation, StringComparison.OrdinalIgnoreCase);
}

if (GetCaseInsensitiveUtf8Mb4Collation((MySqlConnection)connection) != ModernCiCollation)
{
script = script.Replace(ModernCiCollation, LegacyCiCollation, StringComparison.OrdinalIgnoreCase);
}

return script;
}

private void SetupCurrentDatabaseCollation(DbConnection connection)
=> DatabaseCollation = EnsureBackwardsCompatibleCollations(connection, DatabaseCollation);

public string GetCaseSensitiveUtf8Mb4Collation()
=> ServerVersion.Value.Supports.DefaultCharSetUtf8Mb4
? ModernCsCollation
: LegacyCsCollation;

public string GetCaseInsensitiveUtf8Mb4Collation()
=> ServerVersion.Value.Supports.DefaultCharSetUtf8Mb4
? ModernCiCollation
: LegacyCiCollation;

private string GetCaseSensitiveUtf8Mb4Collation(MySqlConnection connection)
=> Microsoft.EntityFrameworkCore.ServerVersion.AutoDetect(connection).Supports.DefaultCharSetUtf8Mb4
? ModernCsCollation
: LegacyCsCollation;

private string GetCaseInsensitiveUtf8Mb4Collation(MySqlConnection connection)
=> Microsoft.EntityFrameworkCore.ServerVersion.AutoDetect(connection).Supports.DefaultCharSetUtf8Mb4
? ModernCiCollation
: LegacyCiCollation;
}
}

0 comments on commit a896e1f

Please sign in to comment.