From d5c8d5d212fcef8813b0368f51e4be9ac37678db Mon Sep 17 00:00:00 2001
From: MASES Public Developers Team
 <94312179+masesdevelopers@users.noreply.github.com>
Date: Wed, 4 Oct 2023 20:13:33 +0200
Subject: [PATCH] Test configuration converted to JSON file and added current
 test types (#69)

---
 .../KEFCore.Test.InMemory.csproj              | 20 ----
 test/KEFCore.Test.InMemory/ProgramConfig.cs   | 35 -------
 .../KEFCore.Test.Replicator.csproj            | 20 ----
 test/KEFCore.Test.Replicator/ProgramConfig.cs | 35 -------
 test/KEFCore.Test.sln                         | 14 ---
 test/KEFCore.Test/InMemoryTest.json           |  3 +
 test/KEFCore.Test/KEFCore.Test.csproj         | 12 +++
 test/KEFCore.Test/KNetReplicatorTest.json     |  4 +
 test/KEFCore.Test/KafkaStreamsTest.json       |  3 +
 test/KEFCore.Test/Program.cs                  | 94 +++++++++----------
 test/KEFCore.Test/ProgramConfig.cs            | 17 ++--
 11 files changed, 79 insertions(+), 178 deletions(-)
 delete mode 100644 test/KEFCore.Test.InMemory/KEFCore.Test.InMemory.csproj
 delete mode 100644 test/KEFCore.Test.InMemory/ProgramConfig.cs
 delete mode 100644 test/KEFCore.Test.Replicator/KEFCore.Test.Replicator.csproj
 delete mode 100644 test/KEFCore.Test.Replicator/ProgramConfig.cs
 create mode 100644 test/KEFCore.Test/InMemoryTest.json
 create mode 100644 test/KEFCore.Test/KNetReplicatorTest.json
 create mode 100644 test/KEFCore.Test/KafkaStreamsTest.json

diff --git a/test/KEFCore.Test.InMemory/KEFCore.Test.InMemory.csproj b/test/KEFCore.Test.InMemory/KEFCore.Test.InMemory.csproj
deleted file mode 100644
index eada7b8a..00000000
--- a/test/KEFCore.Test.InMemory/KEFCore.Test.InMemory.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-	<Import Project="..\Common\Common.props" />
-	<PropertyGroup>
-		<OutputType>Exe</OutputType>
-		<AssemblyName>MASES.EntityFrameworkCore.KNet.Test.InMemory</AssemblyName>
-		<RootNamespace>MASES.EntityFrameworkCore.KNet.Test.InMemory</RootNamespace>
-		<Title>EntityFrameworkCore InMemory Test</Title>
-		<Description>EntityFrameworkCore InMemory Test</Description>
-		<Product>MASES.EntityFrameworkCore.KNet.Test.InMemory</Product>
-		<OutputPath>..\..\bin\</OutputPath>
-	</PropertyGroup>
-	<ItemGroup>
-	  <Compile Include="..\KEFCore.Test\Program.cs" Link="Program.cs" />
-	</ItemGroup>
-
-	<ItemGroup>
-	  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.11" />
-	  <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.11" />
-	</ItemGroup>
-</Project>
diff --git a/test/KEFCore.Test.InMemory/ProgramConfig.cs b/test/KEFCore.Test.InMemory/ProgramConfig.cs
deleted file mode 100644
index 429dcef3..00000000
--- a/test/KEFCore.Test.InMemory/ProgramConfig.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  MIT License
- *
- *  Copyright (c) 2022 MASES s.r.l.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a copy
- *  of this software and associated documentation files (the "Software"), to deal
- *  in the Software without restriction, including without limitation the rights
- *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- *  copies of the Software, and to permit persons to whom the Software is
- *  furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice shall be included in all
- *  copies or substantial portions of the Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- *  SOFTWARE.
- */
-
-namespace MASES.EntityFrameworkCore.KNet.Test
-{
-    partial class Program
-    {
-        public static bool UseInMemoryProvider = true;
-        public static bool UseModelBuilder = false;
-        public static bool UseCompactedReplicator = false;
-        public static string DatabaseName = null;
-        static bool deleteApplication = false;
-    }
-}
diff --git a/test/KEFCore.Test.Replicator/KEFCore.Test.Replicator.csproj b/test/KEFCore.Test.Replicator/KEFCore.Test.Replicator.csproj
deleted file mode 100644
index ea21d142..00000000
--- a/test/KEFCore.Test.Replicator/KEFCore.Test.Replicator.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-	<Import Project="..\Common\Common.props" />
-	<PropertyGroup>
-		<OutputType>Exe</OutputType>
-		<AssemblyName>MASES.EntityFrameworkCore.KNet.Test.Replicator</AssemblyName>
-		<RootNamespace>MASES.EntityFrameworkCore.KNet.Test.Replicator</RootNamespace>
-		<Title>EntityFrameworkCore Replicator Test</Title>
-		<Description>EntityFrameworkCore Replicator Test</Description>
-		<Product>MASES.EntityFrameworkCore.KNet.Test.Replicator</Product>
-		<OutputPath>..\..\bin\</OutputPath>
-	</PropertyGroup>
-	<ItemGroup>
-	  <Compile Include="..\KEFCore.Test\Program.cs" Link="Program.cs" />
-	</ItemGroup>
-
-	<ItemGroup>
-	  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.11" />
-	  <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.11" />
-	</ItemGroup>
-</Project>
diff --git a/test/KEFCore.Test.Replicator/ProgramConfig.cs b/test/KEFCore.Test.Replicator/ProgramConfig.cs
deleted file mode 100644
index 8b687633..00000000
--- a/test/KEFCore.Test.Replicator/ProgramConfig.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  MIT License
- *
- *  Copyright (c) 2022 MASES s.r.l.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a copy
- *  of this software and associated documentation files (the "Software"), to deal
- *  in the Software without restriction, including without limitation the rights
- *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- *  copies of the Software, and to permit persons to whom the Software is
- *  furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice shall be included in all
- *  copies or substantial portions of the Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- *  SOFTWARE.
- */
-
-namespace MASES.EntityFrameworkCore.KNet.Test
-{
-    partial class Program
-    {
-        public static bool UseInMemoryProvider = false;
-        public static bool UseModelBuilder = false;
-        public static bool UseCompactedReplicator = true;
-        public static string DatabaseName = null;
-        static bool deleteApplication = false;
-    }
-}
diff --git a/test/KEFCore.Test.sln b/test/KEFCore.Test.sln
index 43a08ec0..a6a95ddf 100644
--- a/test/KEFCore.Test.sln
+++ b/test/KEFCore.Test.sln
@@ -7,14 +7,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KEFCore.Test", "KEFCore.Tes
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KEFCore", "..\src\net\KEFCore\KEFCore.csproj", "{BB85D638-A032-41F5-9118-3264F6F6D14C}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KEFCore.Test.InMemory", "KEFCore.Test.InMemory\KEFCore.Test.InMemory.csproj", "{B32C7AB4-6B7D-4CDF-B18E-467B9757D231}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{B35B16BB-890F-4385-AB20-7AA4DD6E9C01}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4A0AD520-9BC4-4F92-893B-6F92BBC35BFA}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KEFCore.Test.Replicator", "KEFCore.Test.Replicator\KEFCore.Test.Replicator.csproj", "{6FE8F586-4EA6-496E-AC8D-53F5C25E5388}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -29,14 +25,6 @@ Global
 		{BB85D638-A032-41F5-9118-3264F6F6D14C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{BB85D638-A032-41F5-9118-3264F6F6D14C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{BB85D638-A032-41F5-9118-3264F6F6D14C}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B32C7AB4-6B7D-4CDF-B18E-467B9757D231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B32C7AB4-6B7D-4CDF-B18E-467B9757D231}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B32C7AB4-6B7D-4CDF-B18E-467B9757D231}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B32C7AB4-6B7D-4CDF-B18E-467B9757D231}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6FE8F586-4EA6-496E-AC8D-53F5C25E5388}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6FE8F586-4EA6-496E-AC8D-53F5C25E5388}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6FE8F586-4EA6-496E-AC8D-53F5C25E5388}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6FE8F586-4EA6-496E-AC8D-53F5C25E5388}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -44,8 +32,6 @@ Global
 	GlobalSection(NestedProjects) = preSolution
 		{6999B7F3-6887-41CE-B1E9-2CE6BB881FDA} = {4A0AD520-9BC4-4F92-893B-6F92BBC35BFA}
 		{BB85D638-A032-41F5-9118-3264F6F6D14C} = {B35B16BB-890F-4385-AB20-7AA4DD6E9C01}
