diff --git a/tests/Benchmarks/Benchmark.cs b/tests/Benchmarks/Benchmark.cs
deleted file mode 100644
index 2bf549ceb..000000000
--- a/tests/Benchmarks/Benchmark.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-// ==========================================================================
-// IBenchmark.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Benchmarks
-{
- public abstract class Benchmark
- {
- public virtual void Initialize()
- {
- }
-
- public virtual void RunInitialize()
- {
- }
-
- public virtual void RunCleanup()
- {
- }
-
- public virtual void Cleanup()
- {
- }
-
- public abstract long Run();
- }
-}
diff --git a/tests/Benchmarks/Benchmarks.csproj b/tests/Benchmarks/Benchmarks.csproj
deleted file mode 100644
index e8ecbf1d7..000000000
--- a/tests/Benchmarks/Benchmarks.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- Exe
- netcoreapp2.0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.extensions.dependencyinjection\2.0.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.dll
-
-
-
- ..\..\Squidex.ruleset
-
-
diff --git a/tests/Benchmarks/Program.cs b/tests/Benchmarks/Program.cs
deleted file mode 100644
index c04991e0f..000000000
--- a/tests/Benchmarks/Program.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-// ==========================================================================
-// Program.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using Benchmarks.Tests;
-
-namespace Benchmarks
-{
- public static class Program
- {
- private static readonly List<(string Name, Benchmark Benchmark)> Benchmarks = new Benchmark[]
- {
- new AppendToEventStore(),
- new AppendToEventStoreWithManyWriters(),
- new HandleEvents(),
- new HandleEventsWithManyWriters(),
- new ReadSchemaState()
- }.Select(x => (x.GetType().Name, x)).ToList();
-
- public static void Main(string[] args)
- {
- var name = "ReadSchemaState";
-
- var selected = Benchmarks.Find(x => x.Name == name);
-
- if (selected.Benchmark == null)
- {
- Console.WriteLine($"'{name}' is not a valid benchmark, please try: ");
-
- foreach (var b in Benchmarks)
- {
- Console.WriteLine($" * {b.Name}");
- }
- }
- else
- {
- const int numRuns = 3;
-
- try
- {
- var elapsed = 0d;
- var count = 0L;
-
- Console.WriteLine($"{selected.Name}: Initialized");
-
- selected.Benchmark.Initialize();
-
- for (var run = 0; run < numRuns; run++)
- {
- try
- {
- selected.Benchmark.RunInitialize();
-
- var watch = Stopwatch.StartNew();
-
- count += selected.Benchmark.Run();
-
- watch.Stop();
-
- elapsed += watch.ElapsedMilliseconds;
-
- Console.WriteLine($"{selected.Name}: Run {run + 1} finished");
- }
- finally
- {
- selected.Benchmark.RunCleanup();
- }
- }
-
- var averageElapsed = TimeSpan.FromMilliseconds(elapsed / numRuns);
- var averageSeconds = Math.Round(count / (numRuns * averageElapsed.TotalSeconds), 2);
-
- Console.WriteLine($"{selected.Name}: Completed after {averageElapsed}, {averageSeconds} items/s");
- }
- catch (Exception e)
- {
- Console.WriteLine($"Benchmark failed with '{e.Message}'");
- }
- finally
- {
- selected.Benchmark.Cleanup();
- }
- }
-
- Console.ReadLine();
- }
- }
-}
diff --git a/tests/Benchmarks/Properties/launchSettings.json b/tests/Benchmarks/Properties/launchSettings.json
deleted file mode 100644
index 05fb17fa5..000000000
--- a/tests/Benchmarks/Properties/launchSettings.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "profiles": {
- "Benchmarks": {
- "commandName": "Project"
- }
- }
-}
\ No newline at end of file
diff --git a/tests/Benchmarks/Services.cs b/tests/Benchmarks/Services.cs
deleted file mode 100644
index 1c7a770d0..000000000
--- a/tests/Benchmarks/Services.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-// ==========================================================================
-// Services.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using Benchmarks.Tests.TestData;
-using Microsoft.Extensions.Caching.Memory;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
-using MongoDB.Driver;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
-using NodaTime;
-using NodaTime.Serialization.JsonNet;
-using Squidex.Domain.Apps.Core.Apps.Json;
-using Squidex.Domain.Apps.Core.Rules.Json;
-using Squidex.Domain.Apps.Core.Schemas;
-using Squidex.Domain.Apps.Core.Schemas.Json;
-using Squidex.Infrastructure;
-using Squidex.Infrastructure.EventSourcing;
-using Squidex.Infrastructure.Json;
-using Squidex.Infrastructure.Log;
-using Squidex.Infrastructure.MongoDb;
-using Squidex.Infrastructure.States;
-
-namespace Benchmarks
-{
- public static class Services
- {
- public static IServiceProvider Create()
- {
- var services = new ServiceCollection();
-
- services.AddSingleton(CreateTypeNameRegistry());
-
- services.AddSingleton();
-
- services.AddTransient();
-
- services.AddSingleton(
- new MongoClient("mongodb://localhost"));
-
- services.AddSingleton(
- new SemanticLog(new ILogChannel[0], new ILogAppender[0], () => new JsonLogWriter()));
-
- services.AddSingleton(
- new MemoryCache(Options.Create(new MemoryCacheOptions())));
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton();
-
- services.AddSingleton(c =>
- JsonSerializer.Create(c.GetRequiredService()));
-
- services.AddSingleton(c =>
- CreateJsonSerializerSettings(c.GetRequiredService(), c.GetRequiredService()));
-
- services.AddSingleton(c =>
- c.GetRequiredService().GetDatabase(Guid.NewGuid().ToString()));
-
- return services.BuildServiceProvider();
- }
-
- public static void Cleanup(this IServiceProvider services)
- {
- var mongoClient = services.GetRequiredService();
- var mongoDatabase = services.GetRequiredService();
-
- mongoClient.DropDatabase(mongoDatabase.DatabaseNamespace.DatabaseName);
-
- if (services is IDisposable disposable)
- {
- disposable.Dispose();
- }
- }
-
- private static TypeNameRegistry CreateTypeNameRegistry()
- {
- var result = new TypeNameRegistry();
-
- result.Map(typeof(MyEvent));
-
- return result;
- }
-
- private static JsonSerializerSettings CreateJsonSerializerSettings(TypeNameRegistry typeNameRegistry, FieldRegistry fieldRegistry)
- {
- var settings = new JsonSerializerSettings();
-
- settings.SerializationBinder = new TypeNameSerializationBinder(typeNameRegistry);
-
- settings.ContractResolver = new ConverterContractResolver(
- new AppClientsConverter(),
- new AppContributorsConverter(),
- new ClaimsPrincipalConverter(),
- new InstantConverter(),
- new LanguageConverter(),
- new LanguagesConfigConverter(),
- new NamedGuidIdConverter(),
- new NamedLongIdConverter(),
- new NamedStringIdConverter(),
- new PropertiesBagConverter(),
- new PropertiesBagConverter(),
- new RefTokenConverter(),
- new RuleConverter(),
- new SchemaConverter(fieldRegistry),
- new StringEnumConverter());
-
- settings.NullValueHandling = NullValueHandling.Ignore;
-
- settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
- settings.DateParseHandling = DateParseHandling.None;
-
- settings.TypeNameHandling = TypeNameHandling.Auto;
-
- settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
-
- BsonJsonConvention.Register(JsonSerializer.Create(settings));
-
- return settings;
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/AppendToEventStore.cs b/tests/Benchmarks/Tests/AppendToEventStore.cs
deleted file mode 100644
index 679330ade..000000000
--- a/tests/Benchmarks/Tests/AppendToEventStore.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// ==========================================================================
-// AppendToEventStore.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using Benchmarks.Utils;
-using Microsoft.Extensions.DependencyInjection;
-using Squidex.Infrastructure.EventSourcing;
-
-namespace Benchmarks.Tests
-{
- public sealed class AppendToEventStore : Benchmark
- {
- private IServiceProvider services;
- private IEventStore eventStore;
-
- public override void RunInitialize()
- {
- services = Services.Create();
-
- eventStore = services.GetRequiredService();
- }
-
- public override long Run()
- {
- const long numCommits = 100;
- const long numStreams = 20;
-
- for (var streamId = 0; streamId < numStreams; streamId++)
- {
- var eventOffset = -1;
- var streamName = streamId.ToString();
-
- for (var commitId = 0; commitId < numCommits; commitId++)
- {
- eventStore.AppendEventsAsync(Guid.NewGuid(), streamName, eventOffset, new[] { Helper.CreateEventData() }).Wait();
- eventOffset++;
- }
- }
-
- return numCommits * numStreams;
- }
-
- public override void RunCleanup()
- {
- services.Cleanup();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs b/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs
deleted file mode 100644
index 93ca46661..000000000
--- a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-// ==========================================================================
-// AppendToEventStoreWithManyWriters.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Threading.Tasks;
-using Benchmarks.Utils;
-using Microsoft.Extensions.DependencyInjection;
-using Squidex.Infrastructure.EventSourcing;
-
-namespace Benchmarks.Tests
-{
- public sealed class AppendToEventStoreWithManyWriters : Benchmark
- {
- private IServiceProvider services;
- private IEventStore eventStore;
-
- public override void RunInitialize()
- {
- services = Services.Create();
-
- eventStore = services.GetRequiredService();
- }
-
- public override long Run()
- {
- const long numCommits = 200;
- const long numStreams = 100;
-
- Parallel.For(0, numStreams, streamId =>
- {
- var streamName = streamId.ToString();
-
- for (var commitId = 0; commitId < numCommits; commitId++)
- {
- eventStore.AppendEventsAsync(Guid.NewGuid(), streamName, new[] { Helper.CreateEventData() }).Wait();
- }
- });
-
- return numCommits * numStreams;
- }
-
- public override void RunCleanup()
- {
- services.Cleanup();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/HandleEvents.cs b/tests/Benchmarks/Tests/HandleEvents.cs
deleted file mode 100644
index d49c37b7b..000000000
--- a/tests/Benchmarks/Tests/HandleEvents.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-// ==========================================================================
-// HandleEvents.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using Benchmarks.Tests.TestData;
-using Microsoft.Extensions.DependencyInjection;
-using Squidex.Infrastructure.EventSourcing;
-using Squidex.Infrastructure.EventSourcing.Grains;
-using Squidex.Infrastructure.States;
-
-namespace Benchmarks.Tests
-{
- public sealed class HandleEvents : Benchmark
- {
- private const int NumEvents = 5000;
- private IServiceProvider services;
- private IEventStore eventStore;
- private IEventDataFormatter eventDataFormatter;
- private EventConsumerGrain eventConsumerGrain;
- private MyEventConsumer eventConsumer;
-
- public override void RunInitialize()
- {
- services = Services.Create();
-
- eventConsumer = new MyEventConsumer(NumEvents);
-
- eventStore = services.GetRequiredService();
-
- eventDataFormatter = services.GetRequiredService();
- eventConsumerGrain = services.GetRequiredService();
-
- eventConsumerGrain.ActivateAsync("Test", services.GetRequiredService()).Wait();
- eventConsumerGrain.Activate(eventConsumer);
- }
-
- public override long Run()
- {
- var streamName = Guid.NewGuid().ToString();
-
- for (var eventId = 0; eventId < NumEvents; eventId++)
- {
- var eventData = eventDataFormatter.ToEventData(new Envelope(new MyEvent { EventNumber = eventId + 1 }), Guid.NewGuid());
-
- eventStore.AppendEventsAsync(Guid.NewGuid(), streamName, eventId - 1, new[] { eventData }).Wait();
- }
-
- eventConsumer.WaitAndVerify();
-
- return NumEvents;
- }
-
- public override void RunCleanup()
- {
- services.Cleanup();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs b/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs
deleted file mode 100644
index c98899c91..000000000
--- a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// ==========================================================================
-// HandleEventsWithManyWriters.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Threading.Tasks;
-using Benchmarks.Tests.TestData;
-using Microsoft.Extensions.DependencyInjection;
-using Squidex.Infrastructure.EventSourcing;
-using Squidex.Infrastructure.EventSourcing.Grains;
-using Squidex.Infrastructure.States;
-
-namespace Benchmarks.Tests
-{
- public sealed class HandleEventsWithManyWriters : Benchmark
- {
- private const int NumCommits = 200;
- private const int NumStreams = 10;
- private IServiceProvider services;
- private IEventStore eventStore;
- private IEventDataFormatter eventDataFormatter;
- private EventConsumerGrain eventConsumerGrain;
- private MyEventConsumer eventConsumer;
-
- public override void RunInitialize()
- {
- services = Services.Create();
-
- eventConsumer = new MyEventConsumer(NumStreams * NumCommits);
-
- eventStore = services.GetRequiredService();
- eventDataFormatter = services.GetRequiredService();
-
- eventConsumerGrain = services.GetRequiredService();
-
- eventConsumerGrain.ActivateAsync("Test", services.GetRequiredService()).Wait();
- eventConsumerGrain.Activate(eventConsumer);
- }
-
- public override long Run()
- {
- Parallel.For(0, NumStreams, streamId =>
- {
- var eventOffset = -1;
- var streamName = streamId.ToString();
-
- for (var commitId = 0; commitId < NumCommits; commitId++)
- {
- var eventData = eventDataFormatter.ToEventData(new Envelope(new MyEvent()), Guid.NewGuid());
-
- eventStore.AppendEventsAsync(Guid.NewGuid(), streamName, eventOffset - 1, new[] { eventData }).Wait();
- eventOffset++;
- }
- });
-
- eventConsumer.WaitAndVerify();
-
- return NumStreams * NumCommits;
- }
-
- public override void RunCleanup()
- {
- services.Cleanup();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/ReadSchemaState.cs b/tests/Benchmarks/Tests/ReadSchemaState.cs
deleted file mode 100644
index f02f50ae4..000000000
--- a/tests/Benchmarks/Tests/ReadSchemaState.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-// ==========================================================================
-// ReadSchemaState.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Immutable;
-using Benchmarks.Tests.TestData;
-using Microsoft.Extensions.DependencyInjection;
-using NodaTime;
-using Squidex.Domain.Apps.Core;
-using Squidex.Domain.Apps.Core.Rules;
-using Squidex.Domain.Apps.Core.Rules.Actions;
-using Squidex.Domain.Apps.Core.Rules.Triggers;
-using Squidex.Domain.Apps.Core.Schemas;
-using Squidex.Domain.Apps.Read.State.Grains;
-using Squidex.Infrastructure;
-using Squidex.Infrastructure.States;
-
-namespace Benchmarks.Tests
-{
- public class ReadSchemaState : Benchmark
- {
- private IServiceProvider services;
- private MyAppState grain;
-
- public override void Initialize()
- {
- services = Services.Create();
-
- grain = services.GetRequiredService().GetSynchronizedAsync("DEFAULT").Result;
-
- var state = new AppStateGrainState
- {
- App = new JsonAppEntity
- {
- Id = Guid.NewGuid()
- }
- };
-
- state.Schemas = ImmutableDictionary.Empty;
-
- for (var i = 1; i <= 100; i++)
- {
- var schema = new JsonSchemaEntity
- {
- Id = Guid.NewGuid(),
- Created = SystemClock.Instance.GetCurrentInstant(),
- CreatedBy = new RefToken("user", "1"),
- LastModified = SystemClock.Instance.GetCurrentInstant(),
- LastModifiedBy = new RefToken("user", "1"),
- SchemaDef = new Schema("Name")
- };
-
- for (var j = 1; j < 30; j++)
- {
- schema.SchemaDef = schema.SchemaDef.AddField(new StringField(j, j.ToString(), Partitioning.Invariant));
- }
-
- state.Schemas = state.Schemas.Add(schema.Id, schema);
- }
-
- state.Rules = ImmutableDictionary.Empty;
-
- for (var i = 0; i < 100; i++)
- {
- var rule = new JsonRuleEntity
- {
- Id = Guid.NewGuid(),
- Created = SystemClock.Instance.GetCurrentInstant(),
- CreatedBy = new RefToken("user", "1"),
- LastModified = SystemClock.Instance.GetCurrentInstant(),
- LastModifiedBy = new RefToken("user", "1"),
- RuleDef = new Rule(new ContentChangedTrigger(), new WebhookAction())
- };
-
- state.Rules = state.Rules.Add(rule.Id, rule);
- }
-
- grain.SetState(state);
- grain.WriteStateAsync().Wait();
- }
-
- public override long Run()
- {
- for (var i = 0; i < 10; i++)
- {
- grain.ReadStateAsync().Wait();
- }
-
- return 10;
- }
-
- public override void Cleanup()
- {
- services.Cleanup();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/TestData/MyAppState.cs b/tests/Benchmarks/Tests/TestData/MyAppState.cs
deleted file mode 100644
index 1340b9f7d..000000000
--- a/tests/Benchmarks/Tests/TestData/MyAppState.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-// ==========================================================================
-// MyAppState.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.Threading.Tasks;
-using Squidex.Domain.Apps.Read.State.Grains;
-using Squidex.Infrastructure.States;
-
-namespace Benchmarks.Tests.TestData
-{
- public sealed class MyAppState : IStatefulObject
- {
- private IPersistence persistence;
- private AppStateGrainState state;
-
- public Task ActivateAsync(string key, IStore store)
- {
- persistence = store.WithSnapshots(key, s => state = s);
-
- return persistence.ReadAsync();
- }
-
- public void SetState(AppStateGrainState state)
- {
- this.state = state;
- }
-
- public Task WriteStateAsync()
- {
- return persistence.WriteSnapshotAsync(state);
- }
-
- public Task ReadStateAsync()
- {
- return persistence.ReadAsync();
- }
- }
-}
diff --git a/tests/Benchmarks/Tests/TestData/MyEvent.cs b/tests/Benchmarks/Tests/TestData/MyEvent.cs
deleted file mode 100644
index a11bd99bd..000000000
--- a/tests/Benchmarks/Tests/TestData/MyEvent.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// ==========================================================================
-// MyEvent.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using Squidex.Infrastructure;
-using Squidex.Infrastructure.EventSourcing;
-
-namespace Benchmarks.Tests.TestData
-{
- [TypeName("MyEvent")]
- public sealed class MyEvent : IEvent
- {
- public int EventNumber { get; set; }
- }
-}
\ No newline at end of file
diff --git a/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs b/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs
deleted file mode 100644
index 153910c55..000000000
--- a/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// ==========================================================================
-// MyEventConsumer.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Squidex.Infrastructure.EventSourcing;
-using Squidex.Infrastructure.Tasks;
-
-namespace Benchmarks.Tests.TestData
-{
- public sealed class MyEventConsumer : IEventConsumer
- {
- private readonly TaskCompletionSource