-		{B32C7AB4-6B7D-4CDF-B18E-467B9757D231} = {4A0AD520-9BC4-4F92-893B-6F92BBC35BFA}
-		{6FE8F586-4EA6-496E-AC8D-53F5C25E5388} = {4A0AD520-9BC4-4F92-893B-6F92BBC35BFA}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {36C294ED-9ECE-42AA-8273-31E008749AF3}
diff --git a/test/KEFCore.Test/InMemoryTest.json b/test/KEFCore.Test/InMemoryTest.json
new file mode 100644
index 00000000..f3574821
--- /dev/null
+++ b/test/KEFCore.Test/InMemoryTest.json
@@ -0,0 +1,3 @@
+{
+  "UseInMemoryProvider": true
+}
diff --git a/test/KEFCore.Test/KEFCore.Test.csproj b/test/KEFCore.Test/KEFCore.Test.csproj
index be26f56e..fe28413b 100644
--- a/test/KEFCore.Test/KEFCore.Test.csproj
+++ b/test/KEFCore.Test/KEFCore.Test.csproj
@@ -14,4 +14,16 @@
 	  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.11" />
 	  <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.11" />
 	</ItemGroup>
+
+	<ItemGroup>
+	  <None Update="InMemoryTest.json">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </None>
+	  <None Update="KNetReplicatorTest.json">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </None>
+	  <None Update="KafkaStreamsTest.json">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </None>
+	</ItemGroup>
 </Project>
diff --git a/test/KEFCore.Test/KNetReplicatorTest.json b/test/KEFCore.Test/KNetReplicatorTest.json
new file mode 100644
index 00000000..064ce140
--- /dev/null
+++ b/test/KEFCore.Test/KNetReplicatorTest.json
@@ -0,0 +1,4 @@
+{
+  "UseCompactedReplicator": true,
+  "BootstrapServers": "192.168.1.103:9092"
+}
diff --git a/test/KEFCore.Test/KafkaStreamsTest.json b/test/KEFCore.Test/KafkaStreamsTest.json
new file mode 100644
index 00000000..243bea6a
--- /dev/null
+++ b/test/KEFCore.Test/KafkaStreamsTest.json
@@ -0,0 +1,3 @@
+{
+  "BootstrapServers": "192.168.1.103:9092"
+}
diff --git a/test/KEFCore.Test/Program.cs b/test/KEFCore.Test/Program.cs
index 639ef169..438cbfab 100644
--- a/test/KEFCore.Test/Program.cs
+++ b/test/KEFCore.Test/Program.cs
@@ -25,50 +25,48 @@
 using MASES.EntityFrameworkCore.KNet.Infrastructure;
 using MASES.KNet.Streams;
 using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Metadata.Internal;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.IO;
 using System.Linq;
+using System.Text.Json;
 
 namespace MASES.EntityFrameworkCore.KNet.Test
 {
     partial class Program
     {
-        const string theServer = "localhost:9092";
-        static string serverToUse = theServer;
-        static string databaseName = "TestDB";
-        static string databaseNameWithModel = "TestDBWithModel";
-        static string applicationId = "TestApplication";
+        internal static ProgramConfig config = new();
 
-        static void Main(string[] args)
+        static void ReportString(string message)
         {
-            if (!UseInMemoryProvider)
+            if (Debugger.IsAttached)
             {
-                KEFCore.CreateGlobalInstance();
-                var appArgs = KEFCore.FilteredArgs;
-
-                if (appArgs.Length > 0)
-                {
-                    serverToUse = args[0];
-                }
+                ReportString(message);
+            }
+            else
+            {
+                Console.WriteLine(message);
+            }
+        }
 
-                if (appArgs.Length > 1)
-                {
-                    deleteApplication = args[1].ToLowerInvariant() == "true";
-                }
+        static void Main(string[] args)
+        {
+            if (args.Length > 0)
+            {
+                config = JsonSerializer.Deserialize<ProgramConfig>(File.ReadAllText(args[0]));
+            }
 
-                if (appArgs.Length > 2)
-                {
-                    applicationId = args[2];
-                }
+            if (!config.UseInMemoryProvider)
+            {
+                KEFCore.CreateGlobalInstance();
             }
 
-            DatabaseName = UseModelBuilder ? databaseNameWithModel : databaseName;
+            var databaseName = config.UseModelBuilder ? config.DatabaseNameWithModel : config.DatabaseName;
 
             var globalWatcher = Stopwatch.StartNew();
             StreamsConfigBuilder streamConfig = null;
-            if (!UseInMemoryProvider)
+            if (!config.UseInMemoryProvider)
             {
                 streamConfig = StreamsConfigBuilder.Create();
                 streamConfig = streamConfig.WithAcceptableRecoveryLag(100);
@@ -76,13 +74,13 @@ static void Main(string[] args)
 
             var context = new BloggingContext()
             {
-                BootstrapServers = serverToUse,
-                ApplicationId = applicationId,
-                DbName = DatabaseName,
+                BootstrapServers = config.BootstrapServers,
+                ApplicationId = config.ApplicationId,
+                DbName = databaseName,
                 StreamsConfigBuilder = streamConfig,
             };
 
-            if (deleteApplication)
+            if (config.DeleteApplication)
             {
                 context.Database.EnsureDeleted();
                 context.Database.EnsureCreated();
@@ -90,7 +88,7 @@ static void Main(string[] args)
 
             var testWatcher = Stopwatch.StartNew();
             Stopwatch watch = Stopwatch.StartNew();
-            for (int i = 1; i <= 1000; i++)
+            for (int i = 0; i < config.NumberOfElements; i++)
             {
                 context.Add(new Blog
                 {
@@ -107,14 +105,14 @@ static void Main(string[] args)
                 });
             }
             watch.Stop();
-            Trace.WriteLine($"Elapsed data load {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed data load {watch.ElapsedMilliseconds} ms");
 
             watch.Restart();
             context.SaveChanges();
             watch.Stop();
-            Trace.WriteLine($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
 
-            if (UseModelBuilder)
+            if (config.UseModelBuilder)
             {
                 watch.Restart();
                 var pageObject = (from op in context.Blogs
@@ -122,42 +120,42 @@ join pg in context.Posts on op.BlogId equals pg.BlogId
                                   where pg.BlogId == op.BlogId
                                   select new { pg, op }).SingleOrDefault();
                 watch.Stop();
-                Trace.WriteLine($"Elapsed UseModelBuilder {watch.ElapsedMilliseconds} ms");
+                ReportString($"Elapsed UseModelBuilder {watch.ElapsedMilliseconds} ms");
             }
 
             watch.Restart();
             var post = context.Posts.Single(b => b.BlogId == 2);
             watch.Stop();
-            Trace.WriteLine($"Elapsed context.Posts.Single(b => b.BlogId == 2) {watch.ElapsedMilliseconds} ms. Result is {post}");
+            ReportString($"Elapsed context.Posts.Single(b => b.BlogId == 2) {watch.ElapsedMilliseconds} ms. Result is {post}");
 
             watch.Restart();
             post = context.Posts.Single(b => b.BlogId == 1);
             watch.Stop();
-            Trace.WriteLine($"Elapsed context.Posts.Single(b => b.BlogId == 1) {watch.ElapsedMilliseconds} ms. Result is {post}");
+            ReportString($"Elapsed context.Posts.Single(b => b.BlogId == 1) {watch.ElapsedMilliseconds} ms. Result is {post}");
 
             watch.Restart();
             var all = context.Posts.All((o) => true);
             watch.Stop();
-            Trace.WriteLine($"Elapsed context.Posts.All((o) => true) {watch.ElapsedMilliseconds} ms. Result is {all}");
+            ReportString($"Elapsed context.Posts.All((o) => true) {watch.ElapsedMilliseconds} ms. Result is {all}");
 
             watch.Restart();
             var blog = context.Blogs!.Single(b => b.BlogId == 1);
             watch.Stop();
-            Trace.WriteLine($"Elapsed context.Blogs!.Single(b => b.BlogId == 1) {watch.ElapsedMilliseconds} ms. Result is {blog}");
+            ReportString($"Elapsed context.Blogs!.Single(b => b.BlogId == 1) {watch.ElapsedMilliseconds} ms. Result is {blog}");
 
             watch.Restart();
             context.Remove(post);
             context.Remove(blog);
             watch.Stop();
-            Trace.WriteLine($"Elapsed data remove {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed data remove {watch.ElapsedMilliseconds} ms");
 
             watch.Restart();
             context.SaveChanges();
             watch.Stop();
-            Trace.WriteLine($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
 
             watch.Restart();
-            for (int i = 1000; i < 1100; i++)
+            for (int i = config.NumberOfElements; i < config.NumberOfElements + config.NumberOfExtraElements; i++)
             {
                 context.Add(new Blog
                 {
@@ -174,17 +172,17 @@ join pg in context.Posts on op.BlogId equals pg.BlogId
                 });
             }
             watch.Stop();
-            Trace.WriteLine($"Elapsed data load {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed data load {watch.ElapsedMilliseconds} ms");
 
             watch.Restart();
             context.SaveChanges();
             watch.Stop();
-            Trace.WriteLine($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
+            ReportString($"Elapsed SaveChanges {watch.ElapsedMilliseconds} ms");
 
             watch.Restart();
             post = context.Posts.Single(b => b.BlogId == 1009);
             watch.Stop();
-            Trace.WriteLine($"Elapsed context.Posts.Single(b => b.BlogId == 1009) {watch.ElapsedMilliseconds} ms. Result is {post}");
+            ReportString($"Elapsed context.Posts.Single(b => b.BlogId == 1009) {watch.ElapsedMilliseconds} ms. Result is {post}");
 
             var value = context.Blogs.AsQueryable().ToQueryString();
 
@@ -197,16 +195,16 @@ join pg in context.Posts on op.BlogId equals pg.BlogId
 
     public class BloggingContext : KafkaDbContext
     {
-        public override bool UseCompactedReplicator { get; set; } = Program.UseCompactedReplicator;
+        public override bool UseCompactedReplicator { get; set; } = Program.config.UseCompactedReplicator;
 
         public DbSet<Blog> Blogs { get; set; }
         public DbSet<Post> Posts { get; set; }
 
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
-            if (Program.UseInMemoryProvider)
+            if (Program.config.UseInMemoryProvider)
             {
-                optionsBuilder.UseInMemoryDatabase(Program.DatabaseName);
+                optionsBuilder.UseInMemoryDatabase(Program.config.DatabaseName);
             }
             else
             {
@@ -220,7 +218,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 
         protected override void OnModelCreating(ModelBuilder modelBuilder)
         {
-            if (!Program.UseModelBuilder) return;
+            if (!Program.config.UseModelBuilder) return;
 
             modelBuilder.Entity<Blog>().HasKey(c => new { c.BlogId, c.Rating });
         }
diff --git a/test/KEFCore.Test/ProgramConfig.cs b/test/KEFCore.Test/ProgramConfig.cs
index c8953176..aa137339 100644
--- a/test/KEFCore.Test/ProgramConfig.cs
+++ b/test/KEFCore.Test/ProgramConfig.cs
@@ -24,12 +24,17 @@
 
 namespace MASES.EntityFrameworkCore.KNet.Test
 {
-    partial class Program
+    public class ProgramConfig
     {
-        public static bool UseInMemoryProvider = false;
-        public static bool UseModelBuilder = false;
-        public static bool UseCompactedReplicator = false;
-        public static string DatabaseName = null;
-        static bool deleteApplication = true;
+        public bool UseInMemoryProvider { get; set; } = false;
+        public bool UseModelBuilder { get; set; } = false;
+        public bool UseCompactedReplicator { get; set; } = false;
+        public string DatabaseName { get; set; } = "TestDB";
+        public string DatabaseNameWithModel { get; set; } = "TestDBWithModel";
+        public string ApplicationId { get; set; } = "TestApplication";
+        public bool DeleteApplication { get; set; } = true;
+        public string BootstrapServers { get; set; } = "localhost:9092";
+        public int NumberOfElements { get; set; } = 1000;
+        public int NumberOfExtraElements { get; set; } = 100;
     }
 }