diff --git a/.github/workflows/build-container-reusable.yml b/.github/workflows/build-container-reusable.yml index 8037b92f9..92559e8df 100644 --- a/.github/workflows/build-container-reusable.yml +++ b/.github/workflows/build-container-reusable.yml @@ -59,9 +59,9 @@ jobs: build-args: | CONTAINER_RUNTIME=${{ inputs.container-runtime }} RUNTIME=${{ steps.variables.outputs.runtime }} - - name: Verify Build - run: | - docker run --rm eventstore --insecure --what-if + # - name: Verify Build + # run: | + # docker run --rm eventstore --insecure --what-if - name: Build Test Container uses: docker/build-push-action@v4 with: diff --git a/.gitignore b/.gitignore index b8b13fa20..392721b89 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,9 @@ dependencies *.ncrunchsolution *.ncrunchproject **/.vs/ +**/.idea/ +**/.vscode/ + .idea diff --git a/Dockerfile b/Dockerfile index 59d3ecc1a..cbafe3cd7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,32 +21,32 @@ COPY ./.git/ . WORKDIR /build/src RUN find /build/src -maxdepth 1 -type d -name "*.Tests" -print0 | xargs -I{} -0 -n1 sh -c \ - 'dotnet publish --runtime=${RUNTIME} --no-self-contained --configuration Release --output /build/published-tests/`basename $1` $1' - '{}' + 'dotnet publish --runtime=${RUNTIME} --no-self-contained --configuration Release --output /build/published-tests/`basename $1` $1' - '{}' # "test" image -FROM mcr.microsoft.com/dotnet/sdk:8.0-${CONTAINER_RUNTIME} as test +FROM mcr.microsoft.com/dotnet/sdk:8.0-${CONTAINER_RUNTIME} AS test WORKDIR /build COPY --from=build ./build/published-tests ./published-tests COPY --from=build ./build/ci ./ci COPY --from=build ./build/src/EventStore.Core.Tests/Services/Transport/Tcp/test_certificates/ca/ca.crt /usr/local/share/ca-certificates/ca_eventstore_test.crt RUN mkdir ./test-results RUN printf '#!/usr/bin/env sh\n\ -update-ca-certificates\n\ -find /build/published-tests -maxdepth 1 -type d -name "*.Tests" -print0 | xargs -I{} -0 -n1 sh -c '"'"'proj=`basename $1` && dotnet test --blame --blame-hang-timeout 5min --settings /build/ci/ci.runsettings --logger:"GitHubActions;report-warnings=false" --logger:html --logger:trx --logger:"console;verbosity=normal" --results-directory /build/test-results/$proj $1/$proj.dll'"'"' - '"'"'{}'"'"'\n\ -exit_code=$?\n\ -echo $(find /build/test-results -name "*.html" | xargs cat) > /build/test-results/test-results.html\n\ -exit $exit_code' \ - >> /build/test.sh && \ - chmod +x /build/test.sh + update-ca-certificates\n\ + find /build/published-tests -maxdepth 1 -type d -name "*.Tests" -print0 | xargs -I{} -0 -n1 sh -c '"'"'proj=`basename $1` && dotnet test --blame --blame-hang-timeout 5min --settings /build/ci/ci.runsettings --logger:"GitHubActions;report-warnings=false" --logger:html --logger:trx --logger:"console;verbosity=normal" --results-directory /build/test-results/$proj $1/$proj.dll'"'"' - '"'"'{}'"'"'\n\ + exit_code=$?\n\ + echo $(find /build/test-results -name "*.html" | xargs cat) > /build/test-results/test-results.html\n\ + exit $exit_code' \ + >> /build/test.sh && \ + chmod +x /build/test.sh CMD ["/build/test.sh"] # "publish" image -FROM build as publish +FROM build AS publish ARG RUNTIME=linux-x64 RUN dotnet publish --configuration=Release --runtime=${RUNTIME} --self-contained \ - --framework=net8.0 --output /publish EventStore.ClusterNode + --framework=net8.0 --output /publish EventStore.ClusterNode # "runtime" image FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-${CONTAINER_RUNTIME} AS runtime @@ -55,45 +55,45 @@ ARG UID=1000 ARG GID=1000 RUN if [[ "${RUNTIME}" = "linux-musl-x64" ]];\ - then \ - apk update && \ - apk add --no-cache \ - curl; \ - else \ - apt update && \ - apt install -y \ - curl && \ - rm -rf /var/lib/apt/lists/*; \ - fi + then \ + apk update && \ + apk add --no-cache \ + curl; \ + else \ + apt update && \ + apt install -y \ + curl && \ + rm -rf /var/lib/apt/lists/*; \ + fi WORKDIR /opt/eventstore RUN addgroup --gid ${GID} "eventstore" && \ - adduser \ - --disabled-password \ - --gecos "" \ - --ingroup "eventstore" \ - --no-create-home \ - --uid ${UID} \ - "eventstore" + adduser \ + --disabled-password \ + --gecos "" \ + --ingroup "eventstore" \ + --no-create-home \ + --uid ${UID} \ + "eventstore" COPY --chown=eventstore:eventstore --from=publish /publish ./ RUN mkdir -p /var/lib/eventstore && \ - mkdir -p /var/log/eventstore && \ - mkdir -p /etc/eventstore && \ - chown -R eventstore:eventstore /var/lib/eventstore /var/log/eventstore /etc/eventstore + mkdir -p /var/log/eventstore && \ + mkdir -p /etc/eventstore && \ + chown -R eventstore:eventstore /var/lib/eventstore /var/log/eventstore /etc/eventstore USER eventstore RUN printf "NodeIp: 0.0.0.0\n\ -ReplicationIp: 0.0.0.0" >> /etc/eventstore/eventstore.conf + ReplicationIp: 0.0.0.0" >> /etc/eventstore/eventstore.conf VOLUME /var/lib/eventstore /var/log/eventstore EXPOSE 1112/tcp 1113/tcp 2113/tcp HEALTHCHECK --interval=5s --timeout=5s --retries=24 \ - CMD curl --fail --insecure https://localhost:2113/health/live || curl --fail http://localhost:2113/health/live || exit 1 + CMD curl --fail --insecure https://localhost:2113/health/live || curl --fail http://localhost:2113/health/live || exit 1 ENTRYPOINT ["/opt/eventstore/EventStore.ClusterNode"] diff --git a/src/EventStore.ClusterNode/ClusterVNodeHostedService.cs b/src/EventStore.ClusterNode/ClusterVNodeHostedService.cs index b004d4051..b2d1aa7b6 100644 --- a/src/EventStore.ClusterNode/ClusterVNodeHostedService.cs +++ b/src/EventStore.ClusterNode/ClusterVNodeHostedService.cs @@ -27,7 +27,7 @@ using EventStore.Plugins.Authorization; using EventStore.Plugins.MD5; using EventStore.Plugins.Subsystems; -using EventStore.Projections.Core; +// using EventStore.Projections.Core; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; using Serilog; @@ -64,6 +64,7 @@ public ClusterVNodeHostedService( "Failed to configure MD5. If FIPS mode is enabled, please use the FIPS commercial plugin or disable FIPS mode."); } + /* var projectionMode = options.DevMode.Dev && options.Projection.RunProjections == ProjectionType.None ? ProjectionType.System : options.Projection.RunProjections; @@ -79,6 +80,7 @@ public ClusterVNodeHostedService( options.Projection.ProjectionCompilationTimeout, options.Projection.ProjectionExecutionTimeout))) : options; + */ if (!_options.Database.MemDb) { var absolutePath = Path.GetFullPath(_options.Database.Db); @@ -119,9 +121,14 @@ public ClusterVNodeHostedService( throw new ArgumentOutOfRangeException(nameof(_options.Database.DbLogFormat), "Unexpected log format specified."); } - var enabledNodeSubsystems = projectionMode >= ProjectionType.System + /* + var enabledNodeSubsystems = + projectionMode >= ProjectionType.System ? new[] {NodeSubsystems.Projections} : Array.Empty(); + */ + + var enabledNodeSubsystems = Array.Empty(); RegisterWebControllers(enabledNodeSubsystems); return; diff --git a/src/EventStore.ClusterNode/EventStore.ClusterNode.csproj b/src/EventStore.ClusterNode/EventStore.ClusterNode.csproj index 4eb2234a4..9517c5109 100644 --- a/src/EventStore.ClusterNode/EventStore.ClusterNode.csproj +++ b/src/EventStore.ClusterNode/EventStore.ClusterNode.csproj @@ -14,7 +14,7 @@ - + @@ -36,6 +36,9 @@ PreserveNewest + + PreserveNewest + diff --git a/src/EventStore.ClusterNode/metricsconfig.json b/src/EventStore.ClusterNode/metricsconfig.json index 2cd39b988..fe3629d8c 100644 --- a/src/EventStore.ClusterNode/metricsconfig.json +++ b/src/EventStore.ClusterNode/metricsconfig.json @@ -3,8 +3,7 @@ "ExpectedScrapeIntervalSeconds": 15, "Meters": [ - "EventStore.Core", - "EventStore.Projections.Core" + "EventStore.Core" ], "Statuses": { @@ -15,7 +14,7 @@ "ElectionsCount": true, - "ProjectionStats": true, + "ProjectionStats": false, "PersistentSubscriptionStats": true, @@ -150,14 +149,6 @@ "Regex": "PersistentSubscriptions", "Label": "Persistent Subscriptions" }, - { - "Regex": "Projections Leader", - "Label": "Projections Leader" - }, - { - "Regex": "Projection Core #.*", - "Label": "Projections Core" - }, { "Regex": "Worker #.*", "Label": "Workers" diff --git a/src/EventStore.Common/Utils/Locations.cs b/src/EventStore.Common/Utils/Locations.cs index 7695d7d6b..7df57df7d 100644 --- a/src/EventStore.Common/Utils/Locations.cs +++ b/src/EventStore.Common/Utils/Locations.cs @@ -7,7 +7,7 @@ namespace EventStore.Common.Utils { public class Locations { public static readonly string ApplicationDirectory; public static readonly string WebContentDirectory; - public static readonly string ProjectionsDirectory; + // public static readonly string ProjectionsDirectory; public static readonly string PreludeDirectory; public static readonly string PreludeResourcesPath; public static readonly string PluginsDirectory; @@ -19,6 +19,19 @@ public class Locations { public static readonly string FallbackDefaultDataDirectory; public static readonly string DefaultTrustedRootCertificateDirectory; + /// + /// Returns the preceded location by checking the existence of the directory. + /// The local directory should be the first priority as the first element followed by + /// the global default location as last element. + /// + /// the locations ordered by prioity starting with the preceded location + /// the preceded location + public static string GetPrecededLocation(params string[] locations) { + var precedenceList = locations.Distinct().ToList(); + return precedenceList.FirstOrDefault(Directory.Exists) ?? + precedenceList.Last(); + } + static Locations() { ApplicationDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? Path.GetFullPath("."); @@ -59,10 +72,10 @@ static Locations() { Path.Combine(ApplicationDirectory, "clusternode-web"), Path.Combine(DefaultContentDirectory, "clusternode-web") ); - ProjectionsDirectory = GetPrecededLocation( + /*ProjectionsDirectory = GetPrecededLocation( Path.Combine(ApplicationDirectory, "projections"), Path.Combine(DefaultContentDirectory, "projections") - ); + );*/ PreludeDirectory = GetPrecededLocation( Path.Combine(ApplicationDirectory, "Prelude"), Path.Combine(DefaultContentDirectory, "Prelude") @@ -70,19 +83,6 @@ static Locations() { PreludeResourcesPath = "EventStore.Projections.Core.Prelude"; } - /// - /// Returns the preceded location by checking the existence of the directory. - /// The local directory should be the first priority as the first element followed by - /// the global default location as last element. - /// - /// the locations ordered by prioity starting with the preceded location - /// the preceded location - public static string GetPrecededLocation(params string[] locations) { - var precedenceList = locations.Distinct().ToList(); - return precedenceList.FirstOrDefault(Directory.Exists) ?? - precedenceList.Last(); - } - /// /// Returns the directories that potentially contain any configuration files. /// diff --git a/src/EventStore.Core.Tests/Helpers/MiniClusterNode.cs b/src/EventStore.Core.Tests/Helpers/MiniClusterNode.cs index ca26f9a6d..33fd7ba80 100644 --- a/src/EventStore.Core.Tests/Helpers/MiniClusterNode.cs +++ b/src/EventStore.Core.Tests/Helpers/MiniClusterNode.cs @@ -141,9 +141,9 @@ public MiniClusterNode(string pathname, int debugIndex, IPEndPoint internalTcp, ChunksCacheSize = MiniNode.CachedChunkSize, StreamExistenceFilterSize = 10_000 }, - Projection = new() { + /*Projection = new() { RunProjections = ProjectionType.None - }, + },*/ PlugableComponents = subsystems }; diff --git a/src/EventStore.Core.XUnit.Tests/Configuration/ClusterNodeOptionsTests/when_building/with_default_settings.cs b/src/EventStore.Core.XUnit.Tests/Configuration/ClusterNodeOptionsTests/when_building/with_default_settings.cs index f9010979f..d561954a4 100644 --- a/src/EventStore.Core.XUnit.Tests/Configuration/ClusterNodeOptionsTests/when_building/with_default_settings.cs +++ b/src/EventStore.Core.XUnit.Tests/Configuration/ClusterNodeOptionsTests/when_building/with_default_settings.cs @@ -56,8 +56,8 @@ public void should_set_command_line_args_to_default_values() { Assert.AreEqual(false, _options.Interface.DisableStatsOnHttp, "StatsOnPublic"); Assert.AreEqual(false, _options.Interface.DisableGossipOnHttp, "GossipOnPublic"); Assert.AreEqual(1_000_000, _options.Database.MaxMemTableSize, "MaxMemtableEntryCount"); - Assert.AreEqual(false, _options.Projection.RunProjections > ProjectionType.System, - "StartStandardProjections"); + /*Assert.AreEqual(false, _options.Projection.RunProjections > ProjectionType.System, + "StartStandardProjections");*/ Assert.AreEqual(false, _options.Database.UnsafeIgnoreHardDelete, "UnsafeIgnoreHardDeletes"); Assert.That(string.IsNullOrEmpty(_options.Database.Index), "IndexPath"); diff --git a/src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsPrinterTests.cs b/src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsPrinterTests.cs index f0c1daa3f..c365be70a 100644 --- a/src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsPrinterTests.cs +++ b/src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsPrinterTests.cs @@ -11,7 +11,7 @@ namespace EventStore.Core.XUnit.Tests.Configuration { public class ClusterVNodeOptionsPrinterTests { - [Fact] + /*[Fact] public void prints_options() { var config = new ConfigurationBuilder() .AddEventStoreDefaultValues(new Dictionary { @@ -60,7 +60,7 @@ public void prints_options() { CHUNK SIZE: 10000 () CHUNKS CACHE SIZE: 20000 () "); - } + }*/ [Fact] public void loaded_options_do_not_contain_sensitive_values() { diff --git a/src/EventStore.Core/ClusterVNode.cs b/src/EventStore.Core/ClusterVNode.cs index e5c6caa8c..358626be5 100644 --- a/src/EventStore.Core/ClusterVNode.cs +++ b/src/EventStore.Core/ClusterVNode.cs @@ -1011,7 +1011,7 @@ GossipAdvertiseInfo GetGossipAdvertiseInfo() { var infoController = new InfoController( options, new Dictionary { - ["projections"] = options.Projection.RunProjections != ProjectionType.None || options.DevMode.Dev, + // ["projections"] = options.Projection.RunProjections != ProjectionType.None || options.DevMode.Dev, ["userManagement"] = options.Auth.AuthenticationType == Opts.AuthenticationTypeDefault && !options.Application.Insecure, ["atomPub"] = options.Interface.EnableAtomPubOverHttp || options.DevMode.Dev }, @@ -1529,8 +1529,17 @@ GossipAdvertiseInfo GetGossipAdvertiseInfo() { // subsystems _subsystems = options.Subsystems; - var standardComponents = new StandardComponents(Db.Config, _mainQueue, _mainBus, _timerService, _timeProvider, - httpSendService, new IHttpService[] { _httpService }, _workersHandler, _queueStatsManager, trackers.QueueTrackers, metricsConfiguration.ProjectionStats); + var standardComponents = new StandardComponents(Db.Config, + _mainQueue, + _mainBus, + _timerService, + _timeProvider, + httpSendService, + new IHttpService[] { _httpService }, + _workersHandler, + _queueStatsManager, + trackers.QueueTrackers, + metricsConfiguration.ProjectionStats); IServiceCollection ConfigureNodeServices(IServiceCollection services) { services diff --git a/src/EventStore.Core/Configuration/ClusterVNodeOptions.cs b/src/EventStore.Core/Configuration/ClusterVNodeOptions.cs index 9de7e49f9..c8a2aafbd 100644 --- a/src/EventStore.Core/Configuration/ClusterVNodeOptions.cs +++ b/src/EventStore.Core/Configuration/ClusterVNodeOptions.cs @@ -42,7 +42,8 @@ public partial record ClusterVNodeOptions { [OptionGroup] public DatabaseOptions Database { get; init; } = new(); [OptionGroup] public GrpcOptions Grpc { get; init; } = new(); [OptionGroup] public InterfaceOptions Interface { get; init; } = new(); - [OptionGroup] public ProjectionOptions Projection { get; init; } = new(); + /*[Obsolete("TrogonEventstore won't do projections")] + [OptionGroup] public ProjectionOptions Projection { get; init; } = new();*/ public UnknownOptions Unknown { get; init; } = new([]); public byte IndexBitnessVersion { get; init; } = Index.PTableVersions.IndexV4; @@ -79,7 +80,8 @@ public static ClusterVNodeOptions FromConfiguration(IConfigurationRoot configura Database = configuration.BindOptions(), Grpc = configuration.BindOptions(), Interface = configuration.BindOptions(), - Projection = configuration.BindOptions(), + +// Projection = configuration.BindOptions(), Unknown = UnknownOptions.FromConfiguration(configuration), ConfigurationRoot = configurationRoot, @@ -718,6 +720,7 @@ public int ReplicationHeartbeatInterval { #pragma warning restore 0618 } + [Obsolete("TrogonEventstore won't do projections")] [Description("Projection Options")] public record ProjectionOptions { public const int DefaultProjectionExecutionTimeout = 250; diff --git a/src/EventStore.Core/Telemetry/TelemetryService.cs b/src/EventStore.Core/Telemetry/TelemetryService.cs index b0c2e52b4..55baa691b 100644 --- a/src/EventStore.Core/Telemetry/TelemetryService.cs +++ b/src/EventStore.Core/Telemetry/TelemetryService.cs @@ -174,7 +174,7 @@ private void Handle(TelemetryMessage.Request message) { ["clusterSize"] = _nodeOptions.Cluster.ClusterSize, ["enableAtomPubOverHttp"] = _nodeOptions.Interface.EnableAtomPubOverHttp, ["insecure"] = _nodeOptions.Application.Insecure, - ["runProjections"] = _nodeOptions.Projection.RunProjections.ToString(), + // ["runProjections"] = _nodeOptions.Projection.RunProjections.ToString(), ["authorizationType"] = _nodeOptions.Auth.AuthorizationType, ["authenticationType"] = _nodeOptions.Auth.AuthenticationType })); diff --git a/src/EventStore.MicroBenchmarks/EventStore.MicroBenchmarks.csproj b/src/EventStore.MicroBenchmarks/EventStore.MicroBenchmarks.csproj deleted file mode 100644 index f1dac6dff..000000000 --- a/src/EventStore.MicroBenchmarks/EventStore.MicroBenchmarks.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - Exe - - - - - - - - - diff --git a/src/EventStore.MicroBenchmarks/Program.cs b/src/EventStore.MicroBenchmarks/Program.cs deleted file mode 100644 index 7a37bfce5..000000000 --- a/src/EventStore.MicroBenchmarks/Program.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Configs; -using BenchmarkDotNet.Running; -using EventStore.Projections.Core.Services.Interpreted; -using EventStore.Projections.Core.Tests.Services.Jint.Serialization; -using Jint; -using Jint.Native; -using Jint.Native.Json; - -namespace EventStore.MicroBenchmarks { - internal class Program { - static void Main(string[] args) { - var config = System.Diagnostics.Debugger.IsAttached ? new DebugBuildConfig(){ } : DefaultConfig.Instance; - BenchmarkRunner.Run(config, args); - } - } - - [MemoryDiagnoser] - public class ProjectionSerializationBenchmarks { - private JsonSerializer _builtIn; - private JintProjectionStateHandler _handler; - private JsValue _stateInstance; - - public ProjectionSerializationBenchmarks() { - var json = when_serializing_state.ReadJsonFromFile("big_state.json"); - - var engine = new Engine(); - var parser = new JsonParser(engine); - _builtIn = new JsonSerializer(engine); - _handler = new JintProjectionStateHandler("", false, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(500)); - - _stateInstance = parser.Parse(json); - - } - - [Benchmark(Baseline = true)] - public void JintSerializer() { - var s = _builtIn.Serialize(_stateInstance, JsValue.Undefined, JsValue.Undefined).AsString(); - if (string.IsNullOrEmpty(s)) - throw new Exception("something went wrong"); - } - - [Benchmark] - public void CustomSerializer() { - var s = _handler.Serialize(_stateInstance); - if (string.IsNullOrEmpty(s)) - throw new Exception("something went wrong"); - } - - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Bus/SynchronousScheduler.cs b/src/EventStore.Projections.Core.Javascript.Tests/Bus/SynchronousScheduler.cs deleted file mode 100644 index 483ecc527..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Bus/SynchronousScheduler.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Messaging; - -namespace EventStore.Core.Bus; - -public sealed class SynchronousScheduler(string name = "Test", bool watchSlowMsg = true) : InMemoryBus(name, watchSlowMsg), IPublisher { - public void Publish(Message msg) { - ArgumentNullException.ThrowIfNull(msg); - - var task = DispatchAsync(msg, CancellationToken.None); - if (task.IsCompleted) { - task.GetAwaiter().GetResult(); - } else { - var wrapperTask = task.AsTask(); - - try { - wrapperTask.Wait(); - } catch (AggregateException e) when (e.InnerExceptions is [var innerEx]) { - throw innerEx; - } finally { - wrapperTask.Dispose(); - } - } - } - - ValueTask IAsyncHandle.HandleAsync(Message msg, CancellationToken token) - => DispatchAsync(msg, token); -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/EventStore.Projections.Core.Javascript.Tests.csproj b/src/EventStore.Projections.Core.Javascript.Tests/EventStore.Projections.Core.Javascript.Tests.csproj deleted file mode 100644 index ceee8acfc..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/EventStore.Projections.Core.Javascript.Tests.csproj +++ /dev/null @@ -1,39 +0,0 @@ - - - false - enable - - - - - - - - - - - - - - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Integration/MetadataSerializationTests.cs b/src/EventStore.Projections.Core.Javascript.Tests/Integration/MetadataSerializationTests.cs deleted file mode 100644 index 3f613a45d..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Integration/MetadataSerializationTests.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Text.Json; -using System.Threading.Tasks; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using Xunit; -using Xunit.Abstractions; - -namespace EventStore.Projections.Core.Javascript.Tests.Integration { - public class MetadataSerializationTests : ProjectionRuntimeScenario { - [Fact] - public async Task CanHandleNulls() { - var notification = Notify("emitted-stream"); - - - await WriteEvents("source-stream", ExpectedVersion.NoStream, - new Event(Guid.NewGuid(), "foo", true, - JsonSerializer.SerializeToUtf8Bytes(new object()), Array.Empty())); - - var js = @" -fromStream('source-stream'). - when({ - $any: function (s, e) { - emit('emitted-stream', - 'event-type', - e, - {test:null}); - } - }); -"; - await SendProjectionMessage(envelope => - new ProjectionManagementMessage.Command.Post(envelope, ProjectionMode.Continuous, - "can-handle-null-metadata", ProjectionManagementMessage.RunAs.System, "js", js, - true, true, true, - false, - true)); - - await notification.WaitAsync(TestTimeout); - var events = await ReadStream("emitted-stream", 0); - var e = Assert.Single(events); - JsonDocument doc = JsonDocument.Parse(e.Event.Metadata); - Assert.True(doc.RootElement.TryGetProperty("test", out var prop)); - Assert.Equal(JsonValueKind.Null, prop.ValueKind); - } - - [Fact] - public async Task CanHandleEscapedMetadata() { - var notification = Notify("emitted-stream"); - - await WriteEvents("source-stream", ExpectedVersion.NoStream, - new Event(Guid.NewGuid(), "foo", true, - JsonSerializer.SerializeToUtf8Bytes(new object()), Array.Empty())); - - var js = @" -fromStream('source-stream'). - when({ - $any: function (s, e) { - emit('emitted-stream', - 'event-type', - e, - {test:""\""some-data\""""}); - } - }); -"; - await SendProjectionMessage(envelope => - new ProjectionManagementMessage.Command.Post(envelope, ProjectionMode.Continuous, - "can-handle-null-metadata", ProjectionManagementMessage.RunAs.System, "js", js, - true, true, true, - false, - true)); - - - await notification.WaitAsync(TestTimeout); - var events = await ReadStream("emitted-stream", 0); - var e = Assert.Single(events); - JsonDocument doc = JsonDocument.Parse(e.Event.Metadata); - Assert.True(doc.RootElement.TryGetProperty("test", out var prop)); - Assert.Equal(JsonValueKind.String, prop.ValueKind); - Assert.Equal("\"some-data\"", prop.GetString()); - } - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Integration/ProjectionRuntimeScenario.cs b/src/EventStore.Projections.Core.Javascript.Tests/Integration/ProjectionRuntimeScenario.cs deleted file mode 100644 index 42fc9233f..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Integration/ProjectionRuntimeScenario.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Threading; -using EventStore.Common.Options; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.Transport.Http; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Core.TransactionLog.Chunks; -using EventStore.Core.TransactionLog.FileNamingStrategy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Xunit.Abstractions; - -namespace EventStore.Projections.Core.Javascript.Tests.Integration -{ - public abstract class ProjectionRuntimeScenario: SubsystemScenario { - static readonly IConfiguration EmptyConfiguration = new ConfigurationBuilder().AddInMemoryCollection().Build(); - - protected ProjectionRuntimeScenario() : base(CreateRuntime, "$et", new CancellationTokenSource(System.Diagnostics.Debugger.IsAttached?5*60*1000: 5*1000).Token){ - - } - - static (Action, IPublisher) CreateRuntime(SynchronousScheduler mainBus, IQueuedHandler mainQueue, ICheckpoint writerCheckpoint) { - var options = new ProjectionSubsystemOptions(3, ProjectionType.All, true, TimeSpan.FromMinutes(5), false, 500, 500); - var config = new TFChunkDbConfig("mem", new VersionedPatternFileNamingStrategy("mem", "chunk-"), 10000, 0, writerCheckpoint, new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), new InMemoryCheckpoint(-1), true); - var db = new TFChunkDb(config); - var qs = new QueueStatsManager(); - var timeProvider = new RealTimeProvider(); - var ts = new TimerService(new TimerBasedScheduler(new RealTimer(), timeProvider)); - var sc = new StandardComponents(db.Config, mainQueue, mainBus, ts, timeProvider, null, new IHttpService[] { }, mainBus, qs, new(), true); - - var subsystem = new ProjectionsSubsystem(options); - - var builder = WebApplication.CreateBuilder(); - builder.Services.AddGrpc(); - builder.Services.AddSingleton(sc); - subsystem.ConfigureServices(builder.Services, new ConfigurationBuilder().Build()); - - subsystem.ConfigureApplication(builder.Build().UseRouting(), EmptyConfiguration); - subsystem.Start(); - - return (() => { - subsystem.Stop(); - db.Dispose(); - }, subsystem.LeaderInputQueue); - } - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Integration/SubsystemScenario.cs b/src/EventStore.Projections.Core.Javascript.Tests/Integration/SubsystemScenario.cs deleted file mode 100644 index d3cfce9d9..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Integration/SubsystemScenario.cs +++ /dev/null @@ -1,339 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Security.Claims; -using System.Text; -using System.Threading; -using System.Threading.Channels; -using System.Threading.Tasks; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using Xunit; -using Xunit.Abstractions; - -namespace EventStore.Projections.Core.Javascript.Tests.Integration { - public abstract class SubsystemScenario : IHandle, IAsyncLifetime { - private readonly Action _stop; - private readonly SynchronousScheduler _mainBus; - private readonly IQueuedHandler _mainQueue; - - private readonly InMemoryCheckpoint _writerCheckpoint; - private readonly MiniStore _miniStore; - protected CancellationToken TestTimeout { get; } - private readonly Task _complete; - private readonly IPublisher _subsystemCommands; - private readonly Task _ready; - readonly ConcurrentDictionary> _notifications; - - protected SubsystemScenario(Func createSubsystem, string readyStream, CancellationToken testTimeout) { - _mainBus = new SynchronousScheduler("main"); - _mainQueue = new QueuedHandlerThreadPool(_mainBus, "bossQ", new QueueStatsManager(), new()); - _writerCheckpoint = new InMemoryCheckpoint(0); - _miniStore = new MiniStore(_writerCheckpoint, _mainQueue); - TestTimeout = testTimeout; - _complete = _miniStore.NotifyAll(TestTimeout); - _notifications = new ConcurrentDictionary>(); - _ready = Notify(readyStream); - _mainBus.Subscribe(this); - (_stop, _subsystemCommands) = createSubsystem(_mainBus, _mainQueue, _writerCheckpoint); - } - - protected virtual void OnMainBusMessage(Message msg){} - - public async Task InitializeAsync() { - var _ = _mainQueue.Start(); - _mainQueue.Publish(new SystemMessage.SystemCoreReady()); - _mainQueue.Publish(new SystemMessage.BecomeLeader(Guid.NewGuid())); - await _ready.WaitAsync(TestTimeout); - } - - public async Task DisposeAsync() { - _miniStore.Complete(); - await _complete; - _stop(); - _mainQueue.Stop(); - } - - protected async Task<(long commitPosition, long nextRevision)> WriteEvents(string stream, long expectedRevision, params Event[] events) { - var responseEnvelope = new TellMeWhenItsDone(TestTimeout); - _mainQueue.Publish(new ClientMessage.WriteEvents(Guid.NewGuid(), Guid.NewGuid(), - responseEnvelope, false, stream, expectedRevision, - events, null, null)); - var msg = await responseEnvelope.Task.WaitAsync(TestTimeout); - var resp = Assert.IsType(msg); - Assert.Equal(OperationResult.Success, resp.Result); - return (resp.CommitPosition, resp.CurrentVersion); - } - protected async Task> ReadStream(string stream, int from) { - var tmwid = new TellMeWhenItsDone(TestTimeout); - _mainQueue.Publish(new ClientMessage.ReadStreamEventsForward(Guid.NewGuid(), - Guid.NewGuid(), tmwid, stream, from, 100, true, false, null, - ClaimsPrincipal.Current, replyOnExpired: false, null, null)); - var msg = await tmwid.Task.WaitAsync(TestTimeout); - var rr = Assert.IsType(msg); - return rr.Events; - } - - protected async Task SendProjectionMessage(Func requestFactory) - where TResponse : Message { - var tmwid = new TellMeWhenItsDone(TestTimeout); - _subsystemCommands.Publish(requestFactory(tmwid)); - var msg = await tmwid.Task.WaitAsync(TestTimeout); - return Assert.IsType(msg); - } - class TellMeWhenItsDone : IEnvelope { - private readonly TaskCompletionSource _completion; - private readonly CancellationTokenRegistration _registration; - - public TellMeWhenItsDone(CancellationToken token) { - _completion = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - _registration = token.Register(static o => { - if (o is not TellMeWhenItsDone state) return; - state._registration.Dispose(); - state._completion.TrySetCanceled(state._registration.Token); - }, this); - } - - public Task Task => _completion.Task; - - public void ReplyWith(T message) where T : Message { - _completion.TrySetResult(message); - } - } - - protected Task Notify(string streamName) { - return _notifications.GetOrAdd(streamName, new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously)).Task; - } - - public void Handle(Message message) { - switch (message) { - case SystemMessage.SystemCoreReady: - case SystemMessage.BecomeLeader: - case ProjectionCoreServiceMessage.SubComponentStarted: - case AwakeServiceMessage.SubscribeAwake: - case SystemMessage.SubSystemInitialized: - return; - case ClientMessage.ReadStreamEventsForward m : - _miniStore.Handle(m); - return; - case ClientMessage.ReadStreamEventsBackward m : - _miniStore.Handle(m); - return; - case ClientMessage.ReadAllEventsForward m : - _miniStore.Handle(m); - return; - case ClientMessage.WriteEvents m : - _miniStore.Handle(m); - return; - case StorageMessage.EventCommitted e: - CheckNotifications(e); - break; - } - OnMainBusMessage(message); - } - - private void CheckNotifications(StorageMessage.EventCommitted e) { - if (_notifications.TryRemove(e.Event.EventStreamId, out var tcs)) { - tcs.TrySetResult(true); - } - } - - protected ResolvedEvent AtLogPosition(long position) { - return _miniStore.AtPosition(position); - } - - //A super mini in memory event store purely for testing the projection runtime - class MiniStore : - IHandle, - IHandle, - IHandle, - IHandle { - private readonly ICheckpoint _checkpoint; - private readonly IPublisher _bus; - private readonly List _all; - private readonly Dictionary> _streams; - private readonly Channel _notifications; - - public MiniStore(ICheckpoint checkpoint, IPublisher bus) { - _checkpoint = checkpoint; - _bus = bus; - _all = new List(); - _streams = new Dictionary>(); - _notifications = Channel.CreateUnbounded(new UnboundedChannelOptions(){AllowSynchronousContinuations = false, SingleReader = true, SingleWriter = true}); - } - - public async Task NotifyAll(CancellationToken cancellationToken) { - try { - int next = 0; - await foreach (var upTo in - _notifications.Reader.ReadAllAsync(cancellationToken)) { - while (next < upTo) { - var nextEvent = _all[next].OriginalEvent; - _bus.Publish(new StorageMessage.EventCommitted(next,nextEvent, upTo-1==next)); - next++; - } - - if (cancellationToken.IsCancellationRequested) break; - } - }catch(Exception ex) when (ex is TaskCanceledException or OperationCanceledException){} - } - public void Handle(ClientMessage.ReadStreamEventsForward message) { - ClientMessage.ReadStreamEventsForwardCompleted response; - if (_streams.TryGetValue(message.EventStreamId, out var events)) { - var from = (int)message.FromEventNumber; - response = new ClientMessage.ReadStreamEventsForwardCompleted( - message.CorrelationId, message.EventStreamId, message.FromEventNumber, - message.MaxCount, ReadStreamResult.Success, - events.Skip(from).Take(message.MaxCount).ToArray(), StreamMetadata.Empty, - false, null, Math.Min(from + message.MaxCount + 1, events.Count), - events.Count - 1, from + message.MaxCount >= events.Count, - _checkpoint.Read()); - - } else { - response = new ClientMessage.ReadStreamEventsForwardCompleted( - message.CorrelationId, message.EventStreamId, message.FromEventNumber, - message.MaxCount, ReadStreamResult.NoStream, Array.Empty(), - StreamMetadata.Empty, false, null, -1, -1, true, _checkpoint.Read()); - } - message.Envelope.ReplyWith(response); - } - - public void Handle(ClientMessage.ReadAllEventsForward message) { - ClientMessage.ReadAllEventsForwardCompleted response; - if (message.CommitPosition < _all.Count) { - var resolvedEvents = _all.Skip((int)message.CommitPosition).Take(message.MaxCount).ToArray(); - var next = (int)Math.Min(_all.Count, message.CommitPosition + message.MaxCount); - var prev = Math.Max(0, message.CommitPosition - 1); - response = new ClientMessage.ReadAllEventsForwardCompleted( - message.CorrelationId, ReadAllResult.Success, null, - resolvedEvents, StreamMetadata.Empty, false, message.MaxCount, - new TFPos(message.CommitPosition, message.PreparePosition), new TFPos(next, next), new TFPos(prev, prev > 0 ? prev : long.MaxValue), _checkpoint.Read()); - } else { - response = new ClientMessage.ReadAllEventsForwardCompleted( - message.CorrelationId, ReadAllResult.Success, null, - Array.Empty(), StreamMetadata.Empty, false, message.MaxCount, - new TFPos(message.CommitPosition, message.PreparePosition), new TFPos(message.CommitPosition, message.PreparePosition), new TFPos(0, long.MaxValue), _checkpoint.Read()); - } - message.Envelope.ReplyWith(response); - - } - - public void Handle(ClientMessage.ReadStreamEventsBackward message) { - ClientMessage.ReadStreamEventsBackwardCompleted response; - if (_streams.TryGetValue(message.EventStreamId, out var events)) { - var from = (int)message.FromEventNumber; - response = new ClientMessage.ReadStreamEventsBackwardCompleted( - message.CorrelationId, message.EventStreamId, message.FromEventNumber, - message.MaxCount, ReadStreamResult.Success, - events.AsEnumerable().Reverse().Skip(from).Take(message.MaxCount).ToArray(), StreamMetadata.Empty, - false, null, Math.Max(from - message.MaxCount, 0), - events.Count - 1, from + message.MaxCount >= events.Count, - _checkpoint.Read()); - - } else { - response = new ClientMessage.ReadStreamEventsBackwardCompleted( - message.CorrelationId, message.EventStreamId, message.FromEventNumber, - message.MaxCount, ReadStreamResult.NoStream, Array.Empty(), - StreamMetadata.Empty, false, null, -1, -1, true, _checkpoint.Read()); - } - message.Envelope.ReplyWith(response); - } - - public void Handle(ClientMessage.WriteEvents message) { - ClientMessage.WriteEventsCompleted response; - if (_streams.TryGetValue(message.EventStreamId, out var events)) { - if (message.ExpectedVersion == ExpectedVersion.Any || - message.ExpectedVersion == events.Count - 1) { - response = WriteEvents(message, events); - } else { - response = new ClientMessage.WriteEventsCompleted(message.CorrelationId, - OperationResult.WrongExpectedVersion, "Wrong expected version", - _streams.Count - 1); - } - } else { - if (message.ExpectedVersion is ExpectedVersion.Any or ExpectedVersion.NoStream) { - events = new List(); - _streams.Add(message.EventStreamId, events); - response = WriteEvents(message, events); - } else { - response = new ClientMessage.WriteEventsCompleted(message.CorrelationId, - OperationResult.WrongExpectedVersion, "Wrong expected version", - ExpectedVersion.NoStream); - } - } - - message.Envelope.ReplyWith(response); - - _notifications.Writer.TryWrite((int)_checkpoint.Read()); - } - ClientMessage.WriteEventsCompleted WriteEvents(ClientMessage.WriteEvents message, List events) { - var stored = new List(); - for (int i = 0; i < message.Events.Length; i++) { - var position = _all.Count + i; - var revision = events.Count + i; - var current = message.Events[i]; - - var flags = PrepareFlags.IsCommitted | PrepareFlags.Data; - if (current.IsJson) flags |= PrepareFlags.IsJson; - if (i == 0) flags |= PrepareFlags.TransactionBegin; - if(i==message.Events.Length-1) flags |= PrepareFlags.TransactionEnd; - - var record = new EventRecord(revision, position, message.CorrelationId, - current.EventId, _all.Count, i, message.EventStreamId, -1, DateTime.Now, - flags, current.EventType, current.Data, current.Metadata); - if (current.EventType == SystemEventTypes.LinkTo) { - var data = Encoding.UTF8.GetString(current.Data); - var parts = data.Split('@', 2); - var number = int.Parse(parts[0]); - var stream = parts[1]; - if (_streams.TryGetValue(stream, out var links) && - links.Count > number) { - stored.Add(ResolvedEvent.ForResolvedLink(links[number].OriginalEvent, record, position)); - } else { - stored.Add(ResolvedEvent.ForFailedResolvedLink(record, ReadEventResult.NotFound)); - } - } else { - stored.Add(ResolvedEvent.ForUnresolvedEvent(record, position)); - } - - if (stored.Count > 1) { - if (stored[i].OriginalPosition < stored[i - 1].OriginalPosition) { - Debug.WriteLine("500"); - } - } - } - - var response = new ClientMessage.WriteEventsCompleted(message.CorrelationId, - events.Count, Math.Max(0, events.Count + stored.Count - 1), - _all.Count + stored.Count, _all.Count + stored.Count); - events.AddRange(stored); - _all.AddRange(stored); - _checkpoint.Write(_all.Count); - _checkpoint.Flush(); - return response; - - } - - public void Complete() { - _notifications.Writer.TryComplete(); - } - - public ResolvedEvent AtPosition(long position) { - var local = (int)position; - if (local < 0 || local >= _all.Count) return default; - return _all[local]; - } - } - } -} - diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Integration/TestPollyFills.cs b/src/EventStore.Projections.Core.Javascript.Tests/Integration/TestPollyFills.cs deleted file mode 100644 index b253007e1..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Integration/TestPollyFills.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Data; - -namespace EventStore.Projections.Core.Javascript.Tests.Integration -{ - public static class TestPollyFills { - public static async Task WaitAsync(this Task toWaitFor, CancellationToken cancellationToken) { - var tcs = new TaskCompletionSource(); - await using var reg = cancellationToken.Register(() => { tcs.TrySetCanceled();}); - var result = await Task.WhenAny(tcs.Task, toWaitFor); - await result; - } - public static async Task WaitAsync(this Task toWaitFor, CancellationToken cancellationToken) { - var tcs = new TaskCompletionSource(); - await using var reg = cancellationToken.Register(() => { tcs.TrySetCanceled();}); - var result = await Task.WhenAny(tcs.Task, toWaitFor); - return await result; - } - - public static Event[] LikeBeforeTheyWereSaved(this IReadOnlyList events) { - return events.Select(x => new Event(x.Event.EventId, x.Event.EventType, x.Event.IsJson, - x.Event.Data.ToArray(), x.Event.Metadata.ToArray())).ToArray(); - } - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/SpecRunner.cs b/src/EventStore.Projections.Core.Javascript.Tests/SpecRunner.cs deleted file mode 100644 index 525ebfa50..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/SpecRunner.cs +++ /dev/null @@ -1,472 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; -using EventStore.Core.Data; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Interpreted; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Xunit; -using Xunit.Abstractions; -using JsonSerializer = System.Text.Json.JsonSerializer; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Javascript.Tests { - public class SpecRunner { - private readonly ITestOutputHelper _output; - - public SpecRunner(ITestOutputHelper output) { - _output = output; - } - - private static readonly Encoding Utf8NoBom = new UTF8Encoding(false, true); - - public static IEnumerable GetTestCases() { - var assembly = typeof(SpecRunner).Assembly; - var specs = assembly.GetManifestResourceNames().Where(x => x.EndsWith("-spec.json")); - foreach (var spec in specs) { - JsonDocument doc; - using (var stream = assembly.GetManifestResourceStream(spec)) { - doc = JsonDocument.Parse(stream!); - } - - var projection = doc.RootElement.GetProperty("projection").GetString(); - Assert.False(string.IsNullOrWhiteSpace(projection)); - var projectionSourceName = assembly.GetManifestResourceNames() - .SingleOrDefault(x => x.EndsWith($"{projection}.js")); - Assert.NotNull(projectionSourceName); - string source; - using (var stream = assembly.GetManifestResourceStream(projectionSourceName!)) { - Assert.NotNull(stream); - using (var sr = new StreamReader(stream!)) { - source = sr.ReadToEnd(); - } - } - - List sequences = new(); - foreach (var inputEvent in doc.RootElement.GetProperty("input").EnumerateArray()) { - var stream = inputEvent.GetProperty("streamId").GetString(); - Assert.NotNull(stream); - var sequence = new InputEventSequence(stream!); - sequences.Add(sequence); - foreach (var e in inputEvent.GetProperty("events").EnumerateArray()) { - var et = e.GetProperty("eventType").GetString(); - Assert.NotNull(et); - bool skip = false; - if (e.TryGetProperty("skip", out var skipElement)) { - skip = skipElement.GetBoolean(); - } - - var initializedPartitions = new List(); - if (e.TryGetProperty("initializedPartitions", out var partitions)) { - foreach (var element in partitions.EnumerateArray()) { - initializedPartitions.Add(element.GetString()!); - } - } - var expectedStates = new Dictionary(); - int stateCount = 0; - if (e.TryGetProperty("states", out var states)) { - foreach (var state in states.EnumerateArray()) { - stateCount++; - var expectedStateNode = state.GetProperty("state"); - var expectedState = expectedStateNode.ValueKind == JsonValueKind.Null ? null : expectedStateNode.GetRawText(); - if (!expectedStates.TryAdd(state.GetProperty("partition").GetString()!, - expectedState)) { - throw new InvalidOperationException("Duplicate state"); - } - } - } - if (stateCount > 2) - throw new InvalidOperationException("Cannot specify more than 2 states"); - - sequence.Events.Add(new InputEvent(et!, e.GetProperty("data").GetRawText(), e.TryGetProperty("metadata", out var metadata) ? metadata.GetRawText() : null, initializedPartitions, expectedStates, skip, e.TryGetProperty("eventId", out var idElement) && idElement.TryGetGuid(out var id) ? id: Guid.NewGuid())); - } - } - - var output = doc.RootElement.GetProperty("output"); - var sdb = new SourceDefinitionBuilder(); - var config = output.GetProperty("config"); - foreach (var item in config.EnumerateObject()) { - switch (item.Name) { - case "definesStateTransform": - if (item.Value.GetBoolean()) - sdb.SetDefinesStateTransform(); - break; - case "handlesDeletedNotifications": - sdb.SetHandlesStreamDeletedNotifications(item.Value.GetBoolean()); - break; - case "producesResults": - if (item.Value.GetBoolean()) - sdb.SetOutputState(); - break; - case "definesFold": - if (item.Value.GetBoolean()) - sdb.SetDefinesFold(); - break; - case "resultStreamName": - sdb.SetResultStreamNameOption(item.Value.GetString()); - break; - case "partitionResultStreamNamePattern": - sdb.SetPartitionResultStreamNamePatternOption(item.Value.GetString()); - break; - case "$includeLinks": - sdb.SetIncludeLinks(item.Value.GetBoolean()); - break; - case "reorderEvents": - sdb.SetReorderEvents(item.Value.GetBoolean()); - break; - case "processingLag": - sdb.SetProcessingLag(item.Value.GetInt32()); - break; - case "biState": - sdb.SetIsBiState(item.Value.GetBoolean()); - break; - case "categories": - foreach (var c in item.Value.EnumerateArray()) { - sdb.FromCategory(c.GetString()); - } - break; - case "partitioned": - if (item.Value.GetBoolean()) - sdb.SetByCustomPartitions(); - break; - case "events": - foreach (var e in item.Value.EnumerateArray()) { - sdb.IncludeEvent(e.GetString()); - } - break; - case "allEvents": - if (item.Value.GetBoolean()) { - sdb.AllEvents(); - } else { - sdb.NotAllEvents(); - } - break; - case "allStreams": - if (item.Value.GetBoolean()) { - sdb.FromAll(); - } - break; - default: - throw new Exception($"unexpected property in expected config {item.Name}"); - } - } -#nullable disable - - List expectedEmittedEvents = new(); - if (output.TryGetProperty("emitted", out var expectedEmittedElement)) { - foreach (var element in expectedEmittedElement.EnumerateObject()) { - var stream = element.Name; - foreach (var eventElement in element.Value.EnumerateArray()) { - if (eventElement.ValueKind == JsonValueKind.String) { - expectedEmittedEvents.Add( - new OutputEvent(stream, "$>", eventElement.GetString(), null)); - } - } - } - } - JintProjectionStateHandler runner = null; - IQuerySources definition = null; - - IQuerySources expectedDefinition = sdb.Build(); - yield return WithOutput($"{projection} compiles", o => { - runner = new JintProjectionStateHandler(source, true, - compilationTimeout: TimeSpan.FromMilliseconds(200), - executionTimeout: TimeSpan.FromMilliseconds(200)); - }); - - yield return For($"{projection} getDefinition", () => { - definition = runner.GetSourceDefinition(); - }); - - yield return For($"{projection} qs.AllStreams", () => Assert.Equal(expectedDefinition.AllStreams, definition.AllStreams)); - yield return For($"{projection} qs.Categories", () => Assert.Equal(expectedDefinition.Categories, definition.Categories)); - yield return For($"{projection} qs.Streams", () => Assert.Equal(expectedDefinition.Streams, definition.Streams)); - yield return For($"{projection} qs.AllEvents", () => Assert.Equal(expectedDefinition.AllEvents, definition.AllEvents)); - yield return For($"{projection} qs.Events", () => Assert.Equal(expectedDefinition.Events, definition.Events)); - yield return For($"{projection} qs.ByStreams", () => Assert.Equal(expectedDefinition.ByStreams, definition.ByStreams)); - yield return For($"{projection} qs.ByCustomPartitions", () => Assert.Equal(expectedDefinition.ByCustomPartitions, definition.ByCustomPartitions)); - yield return For($"{projection} qs.DefinesStateTransform", () => Assert.Equal(expectedDefinition.DefinesStateTransform, definition.DefinesStateTransform)); - yield return For($"{projection} qs.DefinesFold", () => Assert.Equal(expectedDefinition.DefinesFold, definition.DefinesFold)); - yield return For($"{projection} qs.HandlesDeletedNotifications", () => Assert.Equal(expectedDefinition.HandlesDeletedNotifications, definition.HandlesDeletedNotifications)); - yield return For($"{projection} qs.ProducesResults", () => Assert.Equal(expectedDefinition.ProducesResults, definition.ProducesResults)); - yield return For($"{projection} qs.IsBiState", () => Assert.Equal(expectedDefinition.IsBiState, definition.IsBiState)); - yield return For($"{projection} qs.IncludeLinksOption", () => Assert.Equal(expectedDefinition.IncludeLinksOption, definition.IncludeLinksOption)); - yield return For($"{projection} qs.ResultStreamNameOption", () => Assert.Equal(expectedDefinition.ResultStreamNameOption, definition.ResultStreamNameOption)); - yield return For($"{projection} qs.PartitionResultStreamNamePatternOption", () => Assert.Equal(expectedDefinition.PartitionResultStreamNamePatternOption, - definition.PartitionResultStreamNamePatternOption)); - yield return For($"{projection} qs.ReorderEventsOption", () => Assert.Equal(expectedDefinition.ReorderEventsOption, definition.ReorderEventsOption)); - yield return For($"{projection} qs.ProcessingLagOption", () => Assert.Equal(expectedDefinition.ProcessingLagOption, definition.ProcessingLagOption)); - yield return For($"{projection} qs.LimitingCommitPosition", () => Assert.Equal(expectedDefinition.LimitingCommitPosition, definition.LimitingCommitPosition)); - var partitionedState = new Dictionary(); - var sharedStateInitialized = false; - var revision = new Dictionary(); - List actualEmittedEvents = new(); - - for (int i = 0; i < sequences.Count; i++) { - var sequence = sequences[i]; - if (!revision.TryGetValue(sequence.Stream, out _)) { - revision[sequence.Stream] = 0; - } - for (int j = 0; j < sequences[i].Events.Count; j++) { - var logPosition = i * 100 + j; - var flags = PrepareFlags.IsJson | PrepareFlags.Data; - if (j == 0) - flags |= PrepareFlags.TransactionBegin; - if (j == sequence.Events.Count - 1) - flags |= PrepareFlags.TransactionEnd; - - /*Sequence: - Get partition if bycustom partition or by stream - if the partition is null or an empty string skip this event (NB: need to indicate that an event should be skipped) - load the state if it doesn't exist or tell the projection to init state - init shared if it doesn't exist - if init was state was called, call created - if processing a delete, call partition deleted (NB: bistate partitions do not support deletes) - process the event - save any shared state if it isn't null - save any state - save emitted events to verify later - */ - var @event = sequence.Events[j]; - var body = JObject.Parse(@event.Body).ToString(Formatting.Indented); - var metadata = Array.Empty(); - if (@event.Metadata != null) { - metadata = Utf8NoBom.GetBytes(JObject.Parse(@event.Metadata).ToString(Formatting.Indented)); - } - var er = new EventRecord( - revision[sequence.Stream], logPosition, Guid.NewGuid(), @event.EventId, i, j, - sequence.Stream, i, DateTime.Now, flags, @event.EventType, - Utf8NoBom.GetBytes(body), metadata); - var e = new ResolvedEvent(EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent(er, logPosition), Array.Empty()); - if (@event.Skip) { - yield return For($"{projection} skips {er.EventNumber}@{sequence.Stream}", - () => Assert.Null(runner.GetStatePartition(CheckpointTag.Empty, "", e))); - } else { - var expectedPartition = ""; - if (expectedDefinition.DefinesFold) { - if (@event.ExpectedStates.Any()) { - expectedPartition = @event.ExpectedStates - .SingleOrDefault(x => string.Empty != x.Key).Key ?? string.Empty; - if (expectedPartition != string.Empty) { - yield return For( - $"{projection} {er.EventNumber}@{sequence.Stream} returns expected partition", - () => Assert.Equal(expectedPartition, - runner.GetStatePartition(CheckpointTag.Empty, "", e))); - foreach (var initializedState in @event.InitializedPartitions) { - yield return For( - $"should not have already initialized \"{initializedState}\" at {er.EventNumber}@{sequence.Stream}", - () => Assert.DoesNotContain(initializedState, - (IReadOnlyDictionary)partitionedState)); - } - } - - if (expectedDefinition.IsBiState && !sharedStateInitialized) { - sharedStateInitialized = true; - yield return For("initializes shared state without error", () => { - runner.InitializeShared(); - }); - } - - if (!@event.InitializedPartitions.Contains(expectedPartition)) { - yield return For( - $"can load current state at {er.EventNumber}@{sequence.Stream}", - () => { - Assert.True( - partitionedState.TryGetValue(expectedPartition, out var value), - $"did not find expected state for partition{expectedPartition}"); - runner.Load(value); - }); - } else { - yield return For( - $"initializes new state at {er.EventNumber}@{sequence.Stream}", - () => { - var ex = Record.Exception(() => runner.Initialize()); - Assert.Null(ex); - }); - - yield return For( - $"handles created partition \"{expectedPartition}\" at {er.EventNumber}@{sequence.Stream}", - () => { - var result = runner.ProcessPartitionCreated(expectedPartition, - CheckpointTag.Empty, e, out var emittedEvents); - if (emittedEvents != null && emittedEvents.Length > 0) { - actualEmittedEvents.AddRange(emittedEvents); - } - - Assert.True(result); - }); - } - } - - yield return For( - $"process event {@event.EventType} at {er.EventNumber}@{sequence.Stream}", - () => { - Assert.True(runner.ProcessEvent(expectedPartition, CheckpointTag.Empty, "", e, - out var newState, out var newSharedState, out var emittedEvents), "Process event should always return true"); - if (newSharedState != null) - partitionedState[""] = newSharedState; - partitionedState[expectedPartition] = newState; - if (emittedEvents != null && emittedEvents.Length > 0) { - actualEmittedEvents.AddRange(emittedEvents); - } - }); - if (@event.ExpectedStates.Any()) { - foreach (var expectedState in @event.ExpectedStates) { - yield return For( - $"state \"{expectedState.Key}\" exists at {er.EventNumber}@{sequence.Stream}", - () => Assert.Contains(expectedState.Key, - (IReadOnlyDictionary)partitionedState)); - yield return For( - $"state \"{expectedState.Key}\" is correct at {er.EventNumber}@{sequence.Stream}", - () => { - if (string.IsNullOrEmpty(expectedState.Value)) { - Assert.Null(partitionedState[expectedState.Key]); - } else { - Assert.True(partitionedState.ContainsKey(expectedState.Key), $"partition does not contain key {expectedState.Key}"); - Assert.NotNull(partitionedState[expectedState.Key]); - Assert.NotEmpty(partitionedState[expectedState.Key]); - var expected = Sort(expectedState.Value, "expected"); - var actual = Sort(partitionedState[expectedState.Key], "actual"); - Assert.Equal(expected.ToString(Formatting.Indented), - actual.ToString(Formatting.Indented)); - } - }); - } - } - } - } - - revision[sequence.Stream] = revision[sequence.Stream] + 1; - } - - - } - - if (expectedEmittedEvents.Count == 0) { - yield return For("Should have no emitted events", () => { - Assert.Empty(actualEmittedEvents); - }); - } else { - foreach (var emitted in expectedEmittedEvents) { - yield return For( - $"Expected event {emitted.StreamId} {emitted.Type} {(emitted.Type == "$>" ? emitted.Data : "")} was emitted", - () => { - Assert.Contains(actualEmittedEvents, eee => eee.Event.Data == emitted.Data); - }); - } - } - - object[] For(string name, Action a) { - return new object[]{ new TestDefinition(Name(name),_ => { - a(); - return default; - })}; - } - - object[] WithOutput(string name, Action a) { - return new object[]{ new TestDefinition(Name(name),o => { - a(o); - return default; - })}; - } - - string Name(string name) { - if (name.StartsWith(projection!)) - return name; - return $"{projection} {name}"; - } - } - - static JObject Sort(string json, string name) { - JObject root; - try { - root = JObject.Parse(json); - } catch { - throw; - } - return new(root.Properties().OrderBy(x => x.Name)); - } - } - - [Theory] - [MemberData(nameof(GetTestCases))] - public Task Test(TestDefinition def) { - return def.Execute(_output).AsTask(); - } - - public class TestDefinition { - private readonly string _name; - private readonly Func _step; - - public TestDefinition(string name, Func step) { - _name = name; - _step = step; - } - - public ValueTask Execute(ITestOutputHelper output) { - return _step(output); - } - - public override string ToString() { - return _name; - } - } - - class InputEventSequence { - public string Stream { get; } - private readonly List _events; - public List Events => _events; - - public InputEventSequence(string stream) { - Stream = stream; - _events = new List(); - } - } - - class InputEvent { - public string EventType { get; } - public string Body { get; } - public string Metadata { get; } - public IReadOnlyList InitializedPartitions { get; } - public IReadOnlyDictionary ExpectedStates { get; } - public bool Skip { get; } - public Guid EventId { get; } - - public InputEvent(string eventType, string body, string metadata, IReadOnlyList initializedPartitions, IReadOnlyDictionary expectedStates, bool skip, Guid eventId) { - EventType = eventType; - Body = body; - Metadata = metadata; - InitializedPartitions = initializedPartitions; - ExpectedStates = expectedStates; - Skip = skip; - EventId = eventId; - } - } - - class OutputEvent { - public string StreamId { get; } - public string Type { get; } - public string Data { get; } - public string Metadata { get; } - - public OutputEvent(string streamId, string type, string data, string metadata) { - StreamId = streamId; - Type = type; - Data = data; - Metadata = metadata; - } - } - } - - -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-balancer.js b/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-balancer.js deleted file mode 100644 index f3c7eda8c..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-balancer.js +++ /dev/null @@ -1,56 +0,0 @@ -options({ - biState: true -}); - -fromCategory("transaction") - .partitionBy(function(e) { - if (e.eventType === "header") return "description"; - if (e.body.accountId.startsWith("ESDBB")) - return e.body.accountId; - return undefined; - }) - .when({ - $init: function() { - return { balance: 0 }; - }, - $initShared: function() { - return { - numberOfAccounts: 0, - totalBalance: 0 - }; - }, - $created: function(s, e) { - if (e.partition !== "description") { - s[1].numberOfAccounts++; - } else { - s[0] = null; - } - }, - "header": function(s, e) { - s[1].description = e.body.description; - }, - "credit": function(s, e) { - if (e.partition === "") return {}; - s[0].balance += e.body.amount; - s[0].credit = e.body.amount; - s[0].debit = undefined; - s[0].description = s[1].description; - s[1].totalBalance += e.body.amount; - return s; - }, - "debit": function(s, e) { - if (e.partition === "") return {}; - s[0].balance -= e.body.amount; - s[0].credit = undefined; - s[0].debit = e.body.amount; - s[0].description = s[1].description; - s[1].totalBalance -= e.body.amount; - return s; - } - }) - .filterBy(function(s) { - return s.partition !== "description"; - }).transformBy(function(s) { - s.partition = undefined; - }) - .outputTo("total-balance", "account-balance-{0}"); diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-closer.js b/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-closer.js deleted file mode 100644 index ce664827e..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-closer.js +++ /dev/null @@ -1,7 +0,0 @@ -fromCategory("account").when( - { - "account-deleted": function(_, e) { - emit('$'+`${e.streamId}`, '$metadata', { $tb: 9223372036854775807}); - } - } -) diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-spec.json b/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-spec.json deleted file mode 100644 index 8b966f9da..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/account-spec.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "projection": "account-balancer", - "input": [ - { - "streamId": "transaction-1", - "events": [ - { - "eventType": "header", - "data": { - "description": "transfer from alice" - }, - "initializedPartitions": [ "", "description" ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 0, - "totalBalance": 0, - "description": "transfer from alice" - } - }, - { - "partition": "description", - "state": null - } - ] - }, - { - "eventType": "debit", - "data": { - "accountId": "External-01", - "amount": 1000 - }, - "skip" : true - }, - { - "eventType": "credit", - "data": { - "accountId": "ESDBB-01", - "amount": 1000 - }, - "initializedPartitions": [ "ESDBB-01" ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 1, - "totalBalance": 1000, - "description": "transfer from alice" - } - }, - { - "partition": "ESDBB-01", - "state": { - "description": "transfer from alice", - "balance": 1000, - "credit": 1000 - } - } - ] - } - ] - }, - { - "streamId": "transaction-2", - "events": [ - { - "eventType": "header", - "data": { - "description": "transfer to savings" - }, - "initializedPartitions": [ ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 1, - "totalBalance": 1000, - "description": "transfer to savings" - } - }, - { - "partition": "description", - "state": null - } - ] - }, - { - "eventType": "debit", - "data": { - "accountId": "ESDBB-01", - "amount": 300 - }, - "initializedPartitions": [ ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 1, - "totalBalance": 700, - "description": "transfer to savings" - } - }, - { - "partition": "ESDBB-01", - "state": { - "description": "transfer to savings", - "balance": 700, - "debit": 300 - } - } - ] - }, - { - "eventType": "credit", - "data": { - "accountId": "ESDBB-S01", - "amount": 300 - }, - "initializedPartitions": [ "ESDBB-S01" ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 2, - "totalBalance": 1000, - "description": "transfer to savings" - } - }, - { - "partition": "ESDBB-S01", - "state": { - "description": "transfer to savings", - "balance": 300, - "credit": 300 - } - } - ] - } - ] - }, - { - "streamId": "transaction-3", - "events": [ - { - "eventType": "header", - "data": { - "description": "bill payment" - }, - "initializedPartitions": [ ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 2, - "totalBalance": 1000, - "description": "bill payment" - } - }, - { - "partition": "description", - "state": null - } - ] - }, - { - "eventType": "debit", - "data": { - "accountId": "ESDBB-01", - "amount": 150 - }, - "initializedPartitions": [ ], - "states": [ - { - "partition": "", - "state": { - "numberOfAccounts": 2, - "totalBalance": 850, - "description": "bill payment" - } - }, - { - "partition": "ESDBB-01", - "state": { - "balance": 550, - "debit": 150, - "description": "bill payment" - } - } - ] - }, - { - "eventType": "credit", - "data": { - "accountId": "EXTERNAL-02", - "amount": 150 - }, - "skip": true - } - ] - } - ], - "output": { - "config": { - "categories": [ "transaction" ], - "events": ["header", "credit", "debit"] , - "partitioned": true, - "definesStateTransform": true, - "handlesDeletedNotifications": false, - "producesResults": true, - "definesFold": true, - "resultStreamName": "total-balance", - "partitionResultStreamNamePattern": "account-balance-{0}", - "$includeLinks": false, - "reorderEvents": false, - "processingLag": 0, - "biState": true - } - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category-spec.json b/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category-spec.json deleted file mode 100644 index a037ac7a2..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category-spec.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "projection": "by-category", - "input": [ - { - "streamId": "category1-a", - "events": [ - { - "eventType": "t1", - "data": {}, - "metadata": {} - }, - { - "eventType": "t2", - "data": {}, - "metadata": {} - }, - { - "eventType": "t3", - "data": {}, - "metadata": {} - } - ] - }, - { - "streamId": "category2-a", - "events": [ - { - "eventType": "t1", - "data": {}, - "metadata": {} - }, - { - "eventType": "t2", - "data": {}, - "metadata": {} - }, - { - "eventType": "t3", - "data": {}, - "metadata": {} - } - ] - }, - { - "streamId": "category1-b", - "events": [ - { - "eventType": "t1", - "data": {}, - "metadata": {} - }, - { - "eventType": "t2", - "data": {}, - "metadata": {} - }, - { - "eventType": "t3", - "data": {}, - "metadata": {} - } - ] - } - ], - "output": { - "config": { - "allEvents": true, - "allStreams": true, - "categories": [], - "events": [], - "partitioned": false, - "definesStateTransform": false, - "handlesDeletedNotifications": false, - "producesResults": false, - "definesFold": true, - "resultStreamName": null, - "partitionResultStreamNamePattern": null, - "$includeLinks": true, - "reorderEvents": false, - "processingLag": 0, - "biState": false - }, - "emitted": { - "$ct-category1": [ "0@category1-a", "1@category1-a", "2@category1-a", "0@category1-b", "1@category1-b", "2@category1-b" ] , - "$ct-category2": [ "0@category2-a", "1@category2-a", "2@category2-a"] - } - } -} diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category.js b/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category.js deleted file mode 100644 index ae1f8530d..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/by-category.js +++ /dev/null @@ -1,9 +0,0 @@ -options({ - $includeLinks: true -}); -fromAll().when({ - $any: (s, e) => { - const stream = e.streamId.split("-")[0]; - linkTo(stream, e); - } -}); diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data-spec.json b/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data-spec.json deleted file mode 100644 index b84c167a6..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data-spec.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "projection": "event-data", - "input": [ - { - "streamId": "foo", - "events": [ - { - "eventType": "baz", - "eventId": "81f23435-6b5b-47c6-84fd-b9d1a64916d8", - "data": { - "something": "one" - }, - "initializedPartitions": [ "" ], - "states": [ - { - "partition": "", - "state": { - "events": [ - { - "streamId": "foo", - "sequenceNumber": 0, - "eventId": "81f23435-6b5b-47c6-84fd-b9d1a64916d8", - "eventType": "baz", - "data": { - "something": "one" - }, - "metadata": null - } - ] - } - } - ] - }, { - "eventType": "baz", - "eventId": "100bd839-2b31-4908-99ef-6af615f51648", - "data": { - "something": "two" - }, - "metadata": { - "test": 1 - }, - "states": [ - { - "partition": "", - "state": { - "events": [ - { - "streamId": "foo", - "sequenceNumber": 0, - "eventId": "81f23435-6b5b-47c6-84fd-b9d1a64916d8", - "eventType": "baz", - "data": { - "something": "one" - }, - "metadata": null - }, - { - "streamId": "foo", - "sequenceNumber": 1, - "eventId": "100bd839-2b31-4908-99ef-6af615f51648", - "eventType": "baz", - "data": { - "something": "two" - }, - "metadata": { - "test": 1 - } - } - ] - } - } - ] - } - ] - } - ], - "output": { - "config": { - "categories": [], - "allStreams": true, - "events": ["baz"] , - "partitioned": false, - "definesStateTransform": false, - "handlesDeletedNotifications": false, - "producesResults": false, - "definesFold": true, - "resultStreamName": "", - "partitionResultStreamNamePattern": "", - "$includeLinks": false, - "reorderEvents": false, - "processingLag": 0, - "biState": false - } - } -} - diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data.js b/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data.js deleted file mode 100644 index 7c502217d..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/event-data.js +++ /dev/null @@ -1,16 +0,0 @@ -fromAll().when( -{ - $init: function() { - return { events: [] }; - }, - "baz" : function(state, event){ - state.events.push({ - streamId: event.streamId, - sequenceNumber: event.sequenceNumber, - eventId: event.eventId, - eventType: event.eventType, - data: event.data, - metadata: event.metadata - }) - } -}) diff --git a/src/EventStore.Projections.Core.Javascript.Tests/Specs/sample-events.json b/src/EventStore.Projections.Core.Javascript.Tests/Specs/sample-events.json deleted file mode 100644 index 6aefa7c41..000000000 --- a/src/EventStore.Projections.Core.Javascript.Tests/Specs/sample-events.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "events": [ - { - "eventType": "", - "data": {}, - "metadata": {} - }, - { - "eventType": "t1", - "data": {}, - "metadata": {} - }, - { - "eventType": "t2", - "data": {}, - "metadata": {} - }, - { - "eventType": "t3", - "data": {}, - "metadata": {} - } - ] - - -} diff --git a/src/EventStore.Projections.Core.Tests/AssertEx.cs b/src/EventStore.Projections.Core.Tests/AssertEx.cs deleted file mode 100644 index 2a871047b..000000000 --- a/src/EventStore.Projections.Core.Tests/AssertEx.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Esprima.Ast; -using EventStore.LogV3; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests { - public static class AssertEx { - public static void AreEqual(IQuerySources expected, IQuerySources actual) { - Assert.AreEqual(expected.AllEvents, actual.AllEvents, $"Expected {nameof(expected.AllEvents)} to be {expected.AllEvents} but was {actual.AllEvents}"); - Assert.AreEqual(expected.AllStreams, actual.AllStreams, $"Expected {nameof(expected.AllStreams)} to be {expected.AllStreams} but was {actual.AllStreams}"); - Assert.AreEqual(expected.ByCustomPartitions, actual.ByCustomPartitions,$"Expected {nameof(expected.ByCustomPartitions)} to be {expected.ByCustomPartitions} but was {actual.ByCustomPartitions}"); - Assert.AreEqual(expected.ByStreams, actual.ByStreams, $"Expected {nameof(expected.ByStreams)} to be {expected.ByStreams} but was {actual.ByStreams}"); - Assert.AreEqual(expected.DefinesFold, actual.DefinesFold, $"Expected {nameof(expected.DefinesFold)} to be {expected.DefinesFold} but was {actual.DefinesFold}"); - Assert.AreEqual(expected.DefinesStateTransform, actual.DefinesStateTransform, $"Expected {nameof(expected.DefinesStateTransform)} to be {expected.DefinesStateTransform} but was {actual.DefinesStateTransform}"); - - Assert.AreEqual(expected.IncludeLinksOption, actual.IncludeLinksOption, $"Expected {nameof(expected.IncludeLinksOption)} to be {expected.IncludeLinksOption} but was {actual.IncludeLinksOption}"); - Assert.AreEqual(expected.IsBiState, actual.IsBiState, $"Expected {nameof(expected.IsBiState)} to be {expected.IsBiState} but was {actual.IsBiState}"); - Assert.AreEqual(expected.LimitingCommitPosition, actual.LimitingCommitPosition, $"Expected {nameof(expected.LimitingCommitPosition)} to be {expected.LimitingCommitPosition} but was {actual.LimitingCommitPosition}"); - Assert.AreEqual(expected.PartitionResultStreamNamePatternOption, actual.PartitionResultStreamNamePatternOption, $"Expected {nameof(expected.PartitionResultStreamNamePatternOption)} to be {expected.PartitionResultStreamNamePatternOption} but was {actual.PartitionResultStreamNamePatternOption}"); - Assert.AreEqual(expected.ProcessingLagOption, actual.ProcessingLagOption, $"Expected {nameof(expected.ProcessingLagOption)} to be {expected.ProcessingLagOption} but was {actual.ProcessingLagOption}"); - Assert.AreEqual(expected.ProducesResults, actual.ProducesResults, $"Expected {nameof(expected.ProducesResults)} to be {expected.ProducesResults} but was {actual.ProducesResults}"); - Assert.AreEqual(expected.ReorderEventsOption, actual.ReorderEventsOption, $"Expected {nameof(expected.ReorderEventsOption)} to be {expected.ReorderEventsOption} but was {actual.ReorderEventsOption}"); - Assert.AreEqual(expected.ResultStreamNameOption, actual.ResultStreamNameOption, $"Expected {nameof(expected.ResultStreamNameOption)} to be {expected.ResultStreamNameOption} but was {actual.ResultStreamNameOption}"); - Assert.AreEqual(expected.HandlesDeletedNotifications, actual.HandlesDeletedNotifications, $"Expected {nameof(expected.HandlesDeletedNotifications)} to be {expected.HandlesDeletedNotifications} but was {actual.HandlesDeletedNotifications}"); - AssertWithName(nameof(expected.Categories),expected.Categories, actual.Categories); - AssertWithName(nameof(expected.Events),expected.Events, actual.Events); - AssertWithName(nameof(expected.Streams),expected.Streams, actual.Streams); - - static void AssertWithName(string name, string[] expected, string[] actual) { - try { - Assert.AreEqual(expected, actual); - } catch (Exception ex) { - var msg = name + ex.Message; - throw new Exception(msg); - } - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/CallbackSubscriber.cs b/src/EventStore.Projections.Core.Tests/CallbackSubscriber.cs deleted file mode 100644 index 7e9cec78a..000000000 --- a/src/EventStore.Projections.Core.Tests/CallbackSubscriber.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Tests { - public static class CallbackSubscriber { - class Impl : IHandle where T : Message { - private readonly Action _callback; - - public Impl(Action callback) { - _callback = callback; - } - - public void Handle(T message) { - _callback(message); - } - } - - public static IHandle Create(Action callback) where T : Message { - return new Impl(callback); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/Cluster/specification_with_standard_projections_runnning.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/Cluster/specification_with_standard_projections_runnning.cs deleted file mode 100644 index cdf4be592..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/Cluster/specification_with_standard_projections_runnning.cs +++ /dev/null @@ -1,305 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using EventStore.ClientAPI; -using EventStore.ClientAPI.Common.Log; -using EventStore.ClientAPI.Projections; -using EventStore.ClientAPI.SystemData; -using EventStore.Common.Options; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Util; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ExpectedVersion = EventStore.ClientAPI.ExpectedVersion; -using ResolvedEvent = EventStore.ClientAPI.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.ClientAPI.Cluster { - [Category("ClientAPI")] - public abstract class specification_with_standard_projections_runnning : SpecificationWithDirectoryPerTestFixture { - protected MiniClusterNode[] _nodes = new MiniClusterNode[3]; - protected Endpoints[] _nodeEndpoints = new Endpoints[3]; - protected IEventStoreConnection _conn; - private readonly ProjectionsSubsystem[] _projections = new ProjectionsSubsystem[3]; - protected UserCredentials _admin = DefaultData.AdminCredentials; - protected ProjectionsManager _manager; - - protected class Endpoints { - public readonly IPEndPoint InternalTcp; - public readonly IPEndPoint ExternalTcp; - public readonly IPEndPoint HttpEndPoint; - private readonly int[] _ports; - - public Endpoints(int internalTcp, int externalTcp, int httpPort) { - var testIp = Environment.GetEnvironmentVariable("ES-TESTIP"); - - var address = string.IsNullOrEmpty(testIp) ? IPAddress.Loopback : IPAddress.Parse(testIp); - InternalTcp = new IPEndPoint(address, internalTcp); - ExternalTcp = new IPEndPoint(address, externalTcp); - HttpEndPoint = new IPEndPoint(address, httpPort); - - _ports = new[] {internalTcp, httpPort, externalTcp}; - } - - public IEnumerable Ports => _ports; - } - - [OneTimeSetUp] - public override async Task TestFixtureSetUp() { - await base.TestFixtureSetUp(); -#if (!DEBUG) - Assert.Ignore("These tests require DEBUG conditional"); -#else - _nodeEndpoints[0] = new Endpoints( - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback)); - _nodeEndpoints[1] = new Endpoints( - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback)); - _nodeEndpoints[2] = new Endpoints( - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback), - PortsHelper.GetAvailablePort(IPAddress.Loopback)); - - _nodes[0] = CreateNode(0, - _nodeEndpoints[0], new[] { _nodeEndpoints[0].HttpEndPoint }); - _nodes[1] = CreateNode(1, - _nodeEndpoints[1], new[] { _nodeEndpoints[1].HttpEndPoint }); - _nodes[2] = CreateNode(2, - _nodeEndpoints[2], new[] { _nodeEndpoints[2].HttpEndPoint }); - WaitIdle(); - - var projectionsStarted = _projections.Select(p => SystemProjections.Created(p.LeaderInputBus)).ToArray(); - - foreach (var node in _nodes) { - node.Start(); - node.WaitIdle(); - } - - await Task.WhenAll(_nodes.Select(x => x.Started)).WithTimeout(TimeSpan.FromSeconds(30)); - - _conn = EventStoreConnection.Create(_nodes[0].ExternalTcpEndPoint); - await _conn.ConnectAsync().WithTimeout(); - - _manager = new ProjectionsManager( - new ConsoleLogger(), - _nodes.Single(x => x.NodeState == VNodeState.Leader).HttpEndPoint, - TimeSpan.FromMilliseconds(10000)); - - if (GivenStandardProjectionsRunning()) { - await Task.WhenAny(projectionsStarted).WithTimeout(TimeSpan.FromSeconds(10)); - await EnableStandardProjections().WithTimeout(TimeSpan.FromMinutes(2)); - } - - WaitIdle(); - - try { - await Given().WithTimeout(); - } catch (Exception ex) { - throw new Exception("Given Failed", ex); - } - - try { - await When().WithTimeout(); - } catch (Exception ex) { - throw new Exception("When Failed", ex); - } -#endif - } - - private MiniClusterNode CreateNode(int index, Endpoints endpoints, EndPoint[] gossipSeeds) { - _projections[index] = new ProjectionsSubsystem(new ProjectionSubsystemOptions(1, ProjectionType.All, false, TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), Opts.FaultOutOfOrderProjectionsDefault, 500, 250)); - var node = new MiniClusterNode( - PathName, index, endpoints.InternalTcp, - endpoints.ExternalTcp, endpoints.HttpEndPoint, - subsystems: [_projections[index]], gossipSeeds: gossipSeeds); - return node; - } - - [TearDown] - public async Task PostTestAsserts() { - var all = await _manager.ListAllAsync(_admin); - if (all.Any(p => p.Name == "Faulted")) - Assert.Fail("Projections faulted while running the test" + "\r\n" + all); - } - - protected async Task EnableStandardProjections() { - await EnableProjection(ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection); - } - - protected async Task DisableStandardProjections() { - await DisableProjection(ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection); - } - - protected virtual bool GivenStandardProjectionsRunning() { - return true; - } - - protected async Task EnableProjection(string name) { - for (int i = 1; i <= 10; i++) { - try { - await _manager.EnableAsync(name, _admin); - } catch (Exception) { - if (i == 10) - throw; - await Task.Delay(5000); - } - } - - await Task.Delay(1000); /* workaround for race condition when multiple projections are being enabled simultaneously */ - } - - protected Task DisableProjection(string name) { - return _manager.DisableAsync(name, _admin); - } - - [OneTimeTearDown] - public override async Task TestFixtureTearDown() { - _conn.Close(); - await Task.WhenAll( - _nodes[0].Shutdown(), - _nodes[1].Shutdown(), - _nodes[2].Shutdown()); - await base.TestFixtureTearDown(); - } - - protected virtual Task When() => Task.CompletedTask; - - protected virtual Task Given() => Task.CompletedTask; - - protected Task PostEvent(string stream, string eventType, string data) { - return _conn.AppendToStreamAsync(stream, ExpectedVersion.Any, new[] { CreateEvent(eventType, data) }); - } - - protected Task HardDeleteStream(string stream) { - return _conn.DeleteStreamAsync(stream, ExpectedVersion.Any, true, _admin); - } - - protected Task SoftDeleteStream(string stream) { - return _conn.DeleteStreamAsync(stream, ExpectedVersion.Any, false, _admin); - } - - protected static EventData CreateEvent(string type, string data) { - return new EventData(Guid.NewGuid(), type, true, Encoding.UTF8.GetBytes(data), new byte[0]); - } - - protected void WaitIdle() { -#if DEBUG - _nodes[0].WaitIdle(); - _nodes[1].WaitIdle(); - _nodes[2].WaitIdle(); -#endif - } - -#pragma warning disable 1998 - protected async Task AssertStreamTailAsync(string streamId, params string[] events) { -#pragma warning restore 1998 -#if DEBUG - var result = await _conn.ReadStreamEventsBackwardAsync(streamId, -1, events.Length, true, _admin); - switch (result.Status) { - case SliceReadStatus.StreamDeleted: - Assert.Fail("Stream '{0}' is deleted", streamId); - break; - case SliceReadStatus.StreamNotFound: - Assert.Fail("Stream '{0}' does not exist", streamId); - break; - case SliceReadStatus.Success: - var resultEventsReversed = result.Events.Reverse().ToArray(); - if (resultEventsReversed.Length < events.Length) - DumpFailed("Stream does not contain enough events", streamId, events, result.Events); - else { - for (var index = 0; index < events.Length; index++) { - var parts = events[index].Split(new char[] { ':' }, 2); - var eventType = parts[0]; - var eventData = parts[1]; - - if (resultEventsReversed[index].Event.EventType != eventType) - DumpFailed("Invalid event type", streamId, events, resultEventsReversed); - else if (resultEventsReversed[index].Event.DebugDataView() != eventData) - DumpFailed("Invalid event body", streamId, events, resultEventsReversed); - } - } - - break; - } -#endif - } - -#pragma warning disable 1998 - protected async Task DumpStreamAsync(string streamId) { -#pragma warning restore 1998 -#if DEBUG - var result = await _conn.ReadStreamEventsBackwardAsync(streamId, -1, 100, true, _admin); - switch (result.Status) { - case SliceReadStatus.StreamDeleted: - Assert.Fail("Stream '{0}' is deleted", streamId); - break; - case SliceReadStatus.StreamNotFound: - Assert.Fail("Stream '{0}' does not exist", streamId); - break; - case SliceReadStatus.Success: - Dump("Dumping..", streamId, result.Events.Reverse().ToArray()); - break; - } -#endif - } - -#if DEBUG - private void DumpFailed(string message, string streamId, string[] events, ResolvedEvent[] resultEvents) { - var expected = events.Aggregate("", (a, v) => a + ", " + v); - var actual = resultEvents.Aggregate( - "", (a, v) => a + ", " + v.Event.EventType + ":" + v.Event.DebugDataView()); - - var actualMeta = resultEvents.Aggregate( - "", (a, v) => a + "\r\n" + v.Event.EventType + ":" + v.Event.DebugMetadataView()); - - - Assert.Fail( - "Stream: '{0}'\r\n{1}\r\n\r\nExisting events: \r\n{2}\r\n Expected events: \r\n{3}\r\n\r\nActual metas:{4}", - streamId, - message, actual, expected, actualMeta); - } - - private void Dump(string message, string streamId, ResolvedEvent[] resultEvents) { - var actual = resultEvents.Aggregate( - "", (a, v) => a + ", " + v.OriginalEvent.EventType + ":" + v.OriginalEvent.DebugDataView()); - - var actualMeta = resultEvents.Aggregate( - "", (a, v) => a + "\r\n" + v.OriginalEvent.EventType + ":" + v.OriginalEvent.DebugMetadataView()); - - Debug.WriteLine( - "Stream: '{0}'\r\n{1}\r\n\r\nExisting events: \r\n{2}\r\n \r\nActual metas:{3}", streamId, - message, actual, actualMeta); - } -#endif - - protected async Task PostProjection(string query) { - await _manager.CreateContinuousAsync("test-projection", query, _admin); - WaitIdle(); - } - } - - [Explicit] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class vnode_cluster_specification : specification_with_standard_projections_runnning { - [Test, Explicit] - public async Task vnode_cluster_starts() { - await PostProjection(@"fromStream('$user-admin').outputState()"); - await AssertStreamTailAsync("$projections-test-projection-result", "Result:{}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/RecordedEventExtensions.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/RecordedEventExtensions.cs deleted file mode 100644 index 9aed83efd..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/RecordedEventExtensions.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Text; -using EventStore.ClientAPI; - -namespace EventStore.Projections.Core.Tests.ClientAPI { - internal static class RecordedEventExtensions { - public static string DebugDataView(this RecordedEvent source) => Encoding.UTF8.GetString(source.Data); - public static string DebugMetadataView(this RecordedEvent source) => Encoding.UTF8.GetString(source.Metadata); - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index.cs deleted file mode 100644 index b9d5f093e..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI { - namespace event_by_type_index { - public abstract class with_existing_events : specification_with_standard_projections_runnning { - protected override async Task Given() { - await base.Given(); - await PostEvent("stream1", "type1", "{}"); - await PostEvent("stream1", "type2", "{}"); - await PostEvent("stream1", "type3", "{}"); - await PostEvent("stream2", "type1", "{}"); - await PostEvent("stream2", "type2", "{}"); - await PostEvent("stream2", "type3", "{}"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating : with_existing_events { - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().when({ - $init: function(){ - return {c: 0}; - }, - type1: count, - type2: count -}).outputState() - -function count(s,e) { - return {c: s.c + 1}; -} -"); - } - - [Test, Category("Network")] - public async Task result_is_correct() { - await AssertStreamTail("$projections-test-projection-result", "Result:{\"c\":4}"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_posting_more_events : with_existing_events { - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().when({ - $init: function(){ - return {c: 0}; - }, - type1: count, - type2: count -}).outputState() - -function count(s,e) { - return {c: s.c + 1}; -} -"); - await PostEvent("stream3", "type2", "{}"); - await PostEvent("stream3", "type3", "{}"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task result_is_correct() { - await AssertStreamTail("$projections-test-projection-result", "Result:{\"c\":5}"); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index/when_reverting_after_index_catches_up.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index/when_reverting_after_index_catches_up.cs deleted file mode 100644 index 9ec5369de..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/event_by_type_index/when_reverting_after_index_catches_up.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.event_by_type_index { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_reverting_after_index_catches_up : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":1}", "Result:{\"a\":2}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":1}", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/list_projections.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/list_projections.cs deleted file mode 100644 index 2b7b8a43c..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/list_projections.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using EventStore.ClientAPI.SystemData; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class list_projections : specification_with_standard_projections_runnning { - const string TestProjection = - "fromAll().when({$init: function (state, ev) {return {};},ConversationStarted: function (state, ev) {state.lastBatchSent = ev;return state;}});"; - - [Test] - public async Task list_all_projections_works() { - var x = await _manager.ListAllAsync(new UserCredentials("admin", "changeit")); - Assert.AreEqual(true, x.Any()); - Assert.IsTrue(x.Any(p => p.Name == "$streams")); - } - - [Test] - public async Task list_oneTime_projections_works() { - await _manager.CreateOneTimeAsync(TestProjection, new UserCredentials("admin", "changeit")); - var x = await _manager.ListOneTimeAsync(new UserCredentials("admin", "changeit")); - Assert.AreEqual(true, x.Any(p => p.Mode == "OneTime")); - } - - [Test] - public async Task list_continuous_projections_works() { - var nameToTest = Guid.NewGuid().ToString(); - await _manager.CreateContinuousAsync(nameToTest, TestProjection, new UserCredentials("admin", "changeit")); - var x = await _manager.ListContinuousAsync(new UserCredentials("admin", "changeit")); - Assert.AreEqual(true, x.Any(p => p.Name == nameToTest)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/SpecificationWithNodeAndProjectionsManager.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/SpecificationWithNodeAndProjectionsManager.cs deleted file mode 100644 index d1e3868bf..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/SpecificationWithNodeAndProjectionsManager.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; -using EventStore.ClientAPI; -using EventStore.ClientAPI.Projections; -using EventStore.ClientAPI.Common.Log; -using EventStore.ClientAPI.SystemData; -using EventStore.Common.Options; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Tests.ClientAPI.Helpers; -using EventStore.Core.Services; -using EventStore.Core.Util; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.ClientAPI.projectionsManager { - public abstract class SpecificationWithNodeAndProjectionsManager : SpecificationWithDirectoryPerTestFixture { - protected MiniNode _node; - protected ProjectionsManager _projManager; - protected IEventStoreConnection _connection; - protected UserCredentials _credentials; - protected TimeSpan _timeout; - protected string _tag; - private Task _systemProjectionsCreated; - private ProjectionsSubsystem _projectionsSubsystem; - - - [OneTimeSetUp] - public override async Task TestFixtureSetUp() { - await base.TestFixtureSetUp(); - _credentials = new UserCredentials(SystemUsers.Admin, SystemUsers.DefaultAdminPassword); - _timeout = TimeSpan.FromSeconds(20); - // Check if a node is running in ProjectionsManagerTestSuiteMarkerBase - _tag = "_1"; - - _node = CreateNode(); - await _node.Start().WithTimeout(_timeout); - - await _systemProjectionsCreated.WithTimeout(_timeout); - - _connection = TestConnection.Create(_node.TcpEndPoint); - await _connection.ConnectAsync(); - - _projManager = new ProjectionsManager(new ConsoleLogger(), _node.HttpEndPoint, _timeout, _node.HttpMessageHandler); - try { - await Given().WithTimeout(_timeout); - } catch (Exception ex) { - throw new Exception("Given Failed", ex); - } - - try { - await When().WithTimeout(_timeout); - } catch (Exception ex) { - throw new Exception("When Failed", ex); - } - } - - [OneTimeTearDown] - public override async Task TestFixtureTearDown() { - _connection.Close(); - await _node.Shutdown(); - - await base.TestFixtureTearDown(); - } - - public abstract Task Given(); - public abstract Task When(); - - protected MiniNode CreateNode() { - _projectionsSubsystem = new ProjectionsSubsystem(new ProjectionSubsystemOptions(1, ProjectionType.All, false, TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), Opts.FaultOutOfOrderProjectionsDefault, 500, 250)); - _systemProjectionsCreated = SystemProjections.Created(_projectionsSubsystem.LeaderInputBus); - return new MiniNode( - PathName, inMemDb: true, - subsystems: [_projectionsSubsystem]); - } - - protected EventData CreateEvent(string eventType, string data) { - return new EventData(Guid.NewGuid(), eventType, true, Encoding.UTF8.GetBytes(data), null); - } - - protected Task PostEvent(string stream, string eventType, string data) { - return _connection.AppendToStreamAsync(stream, ExpectedVersion.Any, new[] { CreateEvent(eventType, data) }); - } - - protected Task CreateOneTimeProjection() { - var query = CreateStandardQuery(Guid.NewGuid().ToString()); - return _projManager.CreateOneTimeAsync(query, _credentials); - } - - protected Task CreateContinuousProjection(string projectionName) { - var query = CreateStandardQuery(Guid.NewGuid().ToString()); - return _projManager.CreateContinuousAsync(projectionName, query, _credentials); - } - - protected string CreateStandardQuery(string stream) { - return @"fromStream(""" + stream + @""") - .when({ - ""$any"":function(s,e) { - s.count = 1; - return s; - } - });"; - } - - protected string CreateEmittingQuery(string stream, string emittingStream) { - return @"fromStream(""" + stream + @""") - .when({ - ""$any"":function(s,e) { - emit(""" + emittingStream + @""", ""emittedEvent"", e); - } - });"; - } - - private List _systemProjections => - typeof(ProjectionNamesBuilder.StandardProjections).GetFields( - System.Reflection.BindingFlags.Public | - System.Reflection.BindingFlags.Static | - System.Reflection.BindingFlags.FlattenHierarchy) - .Where(x => x.IsLiteral && !x.IsInitOnly) - .Select(x => x.GetRawConstantValue().ToString()) - .ToList(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/projectionsManagerTests.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/projectionsManagerTests.cs deleted file mode 100644 index 94fd5ccab..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/projectionsManager/projectionsManagerTests.cs +++ /dev/null @@ -1,352 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NUnit.Framework; -using Newtonsoft.Json.Linq; -using EventStore.ClientAPI; -using EventStore.ClientAPI.Projections; -using EventStore.Common.Utils; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.ClientAPI.projectionsManager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - [Category("ProjectionsManager")] - public class when_creating_one_time_projection : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _query; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - _query = CreateStandardQuery(_streamName); - } - - public override Task When() { - return _projManager.CreateOneTimeAsync(_query, _credentials); - } - - [Test] - public async Task should_create_projection() { - var projections = await _projManager.ListOneTimeAsync(_credentials); - Assert.AreEqual(1, projections.Count); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating_transient_projection : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _projectionName; - private string _query; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - _projectionName = "when_creating_transient_projection"; - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - _query = CreateStandardQuery(_streamName); - } - - public override Task When() { - return _projManager.CreateTransientAsync(_projectionName, _query, _credentials); - } - - [Test] - public async Task should_create_projection() { - var status = await _projManager.GetStatusAsync(_projectionName, _credentials); - Assert.IsNotEmpty(status); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating_continuous_projection : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _emittedStreamName; - private string _projectionName; - private string _query; - private string _projectionId; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - _projectionName = "when_creating_continuous_projection"; - _emittedStreamName = "emittedStream-" + Guid.NewGuid().ToString(); - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - _query = CreateEmittingQuery(_streamName, _emittedStreamName); - } - - public override Task When() { - return _projManager.CreateContinuousAsync(_projectionName, _query, _credentials); - } - - [Test] - public async Task should_create_projection() { - var allProjections = await _projManager.ListContinuousAsync(_credentials); - var proj = allProjections.FirstOrDefault(x => x.EffectiveName == _projectionName); - _projectionId = proj.Name; - Assert.IsNotNull(proj); - } - - [Test] - public async Task should_have_turn_on_emit_to_stream() { - var events = await _connection - .ReadEventAsync(string.Format("$projections-{0}", _projectionId), 0, true, _credentials); - var data = System.Text.Encoding.UTF8.GetString(events.Event.Value.Event.Data); - var eventData = data.ParseJson(); - Assert.IsTrue((bool)eventData["emitEnabled"]); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_creating_continuous_projection_with_track_emitted_streams : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _emittedStreamName; - private string _projectionName; - private string _query; - private string _projectionId; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - _projectionName = "when_creating_continuous_projection_with_track_emitted_streams"; - _emittedStreamName = "emittedStream-" + Guid.NewGuid().ToString(); - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - - _query = CreateEmittingQuery(_streamName, _emittedStreamName); - } - - public override Task When() { - return _projManager.CreateContinuousAsync(_projectionName, _query, true, _credentials); - } - - [Test] - public async Task should_create_projection() { - var allProjections = await _projManager.ListContinuousAsync(_credentials); - var proj = allProjections.FirstOrDefault(x => x.EffectiveName == _projectionName); - _projectionId = proj.Name; - Assert.IsNotNull(proj); - } - - [Test] - public async Task should_enable_track_emitted_streams() { - var events = await _connection - .ReadEventAsync(string.Format("$projections-{0}", _projectionId), 0, true, _credentials); - var data = System.Text.Encoding.UTF8.GetString(events.Event.Value.Event.Data); - var eventData = data.ParseJson(); - Assert.IsTrue((bool)eventData["trackEmittedStreams"]); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_disabling_projections : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _projectionName; - private string _query; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - _projectionName = "when_disabling_projection"; - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - _query = CreateStandardQuery(_streamName); - - await _projManager.CreateContinuousAsync(_projectionName, _query, _credentials); - } - - public override Task When() { - return _projManager.DisableAsync(_projectionName, _credentials); - } - - [Test] - public async Task should_stop_the_projection() { - var projectionStatus = await _projManager.GetStatusAsync(_projectionName, _credentials); - var status = projectionStatus.ParseJson()["status"].ToString(); - Assert.IsTrue(status.Contains("Stopped")); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_enabling_projections : SpecificationWithNodeAndProjectionsManager { - private string _streamName; - private string _projectionName; - private string _query; - - public override async Task Given() { - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - _projectionName = "when_enabling_projections"; - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - _query = CreateStandardQuery(_streamName); - - await _projManager.CreateContinuousAsync(_projectionName, _query, _credentials); - await _projManager.DisableAsync(_projectionName, _credentials); - } - - public override Task When() { - return _projManager.EnableAsync(_projectionName, _credentials); - } - - [Test] - public async Task should_reenable_projection() { - var projectionStatus = await _projManager.GetStatusAsync(_projectionName, _credentials); - var status = projectionStatus.ParseJson()["status"].ToString(); - Assert.IsTrue(status.Contains("Running")); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_listing_the_projections : SpecificationWithNodeAndProjectionsManager { - private List _result; - - public override Task Given() { - return CreateContinuousProjection(Guid.NewGuid().ToString()); - } - - public override async Task When() { - _result = await _projManager.ListAllAsync(_credentials); - } - - [Test] - public void should_return_all_projections() { - Assert.IsNotEmpty(_result); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_listing_one_time_projections : SpecificationWithNodeAndProjectionsManager { - private List _result; - - public override Task Given() { - return CreateOneTimeProjection(); - } - - public override async Task When() { - _result = (await _projManager.ListOneTimeAsync(_credentials)).ToList(); - } - - [Test] - public void should_return_projections() { - Assert.IsNotEmpty(_result); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_listing_continuous_projections : SpecificationWithNodeAndProjectionsManager { - private List _result; - private string _projectionName; - - public override Task Given() { - _projectionName = Guid.NewGuid().ToString(); - return CreateContinuousProjection(_projectionName); - } - - public override async Task When() { - _result = (await _projManager.ListContinuousAsync(_credentials)).ToList(); - } - - [Test] - public void should_return_continuous_projections() { - Assert.IsTrue(_result.Any(x => x.EffectiveName == _projectionName)); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_projection_is_running : SpecificationWithNodeAndProjectionsManager { - private string _projectionName; - private string _streamName; - private string _query; - - public override async Task Given() { - _projectionName = "when_getting_projection_information"; - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - } - - public override Task When() { - _query = CreateStandardQuery(_streamName); - return _projManager.CreateContinuousAsync(_projectionName, _query, _credentials); - } - - [Test] - public async Task should_be_able_to_get_the_projection_state() { - var state = await _projManager.GetStateAsync(_projectionName, _credentials); - Assert.IsNotEmpty(state); - } - - [Test] - public async Task should_be_able_to_get_the_projection_status() { - var status = await _projManager.GetStatusAsync(_projectionName, _credentials); - Assert.IsNotEmpty(status); - } - - [Test] - public async Task should_be_able_to_get_the_projection_result() { - var result = await _projManager.GetResultAsync(_projectionName, _credentials); - Assert.AreEqual("{\"count\":1}", result); - } - - [Test] - public async Task should_be_able_to_get_the_projection_query() { - var query = await _projManager.GetQueryAsync(_projectionName, _credentials); - Assert.AreEqual(_query, query); - } - } - - [Category("ProjectionsManager")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_projection_query : SpecificationWithNodeAndProjectionsManager { - private string _projectionName; - private string _streamName; - private string _newQuery; - - public override async Task Given() { - _projectionName = "when_updating_a_projection_query"; - _streamName = "test-stream-" + Guid.NewGuid().ToString(); - - await PostEvent(_streamName, "testEvent", "{\"A\":\"1\"}"); - await PostEvent(_streamName, "testEvent", "{\"A\":\"2\"}"); - - var origQuery = CreateStandardQuery(_streamName); - _newQuery = CreateStandardQuery("DifferentStream"); - await _projManager.CreateContinuousAsync(_projectionName, origQuery, _credentials); - } - - public override Task When() { - return _projManager.UpdateQueryAsync(_projectionName, _newQuery, _credentials); - } - - [Test] - public async Task should_update_the_projection_query() { - var query = await _projManager.GetQueryAsync(_projectionName, _credentials); - Assert.AreEqual(_newQuery, query); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/specification_with_standard_projections_runnning.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/specification_with_standard_projections_runnning.cs deleted file mode 100644 index f9ed5b5df..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/specification_with_standard_projections_runnning.cs +++ /dev/null @@ -1,256 +0,0 @@ -using System; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using EventStore.ClientAPI; -using EventStore.ClientAPI.Common.Log; -using EventStore.ClientAPI.Projections; -using EventStore.ClientAPI.SystemData; -using EventStore.Common.Options; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Util; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.ClientAPI.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.ClientAPI { - [Category("ClientAPI")] - public abstract class specification_with_standard_projections_runnning : SpecificationWithDirectoryPerTestFixture { - protected IEventStoreConnection _conn; - protected UserCredentials _admin = DefaultData.AdminCredentials; - protected ProjectionsManager _manager; - protected QueryManager _queryManager; - - private Task _projectionsCreated; - private ProjectionsSubsystem _projections; - private MiniNode _node; - - [OneTimeSetUp] - public override async Task TestFixtureSetUp() { - await base.TestFixtureSetUp(); - - var projectionWorkerThreadCount = GivenWorkerThreadCount(); - var configuration = new ProjectionSubsystemOptions( - projectionWorkerThreadCount, - ProjectionType.All, - false, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - Opts.FaultOutOfOrderProjectionsDefault, - 500, - 250); - _projections = new ProjectionsSubsystem(configuration); - _node = new MiniNode( - PathName, inMemDb: true, - subsystems: [_projections]); - _projectionsCreated = SystemProjections.Created(_projections.LeaderInputBus); - - await _node.Start(); - _conn = EventStoreConnection.Create(new ConnectionSettingsBuilder() - .DisableServerCertificateValidation() - .Build(), _node.TcpEndPoint); - await _conn.ConnectAsync(); - - _manager = new ProjectionsManager( - new ConsoleLogger(), - _node.HttpEndPoint, - TimeSpan.FromMilliseconds(20000), - _node.HttpMessageHandler); - - _queryManager = new QueryManager( - new ConsoleLogger(), - _node.HttpEndPoint, - TimeSpan.FromMilliseconds(20000), - TimeSpan.FromMilliseconds(20000), - _node.HttpMessageHandler); - - WaitIdle(); - - if (GivenStandardProjectionsRunning()) - await EnableStandardProjections(); - - WaitIdle(); - try { - await Given().WithTimeout(TimeSpan.FromSeconds(10)); - } catch (Exception ex) { - throw new Exception("Given Failed", ex); - } - - try { - await When().WithTimeout(TimeSpan.FromSeconds(10)); - } catch (Exception ex) { - throw new Exception("When Failed", ex); - } - } - - protected virtual int GivenWorkerThreadCount() { - return 1; - } - - [TearDown] - public async Task PostTestAsserts() { - var all = await _manager.ListAllAsync(_admin); - if (all.Any(p => p.Name == "Faulted")) - Assert.Fail("Projections faulted while running the test" + "\r\n" + all); - } - - protected async Task EnableStandardProjections() { - await _projectionsCreated; - await EnableProjection(ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection); - await EnableProjection(ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection); - } - - protected async Task DisableStandardProjections() { - await DisableProjection(ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection); - await DisableProjection(ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection); - } - - protected virtual bool GivenStandardProjectionsRunning() { - return true; - } - - protected Task EnableProjection(string name) { - return _manager.EnableAsync(name, _admin); - } - - protected Task DisableProjection(string name) { - return _manager.DisableAsync(name, _admin); - } - - [OneTimeTearDown] - public override async Task TestFixtureTearDown() { - if (_conn != null) - _conn.Close(); - - if (_node != null) - await _node.Shutdown(); - - await base.TestFixtureTearDown(); - } - - protected virtual Task When() => Task.CompletedTask; - - protected virtual Task Given() => Task.CompletedTask; - - protected Task PostEvent(string stream, string eventType, string data) { - return _conn.AppendToStreamAsync(stream, ExpectedVersion.Any, CreateEvent(eventType, data)); - } - - protected Task HardDeleteStream(string stream) { - return _conn.DeleteStreamAsync(stream, ExpectedVersion.Any, true, _admin); - } - - protected Task SoftDeleteStream(string stream) { - return _conn.DeleteStreamAsync(stream, ExpectedVersion.Any, false, _admin); - } - - protected static EventData CreateEvent(string type, string data) { - return new EventData(Guid.NewGuid(), type, true, Encoding.UTF8.GetBytes(data), new byte[0]); - } - - protected void WaitIdle(int multiplier = 1) { -#if DEBUG - _node.WaitIdle(); -#endif - } - -#pragma warning disable 1998 - protected async Task AssertStreamTail(string streamId, params string[] events) { -#pragma warning restore 1998 -#if DEBUG - await Task.Delay(TimeSpan.FromMilliseconds(500)); - var result = await _conn.ReadStreamEventsBackwardAsync(streamId, -1, events.Length, true, _admin); - switch (result.Status) { - case SliceReadStatus.StreamDeleted: - Assert.Fail("Stream '{0}' is deleted", streamId); - break; - case SliceReadStatus.StreamNotFound: - Assert.Fail("Stream '{0}' does not exist", streamId); - break; - case SliceReadStatus.Success: - var resultEventsReversed = result.Events.Reverse().ToArray(); - if (resultEventsReversed.Length < events.Length) - DumpFailed("Stream does not contain enough events", streamId, events, result.Events); - else { - for (var index = 0; index < events.Length; index++) { - var parts = events[index].Split(new char[] {':'}, 2); - var eventType = parts[0]; - var eventData = parts[1]; - - if (resultEventsReversed[index].Event.EventType != eventType) - DumpFailed("Invalid event type", streamId, events, resultEventsReversed); - else if (resultEventsReversed[index].Event.DebugDataView() != eventData) - DumpFailed("Invalid event body", streamId, events, resultEventsReversed); - } - } - - break; - } -#endif - } - -#pragma warning disable 1998 - protected async Task DumpStream(string streamId) { -#pragma warning restore 1998 -#if DEBUG - var result = await _conn.ReadStreamEventsBackwardAsync(streamId, -1, 100, true, _admin); - switch (result.Status) { - case SliceReadStatus.StreamDeleted: - Assert.Fail("Stream '{0}' is deleted", streamId); - break; - case SliceReadStatus.StreamNotFound: - Assert.Fail("Stream '{0}' does not exist", streamId); - break; - case SliceReadStatus.Success: - Dump("Dumping..", streamId, result.Events.Reverse().ToArray()); - break; - } -#endif - } - -#if DEBUG - private void DumpFailed(string message, string streamId, string[] events, ResolvedEvent[] resultEvents) { - var expected = events.Aggregate("", (a, v) => a + ", " + v); - var actual = resultEvents.Aggregate( - "", (a, v) => a + ", " + v.Event.EventType + ":" + v.Event.DebugDataView()); - - var actualMeta = resultEvents.Aggregate( - "", (a, v) => a + "\r\n" + v.Event.EventType + ":" + v.Event.DebugMetadataView()); - - - Assert.Fail( - "Stream: '{0}'\r\n{1}\r\n\r\nExisting events: \r\n{2}\r\n Expected events: \r\n{3}\r\n\r\nActual metas:{4}", - streamId, - message, actual, expected, actualMeta); - } - - protected void Dump(string message, string streamId, ResolvedEvent[] resultEvents) { - var actual = resultEvents.Aggregate( - "", (a, v) => a + ", " + v.OriginalEvent.EventType + ":" + v.OriginalEvent.DebugDataView()); - - var actualMeta = resultEvents.Aggregate( - "", (a, v) => a + "\r\n" + v.OriginalEvent.EventType + ":" + v.OriginalEvent.DebugMetadataView()); - - - Debug.WriteLine( - "Stream: '{0}'\r\n{1}\r\n\r\nExisting events: \r\n{2}\r\n \r\nActual metas:{3}", streamId, - message, actual, actualMeta); - } -#endif - - protected async Task PostProjection(string query) { - await _manager.CreateContinuousAsync("test-projection", query, _admin); - WaitIdle(); - } - - protected async Task PostQuery(string query) { - await _manager.CreateTransientAsync("query", query, _admin); - WaitIdle(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result.cs deleted file mode 100644 index babc1e466..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.query_result.with_long_from_all_query { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_getting_result - : specification_with_standard_projections_runnning { - protected override async Task Given() { - await base.Given(); - - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type1", "{}"); - - WaitIdle(); - } - - [Test, Category("Network")] - public async Task waits_for_results() { - const string query = @" -fromAll().when({ - $init: function(){return {count:0}}, - type1: function(s,e){ - var start = new Date(); - while(new Date()-start < 150){} - - s.count++; - }, -}); -"; - - var result = await _queryManager - .ExecuteAsync("query", query, TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(5000), _admin) -; - Assert.AreEqual("{\"count\":3}", result); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result_and_timeout_exceeded.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result_and_timeout_exceeded.cs deleted file mode 100644 index 23460d3f7..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_executing_query/with_long_from_all_query/when_getting_result_and_timeout_exceeded.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.ClientAPI.Exceptions; -using EventStore.Core.Tests; -using NUnit.Framework; -using static EventStore.Core.Tests.AssertEx; -namespace EventStore.Projections.Core.Tests.ClientAPI.when_executing_query.with_long_from_all_query { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_getting_result_and_timeout_exceeded - : specification_with_standard_projections_runnning { - protected override async Task Given() { - await base.Given(); - - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type1", "{}"); - - WaitIdle(); - } - - [Test, Category("Network"), Timeout(60000)] - public async Task throws_exception() { - const string query = @" -fromAll().when({ - $init: function(){return {count:0}}, - type1: function(s,e){ - var start = new Date(); - while(new Date()-start < 1e7){} - - s.count++; - }, -}); -"; - await ThrowsAsync(() => _queryManager.ExecuteAsync("query", query, - TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(5000), _admin)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs deleted file mode 100644 index d11040a4c..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_created.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted - : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e) {s.a++;}, - $created: function(s,e){s.a++;}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_created_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":3}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":3}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs deleted file mode 100644 index 3fd98e5be..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_created.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed - : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++;}, - type2: function(s,e){s.a++;}, - $created: function(s,e){s.a++;}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":3}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":3}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs deleted file mode 100644 index 06ab77535..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_created/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_created.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++;}, - type2: function(s,e){s.a++;}, - $created: function(s,e){s.a++;}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":3}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":3}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_a_stream_gets_deleted_before_recovery.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_a_stream_gets_deleted_before_recovery.cs deleted file mode 100644 index 9c295332d..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_a_stream_gets_deleted_before_recovery.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection. - recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_running_and_a_stream_gets_deleted_before_recovery : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_events_are_posted.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_events_are_posted.cs deleted file mode 100644 index 6debf2ad3..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/recovery/when_running_and_events_are_posted.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection. - recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs deleted file mode 100644 index 7c7d86b73..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_a_stream_and_tombstone_postponed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_a_stream_and_tombstone_postponed.cs deleted file mode 100644 index 7744c65dc..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_a_stream_and_tombstone_postponed.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted_but_a_stream_and_tombstone_postponed : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_tombstone.cs deleted file mode 100644 index c914ea779..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_but_tombstone.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted_but_tombstone : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - } - - protected override async Task When() { - await base.When(); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_including_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_including_tombstone.cs deleted file mode 100644 index 3ba5dac9b..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_events_are_posted_including_tombstone.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_posted_including_tombstone : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs deleted file mode 100644 index 46b130603..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_any_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_any_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_running_and_then_other_events_tombstone_ant_other_events : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - $any: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - } - - protected override async Task When() { - await base.When(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await PostEvent("stream-3", "type1", "{}"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail( - "$projections-test-projection-stream-1-result", "Result:{\"a\":2}", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":4}"); - await AssertStreamTail("$projections-test-projection-stream-3-result", "Result:{\"a\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_are_indexed.cs deleted file mode 100644 index 20f305a5d..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection.recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs deleted file mode 100644 index f5013adea..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection.recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_running_and_events_get_indexed_before_recovery : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs deleted file mode 100644 index 7dcbe631f..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - - // required to flush index checkpoint - { - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - } - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {}}, - type1: function(s,e){s.a=(s.a||0) + 1}, - type2: function(s,e){s.a=(s.a||0) + 1}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone.cs deleted file mode 100644 index d7790f982..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed_but_a_stream_and_tombstone : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - - // required to flush index checkpoint - { - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - } - - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_more_events_and_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_more_events_and_tombstone.cs deleted file mode 100644 index fd4462206..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_more_events_and_tombstone.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed_but_more_events_and_tombstone : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - ; - WaitIdle(); - - // required to flush index checkpoint - { - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - } - - await PostEvent("stream-1", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":0,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs deleted file mode 100644 index a2fa6f065..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed_but_tombstone : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - - // required to flush index checkpoint - { - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - } - - - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {}}, - type1: function(s,e){s.a=1}, - type2: function(s,e){s.a=1}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing.cs deleted file mode 100644 index 55fe47234..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_no_indexing : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {}}, - type1: function(s,e){s.a=1}, - type2: function(s,e){s.a=1}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - } - - protected override async Task When() { - await base.When(); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail( - "$projections-test-projection-stream-1-result", "Result:{\"a\":1}", "Result:{\"a\":1,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing_and_other_events.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing_and_other_events.cs deleted file mode 100644 index 14f584c74..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_all_foreach_projection/when_running_and_no_indexing_and_other_events.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_all_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_no_indexing_and_other_events : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await PostProjection(@" -fromAll().foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - } - - protected override async Task When() { - await base.When(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await PostEvent("stream-3", "type1", "{}"); - WaitIdle(); - } - - [Test, Category("Network")] - public async Task receives_deleted_notification() { - await AssertStreamTail( - "$projections-test-projection-stream-1-result", "Result:{\"a\":2}", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":4}"); - await AssertStreamTail("$projections-test-projection-stream-3-result", "Result:{\"a\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_are_indexed.cs deleted file mode 100644 index 551afc1b5..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection. - recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - // ReSharper disable once InconsistentNaming - public class when_running_and_events_are_indexed - : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - //todo replace with a deterministic fix rather than just covering the potential race condition #2236 - await PostEvent("stream-3", "type1", "{}"); - await PostEvent("stream-3", "type2", "{}"); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs deleted file mode 100644 index 855b1ce08..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/recovery/when_running_and_events_get_indexed_before_recovery.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection. - recovery { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_running_and_events_get_indexed_before_recovery - : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await _manager.AbortAsync("test-projection", _admin); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await _manager.EnableAsync("test-projection", _admin); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs deleted file mode 100644 index 3fe552074..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - await EnableStandardProjections(); - } - - protected override async Task When() { - await base.When(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {}}, - type1: function(s,e){s.a=(s.a||0) + 1}, - type2: function(s,e){s.a=(s.a||0) + 1}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone_postponed.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone_postponed.cs deleted file mode 100644 index bfa80e29f..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_a_stream_and_tombstone_postponed.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - // ReSharper disable once InconsistentNaming - public class when_running_and_events_are_indexed_but_a_stream_and_tombstone_postponed : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await DisableStandardProjections(); - WaitIdle(); - - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - // SUT projection must have been joined heading reader - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-3", "type1", "{}"); - await PostEvent("stream-3", "type2", "{}"); - WaitIdle(); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await PostEvent("stream-3", "type1", "{}"); - await PostEvent("stream-3", "type2", "{}"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs deleted file mode 100644 index 37f5b516c..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_but_tombstone.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed_but_tombstone : specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - } - - protected override async Task When() { - await base.When(); - await HardDeleteStream("stream-1"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":2,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_including_tombstone.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_including_tombstone.cs deleted file mode 100644 index f37a83574..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_events_are_indexed_including_tombstone.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_and_events_are_indexed_including_tombstone : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await HardDeleteStream("stream-1"); - WaitIdle(); - await EnableStandardProjections(); - WaitIdle(); - } - - protected override async Task When() { - await base.When(); - - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1}, -}).outputState(); -"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await DumpStream("$ce-stream"); - await AssertStreamTail("$projections-test-projection-stream-1-result", "Result:{\"a\":0,\"deleted\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs deleted file mode 100644 index a847c9560..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/when_handling_deleted/with_from_category_foreach_projection/when_running_and_then_other_events_tombstone_ant_other_events.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI.when_handling_deleted.with_from_category_foreach_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_running_and_then_other_events_tombstone_ant_other_events : - specification_with_standard_projections_runnning { - protected override bool GivenStandardProjectionsRunning() { - return false; - } - - protected override async Task Given() { - await base.Given(); - await PostProjection(@" -fromCategory('stream').foreachStream().when({ - $init: function(){return {a:0}}, - type1: function(s,e){s.a++}, - type2: function(s,e){s.a++}, - $deleted: function(s,e){s.deleted=1;}, -}).outputState(); -"); - WaitIdle(); - await EnableStandardProjections(); - } - - protected override async Task When() { - await base.When(); - await PostEvent("stream-1", "type1", "{}"); - await PostEvent("stream-1", "type2", "{}"); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - WaitIdle(); - await HardDeleteStream("stream-1"); - WaitIdle(); - await PostEvent("stream-2", "type1", "{}"); - await PostEvent("stream-2", "type2", "{}"); - await PostEvent("stream-3", "type1", "{}"); - WaitIdle(); - } - - [Test, Category("Network")] - [Ignore("Regression")] - public async Task receives_deleted_notification() { - await AssertStreamTail( - "$projections-test-projection-stream-1-result", "Result:{\"a\":2}", "Result:{\"a\":2,\"deleted\":1}"); - await AssertStreamTail("$projections-test-projection-stream-2-result", "Result:{\"a\":4}"); - await AssertStreamTail("$projections-test-projection-stream-3-result", "Result:{\"a\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/ClientAPI/with_standard_projections_running.cs b/src/EventStore.Projections.Core.Tests/ClientAPI/with_standard_projections_running.cs deleted file mode 100644 index c89480363..000000000 --- a/src/EventStore.Projections.Core.Tests/ClientAPI/with_standard_projections_running.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Text; -using System.Threading.Tasks; -using EventStore.ClientAPI; -using EventStore.Core.Bus; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.ClientAPI { - namespace with_standard_projections_running { - public abstract class when_deleting_stream_base - : specification_with_standard_projections_runnning { - [Test, Category("Network")] - public async Task streams_stream_exists() { - Assert.AreEqual( - SliceReadStatus.Success, - (await _conn.ReadStreamEventsForwardAsync("$streams", 0, 10, false, _admin)).Status); - } - - [Test, Category("Network")] - public async Task deleted_stream_events_are_indexed() { - await Task.Delay(500); //give the projection time to catchup... - var slice = await _conn.ReadStreamEventsForwardAsync("$ce-cat", 0, 10, true, _admin); - Assert.AreEqual(SliceReadStatus.Success, slice.Status); - - Assert.AreEqual(3, slice.Events.Length); - var deletedLinkMetadata = slice.Events[2].Link.Metadata; - Assert.IsNotNull(deletedLinkMetadata); - - var checkpointTag = Encoding.UTF8.GetString(deletedLinkMetadata).ParseCheckpointExtraJson(); - Assert.IsTrue(checkpointTag.TryGetValue("$deleted", out _)); - Assert.IsTrue(checkpointTag.TryGetValue("$o", out var originalStream)); - Assert.AreEqual("cat-1", ((JValue)originalStream).Value); - } - - [Test, Category("Network")] - public async Task deleted_stream_events_are_indexed_as_deleted() { - var slice = await _conn.ReadStreamEventsForwardAsync("$et-$deleted", 0, 10, true, _admin); - Assert.AreEqual(SliceReadStatus.Success, slice.Status); - - Assert.AreEqual(1, slice.Events.Length); - } - - protected override async Task When() { - await base.When(); - var r1 = await _conn.AppendToStreamAsync( - "cat-1", ExpectedVersion.NoStream, _admin, - new EventData(Guid.NewGuid(), "type1", true, Encoding.UTF8.GetBytes("{}"), null)) - ; - - var r2 = await _conn.AppendToStreamAsync( - "cat-1", r1.NextExpectedVersion, _admin, - new EventData(Guid.NewGuid(), "type1", true, Encoding.UTF8.GetBytes("{}"), null)); - - await _conn.DeleteStreamAsync("cat-1", r2.NextExpectedVersion, GivenDeleteHardDeleteStreamMode(), - _admin) - ; - WaitIdle(); - if (!GivenStandardProjectionsRunning()) { - await EnableStandardProjections(); - WaitIdle(); - } - } - - protected abstract bool GivenDeleteHardDeleteStreamMode(); - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_hard_deleting_stream : when_deleting_stream_base { - protected override bool GivenDeleteHardDeleteStreamMode() { - return true; - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_soft_deleting_stream : when_deleting_stream_base { - protected override bool GivenDeleteHardDeleteStreamMode() { - return false; - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_hard_deleting_stream_and_starting_standard_projections : when_deleting_stream_base { - protected override bool GivenDeleteHardDeleteStreamMode() { - return true; - } - - protected override bool GivenStandardProjectionsRunning() { - return false; - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_soft_deleting_stream_and_starting_standard_projections : when_deleting_stream_base { - protected override bool GivenDeleteHardDeleteStreamMode() { - return false; - } - - protected override bool GivenStandardProjectionsRunning() { - return false; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/EventStore.Projections.Core.Tests.csproj b/src/EventStore.Projections.Core.Tests/EventStore.Projections.Core.Tests.csproj deleted file mode 100644 index ac675b607..000000000 --- a/src/EventStore.Projections.Core.Tests/EventStore.Projections.Core.Tests.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - true - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - - - - PreserveNewest - - - - - - - - false - true - - diff --git a/src/EventStore.Projections.Core.Tests/Integration/link_metadata/when_running_a_query_using_link_metadata.cs b/src/EventStore.Projections.Core.Tests/Integration/link_metadata/when_running_a_query_using_link_metadata.cs deleted file mode 100644 index 79934c901..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/link_metadata/when_running_a_query_using_link_metadata.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.link_metadata { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_a_query_using_link_metadata : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":1}", "0@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":2}", "1@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":10}", "0@account-02"); - - ExistingEvent("account-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-02", "test", "", "{\"a\":10}", isJson: true); - } - - protected override string GivenQuery() { - return @" -fromStream('stream').when({ - $any: function(s, e) { - // test - if (JSON.stringify(e.body) != JSON.stringify(e.linkMetadata)) - throw 'invalid link metadata ' + JSON.stringify(e.linkMetadata) + ' expected is ' + JSON.stringify(e.body); - - return e.linkMetadata; - } -}).outputState() -"; - } - - [Test] - public void just() { - AssertLastEvent("$projections-query-result", "{\"a\":10}", skip: 1 /* $eof */); - } - - [Test] - public void state_becomes_completed() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Completed, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_deleting_already_categorized_stream.cs b/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_deleting_already_categorized_stream.cs deleted file mode 100644 index 2f245ce95..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_deleting_already_categorized_stream.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.scenarios { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleting_already_categorized_stream : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Greg"", - ""message"": ""Hi"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""starbucks"", - ""time"": ""03:45:31"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""James"", - ""message"": ""herpherp"", - ""time"": ""03:45:32"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Rob"", - ""message"": ""starbucks"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""put the moose in the chocolate"", - ""time"": ""03:45:31"" - }"); - var corrId = Guid.NewGuid(); - yield return - new ClientMessage.DeleteStream( - corrId, corrId, Envelope, false, "chat-2", ExpectedVersion.Any, true, null); - yield return CreateNewProjectionMessage("test1", @" -fromCategory('chat').when({ - ChatMessage: function(s, e) { - copyTo('out1', e); - } -}) -"); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - [Test, Explicit] - public void just() { - DumpStream("$$chat-2"); - DumpStream("$ce-chat"); - DumpStream("out1"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_recategorizing_chat_events_by_users.cs b/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_recategorizing_chat_events_by_users.cs deleted file mode 100644 index 449cec84c..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/scenarios/when_recategorizing_chat_events_by_users.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.scenarios { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_recategorizing_chat_events_by_users : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Greg"", - ""message"": ""Hi"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""starbucks"", - ""time"": ""03:45:31"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""James"", - ""message"": ""herpherp"", - ""time"": ""03:45:32"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Rob"", - ""message"": ""starbucks"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""put the moose in the chocolate"", - ""time"": ""03:45:31"" - }"); - yield return CreateQueryMessage("query1", @" -fromCategory(""chat"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }); -"); - yield return CreateQueryMessage("query2", @" -fromCategory(""user"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }); -"); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - protected override IEnumerable GivenOtherProjections() { - yield return @" -fromCategory(""chat"") -.when({ - ChatMessage: function(state, event) { - var userStream = ""user-"" + event.body.sender; - linkTo(userStream, event); - } -})"; - - yield return @" -fromCategory(""user"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }).outputState(); -"; - } - - [Test] - public void query1_returns_correct_result() { - AssertStreamTailWithLinks( - "$projections-query1-result", @"Result:{""count"":3}", @"Result:{""count"":2}", "$Eof:"); - } - - [Test] - public void query2_returns_correct_result() { - AssertStreamTailWithLinks( - "$projections-query2-result", @"Result:{""count"":1}", @"Result:{""count"":2}", @"Result:{""count"":1}", - @"Result:{""count"":1}", "$Eof:"); - } - - [Test] - public void other_1_projection_produces_correct_results() { - AssertStreamTail( - "$projections-other_1-result", "0@$projections-other_1-user-Greg-result", - "0@$projections-other_1-user-Ronan-result", "0@$projections-other_1-user-James-result", - "0@$projections-other_1-user-Rob-result", "1@$projections-other_1-user-Ronan-result"); - AssertStreamTailWithLinks( - "$projections-other_1-result", @"Result:{""count"":1}", @"Result:{""count"":1}", - @"Result:{""count"":1}", - @"Result:{""count"":1}", @"Result:{""count"":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/specification_with_a_v8_query_posted.cs b/src/EventStore.Projections.Core.Tests/Integration/specification_with_a_v8_query_posted.cs deleted file mode 100644 index a9ea49883..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/specification_with_a_v8_query_posted.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using DotNext; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.projections_manager; - -namespace EventStore.Projections.Core.Tests.Integration { - public abstract class specification_with_a_v8_query_posted : TestFixtureWithProjectionCoreAndManagementServices { - protected string _projectionName; - protected string _projectionSource; - protected ProjectionMode _projectionMode; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - protected bool _startSystemProjections; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - GivenEvents(); - EnableReadAll(); - _projectionName = "query"; - _projectionSource = GivenQuery(); - _projectionMode = ProjectionMode.Transient; - _checkpointsEnabled = false; - _trackEmittedStreams = false; - _emitEnabled = false; - _startSystemProjections = GivenStartSystemProjections(); - } - - protected override Tuple[] GivenProcessingQueues() { - SynchronousScheduler[] buses = [new("1"), new("2")]; - SynchronousScheduler[] outBuses = [new("o1"), new("o2")]; - _otherQueues = [new (buses[0], _timeProvider), new(buses[1], _timeProvider)]; - return [ - Tuple.Create( - buses[0], - _otherQueues[0].As(), - outBuses[0], - Guid.NewGuid()), - Tuple.Create( - buses[1], - _otherQueues[1].As(), - outBuses[1], - Guid.NewGuid()) - ]; - } - - protected abstract void GivenEvents(); - - protected abstract string GivenQuery(); - - protected virtual bool GivenStartSystemProjections() { - return false; - } - - protected Message CreateQueryMessage(string name, string source) { - return new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Transient, name, - ProjectionManagementMessage.RunAs.System, "JS", source, enabled: true, checkpointsEnabled: false, - trackEmittedStreams: false, - emitEnabled: false); - } - - protected Message CreateNewProjectionMessage(string name, string source) { - return new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, name, ProjectionManagementMessage.RunAs.System, - "JS", source, enabled: true, checkpointsEnabled: true, trackEmittedStreams: true, emitEnabled: true); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - if (_startSystemProjections) { - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection, - ProjectionManagementMessage.RunAs.System); - } - - var otherProjections = GivenOtherProjections(); - var index = 0; - foreach (var source in otherProjections) { - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, "other_" + index, - ProjectionManagementMessage.RunAs.System, "JS", source, enabled: true, checkpointsEnabled: true, - trackEmittedStreams: true, - emitEnabled: true)); - index++; - } - - if (!string.IsNullOrEmpty(_projectionSource)) { - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, _projectionMode, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", _projectionSource, enabled: true, - checkpointsEnabled: _checkpointsEnabled, emitEnabled: _emitEnabled, - trackEmittedStreams: _trackEmittedStreams)); - } - } - - protected virtual IEnumerable GivenOtherProjections() { - return new string[0]; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_changing_categorization_projection_configurations.cs b/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_changing_categorization_projection_configurations.cs deleted file mode 100644 index 885d03022..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_changing_categorization_projection_configurations.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.system_projections { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_changing_categorization_projection_configurations_to_first : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - ExistingEvent("account-000-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-000-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-000-02", "test", "", "{\"a\":10}", isJson: true); - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - string query = "first\r\n-"; - yield return - new ProjectionManagementMessage.Command.UpdateQuery( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System, query: query, emitEnabled: null); - yield return - new ProjectionManagementMessage.Command.UpdateQuery( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System, query: query, emitEnabled: null); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return false; - } - - protected override string GivenQuery() { - return ""; - } - - [Test] - public void streams_are_categorized() { - AssertStreamTail("$category-account", "account-000-01", "account-000-02"); - } - - [Test] - public void events_are_categorized() { - AssertStreamTail("$ce-account", "0@account-000-01", "1@account-000-01", "0@account-000-02"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events.cs b/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events.cs deleted file mode 100644 index 641f32670..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.system_projections { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_recategorizing_events : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - ExistingEvent("account-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-02", "test", "", "{\"a\":10}", isJson: true); - - ExistingEvent("categorized-0", SystemEventTypes.LinkTo, "{\"a\":2}", "1@account-01"); - ExistingEvent("categorized-0", SystemEventTypes.LinkTo, "{\"a\":10}", "0@account-02"); - ExistingEvent("categorized-1", SystemEventTypes.LinkTo, "{\"a\":1}", "0@account-01"); - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - [Test] - public void streams_are_categorized() { - AssertStreamTail("$category-account", "account-01", "account-02"); - AssertStreamTail("$category-categorized", "categorized-0", "categorized-1"); - } - - [Test] - public void events_are_categorized() { - AssertStreamTail("$ce-account", "0@account-01", "1@account-01", "0@account-02"); - } - - [Test] - public void links_are_categorized() { - AssertStreamTail("$ce-categorized", "1@account-01", "0@account-02", "0@account-01"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events_while_running.cs b/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events_while_running.cs deleted file mode 100644 index 32c79da89..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_recategorizing_events_while_running.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.system_projections { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_recategorizing_events_while_running : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - ExistingEvent("account-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-02", "test", "", "{\"a\":10}", isJson: true); - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("categorized-0", SystemEventTypes.LinkTo, "1@account-01", "{\"a\":2}"); - yield return CreateWriteEvent("categorized-0", SystemEventTypes.LinkTo, "0@account-02", "{\"a\":10}"); - yield return CreateWriteEvent("categorized-1", SystemEventTypes.LinkTo, "0@account-01", "{\"a\":1}"); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - [Test] - public void streams_are_categorized() { - AssertStreamTail("$category-account", "account-01", "account-02"); - AssertStreamTail("$category-categorized", "categorized-0", "categorized-1"); - } - - [Test] - public void events_are_categorized() { - AssertStreamTail("$ce-account", "0@account-01", "1@account-01", "0@account-02"); - } - - [Test] - public void links_are_categorized() { - AssertStreamTail("$ce-categorized", "1@account-01", "0@account-02", "0@account-01"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_running_system_projections.cs b/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_running_system_projections.cs deleted file mode 100644 index 3efbbfbac..000000000 --- a/src/EventStore.Projections.Core.Tests/Integration/system_projections/when_running_system_projections.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Integration.system_projections { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_system_projections : specification_with_a_v8_query_posted { - protected override void GivenEvents() { - ExistingEvent("account-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-02", "test", "", "{\"a\":10}", isJson: true); - ExistingEvent("account-000-02", "test", "", "{\"a\":10}", isJson: true); - - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":1}", "0@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":2}", "1@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":10}", "0@account-02"); - - ExistingEvent("stream-1", SystemEventTypes.LinkTo, "{\"a\":10}", "1@account-01"); - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("test-1", "test1", "{}", "{}", isJson: true); - yield return CreateWriteEvent("test-2", SystemEventTypes.LinkTo, "0@test-1", "{}", isJson: true); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - [Test] - public void streams_are_categorized() { - AssertStreamTail("$category-stream", "stream-1"); - AssertStreamTail("$category-test", "test-1", "test-2"); - AssertStreamTail("$category-account", "account-01", "account-02", "account-000-02"); - } - - [Test] - public void streams_are_indexed() { - AssertStreamContains( - "$streams", "0@account-01", "0@account-02", "0@stream", "0@test-1", "0@test-2", "0@stream-1", - "0@account-000-02"); - } - - [Test] - public void events_are_categorized() { - AssertStreamTail("$ce-stream", "1@account-01"); - AssertStreamTail("$ce-test", "0@test-1", "0@test-1"); - AssertStreamTail("$ce-account", "0@account-01", "1@account-01", "0@account-02", "0@account-000-02"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Other/Stopwatch.cs b/src/EventStore.Projections.Core.Tests/Other/Stopwatch.cs deleted file mode 100644 index 5e99551cd..000000000 --- a/src/EventStore.Projections.Core.Tests/Other/Stopwatch.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using EventStore.Core.Tests.Helpers; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Other { - [TestFixture] - class Stopwatch { - [Test] - public void MeasureStopwatch() { - var sw = new System.Diagnostics.Stopwatch(); - var measured = new System.Diagnostics.Stopwatch(); - sw.Reset(); - sw.Start(); - measured.Start(); - measured.Stop(); - TestHelper.Consume(measured.ElapsedMilliseconds); - sw.Stop(); - TestHelper.Consume(sw.ElapsedMilliseconds); - measured.Reset(); - sw.Reset(); - - sw.Start(); - sw.Stop(); - var originalTime = sw.ElapsedMilliseconds; - sw.Reset(); - - sw.Start(); - for (var i = 0; i < 1000000; i++) { - measured.Start(); - measured.Stop(); - TestHelper.Consume(measured.ElapsedMilliseconds); - } - - sw.Stop(); - var measuredTime = sw.ElapsedMilliseconds; - Console.WriteLine(measuredTime - originalTime); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Other/claims_serialization.cs b/src/EventStore.Projections.Core.Tests/Other/claims_serialization.cs deleted file mode 100644 index cd6bda62d..000000000 --- a/src/EventStore.Projections.Core.Tests/Other/claims_serialization.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Security.Claims; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Other; - -[TestFixture] -public class claims_serialization { - [Test] - public void should_serialize_principal_name() { - var principalName = "foo-name"; - var claimsIdentity = new ClaimsIdentity(new Claim[] { - new(ClaimTypes.Name, principalName), - new(ClaimTypes.Role, "$admins"), - }); - var runas = new ProjectionManagementMessage.RunAs(new ClaimsPrincipal(claimsIdentity)); - var sra = SerializedRunAs.SerializePrincipal(runas); - Assert.AreEqual(principalName, sra.Name); - } - - [Test] - public void should_only_serialize_role() { - var roleClaim = new Claim(ClaimTypes.Role, "$admins"); - var claimsIdentity = new ClaimsIdentity(new [] { - new(ClaimTypes.Name, "foo-name"), - roleClaim, - new("uid", "foo-uid"), - new("pwd", "foo-pwd") - }); - var runas = new ProjectionManagementMessage.RunAs(new ClaimsPrincipal(claimsIdentity)); - var sra = SerializedRunAs.SerializePrincipal(runas); - Assert.AreEqual(1, sra.Roles.Length); - Assert.AreEqual($"{roleClaim.Type}$$${roleClaim.Value}", sra.Roles[0]); - } - - [Test] - public void should_return_null_for_anonymous() { - var runas = new ProjectionManagementMessage.RunAs(SystemAccounts.Anonymous); - var sra = SerializedRunAs.SerializePrincipal(runas); - Assert.IsNull(sra); - } - - [Test] - public void should_set_runas_system_for_system_principal() { - var runas = new ProjectionManagementMessage.RunAs(SystemAccounts.System); - var sra = SerializedRunAs.SerializePrincipal(runas); - Assert.AreEqual("$system", sra.Name); - Assert.IsNull(sra.Roles); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Other/json_serialization.cs b/src/EventStore.Projections.Core.Tests/Other/json_serialization.cs deleted file mode 100644 index 6c60becae..000000000 --- a/src/EventStore.Projections.Core.Tests/Other/json_serialization.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Other { - [TestFixture] - class can_serialize_and_deserialize { - private ProjectionVersion _version; - - [SetUp] - public void setup() { - _version = new ProjectionVersion(1, 0, 0); - } - - [Test] - public void position_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromPosition(1, -1, 0); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void prepare_position_based_checkpoint_tag_zero() { - CheckpointTag tag = CheckpointTag.FromPreparePosition(1, 0); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void prepare_position_based_checkpoint_tag_minus_one() { - CheckpointTag tag = CheckpointTag.FromPreparePosition(1, -1); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void prepare_position_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromPreparePosition(1, 1234); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void stream_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromStreamPosition(1, "$ce-account", 12345); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - Assert.IsNull(back.CommitPosition); - } - - [Test] - public void streams_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromStreamPositions(1, new Dictionary {{"a", 1}, {"b", 2}}); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - Assert.IsNull(back.CommitPosition); - } - - [Test] - public void event_by_type_index_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(100, 50), new Dictionary {{"a", 1}, {"b", 2}}); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void phase_based_checkpoint_tag_completed() { - CheckpointTag tag = CheckpointTag.FromPhase(2, completed: false); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void phase_based_checkpoint_tag_incomplete() { - CheckpointTag tag = CheckpointTag.FromPhase(0, completed: true); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void by_stream_based_checkpoint_tag() { - CheckpointTag tag = CheckpointTag.FromByStreamPosition(0, "catalog", 1, "data", 2, 12345); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void by_stream_based_checkpoint_tag_zero() { - CheckpointTag tag = CheckpointTag.FromByStreamPosition(0, "catalog", -1, null, -1, 12345); - byte[] bytes = tag.ToJsonBytes(_version); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTag back = instring.ParseCheckpointTagJson(); - Assert.AreEqual(tag, back); - } - - [Test] - public void extra_metadata_are_preserved() { - CheckpointTag tag = CheckpointTag.FromPosition(0, -1, 0); - var extra = new Dictionary {{"$$a", new JRaw("\"b\"")}, {"$$c", new JRaw("\"d\"")}}; - byte[] bytes = tag.ToJsonBytes(_version, extra); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - CheckpointTagVersion back = instring.ParseCheckpointTagVersionExtraJson(_version); - Assert.IsNotNull(back.ExtraMetadata); - JToken v; - Assert.IsTrue(back.ExtraMetadata.TryGetValue("$$a", out v)); - Assert.AreEqual("b", (string)((JValue)v).Value); - Assert.IsTrue(back.ExtraMetadata.TryGetValue("$$c", out v)); - Assert.AreEqual("d", (string)((JValue)v).Value); - } - - [Test] - public void can_deserialize_readonly_fields() { - TestData data = new TestData("123"); - byte[] bytes = data.ToJsonBytes(); - string instring = Helper.UTF8NoBom.GetString(bytes); - Console.WriteLine(instring); - - TestData back = instring.ParseJson(); - Assert.AreEqual(data, back); - } - - private class TestData { - public readonly string Data; - - public TestData(string data) { - Data = data; - } - - protected bool Equals(TestData other) { - return string.Equals(Data, other.Data); - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != GetType()) return false; - return Equals((TestData)obj); - } - - public override int GetHashCode() { - return (Data != null ? Data.GetHashCode() : 0); - } - - public override string ToString() { - return string.Format("Data: {0}", Data); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Other/when_matching_remaining_path.cs b/src/EventStore.Projections.Core.Tests/Other/when_matching_remaining_path.cs deleted file mode 100644 index 964a45058..000000000 --- a/src/EventStore.Projections.Core.Tests/Other/when_matching_remaining_path.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Other { - [TestFixture, Ignore("Until resolved in MONO")] - class when_matching_remaining_path { - private UriTemplate _urlTemplate; - private UriTemplateMatch _match; - - [SetUp] - public void setup() { - _urlTemplate = new UriTemplate("/a/b/{*C}"); - _match = _urlTemplate.Match(new Uri("http://localhost"), new Uri("http://localhost/a/b/123")); - } - - [Test] - public void bound_variable_c_is_available() { - Assert.IsTrue(_match.BoundVariables.AllKeys.Contains("C")); - } - - [Test] - public void bound_variable_c_contains_remaining_path() { - Assert.AreEqual("123", _match.BoundVariables["C"]); - } - } - - [TestFixture, Ignore("Until resolved in MONO")] - class when_matching_remaining_multi_segment_path { - private UriTemplate _urlTemplate; - private UriTemplateMatch _match; - - [SetUp] - public void setup() { - _urlTemplate = new UriTemplate("/a/b/{*C}"); - _match = _urlTemplate.Match(new Uri("http://localhost"), new Uri("http://localhost/a/b/123/456")); - } - - [Test] - public void bound_variable_c_is_available() { - Assert.IsTrue(_match.BoundVariables.AllKeys.Contains("C")); - } - - [Test] - public void bound_variable_c_contains_remaining_path() { - Assert.AreEqual("123/456", _match.BoundVariables["C"]); - } - } - - - [TestFixture] - class when_matching_uri_with_missing_query_variable { - private UriTemplate _urlTemplate; - private UriTemplateMatch _match; - - [SetUp] - public void setup() { - _urlTemplate = new UriTemplate("/a/b?c={C}"); - _match = _urlTemplate.Match(new Uri("http://localhost"), new Uri("http://localhost/a/b")); - } - - [Test] - public void match_succeeds() { - Assert.IsTrue(_match != null); - } - - [Test] - public void bound_variable_c_is_null() { - Assert.AreEqual(null, _match.BoundVariables["C"]); - } - } - - [TestFixture] - class url_segments { - [Test] - public void are_not_untumatically_unescaped() { - var uri = new Uri("http://fake/a%24a%20/123$"); - Assert.AreEqual(3, uri.Segments.Length); - Assert.AreEqual("/", uri.Segments[0]); - Assert.AreEqual("a%24a%20/", uri.Segments[1]); - Assert.AreEqual("123$", uri.Segments[2]); - } - - [Test] - public void are_not_automatically_unescaped2() { - var ub = new UriBuilder(); - ub.Scheme = "http"; - ub.Host = "fake"; - ub.Path = "/a%24a%20/123$"; - var uri = ub.Uri; - Assert.AreEqual(3, uri.Segments.Length); - Assert.AreEqual("/", uri.Segments[0]); - Assert.AreEqual("a%24a%20/", uri.Segments[1]); - Assert.AreEqual("123$", uri.Segments[2]); - } - } - - [TestFixture] - class when_matching_escaped_urls { - [Test] - public void Dump() { - var result = new List>(); - for (char i = (char)1; i <= 127; i++) { - try { - var unescaped = "/z" + i + "z/"; - var escaped = "/z" + Uri.HexEscape(i) + "z/"; - - var unescapedTemplate = new UriTemplate(unescaped); - var escapedTemplate = new UriTemplate(escaped); - - Func m = - (s, template) => - template.Match(new Uri("http://localhost"), new Uri("http://localhost" + s)) != null; - - result.Add(Tuple.Create(i, string.Format( - "e=>e {1} e=>u {2} u=>e {3} u=>u {4}", new String(i, 1), m(escaped, escapedTemplate), - m(unescaped, escapedTemplate), m(escaped, unescapedTemplate), - m(unescaped, unescapedTemplate)))); - } catch (Exception) { - result.Add( - Tuple.Create(i, string.Format("EXCEPTION"))); - } - } - - foreach (var tuple in - from i in result - group i by i.Item2 - into g - orderby g.Key - select g - ) { - Console.WriteLine(tuple.Key); - Console.Write(" "); - foreach (var i in tuple) { - if (char.IsWhiteSpace(i.Item1)) - Console.Write(Uri.HexEscape(i.Item1)); - else - Console.Write(i.Item1); - } - - Console.WriteLine(); - } - } - - private static void Matches(string template, string candidate) { - var urlTemplate = new UriTemplate(template); - var match = urlTemplate.Match(new Uri("http://localhost"), new Uri("http://localhost" + candidate)); - Assert.IsNotNull(match); - } - - private static void DoesNotMatch(string template, string candidate) { - var urlTemplate = new UriTemplate(template); - var match = urlTemplate.Match(new Uri("http://localhost"), new Uri("http://localhost" + candidate)); - Assert.IsNull(match); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Playground/BusTestingExtentions.cs b/src/EventStore.Projections.Core.Tests/Playground/BusTestingExtentions.cs deleted file mode 100644 index a31427f04..000000000 --- a/src/EventStore.Projections.Core.Tests/Playground/BusTestingExtentions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Tests.Playground { - public static class BusTestingExtentions { - private class Handler : IHandle where T : Message { - private readonly Action _handler; - - public Handler(Action handler) { - _handler = handler; - } - - public void Handle(T message) { - _handler(message); - } - } - - public static void Subscribe(this ISubscriber self, Action handler) where T : Message { - self.Subscribe(new Handler(handler)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Playground/Launchpad.cs b/src/EventStore.Projections.Core.Tests/Playground/Launchpad.cs deleted file mode 100644 index 0441b4506..000000000 --- a/src/EventStore.Projections.Core.Tests/Playground/Launchpad.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Threading; -using EventStore.Common.Utils; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Playground { - [TestFixture, Explicit, Category("Manual")] - public class Launchpad : LaunchpadBase { - private IDisposable _vnodeProcess; - private IDisposable _managerProcess; - private IDisposable _clientProcess; - private IDisposable _projectionsProcess; - - private string _binFolder; - private Dictionary _environment; - private string _dbPath; - - [SetUp] - public void Setup() { - if (!OS.IsUnix) - AllocConsole(); // this is required to keep console open after executeassemly has exited - - _binFolder = AppDomain.CurrentDomain.BaseDirectory; - _dbPath = Path.Combine(_binFolder, DateTime.UtcNow.Ticks.ToString()); - _environment = new Dictionary {{"EVENTSTORE_LOGSDIR", _dbPath}}; - - var vnodeExecutable = Path.Combine(_binFolder, @"EventStore.ClusterNode.exe"); - var managerExecutable = Path.Combine(_binFolder, @"EventStore.Manager.exe"); - - - string vnodeCommandLine = - string.Format( - @"--ip=127.0.0.1 --db={0} --int-tcp-port=3111 --ext-tcp-port=1111 --http-port=2111 --manager-ip=127.0.0.1 --manager-port=30777 --nodes-count=1 --fake-dns --prepare-count=1 --commit-count=1", - _dbPath); - string managerCommandLine = @"--ip=127.0.0.1 --port=30777 --nodes-count=1 --fake-dns"; - - _managerProcess = _launch(managerExecutable, managerCommandLine, _environment); - Thread.Sleep(500); - _vnodeProcess = _launch(vnodeExecutable, vnodeCommandLine, _environment); - } - - [TearDown] - public void Teardown() { - if (_managerProcess != null) _managerProcess.Dispose(); - if (_vnodeProcess != null) _vnodeProcess.Dispose(); - if (_clientProcess != null) _clientProcess.Dispose(); - if (_projectionsProcess != null) _projectionsProcess.Dispose(); - } - - public void LaunchFlood() { - var clientExecutable = Path.Combine(_binFolder, @"EventStore.Client.exe"); - string clientCommandLine = @"-i 127.0.0.1 -t 1111 -h 2111 WRFL 1 100"; - _clientProcess = _launch(clientExecutable, clientCommandLine, _environment); - } - - public void LaunchProjections() { - var clientExecutable = Path.Combine(_binFolder, @"EventStore.Projections.Worker.exe"); - string clientCommandLine = string.Format(@"--ip 127.0.0.1 -t 1111 -h 2111 --db {0}", _dbPath); - _projectionsProcess = _launch(clientExecutable, clientCommandLine, _environment); - } - - [Test] - public void WriteFloodAndProjections() { - Thread.Sleep(5000); - LaunchFlood(); - Thread.Sleep(5000); - LaunchProjections(); - Thread.Sleep(500); - LaunchFlood(); - Thread.Sleep(160000); - } - - [Test] - public void JustProjections() { - Thread.Sleep(3500); - LaunchProjections(); - Thread.Sleep(50000); - } - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AllocConsole(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Playground/Launchpad2.cs b/src/EventStore.Projections.Core.Tests/Playground/Launchpad2.cs deleted file mode 100644 index 0718dfeb0..000000000 --- a/src/EventStore.Projections.Core.Tests/Playground/Launchpad2.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Threading; -using EventStore.Common.Utils; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Playground { - [TestFixture, Explicit, Category("Manual")] - public class Launchpad2 : LaunchpadBase { - private IDisposable _vnodeProcess; - private IDisposable _clientProcess; - - private string _binFolder; - private Dictionary _environment; - private string _dbPath; - - [SetUp] - public void Setup() { - if (!OS.IsUnix) - AllocConsole(); // this is required to keep console open after executeassemly has exited - - _binFolder = AppDomain.CurrentDomain.BaseDirectory; - _dbPath = Path.Combine(_binFolder, DateTime.UtcNow.Ticks.ToString()); - _environment = new Dictionary {{"EVENTSTORE_LOGSDIR", _dbPath}}; - - var vnodeExecutable = Path.Combine(_binFolder, @"EventStore.Projections.Worker.exe"); - - - string vnodeCommandLine = - string.Format( - @"--ip=127.0.0.1 --db={0} --stats-frequency-sec=10 --int-tcp-port=3111 --ext-tcp-port=1111 --http-port=2111", - _dbPath); - - _vnodeProcess = _launch(vnodeExecutable, vnodeCommandLine, _environment); - } - - [TearDown] - public void Teardown() { - if (_vnodeProcess != null) _vnodeProcess.Dispose(); - if (_clientProcess != null) _clientProcess.Dispose(); - } - - public void LaunchFlood() { - var clientExecutable = Path.Combine(_binFolder, @"EventStore.Client.exe"); - string clientCommandLine = @"--ip 127.0.0.1 --tcp-port 1111 --http-port 2111 WRFL 1 100"; - _clientProcess = _launch(clientExecutable, clientCommandLine, _environment); - } - - [Test] - public void RunSingle() { - Thread.Sleep(60000); - } - - [Test] - public void RunSingleAndFlood() { - Thread.Sleep(4000); - LaunchFlood(); - Thread.Sleep(10000); - LaunchFlood(); - Thread.Sleep(20000); - } - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AllocConsole(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Playground/Launchpad3.cs b/src/EventStore.Projections.Core.Tests/Playground/Launchpad3.cs deleted file mode 100644 index c3c20f4b2..000000000 --- a/src/EventStore.Projections.Core.Tests/Playground/Launchpad3.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading; -using EventStore.Common.Utils; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Playground { - [TestFixture, Explicit, Category("Manual")] - public class Launchpad3 : LaunchpadBase { - private IDisposable _vnodeProcess; - private readonly IDisposable _clientProcess = null; - - private string _binFolder; - private Dictionary _environment; - private string _dbPath; - - [SetUp] - public void Setup() { - if (!OS.IsUnix) - AllocConsole(); // this is required to keep console open after ExecuteAssembly has exited - - _binFolder = AppDomain.CurrentDomain.BaseDirectory; - _dbPath = Path.GetFullPath(Path.Combine(_binFolder, @"..\..\..\..\Data")); - _environment = new Dictionary {{"EVENTSTORE_LOGSDIR", _dbPath}}; - - var vnodeExecutable = Path.Combine(_binFolder, @"EventStore.Projections.Worker.exe"); - - - string vnodeCommandLine = - string.Format(@"--ip=127.0.0.1 --db={0} --stats-frequency-sec=10 -t1111 --http-port=2111", _dbPath); - - _vnodeProcess = _launch(vnodeExecutable, vnodeCommandLine, _environment); - } - - [TearDown] - public void Teardown() { - if (_vnodeProcess != null) _vnodeProcess.Dispose(); - if (_clientProcess != null) _clientProcess.Dispose(); - } - - [Test, Explicit] - public void RunSingle() { - Thread.Sleep(1000); - var timer = Stopwatch.StartNew(); - while (timer.Elapsed.TotalSeconds < 15) { - var request = WebRequest.Create(@"http://127.0.0.1:2111/projections/onetime"); - try { - request.Method = "POST"; - request.Timeout = 5000; - var query = File.ReadAllText(Path.Combine(_binFolder, @"Queries\1Query.js")); - var data = Helper.UTF8NoBom.GetBytes(query); - using (var requestStream = request.GetRequestStream()) - requestStream.Write(data, 0, data.Length); - var response = (HttpWebResponse)request.GetResponse(); - Console.WriteLine(response.StatusDescription); - Console.WriteLine(response.GetResponseHeader("Location")); - Console.WriteLine(response.GetResponseHeader("Z")); - } catch (SocketException) { - continue; - } catch (TimeoutException) { - continue; - } catch (WebException) { - continue; - } - - break; - } - - timer.Stop(); - Thread.Sleep(100000); - } - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AllocConsole(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Playground/LaunchpadBase.cs b/src/EventStore.Projections.Core.Tests/Playground/LaunchpadBase.cs deleted file mode 100644 index 2e43d318b..000000000 --- a/src/EventStore.Projections.Core.Tests/Playground/LaunchpadBase.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; -using EventStore.Common.Log; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Tests.Playground { - public class LaunchpadBase { - protected readonly ILogger _logger = LogManager.GetLoggerFor(); - - protected readonly Func, IDisposable> _launch = StartHelperProcess; - - private class DisposeHandler : IDisposable { - private readonly Action _dispose; - - public DisposeHandler(Action dispose) { - _dispose = dispose; - } - - public void Dispose() { - _dispose(); - } - } - - private static IDisposable StartHelperProcess( - string executable, string commandLine, IDictionary additionalEnvironment) { - foreach (var v in additionalEnvironment) { - Environment.SetEnvironmentVariable(v.Key, v.Value); - } - - var appDomain = AppDomain.CreateDomain( - Path.GetFileNameWithoutExtension(executable)); - ThreadPool.QueueUserWorkItem( - state => { - try { - var result = appDomain.ExecuteAssembly(executable, commandLine.Split(' ')); - Console.WriteLine(executable + "has exited with code " + result); - } catch (AppDomainUnloadedException) { - } - }); - return new DisposeHandler(() => AppDomain.Unload(appDomain)); - } - - private static IDisposable RestartProcess( - string executable, string commandLine, IDictionary additionalEnvironment) { - var existing = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executable)); - foreach (var p in existing) { - Console.WriteLine("Killing process {0} : {1}", p.Id, p.ProcessName); - p.Kill(); - } - - var startInfo = new ProcessStartInfo { - UseShellExecute = false, - Arguments = commandLine, - FileName = executable, - // - - // CreateNoWindow = true, - // RedirectStandardError = true, - // RedirectStandardOutput = true, - }; - foreach (var pair in additionalEnvironment) { - startInfo.EnvironmentVariables.Add(pair.Key, pair.Value); - } - - var process = Process.Start(startInfo); - return process; - } - - protected class DumpingHandler : IHandle { - public void Handle(Message message) { - Console.WriteLine("Received: {0}({1})", message.GetType(), message); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Queries/1Query.js b/src/EventStore.Projections.Core.Tests/Queries/1Query.js deleted file mode 100644 index ddb57637e..000000000 --- a/src/EventStore.Projections.Core.Tests/Queries/1Query.js +++ /dev/null @@ -1 +0,0 @@ -log("Hello"); diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/specification_with_js_query_posted.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/specification_with_js_query_posted.cs deleted file mode 100644 index 696484c53..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/specification_with_js_query_posted.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using DotNext; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; - -using EventStore.Projections.Core.Tests.Services.projections_manager; - -namespace EventStore.Projections.Core.Tests.Services.Jint.Scenarios -{ - public abstract class specification_with_js_query_posted : TestFixtureWithProjectionCoreAndManagementServices - { - protected string _projectionName; - protected string _projectionSource; - protected ProjectionMode _projectionMode; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - protected bool _startSystemProjections; - - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - GivenEvents(); - EnableReadAll(); - _projectionName = "query"; - _projectionSource = GivenQuery(); - _projectionMode = ProjectionMode.Transient; - _checkpointsEnabled = false; - _trackEmittedStreams = false; - _emitEnabled = false; - _startSystemProjections = GivenStartSystemProjections(); - } - - protected override Tuple[] GivenProcessingQueues() { - SynchronousScheduler[] buses = [new("1"), new("2")]; - SynchronousScheduler[] outBuses = [new("o1"), new("o2")]; - _otherQueues = [new(buses[0], _timeProvider), new(buses[1], _timeProvider)]; - return [ - Tuple.Create( - buses[0], - _otherQueues[0].As(), - outBuses[0], - Guid.NewGuid()), - Tuple.Create( - buses[1], - _otherQueues[1].As(), - outBuses[1], - Guid.NewGuid()) - ]; - } - - protected abstract void GivenEvents(); - - protected abstract string GivenQuery(); - - protected virtual bool GivenStartSystemProjections() { - return false; - } - - protected Message CreateQueryMessage(string name, string source) { - return new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Transient, name, - ProjectionManagementMessage.RunAs.System, "JS", source, enabled: true, checkpointsEnabled: false, - trackEmittedStreams: false, - emitEnabled: false); - } - - protected Message CreateNewProjectionMessage(string name, string source) { - return new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, name, ProjectionManagementMessage.RunAs.System, - "INTERPRETED", source, enabled: true, checkpointsEnabled: true, trackEmittedStreams: true, emitEnabled: true); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - if (_startSystemProjections) { - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection, - ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection, - ProjectionManagementMessage.RunAs.System); - } - - var otherProjections = GivenOtherProjections(); - var index = 0; - foreach (var source in otherProjections) { - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, "other_" + index, - ProjectionManagementMessage.RunAs.System, "JS", source, enabled: true, checkpointsEnabled: true, - trackEmittedStreams: true, - emitEnabled: true)); - index++; - } - - if (!string.IsNullOrEmpty(_projectionSource)) { - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, _projectionMode, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", _projectionSource, enabled: true, - checkpointsEnabled: _checkpointsEnabled, emitEnabled: _emitEnabled, - trackEmittedStreams: _trackEmittedStreams)); - } - } - - protected virtual IEnumerable GivenOtherProjections() { - return new string[0]; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_deleting_already_categorized_stream.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_deleting_already_categorized_stream.cs deleted file mode 100644 index a822d4fcc..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_deleting_already_categorized_stream.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint.Scenarios -{ - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(long))] - public class when_deleting_already_categorized_stream : specification_with_js_query_posted { - protected override void GivenEvents() { - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Greg"", - ""message"": ""Hi"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""starbucks"", - ""time"": ""03:45:31"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""James"", - ""message"": ""herpherp"", - ""time"": ""03:45:32"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Rob"", - ""message"": ""starbucks"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""put the moose in the chocolate"", - ""time"": ""03:45:31"" - }"); - var corrId = Guid.NewGuid(); - yield return - new ClientMessage.DeleteStream( - corrId, corrId, Envelope, false, "chat-2", ExpectedVersion.Any, true, null); - yield return CreateNewProjectionMessage("test1", @" -fromCategory('chat').when({ - ChatMessage: function(s, e) { - copyTo('out1', e); - } -}) -"); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - [Test, Explicit] - public void just() { - DumpStream("$$chat-2"); - DumpStream("$ce-chat"); - DumpStream("out1"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_recategorizing_chat_events_by_users.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_recategorizing_chat_events_by_users.cs deleted file mode 100644 index 20746ea62..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_recategorizing_chat_events_by_users.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint.Scenarios -{ - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(long))] - public class when_recategorizing_chat_events_by_users : specification_with_js_query_posted { - protected override void GivenEvents() { - } - - protected override IEnumerable When() { - foreach (var e in base.When()) yield return e; - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Greg"", - ""message"": ""Hi"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""starbucks"", - ""time"": ""03:45:31"" - }"); - yield return CreateWriteEvent("chat-1", "ChatMessage", @" - { - ""sender"": ""James"", - ""message"": ""herpherp"", - ""time"": ""03:45:32"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Rob"", - ""message"": ""starbucks"", - ""time"": ""03:45:30"" - }"); - yield return CreateWriteEvent("chat-2", "ChatMessage", @" - { - ""sender"": ""Ronan"", - ""message"": ""put the moose in the chocolate"", - ""time"": ""03:45:31"" - }"); - yield return CreateQueryMessage("query1", @" -fromCategory(""chat"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }); -"); - yield return CreateQueryMessage("query2", @" -fromCategory(""user"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }); -"); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override string GivenQuery() { - return ""; - } - - protected override IEnumerable GivenOtherProjections() { - yield return @" -fromCategory(""chat"") -.when({ - ChatMessage: function(state, event) { - var userStream = ""user-"" + event.body.sender; - linkTo(userStream, event); - } -})"; - - yield return @" -fromCategory(""user"") - .foreachStream() - .when({ - $init: function() { - return { count: 0 } - }, - ChatMessage: function(state, event) { - state.count += 1; - return state; - } - }).outputState(); -"; - } - - [Test] - public void query1_returns_correct_result() { - AssertStreamTailWithLinks( - "$projections-query1-result", @"Result:{""count"":3}", @"Result:{""count"":2}", "$Eof:"); - } - - [Test] - public void query2_returns_correct_result() { - AssertStreamTailWithLinks( - "$projections-query2-result", @"Result:{""count"":1}", @"Result:{""count"":2}", @"Result:{""count"":1}", - @"Result:{""count"":1}", "$Eof:"); - } - - [Test] - public void other_1_projection_produces_correct_results() { - AssertStreamTail( - "$projections-other_1-result", "0@$projections-other_1-user-Greg-result", - "0@$projections-other_1-user-Ronan-result", "0@$projections-other_1-user-James-result", - "0@$projections-other_1-user-Rob-result", "1@$projections-other_1-user-Ronan-result"); - AssertStreamTailWithLinks( - "$projections-other_1-result", @"Result:{""count"":1}", @"Result:{""count"":1}", - @"Result:{""count"":1}", - @"Result:{""count"":1}", @"Result:{""count"":2}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_running_a_query_using_link_metadata.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_running_a_query_using_link_metadata.cs deleted file mode 100644 index 24707c6ec..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Scenarios/when_running_a_query_using_link_metadata.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint.Scenarios -{ - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_running_a_query_using_link_metadata : specification_with_js_query_posted { - protected override void GivenEvents() { - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":1}", "0@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":2}", "1@account-01"); - ExistingEvent("stream", SystemEventTypes.LinkTo, "{\"a\":10}", "0@account-02"); - - ExistingEvent("account-01", "test", "", "{\"a\":1}", isJson: true); - ExistingEvent("account-01", "test", "", "{\"a\":2}", isJson: true); - ExistingEvent("account-02", "test", "", "{\"a\":10}", isJson: true); - } - - protected override string GivenQuery() { - return @" -fromStream('stream').when({ - $any: function(s, e) { - // test - if (JSON.stringify(e.body) != JSON.stringify(e.linkMetadata)) - throw 'invalid link metadata ' + JSON.stringify(e.linkMetadata) + ' expected is ' + JSON.stringify(e.body); - - return e.linkMetadata; - } -}).outputState() -"; - } - - [Test] - public void just() { - AssertLastEvent("$projections-query-result", "{\"a\":10}", skip: 1 /* $eof */); - } - - [Test] - public void state_becomes_completed() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Completed, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/big_state.json b/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/big_state.json deleted file mode 100644 index e59aad408..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/big_state.json +++ /dev/null @@ -1,3685 +0,0 @@ -{ - "Items": [ - { - "Id": "0", - "RandomData": [ "H8F1EM1I686BNBZMMJ3TRMI64BP2Q5QD", "ALOKH6GB7XCHZ915ZMVWNTM40J7C681B", "R3ABWPFQD2W3JAH4KUCEK40R9TU88DE8", "5B069ZIKHESU7SVZBD2M6X1WCTBC5GR9", "YX7IKL4UL27FLFTQ8465L1CIKE3PYGOA" ] - }, - { - "Id": "1", - "RandomData": [ "WT6JUMP0IHAD0VK79UDBKVX6VZ8FRO6F", "N6S2IK5VOGXD18SY35QDCN0B5AY5OJJ3", "L503DSZZYRWE8UFXHJMV82DAGR6IVAHE", "6425IYVLG1OU0WDL4BYF7X4T2ZWVVQDY", "KSHD1JOSYAPHNSJUOUNUMBHJ9JDSB90Z" ] - }, - { - "Id": "2", - "RandomData": [ "X0JIO9TVWFR6HXFJPCHADSMIK7ESG6QY", "KZTXIBFPB28GUKBLD3D91ZWFNA7R4BP0", "Z2WSESBO629KUGYA52PM3R6UCOJHDXU9", "MIQ1XTHV2YC90LUHM7WBVC6I6CQZI3KI", "I98LZ6MMV3UEO7303C5GBSNKLI5VDRN9" ] - }, - { - "Id": "3", - "RandomData": [ "O300NJSPUJQ2S238IZ6G7EG0VYAQB1IE", "QVZUGCMUTPW2BV1TO7MNUGBKWAFZJBO2", "ALL7CJ1FMMWSROYA6RBEO5TJUP7G7XLS", "B31ZJ4QFFHAIUS2IME229KNF2BNWLVHZ", "BDQYX80CA68H4LZBXZ324ST1PV7HQ34T" ] - }, - { - "Id": "4", - "RandomData": [ "9LHQCEUNO01DLGLQMM9V1O4SUZICASVH", "BPHTEJ9SFPOE1PPJKQ5E3I1UQZ5M5SN5", "EUB582MCMQQMA00EJ81TXRN3XXCOOWWX", "CSAHOULSE21M1PU080C703HWGHHKZ7Y0", "33JRZT0ZWJP4ZABICMQXTZ6IKNAGMA2G" ] - }, - { - "Id": "5", - "RandomData": [ "EBS8FCAPANLRON6FG9IMRAGE6AGLSTNV", "QJ0YSDC9MBXGOP47Q4AM2PYD5OBF6Y6R", "AZAFWIXC6IAQN90RGI5YSA2AUX3EB7DX", "FFGYOZLIG7QUPIZ5XU8X3H896AU9PTB9", "EMKI3BCR7WRUTHVL77QR8P47GG1OEL2X" ] - }, - { - "Id": "6", - "RandomData": [ "6RPC8RCVRR0G0OQYPJBRDTAZSNBWKYMV", "44XC2TNQ54AQZXG20C94JKTMQ0TUQPL2", "FEM60N665VWITTA4GI6HZRLTKKVB929Q", "SHLULKBNGD9YYL36ZZOHTEDX22WQ146D", "VGZMIPS6GTBWSX48RYLKO16ODY1SYVVL" ] - }, - { - "Id": "7", - "RandomData": [ "G6CSVQYKGSAADREF8X8CSWY4JLIUY9HV", "70PWVMNAABD606LWTWUAXS2UHIJKIEVG", "KPCNBSUWK7CRS2DM9VACOH7O75PMCD25", "Q7WL38VBC80ZQLBPF6KWDT1CRXPGDHTG", "FGAUG2SBA99QQI8W39HG2F26FT3GTP75" ] - }, - { - "Id": "8", - "RandomData": [ "PTUJKQJNNIWDTLWJY2MD9NO9OEPX8MSV", "BEA7XZMN042TTYM47TR0D45CFU5GBVOB", "0ABPKYV9P8MFU4PZ1UZP51SHJ81C4GLE", "Q13SX7TI8RKES0RLFFOQ59F8S4FM7SFJ", "XHY3B7C3BRQNQOZSQQ7Z14IQV4A22GKP" ] - }, - { - "Id": "9", - "RandomData": [ "MBQKBYKHCVPOS2SEFW5RUQR28IHG6KB4", "GBBP7OR2FZWGP483M6XFL345TXL3RDL2", "TVHQ1CG0FDL53LNEJO4AW6TNHG5JDYKC", "O4W4XRCJZ79HS9BHKHTCIKFXB4JUG6WQ", "2IQ9ZTR2MVKZ6L4HEY96FI3DZ823HRC3" ] - }, - { - "Id": "10", - "RandomData": [ "KSPJSCS1000WAQ109BQS70LUOMK01YU5", "TRON6VZCFHFORGDIHB3GAT6TH44G22AC", "G5DTBN4NMONZU6CHIBSZ4O49U4GB0SJN", "HDIWDUG3HQ3WGG8K1W70JKH1AD8HH2W4", "EARQYQEY4YROUH3O65KEUTD76QV9W9WP" ] - }, - { - "Id": "11", - "RandomData": [ "39SFZRVKRJ6U23H2KTLLRSJV6UUH5FB5", "CCUUZXZOJ9WKWTECJ2ZCYK7K07JE7OPM", "IBR0IXDW46BS588NQS8CQ9G1FJ42OUQ5", "TJCVBO3WZCH1IOP185YOQN6I4ZV92KHJ", "QG9V6MMCZMNN1OT04C3T6CPGN31L243O" ] - }, - { - "Id": "12", - "RandomData": [ "58LCP35WTWZDASRPG5EZRYNN02ICVAJ5", "S8S3DQKBHGAKNLG5MLE7ZD7GU7LXV3BS", "M3VBAYM0UDSKYDAPWNZJ5LFPBLIFEXQO", "FR7T0E4Y9ONWVWSR76AHD1WBYFAYPHV7", "WDFGFRYSSBKR8T3O31HHWIKN454UDGI2" ] - }, - { - "Id": "13", - "RandomData": [ "2P9RRLLQHSZBRFDFMW5Y9OKO32LJWEOL", "3SZSTM6RP1AESI5Z2ZIRLU2OFVYZAB4D", "DNI9QUWAZOIHNF5U6WQ666AIZKN7XHRN", "76BFA6JIDH27LVA90D3NV7HGN9JFGYMS", "65KRE0U9NI2YEC7EKOGTOD29Z41AWDCO" ] - }, - { - "Id": "14", - "RandomData": [ "5KAQKT4AT3ANESBKCF42S2D3CL1J8TMJ", "GO24CR41TFAUDP4G2Q8RJJ6CGHN91UC9", "Q1H00HIUKDIM2S0XQVRSV496RZY5D5A8", "DAEMIDQVHNHGBUKXR0SGDTNV1KJATNQP", "DKI2ONONE6KIX357PANNN34TWSV74QC4" ] - }, - { - "Id": "15", - "RandomData": [ "61D0LSIDLEBHJF77PLUS9DCJPYF52RTY", "4PM60EV71KCI2XKRVYRS5T42Y3LXMNK3", "VNN43BGL0X0ZB4R1OYKE9B2KUTH638UO", "9IWOKQYURF1I3F14MTIYCG3UVCJJ3JS1", "CLZ2HCR8A0W3JTQO1NUJZ6L3OC2HGO1I" ] - }, - { - "Id": "16", - "RandomData": [ "XAGSQ9WJCKYMTAKCW4SPZICG96OEKJ1V", "9OGJM8820KHPH9JO10VL5LTP8ASTUS92", "SCNF3BZY50YOBW8AX9MTYPZX51LMQPHI", "LO6FWEU0B6QFWEOLCR6VFQECMZJC0NIQ", "SQDW02OSPWS19UB0N9K8TWD5K3364S9X" ] - }, - { - "Id": "17", - "RandomData": [ "Y9WFB1VJDNFS7MD2XTZ0CJ76NIL69RY7", "W4C975YVOB5FQU770AIK3JVPC023PYJV", "YI6CKD525DLBO1Q2KOF9JNDNJX6HD4FZ", "1JQHY4XXFQPZ7TALJ9TBTKMLES3WGYZA", "7VKEKIEP1S327OPZXV7DLEGQ7FCFBAQR" ] - }, - { - "Id": "18", - "RandomData": [ "1P1MJ5BA5DKBQTN0DE9V0VY3P3HEG8O0", "BMBSWDP1T6II3FAN2MC6B50F176QX646", "YU9ES5DAYHB4NP9K24M46RYGW60ZG8EX", "CLTJF646ICI4351L7WX3UA9H53RWEO3Z", "DO2B50E69PV4J3M0EO1ULKCBLMNLOI23" ] - }, - { - "Id": "19", - "RandomData": [ "IS1PDZQHR13FOF7CR1RZXJO2L0ZSM3S1", "X1V0C6WO8TCTQ7XGOL3X0CG9E9EN975X", "JCSWTHAVED1DG4LNDTEA95AUUWWC2JOB", "YOKOPAWHLISXKD2JX0JQ34XNC7B7V724", "Y0O1U78C76Z1MNJR3NPB98I406LS8YWO" ] - }, - { - "Id": "20", - "RandomData": [ "PX8UZAZ02HT6E6BZXUEHR050RUAXVPDI", "KLLZPZ12YZJ2PLZ45W4OUO6Y2HCF9BEM", "DKV3ULJ82LT2RCLF4G18UZX6PX6HWW2W", "U7ZE05JUM6VI4DH066K3KF1NXZO7OCLF", "T7ITMHP86HWYDOBLPGLZM9LOGLRBRMFK" ] - }, - { - "Id": "21", - "RandomData": [ "UPZ74YNYRL6DTDKIXCRI1W3UV3NB0ORT", "CMDXZDR13WIACI5DBJNO56S8WFMBKM8D", "4MAH9WSUVZPFN2RM7K9QADYF3EBT0PRQ", "XFGZHYDP032GRNU3XADANRC1Y5O4U93G", "I8RIW1EJGU0HKRYPUH50MQDFCPBMJJ40" ] - }, - { - "Id": "22", - "RandomData": [ "AW8S5LG6534315QGG8KNDC415MGH0197", "Z9HXTFUIA94SVKOH84FL8RX72GXSF9FD", "37D1Y2XBNBMDHLFU88J5WY8IMJ5MSBCB", "31ZYGWSFHE87FUZRACUH0KRF85PO7KSL", "9KJQWQNLQDYRZBD2UOLPR5LTJT0LHDI6" ] - }, - { - "Id": "23", - "RandomData": [ "VW74KI4TYI0WW9P72X4S8D4D80HC0CEM", "416DDISLT21IEZ6JD3TUJZ7S236TB23W", "EO14DM3TFT9GMV9J3797STCF3NLJL8J1", "8EEZ7CG1A9PZ01GG4WZE36EULWBZBTHG", "KHIHQJM10H7SENOCHEOZIE8CAUOKBQZQ" ] - }, - { - "Id": "24", - "RandomData": [ "1IPST8ZVK8OV9VP8I8S6ES7FJFH65C0J", "SQ1576TIP3OK0NDOEPBC82MILJIN130I", "HECS4UALPJRLEWP6C21PAYKZESUXXFRV", "DGDVKUUUOZWZLAEY4MK8BKIT3MOMANYJ", "15I8T3VSIGBKBVODN53L4TU28T27FIUB" ] - }, - { - "Id": "25", - "RandomData": [ "BN7P2GFB0204J7SI8K8ETNOILP9ABXMA", "W9IYX9KGZ2UC2ZSABT95JPRY8ZENGF9D", "Q0IJZ4U9A2P12MPV699RYR0GSUZ8479U", "2RWCQJLG8A5RA05WJSQHFSP99C1EEWEC", "248L0NEXY2SXVJF1YDZMR2OKCWCORGBM" ] - }, - { - "Id": "26", - "RandomData": [ "62ZG1T55N2TN91N079QB61U9PYJDK0FR", "0G03U8AEH38YJBLKJMRRZAPEHZ1DK2VX", "XBW2AUF89L3D360NM937JX2Z0WV4H74P", "IKBIOSJZHSSNHMLL9N0K8XO9J6BO8K0C", "RN4S4R94ZD00FOSOKJ54GTRU6B9RR406" ] - }, - { - "Id": "27", - "RandomData": [ "2P63R2QRO6U47X44OXEZP5586KV3SRM5", "N380SY6R3NQK8WWIHED30BR6T87HGX97", "TZRDZEM01W6BOU9KXNVNNTELMBGT0YKF", "OT1JESTD2MCEFPR98XU3CVT9UG1Y729C", "L0X520FE4RVBRAF7THVDERD2A1Y814F9" ] - }, - { - "Id": "28", - "RandomData": [ "N92P2WGISP9U9SSUA4F0H584W44ABGM9", "LWXRI0E6AMVYRT3SJE77ZP1RA8281FGL", "C9IN4ALKZIZ5KJMDAM17IPK64GRJ7GF5", "FJWRKQXI2WIQZ6G0VY7ONICXZMSXTCNS", "D4ZAX52UYTFWH3G890YJJ0R7G8288AY0" ] - }, - { - "Id": "29", - "RandomData": [ "JZN5HFC05MZ4DQP5FTX2NEIMM24YC4WY", "4PMRQL13Y7N7AW30S63OM6MFQASOLNXB", "ZBAXE8O324EP0LMZ8EFFBIM7CGAQ2MSK", "KLH9WFVUS9WS16OFY2QHHRARYCV778AP", "L4FODND2SVXBW4GG252A6KC2L0KUUYXT" ] - }, - { - "Id": "30", - "RandomData": [ "8GG719BKZXZW48545OEBGATB2MCNCSI4", "8DDQYJP24RKIUP8N5PYGTVN7WEFO6XHG", "P5Y04PGW9MHZ0KQMNZSX4BKM0F3TEB5G", "JD3Z1ITPJBHHNYHMX2AHEUMNUL9ZVWS8", "QAPXR1UFGCN34D9C8R5LAYBY1QEPJ34X" ] - }, - { - "Id": "31", - "RandomData": [ "SJ0MIU46H5BCHTSRM61E0H72915BWF5M", "I0KVNW4NW9DFW9RH7XDMCZ6LL8NRY3KC", "9Z3RI6D0CNS1D2F9KXD8CTJS38KPIMZ2", "YBG7FA9ATNJYHEHT2NHAZLAPPKXKWYRZ", "YZCCVI3JYDPYJVLZ00W4FYDNA0R5MZN4" ] - }, - { - "Id": "32", - "RandomData": [ "5TASCF7TU7LW6LF498T5CWUAWZB50879", "ZU30U3WV3DKIMQRZUX5OFR2J9A6NDC2V", "AM6MSPJGL7C9LMXFIMKDCS3H1U0U7JS0", "KZIAUEHFOZDHP37XM0E02ZSRSYU8YYJB", "PLZWEWUDFFZMOV28WDIGE18UG0S5UJQZ" ] - }, - { - "Id": "33", - "RandomData": [ "QC2DEKS0GBVWAGD66VLUQD6YMEQNEZS6", "Y95M3Y4MVR9CGLUAWW9875JNFD093EVQ", "TY8AK0CH1898D3SAUQ1SZT820RHZ84TQ", "6STRNTZ6T2G96KKLVZPMND19ZFK2TMJ7", "PTCUKAXA0487M96PH5EIOGC21U1HJ7MG" ] - }, - { - "Id": "34", - "RandomData": [ "TJUMI0BVCPWSE3W0J4VXIATJRK2ZIQ13", "S2ODOTHQ4SG8TTX88A7OMZ8S0K588LMW", "Y2AMOSM0XE3Z4UZ7W31HSNR236NDXJSS", "FUK1SKTPYH0H6IYFV7LEUFDKLHTSFICO", "WKUKJ8PLKMSKWJ6VHIS07N8AQ9PK1AJQ" ] - }, - { - "Id": "35", - "RandomData": [ "FMUVYO5XS94HW3YCK7L7ZLQJLT3JSEUK", "CCFKYL63M4I8T0OWLN93ZM036LKEUVEN", "PTFTYON9BRU4DRZUFH8FF0U0LLNMB1J1", "Z5S9V487992H16ZOWZ9NX9HZ9OIMAA8J", "I3EI809LIAFF8N8PV90L26D0X3AHVW79" ] - }, - { - "Id": "36", - "RandomData": [ "AS971RP5ZYEX4C1WP30BJWRL0OUFZ2ZW", "CGEPNAYET4WD1Q6VCO1256ZNBXHM6KG7", "9SUY7LIOEWROAOUKS9CLB60GQ0OZ3LHI", "YYEJ5IY1FMXJOKNXD747I46C2OHG7TV3", "OIZLJLOKLLGYJR1FN1V5RKA42CQQAS3V" ] - }, - { - "Id": "37", - "RandomData": [ "044FUBN2SUW7XH2LXC2G70LEI5TH48J2", "RU8OWVUMN3M7YDGUJF28ZWY9S07ZSF8U", "K3PDJNYBRQ2EONPFZ88YFLD46865Y53I", "41X5XDL5R1QJ4TVFL2ATHKO90UGLR3NW", "WUJW0URVXCHO43AMM0U54KAUNYED79NX" ] - }, - { - "Id": "38", - "RandomData": [ "N4WJJ9O0KO5FDAE6T380JR1LTZJCPOYX", "YTBAH1CNM3VQP5RMTITDBWO5CKZUZMK6", "0HQT8DY20UOP6L6YH6SH4VWBFG76BSYA", "SYZHO7NPT1MQI881OAM23DBFUOO2G20I", "6O7HVZJKSCXDIG3HHGSBF5GPXUWATVJ1" ] - }, - { - "Id": "39", - "RandomData": [ "BET4A0FY1CK0Q76OVGV9JZCBHSUACJ07", "25CEX8GRB3JDVP80YIOMAKRLBRWSGEWS", "LM7U510WAD7QP9Q1T4M35N7SO0DGMXL6", "H11IRO46R1M6MB6BA49L12W8OPGEYUKM", "2BIYIHJF9QLDBBFM4BFRY9EPE33CH0H7" ] - }, - { - "Id": "40", - "RandomData": [ "QADL3I32U3MLQS7NJ3KWP2X363TPOH7I", "JOXB74TWIM65X38W5Q2NQUSYMKP9YNON", "6DCC56QPKYNC62GC47T7OT2Y69YWPT75", "8T8T16099ND2HP1TEME14Q9MLNF6H3A1", "0SEN3WK8GT8BQAQRHERCOFBRTWIN042F" ] - }, - { - "Id": "41", - "RandomData": [ "MMBYKOZSCGUKS76L7YZCM7MURX3HO6HM", "12YD82G2P9AIV08WZ7QCFZ3P9QHXVSDF", "8HS0J2MFS6XM7E90YGSRQFHC8JERUSG6", "55JNIIN6ULTICRR5RR9OAWY3AQ19Y5U9", "Z0QC4WRP3V6EV99Q2IADT16IGQM1RNIZ" ] - }, - { - "Id": "42", - "RandomData": [ "1USLBOA49TVP0UHAQKHP4QP74H6OJZ8Q", "MHNBQYPNIFEAGQSVJLLGF24KEUQ3SWVJ", "VECSGFU244HZMP1NYKE7O1KTNC76HW4V", "T5OBO9PD1TMLVE8Y3DEIRY434SFDIYUI", "9VFQAZ9Z5AF5P88IEICERWD5BUH54L5D" ] - }, - { - "Id": "43", - "RandomData": [ "8DL99RYEDPMQS8O5U79AVQ0NSJPPRD4U", "FB7LX9JXT8ABJWNCGLK6L5SSM8RZBIW9", "U2LQBDIVYMQXPZD56NJG28IJTO8YRTVL", "LAQRL6ACCZI9P5CX5W2Y9PHWTB6XEUDE", "0ELOIVT9MGDD0I4YLL3516M5347J9N8S" ] - }, - { - "Id": "44", - "RandomData": [ "WDIKTYPJC2L2MD6LHIL30HN42PVNYKA9", "IUQW9TEX6U38VTTZ8WC1CE1P0OSECBV2", "2MU1XJLXDX7GNPIJ55PCII6D3B6UB9U4", "8BFI92BYKOYOHVBLGJJGVTUUPR8WN1WD", "CCHMJAKD3113TS6H9VO20OJPRV3R3PLS" ] - }, - { - "Id": "45", - "RandomData": [ "2VLENYBF9FM410A7U0W2M3MY325YH2JO", "QJB8G14LTI3UBPY0U56D2SF8IWLU2M8G", "68OSYC036LIEA1XOEEEL5GV7DD0UPJSG", "JWYCAFBRFDGRKB7Q87QXIXLZNROVMGNW", "3B4ODVN8DWF19DWBFJVS348WK9ZT0PF9" ] - }, - { - "Id": "46", - "RandomData": [ "ZUYJHTNNTRUVRTZJ4NQCV429CHDD63HX", "RGCOPN3V6H9MJME0JPYN9CN42ZG9PJRZ", "J7ELRK3RT4GN5QZ0DN4QE4YO2HW0G4FW", "0JCMI3I8VH3E5A9L9Q6COAUPJZSKYDKZ", "YUXWNNSKE657ATS2IL007DH0YXDSK8KS" ] - }, - { - "Id": "47", - "RandomData": [ "6EPLMM8W7W8SFXOZH0BMMU1VM77ZKA9F", "WMB6DHP5NE2LEZVBJNKU77FMM39POIM7", "W352WRVAKG9H1QRWM6Q6ZPIZHZUJHAQF", "25YL42O11KJ078U5MNDS1PIHUGV77M2K", "Z4P62F1TRYFOFR1JEY7468NNXR0YHR4P" ] - }, - { - "Id": "48", - "RandomData": [ "S9BDSYDGVTADJ3BDPL2IO8N0RBIKPDLA", "406GPX0PU0JN8JD3PXI5YVAUWLWRP21R", "IAJT75X1VNXYYA2H8P515PLIZLUEBJA2", "82E8AT5UARKL7M5VSPSA7AW2YA4VLT0M", "N5Z654GOTK1NF9KNQ8VW0948FMJ9ZJIR" ] - }, - { - "Id": "49", - "RandomData": [ "178CW80YIEQWJIXYZRFN7DWNB00SUGYK", "CKWHBI0SH6NVTHZ7ZUKIE5TXLVA6HHDB", "QGU8WPXR1XFA0A43B33A6QFG085QI3KA", "3LFMW0KJ72QR0T7L0G4ONDF9AOIYTHI7", "MEHO5RGKSTCD9XPHBUZB95WZGFLISW00" ] - }, - { - "Id": "50", - "RandomData": [ "TTEVLSPJ9T53ABAM8BW8RH8QSRIZF825", "3MTQT45SEQBPA2YEF8KRA1IMVYD4K0DB", "1AAYRU3EFE3BGTQZ2DUHXL5CEH440BIO", "MAX92AWVEGL57GGCHOBGG6NQE7TKZ9NE", "5PYG5Q62Q9CR99E8B2XMABIQWH55RM5F" ] - }, - { - "Id": "51", - "RandomData": [ "2HASRAG0RJZG45QE3VI6LAE4GITXVBKE", "D6Y29WQBV640LBW010C6D832DFLJQTFQ", "8VD7HYEGEHLPFNSEV2649OAEC6Y3KHUC", "0O208YTDV526XOW0XHXXXLQUV85K9L66", "WJZ0U2G7J3IEWDRYJ8GDT7PO8IF93IDK" ] - }, - { - "Id": "52", - "RandomData": [ "85JOY5F5A0O3DM7RRHAAF3MZ4K2MXGDA", "Z7F04D9O3KC3TVLVKXSVICFFSUTOD2I3", "WNEFHHXOHWH40TGJ8GB9YS2W29IJTUKA", "CIGFQGODADOV5LO8OKP61JEEVRNH8N4W", "LG2SMB22188UDG0RUJ4IFOJ2DCT92HEW" ] - }, - { - "Id": "53", - "RandomData": [ "J1JZS6VNSXF3KUAO06WZSWR779OKR29U", "3LLM6B8YXRZRIPRTBEI6UPDWJM2SRL6Z", "YU99IYRZ78BB6AYRR5JMUCAOHYCUJPGM", "VA2YQSKNWT8VNC0JXKAVCTFVUV1TV6QS", "1YQ6HAA9U5ZAEOAF8278PVKC4HD4111Z" ] - }, - { - "Id": "54", - "RandomData": [ "DQ4ZW3CWJBBG3FRGVWV29RCGOOCA6GI3", "EA7XTLSE0KYNTEIZZ7JEG80VNXKI1B0D", "3IC3H4WKDQBY3ZWJFMK96DWFJLJ5AKMZ", "UUULCPR5K9B06B2YBBCP00G0V6T6U0J2", "DMEIFLHZ5PZ7B6IITV49H784N30F5VKT" ] - }, - { - "Id": "55", - "RandomData": [ "ZIWU7TT03MULBJYYYLN96KUFOK5LVC3J", "EFH2JYK9CEF5NW2EFBRUHLXPXQFWYHF1", "SKG5B5O9AN71EZ21R0GTUJC3R2F2TXL4", "9NMDQ7DJWRU4N6K8YNF7BVGJHMNI0WQM", "BD11NYLTW77DZIPVSGEFSN2OHC5DT5SA" ] - }, - { - "Id": "56", - "RandomData": [ "AH2KETV9BVLEXDU9620URL4YKNTK3IA1", "O7CRPFR8VED6CY1DS5G0E8SZNEA09KG3", "VTZZADU1L18NH7VVWP18BJWQPMDLF09K", "8KLS9BCPLPPN9FSPSOETTI1L6JKY9IWV", "2YO7WDWUNMWW4JQK4X20VP10S9VZ1OPC" ] - }, - { - "Id": "57", - "RandomData": [ "23VL0V3P1TGGVFQX2A4MQ59M6YPXR638", "7U4BYFTJ4N9CJVEMT870UCW64IOBFG84", "ZHIALP8XQVRC67DLTCDS9CO487HP0SDY", "PEMBMEBD9KK8VT96FDSDCP5W2NCNIT68", "R3X2UB8PAATY2PJO7KJXAAWAI0I8BY5Q" ] - }, - { - "Id": "58", - "RandomData": [ "NMQ16HMEECCB5G4MEYQ8JJ8RHXU429OM", "FDLQ9RS07FT77UEB554NH6GEN9UIXSLE", "YZ625ONWG0BD0AUWTS86FBEI6GC96JCO", "4OJHYLGRRIGR5CONP8ZFUO9XVX5ZMOZ6", "XWJL1M8HMQO64XN31YU8T73PPVWAPQFD" ] - }, - { - "Id": "59", - "RandomData": [ "SJ4I3DVC9S3D9C38KC7X30NZ246FZ815", "LKOU2EAYDR9AEZPM2YZNSSK26EP9GPNB", "172YYJFGBJTL1NVCOUNBINM2AVXYYBRX", "E7JH70XTSTMJ88ATTNUWCL2NUAYCVRR9", "16H3DOFX63SZBD4BVEELQ5U2F6W6CV8B" ] - }, - { - "Id": "60", - "RandomData": [ "CMRB1GPFH60J3DLRFWRQNGT5MPYH2IVK", "5RXYV2KOZ8DTFL8CUE1PERY63WZLSIN8", "LPNMQW6NMC1OC90BQWXXRGGO2159C86Q", "VEIZ7WW7INDBZK345Y56VZRFI9TY16KN", "GK270AD3AZPECFYS7BDOD955XCR7D7FL" ] - }, - { - "Id": "61", - "RandomData": [ "C04PR6D4UC65KNCDLA1Z26KGO6JXTGZC", "TEBMKIBA7J3BDAVKAOWDFPSFPYAUWPLO", "M3LFL02C912TDICOL9XFUW7EW56WIQNR", "7OYKZP8KVTDOX8BHVVJX2F4Z5HTP3F4S", "NKVZU2Z5BNTASTQX4ZBWH0Z1T9OR5SQP" ] - }, - { - "Id": "62", - "RandomData": [ "YVANMMW36NWOW4GM06VDEILWU4GVNH9S", "6EM7SCKRCIZ4EKFZ2C196NLQJO2SFBQZ", "NDSSRI4YVDA5SQSJYR2KQAVT25XEJ2MB", "2AQA2XHTIDO2MP826S4YJFINR8ZWU0O3", "19DRARRAJICNV2HM64H07Y2W1DS37V9S" ] - }, - { - "Id": "63", - "RandomData": [ "YUBMMR2PB3OAD51Z1NZZSX5DGQZ78XCY", "JUYA14APC2ZEJ1T6L3CU5J9BZ7F525QN", "1Z0SG076MJXZ713P72VEVR3AUXL3YFXG", "LMNUBAZU6FIWVKD8E089JM1J608TPEIH", "WQNVOJN6DAIQJHOKTNZ7GY69UDYKCFF1" ] - }, - { - "Id": "64", - "RandomData": [ "7A9E6RT5MC6JEL9YLXACOKA7TOBKUD37", "5QTJHKOB34UE2X5IE99OFDNW9CURQJKJ", "I8OX2ZRBJ8IU06F6T2FVEP11D6KFZ6VT", "TK63JHQOS7EH425C6Y8YDZF3GWU5PMLN", "NZBP9LWMM1DGKU7LBHIA87Q4FCWWWU9F" ] - }, - { - "Id": "65", - "RandomData": [ "W13F1QDVCVLMV9TWZJ4IELOQIGJ7Z9Z1", "17US01UUEX8MVDIGTA7N01BKMN6UGF6C", "6UUYOA57ZJDRMC4F7DNYCMBA6JFN59N8", "16QBSU1SF9YQXT8KS1WD2HAUSU1F5RCZ", "6F0QW3WNL4SCYUMMK44DNKFT55S72WXX" ] - }, - { - "Id": "66", - "RandomData": [ "68US3SYZFJ18Y758IP4AW9MW9GU0LYUZ", "H4FZA4S2GF8DSH479TZN1WB7W7SW77NQ", "YC141G7O6B4QAIE2MW019H7U3IDCL65I", "2SPPQAG3WLR02U6N30KKHWRQFGATD4CA", "GVYS2YLMQ6FYZH2JLZIVVUBFA8KK9W01" ] - }, - { - "Id": "67", - "RandomData": [ "IRTH5OVFO74KR307O1HNWROVTSR4NBM4", "GNPIXUN7EDGX00YHHM5HOMF0D7XM611M", "V9EDNSK3OKJSK0524JWBFEP3IZFZ7ABN", "L4C0WU4ZBC3EDWPMC4SWE0GQUK5XMU5N", "J5GQXEGJP69DLLZVJ2XDSOIVXWGMZGMR" ] - }, - { - "Id": "68", - "RandomData": [ "GQ5IP8Z7YIHH0DEIUJOT7254XV3B84UI", "US65QRFLD0OJHA5TR71P23TOUAU4FY84", "Y8XIHJ2CDDPHNVXW0JTBCEQ08RKP6LFP", "1UUIMWMHEYLZNMA8N8E6E71TS7JZ9NG2", "7AP3BOJD6L6O20NWRLB8HJL43A0PNXI1" ] - }, - { - "Id": "69", - "RandomData": [ "ST2N6H79ZA93AM11TWHXLHUXYV9AX3ZJ", "CF5J8A0KOCJGKR3QJ860PVPK8EYKH7L5", "KZ05QS3T67IJ8ONH2S0Z794R0VK4MPCR", "1N5U1891FN4RMGLU0RSZGV7L5JE5I8GR", "51RUS3P4S9UUEMEUJZD46NKFQUZS3ETG" ] - }, - { - "Id": "70", - "RandomData": [ "GNWVY0C7BYGHBMGSEUVS4MURRME7D6BO", "PNO10T5SWG3IHCEDNGNISAL42EDMWE3E", "W11X8P2VZC6YSLKOIBU7T26PCU8VPT6R", "MYVQKQF7N1TPEXLR4ZEUU6V44MVNQHGF", "GOL4Z4D16WT1JRKPJR0ZPL7QC1V741RG" ] - }, - { - "Id": "71", - "RandomData": [ "VNJZLQ1AVMY7M4UNCGE9QQZ4R517IF7E", "FMF5HVD2Z0EDX9DIHH5XWRZEXOHQZ41P", "OU29YYFQDLK0MWHS1T0BJJRXXAH3NXD5", "8YYDHDUSCPULH92BHZYGD0FFCFMXQMDP", "HO1X7ELX8H94YGPXIGVX871ISTAC06CZ" ] - }, - { - "Id": "72", - "RandomData": [ "LED3HEEDOAH51LQ5ZYPK1PRKWTFNDJ7C", "FJTTCWPDCRJ706QHDFMBR176X3GY90AF", "DFZR262DJLHJGTT0C7K865UOLX6JQ1EL", "QE3VG8PGMJ2GTYZDJPVBQCIIULGFATXR", "H63C08TESDVXCO4X72AAGD5O5VA52KF2" ] - }, - { - "Id": "73", - "RandomData": [ "WL8X4XNL6RSMQVGGRSHISWLDBOGE7YLI", "83A0PG2JPZEZUS7KP4NJC7J9A4WQRINH", "FKOXUP0KZ823SVTSQ5ZDLBFATB0UUM1G", "L7UKDK09DCUDEQROLD9VSJ6DENETYF0N", "GVSVBJPGFZ9IRB5CUMJQMGXBAQFZGHL8" ] - }, - { - "Id": "74", - "RandomData": [ "MG7T75MCY3P3KXVCSB8M6JAA7QUUDZ98", "OB6LEMFY9H2T041N5CHEI8BCF6VRK189", "3ROJ1K8F6JMZRRKCZHZBR50P93FH0XNH", "J2ZIQSVVEBI8WMVYWS2DC6R818J8F0OI", "5EQY2BWHVD7PW13XIQVI5KFML1RSIXQN" ] - }, - { - "Id": "75", - "RandomData": [ "W9CR566U6UR89BL9FVZYEGMV9ENBTE88", "XT3XZL1MUBLK3GMJPSMX72IPWRR1S4A2", "WSKPIYK33NDD5C231EVB1LB5LNAI393Z", "ATYK57A1IT3TYEUUYYAOJ9BKRPE5YB94", "UNDMNR74D43ISRHG2PTF9OQARN2Q2FDG" ] - }, - { - "Id": "76", - "RandomData": [ "T99LBIHG1GLPG22AI8CIS44G7C4AZRB7", "1WYTR6ETIMO2CB4ZV2I3C4YYE3N8OHRJ", "ENYTEJSL3TAFQBD6IFP6IH5789OYSGEB", "4EXYMKULJ6AT3SICZRZJ1VB7S0VE443X", "O9KMNOT8UDWMHLDQ1M8AQ5JJD0GWYQRP" ] - }, - { - "Id": "77", - "RandomData": [ "CMF3H6YL81ZY8YZGXFMR52GS0BJXI7JD", "VGJ5GKI5XXCZFUKOB98TE9UKFWDGXBDA", "RWD2P4AM6R4HZRNF04WI8Z9VV8ZUHCIW", "UCHTRS8G9WXXFNUXJ7P2P4C1WRGQEPF3", "IIWXJ3YI6PIMCMQIOBKKXQGZ9Q6AMSBU" ] - }, - { - "Id": "78", - "RandomData": [ "Q3O706OPIH59W0ZKA7CDE5G2B7Y36Y5O", "OY5I7TSRX5BPUGDI0V9OP8PVWV52IUST", "LRV85QNRPUPJ31I44PCLZR8PIJVMXZIC", "MRECVENKIR95SF15NB83SH43TFZV4B4Z", "LN7LXFJZB2CHSD7DS08V0PUEXKTPP2PH" ] - }, - { - "Id": "79", - "RandomData": [ "XJTEIQIH2J2ZFXLPIVDECI8632YMW3KJ", "M4UJU25CR03RX4998DH3ZLFOKWLP15V9", "8TMKDC5P0BWLOQJ83YNSVQUBZF87QPKV", "F4SDRY66H2CXY3A4MNVCRCNS9LU7D88K", "0AGT7FQE2RL3O6M5EEUD4IECRAEGE82J" ] - }, - { - "Id": "80", - "RandomData": [ "317YXQ6H6RKA1UDC8Y39N5QS6DC6AJA3", "YC9W9YIYHNGN8DK77CHPF257LP1UN9GX", "QRMZURDKQE2AZDT32F98BUX5GCLT7XKI", "GT6R1VNP878BA4IH581I9HV53QSSGUM2", "3U3FHCBH2TAEWV5M3DY96CI97AXKC5JO" ] - }, - { - "Id": "81", - "RandomData": [ "UFHQBCA26UPPHRJHVGYC5N61M4IGP1E7", "KWTQOOK0C5CMW22Q0PZ5GGSHJQEG43ME", "PSFU823G58A9KUETC1PABI1DDLH8KD5I", "T77EWHS8VSAHGT6YLUEDOMDG0BRWV461", "D1QMX964IROTIU7UPSW0914G40NVZ6M1" ] - }, - { - "Id": "82", - "RandomData": [ "WIDPCTBMXJ468T7GE6GDIF2L6KR6VLEM", "FX6AQSR5QKCZ68IK3HQ3ZJTQP1S2BF0L", "FS1KX70WOLW7DDO8BGCO5LW5EPUY9Z3K", "U1UOG7X6Q4OOWVNLMT04DLQ365GHMBWZ", "RLMMTA2DTG7A7HISCILP88HIK0RK1PTP" ] - }, - { - "Id": "83", - "RandomData": [ "IY7LIB2M1XL6OP5YXXFD0G1SEEB2SRMD", "WS2IK7JAQ9YLXK4453XDKQYB7PGEA93K", "KIK5XWOZOFW1SP43JG7Z3I3G31K40EAR", "GNAPA8HIO8ZF37SSUN43BDQCPEB6MT8J", "EFVEPP3L9ZK5TXM6I2KNKHPC78A66K65" ] - }, - { - "Id": "84", - "RandomData": [ "9QAXMOCFTT3M2VS11FYTJU97ZSHRP6OY", "3P5CWYT30E30NDJMPIF1WMVORD84HVZX", "FFTMZQECV43E1ITWI4BG1XBQ4RVS0ZWE", "PGUIU6W9DCF2TQXIULVMTS5SDCSI4VL6", "IYZUXKBLICDYRJ6N3M8OEJU6KCFROOER" ] - }, - { - "Id": "85", - "RandomData": [ "1IT41CUJKJERPGA3FFORX618E2JVFU73", "7V7IZCW12ZE4FDREBLLJAW44QV0829E0", "LLT4J1EDSWZ8273ALFT3IY2K0D2ELX82", "UOT4UX4KHI0N76BT1ZXXQKRXSIDG9925", "Y7NOO8QXLIVA7ON3BIMV9LMK65LLTYKI" ] - }, - { - "Id": "86", - "RandomData": [ "P4ZATXF3J9LHYRZD4JE1XG6NUCRSXEEW", "8NUDZNKNCTM99EVOFIQKUTUI8LPQGXFE", "5ZJK7WOR90YD46OQRCMOY3CO2LFN83HP", "NHEJ5KRT39K34QNB799DK0QBX4RVRATF", "SJ0X2EUGV3VYTITM7DP83EEW0CWA25C3" ] - }, - { - "Id": "87", - "RandomData": [ "PEKU00J3O3RRF1SOLFYNUUMNED6ZRUN0", "01JO89VH3WUAXXQ9UIZXHYI526PW3UL3", "P10OSEQMURU89L0RX7FJ40SCTOVBT8NJ", "K0U57CQP2NCZDJ5RG896OC9ZIX4ESP2V", "EKYJ04TUQZRRX38JSE4U9Q5H15XJIM7N" ] - }, - { - "Id": "88", - "RandomData": [ "URV3VV0LOPPYVRBPZUVNUIWXPQR5HKME", "2D6GHFY6OTFTAGWJ3IUX0T2M58NEE4EE", "CL6RU5IU5Y9BCCWJ4HB90ZNIKULI2U2T", "OBRYKEZ8A91CU1J2LDJ63FNN8XGAT91L", "6PWAV79ZSD807KYSKS7YK50JXD0W7ZOA" ] - }, - { - "Id": "89", - "RandomData": [ "IQGEFJHNEUOZGXQX8XZBBDAAYNMRHM13", "Y8SRETNBLTU0RACAWCYK9N8FPGQ26ZG2", "2UBIE9TPKXZSSKSXKL4EYR3K9NB8DVFV", "N276945XTI9MXQWFX2RU4BDK10J17ULZ", "REE0MVYQQHVPRQWS05LLDV1MYWFIUD08" ] - }, - { - "Id": "90", - "RandomData": [ "7K4TM53BDBEXPY3KE1BBJ9V6N2CZQQ5M", "QWRHVDG5CJHCRD6935E3CYZ7Z8GU2EVX", "F1G3GWYAUF991SPJ5C5VMBJ26TRX7VC8", "YU7Z6D2HGDI6ZZFGT6YZI9LDSO6WEBD9", "DBLHVZN2KYOI2MCHNLEA7MZYI3HRGGCF" ] - }, - { - "Id": "91", - "RandomData": [ "9J3YO8V3T6PUVCKFMZI36CB0LW81S5VD", "VJITTO3P0KRA7FDGTCFR7JI7HCM193LX", "LL8L31V763DWUB3FT2IQZEGLALLQBBP6", "94ZVG1M1QHUDGWMGJGHHU57GEXKSQE64", "NGX0LI91PQ9RTDFO9EH44IME6SQTQ4LL" ] - }, - { - "Id": "92", - "RandomData": [ "L0Z98V5BHQ1D5QXBR6TL7BAF4S421PKV", "FXF3NFPNJGXNQIIQ5OBUK9OKZUFQ1CJ1", "FF8HK4YLQGC1NWYVKO7NO0KFJ5D3A9VH", "75IKKAFB00EE7X6C5TGNE5NO428P04LQ", "U54SOOLJI6XXWFIW8A8Q3ICBS3PRC0K5" ] - }, - { - "Id": "93", - "RandomData": [ "OXUC2OYRI6EIIZ2ZUMR064XM229U84HS", "V1J9VF3TLRI7D432B06ZJU8UAHJAOETO", "ZWWQQ3DOS7OPV0J79HSH7RIB3Y9O53FG", "74HQIMMIXSHMGS8J8MAHVMQINUX14YSZ", "2HR1S2ZX4KTPJ65K0ZQT27VVN9DXZUO9" ] - }, - { - "Id": "94", - "RandomData": [ "9RU8BH1GWNML2B8QZMBEI974W5NTYB7K", "6UP2M6JT7J6OVJ3MAW7MTJ0ATZMF3IRV", "PBOIVFE3DRH8CTIMCBSCEV0X3PIWTEZZ", "2L8T5U05RDJBB17AR9C2ZOQ4L1PF7RJ9", "2RG0UZRSLXUAMZVCSHFTB6AN5DIEFU7A" ] - }, - { - "Id": "95", - "RandomData": [ "4KJUVHP1SURC4QSVFMXZLZ75R35QQNM0", "ZUGCQBQK2NBRP7SOVW826IYEMND2M8LF", "H0MKKPFE6N77YQQTKQ54OU4R5BZC8Y73", "C5JZVIDFQ46SK1P67TR5DQ1X54PI0CFH", "PE42G07BNZNTXMGEW2FOGCZVEV3034PO" ] - }, - { - "Id": "96", - "RandomData": [ "ZZCG6W0GVQSODIATYLW771ANPIYU7HIS", "J948JAH9C920UKS5VKCSIRQ7ZZ1X8FJO", "IAEDOCKYDX488J3E028XEZJ2S6ITIUA6", "ZOSUGORT9NPVWS9P6W6GHWJS0MVR31PS", "W8IU1J8LKOX0KYF963WVX4ZDE933390I" ] - }, - { - "Id": "97", - "RandomData": [ "868YKPYXYU528THBHVVAE442IEQ1PESK", "YP2OZQYRE97D96FV22WHO0DECGPG96IU", "CUET03L06D5E613L859XRL67LYLTASSH", "1MAO2W48Q6KK49HKNDHD7VC0YGHBR2ZO", "VXNU0OTMAAGVAVCMRAF6KOKGJJ0WO2QY" ] - }, - { - "Id": "98", - "RandomData": [ "G6ZHVWU8U5D6OR0CD5UQW2DGNHKQY67H", "TSOE6504QHLPLN11TYTTIABO2S4NLDKY", "75M5DVFIEZ9PQY59PT7ANO9TRALOBMSN", "6XRPB6Y7SKOSAW7EW582GKKT62ODK1H1", "HWS3GQ7T59RC9QT4DG1FOZHWM7SIRUX0" ] - }, - { - "Id": "99", - "RandomData": [ "DXLNDE7G7P7G2IUQJUADABNRO6QJ7ZBK", "L18LEF08JUH92A3EMC97UU0CK38HXYII", "NX4BJJLD3B3P3NZODM65ZE01A6BKHTLU", "M9VEG24D05ES0LJ6EUDL1MSJ7DANHA6J", "ZJC42UHLR3F39HBZWEGWQA29QMHD1Q50" ] - }, - { - "Id": "100", - "RandomData": [ "953RIPETN238HYKZBL0D4K3ZQDNQMETB", "7O4EOTQHAWJXH411BRBPZ26ZCDAFBYGI", "I2B24FLS4SCHAFSWLVO5CELESFCKSLGM", "PAOP2976FTVH0YY6VO4PJLGEQ6JZDB9S", "M02A1D3LYRZTSEO4QFYER0CD4K86ZI2E" ] - }, - { - "Id": "101", - "RandomData": [ "UC496XFSVS11WWVMRPI7N4BVXYGRF6WQ", "ZV9QJO82AGS98KRHYVPK950ZBIMHRXNZ", "5LCAXFDCQP6HMBXMG82TRLQ44JOAC0LM", "23DXIQUSSM3T8TN9V9BS43HU4IGN0CA0", "ETOS79EZOKBFR76K6OPCZ2S9VT39KG2P" ] - }, - { - "Id": "102", - "RandomData": [ "MDOOF4BV5LEU2CC6M5QLX7ALBP7OGEPH", "SW3NSRECM3HOY7GTR6XO0Q2ODDM07XP0", "56CFJYN40N830WWEIN7KQBRB3OKPFOFZ", "NRS24BK2S3XMR8YQQIRT0FJ3PAM4N8ZM", "IJQIE3JHDE1XOEU504866W8IIYN3YPPT" ] - }, - { - "Id": "103", - "RandomData": [ "DKEHSPMW8KPVNVPKQQETA2PVKIAPQPSY", "ZHTDANNKRL8WGM4WJDNHK5TL5S6KO7GS", "216GCMJDD3BY33P7NOGNBKN3YIHRQD5U", "EQ3PQYU63KEQ44RCD96A03QRNDR3E2XA", "8RTN99RZ4JT1G6830FOQG53L9MBMG02B" ] - }, - { - "Id": "104", - "RandomData": [ "XDSNLDCDRGGRJZLRFYD8OG3DXIOX8FTE", "RSDCOVSWCK99YMBKBUHRW3XRKPZCZPFM", "XCA1WICTGQ5DH3OLGEVO8BRX4V285P7X", "EWLWLKX2RXKG7TKQBO6V30OWVM6AQDX1", "TI9UR196Q36K0KZLLL7RTM3NIZB8NXLN" ] - }, - { - "Id": "105", - "RandomData": [ "9TXZU09JO9EA4D5KWVZFFGHGOVL20BT3", "RTKHXA0ULYDTH3TE31M17GH3LQK9OHTN", "QLSK2YWW4E4RDY9UBH88Y15LLR5H01GE", "FZD5LJMEE063L0ZXQZ7HJUYYQG8K3P5D", "7ZLNUDJ243484C9V2H1A495VBOPFKBLZ" ] - }, - { - "Id": "106", - "RandomData": [ "435WOMCMQFMP0Z3NGNSVY5J840LGYER3", "REEBHNGPFOUYXP5MUC86S0B8U61YA6YL", "XS7VU2G2GDQJLULP59VWFUL1CGQKWSOI", "0IBERJ125GZPJ2XAVM2BKCGCHFSOL5GY", "YHTCSH7WH30956SKTQZKZN7YC97L0NQA" ] - }, - { - "Id": "107", - "RandomData": [ "AB1CIUROOG3RLGHLXI45F59KJ5ATJV53", "NZ93EPB88L5STQM51WXSSU4EBQ2NT8E2", "KAEWHNGIG6649Q03TF1X7NK2541YXYPA", "HCHTLZXOQPLWX9EVZ84OHQ47ZL0MVRUS", "R6X7IHR3RMHSCYE50G8Y4A20HK3A8L28" ] - }, - { - "Id": "108", - "RandomData": [ "53F1MHMSRA64JM4BH5WPT5YQE7Z8OR4G", "UIWJSNSS3QH3D8Q5P12DYNO9EYXPSOD9", "G0KBZVT4MDVDX5MFR4SWY1RG3XE30DAO", "MIWNXPF4I80U1LMJMR8Y6RKOJDHCQZDJ", "DG0PI9RBZYO0B6ORK4RJFMS57IEUHCNT" ] - }, - { - "Id": "109", - "RandomData": [ "4RRVV7BM969IDUNMZZ1VH4E1Y5R9573W", "K45TP36N3FJIMK1N415SK1M9MZ6ZPBRB", "CM7IY3752O2CV5ONDEFDCLMTS5HZ6G81", "XIGAMTYA49Z68KORKTWL5O81AN03WH8V", "PAONYOAUPFICVQUHRZONUW6JJPA925NX" ] - }, - { - "Id": "110", - "RandomData": [ "BDQ85B26SC50F5FT3SL72UB3EFDJNB1U", "1VBS9WLP6S5S1FENJQGJTQ4RCX307TSQ", "KK9T4XUGG6BKYSB9A0975RBL1UPM2VSM", "9OHQGUSW69DXOU2TV4ZGTVU3JX2KHHNV", "NYKJLV2PHMA6OO6G26185L3O4OHS2IPZ" ] - }, - { - "Id": "111", - "RandomData": [ "VRJ0KSIABK9HUYO40VRLQP0C56P6OJX8", "7LK6FG6KY16VMV3F9M2H1EJG0G4OCLW1", "WAJIORZUYHWZSF0JCK7BRPH3CDG8LSHN", "EE8LMV0RWHSTRUYVQVL2OUJH2QGLL0IG", "AJUNHP6QTPOK6YLSPVSZGP8U50S6OPG6" ] - }, - { - "Id": "112", - "RandomData": [ "8MSH9KNBY4I8F9KEEX50IS9UK9SQ6ACD", "JSLTFESEHRBLGAO5QN21TPXPN86A27EX", "2FZXY099F1S1RXOKVWASIKT345GHHSLK", "MNSBL1HZO2W26680UWOF7VPSV522U12W", "PIODEM94PKEQY1787QXUDGN08APP8OFW" ] - }, - { - "Id": "113", - "RandomData": [ "99MXS4VHXU0WR834845EEHSJ5XFE7T5A", "FRQZPJQC4P7TP0J9GVRETAS1QC24YRKD", "YZRAREPZN2JYK93FOF7MC0RE8ZIMQVNN", "F340JIRCF10013RQIXPTT7B8IMB25CI1", "O5SQED5GX4GL90NFI1E3F43H26R6GZGD" ] - }, - { - "Id": "114", - "RandomData": [ "S8M5KALE1J5Z1Z8R86UD8PVTBLYIW898", "XD2AOR4HQ9C69EQC898KEDEDM239LDS2", "K6BY77DRCMX8MZU74VKWAZ3U8YYWX46M", "RKWCC1FB6QH2PG1XH6EZ351UDQ0IJR3H", "QLRCDR4DQI0TRBF17AO10GTVSB9WB62O" ] - }, - { - "Id": "115", - "RandomData": [ "XALEZZT0CBJUFHDBL8LICCQK15TCSIBU", "QL6QZBCIRXYY68QL78LDUTMVTBM4FRI4", "AZD3LWLJ5D1ON2N3OHET67979K6YZICA", "P4YH5XALWBIR27I1YTP8MY7CZG4AZXUW", "B19SDF81H375ZSECCFAG3EX17VSY29V9" ] - }, - { - "Id": "116", - "RandomData": [ "QVQB8ZXSUX0T0BNGC18UXO37DHVSWJ8H", "H8PDCCENRRVFNDA5HLWBBAMC1T70DF5L", "ZSM2WJE9XUDF3YTAH0KLW7FGVNMTEOJM", "VJP41HJ8HXNQ7GIC97SN4UY1NFHJ7V4J", "L0UTJYIARME9UYJPEJTH56RAUYRWA9AW" ] - }, - { - "Id": "117", - "RandomData": [ "3DFGVZ3KYS5SQZHY51FYBWOOIU8UHWAR", "MSGQTC4OPJSNB9U5Q30I4MUGZ17B0IDB", "ROG7T0F370I1DANJ9DDO61W97911E3YG", "GQ5W3WL0Y6LED3CZOYBWEZF02GAT9NZE", "BBVXE0PN1NZ9QR6E7CNP1BCRLF4XW21K" ] - }, - { - "Id": "118", - "RandomData": [ "HGCCHPUXIY519FJKJ5W6AJMA9EL96209", "WO2JO36RRZHDGKRG5UN0G4K83CDDEU1Q", "75FUMA5Q9EPKCJ3YWEELO931E3QM03N6", "80FKF735Y71BPA6UIOR9QPC7CNQTUSZG", "0SLLDTTYLIXRI1MD75EMMOPTYHI1RKLG" ] - }, - { - "Id": "119", - "RandomData": [ "HVL7ZURZ42XH2VZLBMVYON4LC2X5L2GB", "7RJWPPONNPRT1I1DS60FYW1419477WNB", "VWKLLC5V7IL95KU4AUMOCBMLZO5QURP1", "BQ7E7P1PBEHQL18QOA6NJ99UK8V6HPBQ", "2T8PMQ6V27N845A8QPBTVCRBQN4944IV" ] - }, - { - "Id": "120", - "RandomData": [ "C0Y12TD8ELUMWAZO8XQ2OR5ZB689V708", "Y16DHIF6LCPJSFPPXQBHNQHU58Z6UENH", "UVX4EWGZSTQMCVH6RSLF6TUIULIJTJMH", "ZIZ6SVLBJLZ495SJ03OB2HLABPJ3N7FI", "HJW45KN5HK6U40IZ28SZ4LOR6Y5DLRXL" ] - }, - { - "Id": "121", - "RandomData": [ "FQX0IYNQPT3SL0GLHUAOOQO64F7HOKU0", "WUOOCRREUCJLR6GGSU61QI7ZB15C1GBF", "9D50M1IZC64MGDO891Y4O2JNXZNLWONO", "AEMOAP31MHZUOUT7M6D9SG1G3SCXO6CX", "SPLB1A8T77SHDY8DFP9ZLN53NFUSMGMP" ] - }, - { - "Id": "122", - "RandomData": [ "EBC9IRFM8TCUYTDET9R86NLETSYWPQG0", "UCCBW94YKX02LLF3BQ8MZOT1Z7P03T6S", "MLAWQCRTF3XJWT3IN4U8R4BGTLLZUE51", "0IP9KSM99OH60JFGDGN888ASJ3CF119A", "76TNE374RV9CWFQJGFWN1622H60QPHIH" ] - }, - { - "Id": "123", - "RandomData": [ "PG8301BJISQN885EN38WFVJAD1FHDQOK", "M2WQGWTODMFIQP3JAVDWIWB467Z9V4G1", "EGAGLP71JUS3PBUY76GRN1B012TJ6T2I", "FNEKPX7UYLMYDHO5NBBZXYNMEKPT6Y40", "1KYC6JJK8V3BPNWTNX54SDUR92FEIOYA" ] - }, - { - "Id": "124", - "RandomData": [ "QW63TM9D210B4M71X5FJ29HYZGCEDEBU", "73U2Q3ABY2C0NSWX4ORMJOHQOIDMK49Y", "ZFEB1EK35EV97RLGUOJYXYLTVDNIZX13", "3OAHOU6ZEXRE3IT77715UKBA4UPX1BDH", "N1GTQD1ASTU9HG0NUQL255ISNAM4EJ8D" ] - }, - { - "Id": "125", - "RandomData": [ "TJ1BB9R3F1NB0B3X4CCK0LMRTYGQ075I", "VQQ7PZLU9RXESH1LGY9CGXNI7KRN3ACI", "6EPJV5IF0SLIYH8L64JB83C7DHAFH818", "PPHN1S0LQ3LYMEUZLFR81AJCCSGN5D82", "0N3IAVUOE7VERNU8XK3BR2GOFFLILMPM" ] - }, - { - "Id": "126", - "RandomData": [ "5T79LLZ0VD33PFUY7IZVJ6K8GOD5JLC2", "SJI8PVWMUDQO8N99UWLDW4C8I936H4QJ", "ABLG6VIMVNAGQ692PEKWA8FXGJ0Q2ZE0", "XGN7B2C8N8SJ46SLAAQDT3JC6Y9X52T5", "JKSJTC0XBMJBQ62J1PP2IBG37LAN2PCU" ] - }, - { - "Id": "127", - "RandomData": [ "PW9UNI28J3BGUHVA505PM0WIDZMHBM4W", "JYV36I5TXRSP99IZZASCTXIYA1QY5U76", "9P76V2DX4M25IHIEQWSA41CWQ73E1HXD", "UWPUCME775HH4MQ2TMHIB6BIMKQY985X", "ZZLV2YBESVD9T51DQAVPAOBXUHH15P78" ] - }, - { - "Id": "128", - "RandomData": [ "9USFB4A4KC0Q3CYRTMH8NQWLXXBUQKJD", "XE99NVCW90E8YU4RS0ISI9VT7GSN2PNA", "3X3YCZE7KV9WLYWD3UC0B04YTQBGDY3T", "MEFB1FO3WLIXA8HJUOUINX8C2FEVY73W", "1PJHTVLXFIEZSHYVJ1WYDUGZFCIWA3FY" ] - }, - { - "Id": "129", - "RandomData": [ "RW5UY908C7DESIUUQTM6LESHIUCRMZWL", "DQI6MD6KBYVGQBG6RYFRQIMMDYME7IVN", "K1ACAYHNXC5XSL0GNG9YUF55D52Y02N2", "CI6ZBE52R14ONZ328F00J72F6F9F6TW4", "ZCUKPBFJKGH3LQSNBA0VCWTFQ126F067" ] - }, - { - "Id": "130", - "RandomData": [ "E9ZKFTM7AQQC094QXVD53B2CTO3YIJEU", "KJYL0HIRX2UVFQPR7LITWAECHW10ZYY0", "L52QKSZQMWIAQG7C9M17AU8JFVDEPS19", "E3JKY9GOW2HA2DWBZY1N71007TLYOVA4", "4I5W6WO9FMKHN8QB9CO01OBNDSMEXS9A" ] - }, - { - "Id": "131", - "RandomData": [ "1MGTH9ECK1IUQSN9CJYLGKDPGSTNJJLW", "NJQB164A8LQ9GR7VFNCO3X4RJ0MZP03A", "PVHGCLHFPYN54DJZV8H6H73ZP81BTEUH", "SPUVK0S3G69FJ9XGRXERS62S1R0DUFWK", "DFMOSYP4PN0L7XPQLVU6ACYVWC32APJA" ] - }, - { - "Id": "132", - "RandomData": [ "KZBDWIX2HJCEGRUEBJ29VZJAR01Q4X4A", "EZAIVL4C81Z0ATPFSZ10XKPUPAW6RG8U", "PCARRLSZPZA3ATA7LW8F5DM4KP3VZ8V1", "3EK8T8XGHBL7JWU6AZU4I3YMZGGBS6AR", "DJA5ICON81742OUY57VAN1T9P8IN1WYK" ] - }, - { - "Id": "133", - "RandomData": [ "B34AVYX7KH5Q54TKVSGVLADMZAPJ3BVM", "DX38UUCGJXZF5DEVO81IQD8A0SKVIOEJ", "VTMHAVZAQALYL8QW6354JN5AZ2ICKR75", "SPTM06U3I11Q1JZ1BXZPSJAIXMSIMXZ9", "CQG5OE59JCVRVPIPCQAX1SMIOLYOOMQV" ] - }, - { - "Id": "134", - "RandomData": [ "B2NLD4N71ZGQXSWHDCF6XCHUD7QCPRV6", "VAQ3C7MIDC5BM6V5ZQLLGU89U2HGNKRK", "EJ4XC2FF072UGGIHMVN9GJZBCRJJZF52", "VV7CB836LFUJ1O2OU9427SD4T3UVT5QU", "CA8UIFGN1QXBZQKYY4Z0LC4CSCTINHNP" ] - }, - { - "Id": "135", - "RandomData": [ "Z9G0PHFO3QAR4CFCS67YGZJ9G6CGW8AU", "DILZKTIRZK65CNIP6QZRKYJ90HUTE824", "PPOV0P28XP953N63YXJGJTKO9M8C9ZM0", "SBPW9WYRX034ZNGMK15RZWV6F9WOR098", "DJN18K4B82STZPZWGW1I44A6QTQ99K97" ] - }, - { - "Id": "136", - "RandomData": [ "050QAOOA73S6DCG0JAH481DIIQLP34CX", "2U24YJV2H1LBLE2NM0Z9DF991SITD9HC", "05ETKLBAOPXHPC6DY7CCEDUXV2DGBCYI", "TIKQ9IDAYZUXR1UYVE5F6E8XKQ8SI59M", "0OXG2PEP4BNPS6F3IOU7GTLOKWGTKV23" ] - }, - { - "Id": "137", - "RandomData": [ "ZI7DEN6FAPK40SFOKFJ4KCFGCJ6GJUFJ", "JTZK8CY5SP71IQX2R2IFL7TXC0A5QZ6P", "KAVH34PIQOM5EO7WVEZRMA8LABHIC3O2", "SRQI5Q9WM9Y6VYSY2NJMAOCKCJG1XGGW", "ATMX7Z0EFCEMLCZLSTPYUB1EOGFVJH8F" ] - }, - { - "Id": "138", - "RandomData": [ "3C6BM50DXFH7J09AT5IE1RC82HI1TF47", "E8SJFY9X2MBO434YGFBO84OM97JEX9TR", "KJ3LH0455VLOQXE8NUUNDQ8JUGJIO493", "3TEU9TQQLFSNS96M2K1COFO4LU0BQVRB", "VSV6TU83EDC77V0VK7QDD7OYFKIP2OA0" ] - }, - { - "Id": "139", - "RandomData": [ "YR1AN93HM78KCQ6Z3F1TFN7YD71ILTBZ", "DMIQ30HKEI1G8EVYNTWXWQVKTD6QIU53", "6JG0HQ6D8RP6W109MC426NCX177031BT", "M8JZ74R7WTZFBYY1M6DGZD6SGT9JSFJG", "P5TYRBCRU7FNX7VCJFO7X54JB1SN5HOR" ] - }, - { - "Id": "140", - "RandomData": [ "JSZFFAJL4VV27S4I86AN1MSUBJW0SZVN", "SYEFIP7I6CCBJBMT6KP9HB079EE5OS3F", "9IJJOZAS91QYJQL97C4IJWGQ7HFDLB4N", "J7CB2DFGJ79PUBXT3F7LYU5NC3LHU7G7", "6DPLOKH47X8MX066TWJFDTYYCZ9817WL" ] - }, - { - "Id": "141", - "RandomData": [ "0BTRWLET8DNBWTZL7PX8XA4NO1JZLICA", "BWVVHOKHRZHAFXCT9XBMJXXZHGC4COIZ", "ANA97EESFQQ723H1Y00XG00N86NBMPFD", "RSA2XDV5STH3H06O8LGMXUTKXWAB0DFZ", "LNQK3ODVE5FWS6GI99CAJ3P68ZFACUEP" ] - }, - { - "Id": "142", - "RandomData": [ "NRS3JVUUHUH2P610Q1B0BEQS7TMDJDST", "0ZIAOM9NPS3YVWRB8PTLSOOJA96ZJQKE", "BYCZY0LE1YLSL26KCKF4THALL9AOPJD8", "HYX7U1NHDPT4D57IDVX8LQV4X0NY06YS", "UMLWE90L770DXGIQC1L4WFW1D2K3NYRH" ] - }, - { - "Id": "143", - "RandomData": [ "0BJ0UKED5LBOZRHQS7W9U45PZTSLZ67J", "PTNV7R61XI8KEICWV3LQBSW6F3AA12O9", "O18FDVTBA5LM5VLRR605VRI77RPDQ595", "396MJ6S9KJPFGJAUSTS5BTN6TBIWFPVE", "6QT5Z9IVN0ULCC0XQ5V7ND3JV92HX534" ] - }, - { - "Id": "144", - "RandomData": [ "YKJZ0E4TK7RL8C4QLVGK4X12XJJ0GB8S", "7ZW13B6LACWPWSKTEM6BZTAASQBR5EMJ", "99OJPCXKZ5J2BLGF80V4E63NZVJN9PQ6", "ZNQWEBDBYWM4KI9GJ6SETSECGAT43KKJ", "ONDX5TB6WTFSU9DRWCDC7LMGIOQDRJHO" ] - }, - { - "Id": "145", - "RandomData": [ "LCP6ELL04VR9NVSH6CI1HHMCA6ORD7PN", "L0HRTGMK0NHL3N2W5IHPAQHDZM6I64W7", "GEXWOAX008A49BJWD1V409M5TD1HKDN6", "0KFZZGI4VRZCPNDYDJEFJ1HG11DKIQPW", "VEDZ6T67T0JJKJQGADDA9IW9D888C7VE" ] - }, - { - "Id": "146", - "RandomData": [ "BCRKKO2TNHVSR76RL7KFMPXMSDW7V84W", "EFIH1F6WKUX1WDRFCQWFWQ2VPE2G148O", "M9OMZYZFAY42250OWQ5FLY9YNX2WN04Q", "VIPXZEQN0RE8V92UOOTL83CX9Z9C6C2K", "4OGTQCYR9RO4TBDN4HI8GSR2G1X9FORX" ] - }, - { - "Id": "147", - "RandomData": [ "Y4DG2IEM0CMROHD8WVHY43EL7ONZOYMU", "90FZ76VVD5IDGAN8XZNTG325Z1JO5P7B", "01RXBNA0AVU8UAF6APBZL2OF7KAFWG0Y", "8HNPSZ6JYXSUJ4KYWMNPNH07NLZ1N5D3", "55ANX0NLS2AXK36D9MTK3KL0QPBH9F53" ] - }, - { - "Id": "148", - "RandomData": [ "UYZO37A68B7UGCXTPW1BL2AUTJ6IYGLM", "6HDVDRKCLXL2N0TN1S2NO4R1YF4UA2H2", "0UY99BQ7LY0YQIH2ZSQGN78CZL78W0BS", "PTB2CUOZB5BZE3KQ8C4RMBO2WWJXESKV", "WHI7GOZFE0ES6J76BRAU5UFOFJGQK0VT" ] - }, - { - "Id": "149", - "RandomData": [ "VPC6UNKTMYMV665NYNWXRZZCC426IJ5O", "FV7QGBMXHQIHHTSIN326D8B50A4ZVNKD", "28QK8PGWB8QARS5SMTSPQ8KHTB0GHWC3", "GFOIDHK8WG5FRAOHEMNB45W3YJ17ZAPO", "6W4LDWOFJU2KDFZSXSB5JB8KSUU3PNIW" ] - }, - { - "Id": "150", - "RandomData": [ "0RI5GCDS7I2KDM0SUIJG9TE4XU3SCVZ6", "MGTV64MUOS8BIYHF4BJHDCXGMOHVIVQL", "T5762EW06Y1QVDV9NXYALR2KTMISX0L3", "CWSM0KMZPTLOKGVJ2HIV7Q9BDXNQ5EDF", "M8O9VJICK8V2GO9M190PS06WWRJC763L" ] - }, - { - "Id": "151", - "RandomData": [ "QFBL2VYT9GK85H4YYAY6NXXWB1NE9FEO", "EJMAMYTGLHPLQ81PWVO7I772SPJAHUT3", "C63V43L9QSUGHLGDA8RO0GFHMUS7OS81", "XWJTEFU3JOQZM0UGJGAJCFC50WIKLOV7", "T3TVCW94NYEL0P4VALYISYYRTO3S7KR5" ] - }, - { - "Id": "152", - "RandomData": [ "3TGTH8EWGF5OB1FK1XK9ZNP5EBCY2Q7D", "GJSHJLOBHBBN2KQ1IS1KASFPDKOF5Q40", "H2H1I8APJI2XMBC3VKPJZXCYDDD96IG0", "HKF9DYTKSLB1ZSCCHUUUAUBUZSYE5BSA", "CBQB6C061E1NWK9VAA1LYV0XJVKUAOPQ" ] - }, - { - "Id": "153", - "RandomData": [ "3AZXCAGF4X362X7OTCE4KGLRL31K2F6M", "YKUVVLT94WRB134WX5B7KVGWYIMII5MZ", "1RHSDL3HTE9XZKZR9FW7E8BDE77N9K09", "J2JKWMSLB3OGWS7OT4JDIPU2PDNFOQIJ", "N9O7AO4WXK5KU5RVAT4EAX04HR5S8M7V" ] - }, - { - "Id": "154", - "RandomData": [ "UE2WEANE9WP8TKIUW2F5VEIZJTZTTMYK", "NJZPC4RAFZENI2K7IK6GHBAQ6CMUK3UX", "8EUKU2R1KE0594RQI2KIPSCLJJT9R60L", "FRPDIAMQ3E5DLEQBV6LSTMHQBIAKJSJO", "OO0SPOIHP4PLW9AF2SOVUI23J9B9ABGK" ] - }, - { - "Id": "155", - "RandomData": [ "4RZ7N7VGXECY663CI5S0DY3FV7JPNJHN", "XEQFKD156H8QFD6MG81ETQGGXTLPYG3N", "6YA1PY2EDW46ZM9RB6JOSD4H7KR02MG0", "NUURDE7SGWA6VKQKT3O16P52434FGBM1", "QESF2SO691H5C7WX3GH87O38Y1XJK1LF" ] - }, - { - "Id": "156", - "RandomData": [ "JJQR1LSBOR2EI906HHLA3N3BKUQB5EWH", "QBW3QE5SYGUPWY0ZB0CCQLM5POGH4RFJ", "5VYGN6PCL3LX3NPW419ECT1FZ0NB8YXH", "AKUA9TLEKA1W9ZBB9UMDRBHL4TRWSNEX", "GEWT2OWKP54B2EFAYMCNLTZ9DJGQCYV6" ] - }, - { - "Id": "157", - "RandomData": [ "5DQ4CSIU8BXWHFSZOR7GL1LWPXPTIGI1", "J7GYXL7GDROK6D170QBU0OVE24POCZM2", "26MJ94CCT1D4MB0L5S21EYA4LB535TDO", "EWR90S86O9B8L121EDTU6VYE5R878IGA", "YZZZU0UNT6NEWBTUJEZ29SRT8MDITA8F" ] - }, - { - "Id": "158", - "RandomData": [ "2AJWBCHNSFAAITR48NY3TOAGHG1HWM3T", "7HMV16SG7MJ4RQLP4JJGMEWNADO5L90G", "MRDBG5CC4R6HFFY15LMNCWH2U8VYSX57", "VCSANKI8HHM4IPI4OXA9XNEZJKQHKNTH", "W8VDXYNUCOF4KNUE00J4W5KH730D3BX3" ] - }, - { - "Id": "159", - "RandomData": [ "XFHJ3FH0KP7JHKO60MRUEZU1YOF47K1B", "0MGFFKKVTTUH8BAWO3NRTDZ8UQVP9M29", "Y5T5EI1PB6AVEN3XOSQD6KRWXHUZZ4VG", "0USCSESFC7QXCD3HX7BR6ZDON6H6YB0G", "K35U40FJAKB833TTNNC13EKBREYV7VRA" ] - }, - { - "Id": "160", - "RandomData": [ "HJNIIJM622RVXEUUNXSK98NGT4DZBTLO", "3A0UQKKEAF8AXYNMUEIJCGBJ6GZOGW5J", "RC2WN9DCMOK39NT4Q0F6KBLW9RYKV57N", "KZTU608UBG6Y6HJSW48QR88P1GX6L3QQ", "Q6TK39801V5EFW01HFX07R6L1D3ZCCJH" ] - }, - { - "Id": "161", - "RandomData": [ "ZPH9X9YX6HY6D3KEQ5ZFG0T89ITZFIXZ", "MYOZO0EHQ9303AH73YJHMDB96J9PQ8RX", "U8TPOUZ01RZH62F9AV6R9QMIXP2F0Z1R", "RGG4Q2SJ9TP5N3DDEAO4CAYDWL291T9C", "0HZ0WKSIDWRPAR43MZBZK6OQRCIFASRP" ] - }, - { - "Id": "162", - "RandomData": [ "TNEGDMR3RF0QSJDEQ8XCSK132JJUBNIU", "FC6WMYZ9IHIFF87H9DZB5P6JWLN4D61E", "7GLQNQ21JX4KCWX4MBU8YGYZFXABK55L", "QEH9XQ4TL72HUWHAXTSCM3P1RVL0P0QO", "2T48OXG5GBW0ORFTQAN1M29WYQSCFEDU" ] - }, - { - "Id": "163", - "RandomData": [ "QNPB1IV9MW5KHZM9P2KPNZB9UIJ8FEZC", "8BJABE1HOOP07YO8DSWN4XH1MPQT9X4H", "73LGPL8LADA9JLC53K4WSMHK3RYWXHH1", "TH3DNIT2ULM1XIRBNV0Y2HYUVAM7XLX2", "5IPCR8SU1CCH9QXV9XICRT9MSIRM6VEI" ] - }, - { - "Id": "164", - "RandomData": [ "XT6O3PTODF6ZFRVFM18ADVLLJCTJQFYG", "73UPTJ2TD49MXJHBWM9EWEFCIUF06J77", "QZ2L7FVD9O6IW9Y95SXEGTT3XSH9EBX4", "6B57R5DQ05FII6PJ6F4OW207G8YP8W97", "0BLUD0SAOGOKNLV0C7C9HJHDK71SGYRD" ] - }, - { - "Id": "165", - "RandomData": [ "6ISGV5FFW39QOQT4N7NBTA0R4HJG993Z", "YKNF3PFG27MNJ1Z4N6FJLQU6SAMNW9FW", "9K1ECOB81GIWXMHCSO2D4UOH0RW2D2U3", "1ZN99V194HSEI7IF2J4HGC2P5UNV1J58", "VP578IC7X3IXCJ92IQ938NWY78EPHGHV" ] - }, - { - "Id": "166", - "RandomData": [ "MTT2CKHUG7UN4ENVUVMKJBAI2GAAEXZQ", "VXLS0GZ8JPWA3J42US4W36LKTKA6KHPS", "HD1G344O5OB4O9OTLHPV3DWZMA9PG3XC", "9E20RX8ZXP0P5Q5T5QUC13ZEQC425PIB", "085KGYCYIZ8NMH45FPTZJVKFOYJO3G4I" ] - }, - { - "Id": "167", - "RandomData": [ "HYY6VVMHO53C5M1II8XP5S2FXZ5SOX4C", "5ZFYT7KTDMLN1IJC6BG4SONZ6SI5Z421", "B1GFGDZKYDMSHOOOP3VNQAUQMQ1AYO4I", "TUMABE62L5GOB4SRE3Q5IPKAGZ3ZMZWK", "JE8XCOML73BU4GPR8K6478AEJL3LKGQW" ] - }, - { - "Id": "168", - "RandomData": [ "J5E764PZQE8PN0GAKL0C31MKD3N0UAA0", "MPK8BRVD4GN29V1TE3B9PO2ST43CRYFP", "EID7PI820XHXNTKSC4V19BK7W2PHYSWG", "A7Y1S3E64II2HFF9TLAWCOQD8FLW21EI", "AAWP5T9I0Z602RZQXPXMS9EWRU2MSRDD" ] - }, - { - "Id": "169", - "RandomData": [ "EA1GTZE9M16NSZKRP49ND20A6A7K1X0I", "V3W2ZT77LXA0D0E2KL6YR09LK0KT24IY", "BX1ZCS166CCP297F5FAP0C143LS8IOFR", "PLZQ9PZ1TA1PYTTK3EXW3389675092XS", "6UARKRGQPI5ZLLFJ2IFE1SXWM0TBT921" ] - }, - { - "Id": "170", - "RandomData": [ "MITDTCAM7GHV7JYU1V81XT1N7OEU7F6Q", "QENC2B0ZH3GULCYDB8J8AAD3RFGE7QO2", "J0E25V2Z4IT4MGC5ZBS858QPAUUX5V21", "OOLU76HQGTD1RJQLCLP57P7KKZ1KBF4J", "Q2P75R733C2L5Y81DJUUG638RAKHE6OA" ] - }, - { - "Id": "171", - "RandomData": [ "Z4KY3SQVNVC5XVOV1AH1VKCT8QQ4HZZ6", "X1VBOJ7U38GU48L5VYQDZWPP100MCVOX", "6FI59NHSCW8WDSZAFUITJVHAMGKXTUSH", "USXZZQ6IQ7ADY2MJBZHSN5NK8HS3CU9S", "D1BU4AKZX9CMVDMT4BV3N94ZFM1S7DF6" ] - }, - { - "Id": "172", - "RandomData": [ "8S9711OAPS4N2BZ4598B8GED6MPRJ22U", "3GNCEP2CWVO5FR7DW6X7EE72N5AOM71X", "ZJTWXXZQG6ON1J8PPM4MF4QZIVYJON0Z", "31F57KP9HG1IZUAE7U99COR533OB9QB2", "FZTAECRE65F8DI9YVTL4N0XOJJCE6NA0" ] - }, - { - "Id": "173", - "RandomData": [ "F8CAA9A4C5DHJT2U3ZQPEGOOCF149NIS", "4P2EG9YVTR1SXPFZRSKG7VV8TX85HF4Z", "WVM41XO4B45XP51W9CNRDCVJ33VSB3OO", "WB6BDL73DQECZ8TX5L5F1NWUACB8B62I", "QQAN9ZTYEUNX8ST4J8WZ7IXJPMBAK91H" ] - }, - { - "Id": "174", - "RandomData": [ "X5WJ7GYF2GBH98VRTGYDJCLI217WYSOE", "2G9C6K7DKR71HQJR0URELX8UUOQFIBRK", "26O38TVIIU32FUBMSQ6EBK2EIPSS315J", "9X8KBQSH8I504FOAMDX1ENIRDJUTADPR", "ZU2SV0LC8YF2PBKCBSFZEDEVORG158G4" ] - }, - { - "Id": "175", - "RandomData": [ "2NBKM5OW2V3QHQCC9SSS8ZNWQGEEUTG9", "RL9BA9ZFDS6SJYO8OE1NQY6CAP4G1KBJ", "O386QBB92MOP34M22GZQ12S2O6AUFTO2", "RXDPZRRNC2VEKQJGDBNVVVRVLFRTAQ3I", "8V8F06CKYLN9HOS8X4REG2H6FREU98NV" ] - }, - { - "Id": "176", - "RandomData": [ "8MFZSDPG9C6JHSO6XT6F9ZCFNBAJ1SKZ", "82B5I3PTOLED57YWDI7QCHWIJ9LQDGPR", "1HLORSX3EM1XU8JQMNFTV4X0F2VIR8PI", "6XLYWKFVUDMZQ8XK05D0B557UUJY6OLF", "7S17XV3CHU8SS7KHFKSW5ZHA1OEBBQYF" ] - }, - { - "Id": "177", - "RandomData": [ "1G27G0XEBASR6NOWJBTW5ZKHL1FIQ1B1", "530LEMAOWOV4G0DO9R196CKC6UWPVPYJ", "91VDWDS7BF9RDPBUX0I99C43TYOT0U3H", "0L5PEA169471D28RTB14GZJ672U7Y9GQ", "L112UVPX9MAFECZ0079Y39BBB8SMP3HA" ] - }, - { - "Id": "178", - "RandomData": [ "XRQLAF78VE43ZE24C4H19SXL000VDCIF", "F9RWWOZUABCYEHL7GXKVWQAF4EVKPL4S", "6ZYZXFIXEW07P8GSO2OP2WTY9L2R2PFY", "HT2PTWJBPWQ9ZCZ67C5W6O0JF9ZLM14Z", "RC06F191SNAFFT96W6T0TS222TKT78ZY" ] - }, - { - "Id": "179", - "RandomData": [ "21SXL30GDEDTOVDVA2ZPHEG8K8DWQP4U", "YMNOBMU2GMWOOINHPYTEIJQXUTNNZDZY", "KT5CIZUXI7J4S1UBU6H25ZMP503S9HDC", "W8E5NL90E56L9VE38L23672UGQGS5CYA", "3GIUXZXJ7RX93BPJVATXOJGYFTY7EQ4C" ] - }, - { - "Id": "180", - "RandomData": [ "H5R2NUGJXT6PK21FA765TBVTATODA0EQ", "WV27TW5A4J95N1OM2T6HT9TFJ724FCJ7", "OP2YA3VOB6BJC0GJECKR476XCXXW4B51", "ACQ780M97SFX7JDT1T0D21CRTFVNF9UA", "AKJ9JIKN0KTM1IZ3TE4KK28I98O3E948" ] - }, - { - "Id": "181", - "RandomData": [ "7FXXADJSINNRH00LP23AEJZILAAL4RI1", "QVOVVC2P4MC7ORAJICNMF33YPOL9D8Y0", "EWAVME0M9NG2G23491C1D6VX2ZGG03M5", "XL22QO6DMAM1WBRWVR9M56WHAN3W8TWG", "BKE59ANV49ODU3A1HTVJ39A1YV2DVJE3" ] - }, - { - "Id": "182", - "RandomData": [ "OF0M6WXUDOS6RTXGMCOP7NNBKNGOIK9U", "4VYODY4V6BFPRDJF7V0S5Z5B2ZCTPIL3", "O7B54IDYI3T6H8TGDBQXTRZE0XWNVKFX", "ZMATCOKYRCKCG934F6QO1YJ7I6FGWZC7", "X5G579EZ02FQGX8042IZ415BCCLFIDC2" ] - }, - { - "Id": "183", - "RandomData": [ "9NOK276F11X9T21V8PM3RNC5AF35Y8RX", "ZNR2IX875C7DD5RJLZG31IKWKTKXDBQ3", "KAKGL8NLQO7OP91EXUT91X5QC4SYMK44", "VE2DVL7MM5MMK5GK1F9TRRBWE3EQQY8G", "UD3LGYTMWGX6LSGGXH7GKKNECG81HQ6X" ] - }, - { - "Id": "184", - "RandomData": [ "6G2HC5ECWX6K3FKVX72I015JZYIA01EF", "K99F08E2D5UXOCL75MEKXX6ELTROWDM4", "T0A3FF5Y3AF5HI5XNLENX4RWD44HQZG9", "S0DXCR10QPQXSB7CX4BK98GYJO0LLYID", "3FNQEHU5UO6IN4DC61TWY6ATUOOY1PP2" ] - }, - { - "Id": "185", - "RandomData": [ "HN4MXR8QJF0UC7LOKYPTFVP6F35Z36EE", "9EBA91OO2DMSFPRWD9NCA5WV87G4VJWN", "BWV76KPTJA1CJ600MJV4TBDDRPCBUT2T", "Q9RT3U02T33AEULCGQSMX239SRPQIN90", "HHVKOH61S2KZID97DA5EBP6YFRBLEJUG" ] - }, - { - "Id": "186", - "RandomData": [ "4C268BX9T044RE1PRSMHS5Y1L7F6FVXI", "IE4FKD8CM5ULVBGAZV3V7MX9OBVB6038", "CVWNJWEOUK5XKNFJ0EGT1BL5Q40JS6FW", "BWIAP31DRPBWRAZB5LL2TJGAJ06O556X", "EJVYEF46NDCMAYOQFZOHUNC2PH1Y6MIW" ] - }, - { - "Id": "187", - "RandomData": [ "SNSIPB6ZQOOQH4AUMQJGQYD0G3I6OGAA", "4Q3WGFBE2Y0F8VUVGGLPDCF4K1BV3ALJ", "OOV0AOOHPEN2871VIWZH5U72L9MOEPL2", "MQ1U94V22EA8YM5N9QNGKDO3Q2PBC9DA", "3VPRFHVOB7P0U8E8D9PXCERIB8DHOT02" ] - }, - { - "Id": "188", - "RandomData": [ "B9FC7OH258FNYYISYR7DUP7YDGPHDO9R", "GWZU3BBY1W2D9EUNZVT7WXIVCQ9099YQ", "9XGB8XYWQIL7W3Z8VBSS4C5TODSMCLZ2", "7LEL7TPB66QNMK9I1AE7RGV62XX4FLUF", "TTALZNACWQV8VSGDEKVBG2K0ZITK6U6U" ] - }, - { - "Id": "189", - "RandomData": [ "ML42KXSN9BLBVXKKQTZ40S80IJVR30FB", "UAVJXO2Q1IBFQJFB7J3M4B44NDUBCBTJ", "5JQUCAWC1JDSR3K8ETTU63HSG16U30OZ", "Y2JH2U96X1VV7MNU3V7TS9MCC8OKECIA", "4O4YTCGTTW7FIVU3OL0I34GYPHF4FZ2U" ] - }, - { - "Id": "190", - "RandomData": [ "SU0TSYA0PN95CG3QNU62LAH9HFJM7LO4", "4MXY4BL0KA2Q5LVINYRU29JRN0MMOY2D", "9FB0TFWLIGRKH1E6TA9J33B5CGKEZ9LW", "HZQ0K5ZHCFLWR8JWVQ2OYTJFDFXM5SWJ", "44DSKOVXK2HYRONE6YSJH68XPLWEIMLU" ] - }, - { - "Id": "191", - "RandomData": [ "TC2W51MH4ED6MVXY2TQGANC76PD81RP7", "QXEPW0IFMKPC3CL3Y8LZ6FTGA40PXNPM", "ZFPZRIBCKK4Z89E4DJK3FZBLD8O2A2R8", "4CNXWWMP7JPVK4IA05MOCWG9EEVS3IBR", "3645WQIR7466KPAI0NCEQD5I5NTSA3WY" ] - }, - { - "Id": "192", - "RandomData": [ "H72O9MOJX4QI0KZYDM2PG7BZAW9J60QD", "IIYNWWJN92RVWXSVX4OXAHRK6CONNFM7", "OM9SVMBQDPPOPPDMENVCL2DA0OQUI5A4", "PTHKX99L27UV1D4Q9BJ9TKWVJ81H5RII", "OV86H3ZEOJJNIRJXT9UHVBKF7VAYI2PL" ] - }, - { - "Id": "193", - "RandomData": [ "ZLHGF8IGLFVJBIN2ZEY56BWNK38W2A5V", "48X6KDSU1O5QQADYII8DDUOYZ35MAWNL", "J9PDURSWWDERFF7JZJOUB2RJT9GQHFUE", "BUHQVAE00MRAP6ST6WX0I3JRRFTVKBPQ", "TAQV8QYYFX4ZKR4WRXUVS36ILZ9PRSQY" ] - }, - { - "Id": "194", - "RandomData": [ "7BQPQ7UQ78VU8UH9L6DXR370EIKJQJHW", "HF1IBOGTCDXUHLJ1SADUO2HDE0LHXL9Y", "19N32886ZUUNFNS29T0QFWHO8XEKD961", "E92I7P8UBG44I371ISIDUTSE195E3X30", "X3JGUJ4TUGO92MFE0NCV13GVRYR8U41O" ] - }, - { - "Id": "195", - "RandomData": [ "NEHPU1G8XYTOESMO30OPUH94WXY5268Z", "OAVYE0T8GE7CJ1Q8LCF3QL3FFN27CLF1", "Z39E7YJCHPIQK6U4H0T00FJCGPT18W65", "8FNP2MBX2DWADM5I370M1PBUT67RFSDV", "TMRESEC4Z67XTJ94UK7B6TETE365OTSK" ] - }, - { - "Id": "196", - "RandomData": [ "9AR0500Y45X5SNAK7D74UCZ9I8AZIHPF", "NXYS1I83TJGB6JB12V8LWXZ7LRS60AQX", "PRR4ZSSYEDKL5YD96J7WIDSZ71GK0CDT", "2TVO1GBJDJHTMNBXOT9RD4OL9268LI7C", "A1TMCYI0HXT969MUZS6HCVP8EJP8JD75" ] - }, - { - "Id": "197", - "RandomData": [ "MFTU4ZVZKJKQKPP9PMI2L0AOMUH2IJQD", "ZYW0Q2Z97G62L9XZ4QT64ETVFEIJS2RB", "2G0W2YTXXI5F3HDN7R72ZUIUFAVLTPRF", "Z4AEIB6G66JWJN27B4MA4YLI8GR1CHDH", "10Q8H8F6U163KWK1IXKYDQKAS1GCTFDY" ] - }, - { - "Id": "198", - "RandomData": [ "2C4T730CZQPD2S8L5ZSO7ODKPPQP2CMP", "YHBH114P7H9WBHIA35G4WY1N8UDRNKKW", "EAOVR0TD5DRZPQJIHPW75S39PXJHXMCW", "7MSA2XTDLD8THB7RL4K7YN1WGPF3RMPS", "A42D8IQU6SV2TJ2OZ163CE8UV63NRZW8" ] - }, - { - "Id": "199", - "RandomData": [ "XQSMJ4TCOZBG18C7W1DZQWP56ISBOCCG", "6XFD1PE5H3OND23W4600W6SAAWQBLRXL", "W5JD29FGWHSWHC2DO5HRMMT9FFCE9DUZ", "FD0HSZ450UDOO5283NWPKF9KLJ8X6BHS", "X2REMVVZBM11JFVJMDLWREP9DP5I0G8Z" ] - }, - { - "Id": "200", - "RandomData": [ "MU0VOXWI16O7OHBGYZL20VATMRB6ZM84", "OBPYO95YRC4VZRV5OZUB5F91UGJ7W0SP", "7TTN2M1Y3WLX1P346FRA179IBYEI08C0", "UOXG8HDB76HI3M9EMOAQJRXAUKMEIT85", "UUCM2X6YBPD5Z0OYY95L7VRC0XWX593N" ] - }, - { - "Id": "201", - "RandomData": [ "8MYJJWLZSMO3O2K35XPIYW78CAWFBI3C", "WZ7NBFPBXF3VGYY8N21HUUZLO0GJAGYJ", "SMHY4610INUS3M1OMY1IRWSBAW8L9GBQ", "RTC4Q9DQAB8G9GSC817LOP264GYI8Q0C", "MEBJK78MULHPXLC3E6MIIZBB1F9KL4RT" ] - }, - { - "Id": "202", - "RandomData": [ "L645FI2B2U0DHMJSD4ECES3WC9SE7YB0", "4XE0RGY5DLPY884P6RGQ0PP2DH3F0YDE", "TAITHSB7GI82DFXDFDHQSUAPHMXJNSFP", "HKE80KHNQIKRQXZ7T0AXQXV9A3L551TX", "DTV2BZN553AJJT9UWZ0XSS9UYE768LSZ" ] - }, - { - "Id": "203", - "RandomData": [ "ZXN7C663NF1WXMZR41IFA6FUTBD61Q6U", "LKUWFBSZ26KM1M6MOQCHDMY2R3NB3AB6", "IHLM2DL2ISNEW23HE0RLNZQ8W1FMYR61", "4NDUATTLFJ8U9TGY9G6CT0ST0NZB89E1", "WVKIZJGUHFGD068DUQMRU3ID4U3X4SNF" ] - }, - { - "Id": "204", - "RandomData": [ "FH7OJ8909M5NUO33OWRRXWG2MGNEPS0Y", "2A8S8U3VRVSI85TP0AJHB5RTAEBDU4LR", "VGUTQK4325ACE84RX7OPISX6TPR3T0BW", "KAW1K99QFQOF5POCKUQWQ5IDSXAB2AKC", "3O1DLDGY87K2DRBDAOT8KOFP2TIW88XE" ] - }, - { - "Id": "205", - "RandomData": [ "GMMQYL1GO2XSVQ9BV7ANRL2PIMK24TZA", "KFW1FUPYXMUS0X3MTHBB7JX4T6ILA8M4", "CXIP3I5ARMZE1KYUS8JWSYDAS1HIMDYZ", "AZPDOOSLLATUTTCJIX2BZZMNTI6BAWYO", "YADB4UGEQ8LSFSQ9Z89YKWALNBTGRQKZ" ] - }, - { - "Id": "206", - "RandomData": [ "LE6TPAOXRYV1O4IB17MCXADCA2Y3B9X9", "XVGAW7TYTLGWAI6T3SPTDIBKB4TXMVWS", "BWD2XHP3OYSL4RC15F9TUD5PU691O6L8", "ZYVNFE5VCVFP00QT211GVD770YI0HXPR", "NTVG6YW1JOQ88QZ3QQ9WEENV0XWQ6FNP" ] - }, - { - "Id": "207", - "RandomData": [ "GXCGEKXDFA7HX99K9PK1Y2NIGAPIBG5E", "AA2KOSYF35RDHG71YMQQ4W1NJ39E4OC9", "F2GWGY6R0E82LKAACYUZZOKOJPAUTTLO", "3S7O9LU9Q9ZZX9C939BG4NJ1S2M1XL7G", "3T82MVA1DUI0YU0KMB0TREUQJF6H83ME" ] - }, - { - "Id": "208", - "RandomData": [ "BT5DAJWH8KDJESD7BCOWUNZY9STGZ32K", "IEYFZWKDOTVGBKL0C8F6OZTX3GER0QSF", "S3B948IP1LIB2SXYG3E0X65SUBLSS2M8", "BPYIJL6E00ECRS4LTQL6M1RV7TP2WZ79", "8KAM3OP4799722ACG99BRQWJ8CKZ6DRB" ] - }, - { - "Id": "209", - "RandomData": [ "3EDHRRSEBQ9M2U3ESMWXZ5RSY0O0DZ84", "S8DXY3UYQ5ABRJRNIGGTR3L8XVT0D1AL", "SF34RGQZ27G44QBOJBR7SOMYWFADJ3VZ", "4YSLQX6BZQ1TXQDGTFRBJC3D2EHLGMQ8", "MRAG7Z7WEQIBW3BFC3TEMTP25OTLPU5M" ] - }, - { - "Id": "210", - "RandomData": [ "A3HFQ7I4H47341R8DBJM3MV2BHKTGWHU", "U5A2V5YFVZ6SWV7D7UHNKSTYHODJWZYU", "XMI90ZMHNE1EPDGPKGVVO3KCLMUH2PS6", "BL4JN8NIHAAF0PIDIX8PDCG3CGXOEFP7", "W4DDI6CL3NNO2EL6DQ8EQD38FBHHL9DB" ] - }, - { - "Id": "211", - "RandomData": [ "VDT6LF4MVXWZZ2A840KXHLQSBE8HY5A3", "KL3ZUPV8VVS3RDJNAJMVYQ4JXA4HGXXZ", "X2PN9LNOFMBV2WB75VHPSOF3RTCUUN18", "83GYY6NY68QMPIRA87MUPIHIXV6PJ331", "UCX9QNI8HTTU82OICCVXBGTZW7BC97PC" ] - }, - { - "Id": "212", - "RandomData": [ "EY2MVRTVYNN6YWJ4HXNHHG0NS7NTLF9K", "DQQJABXUS99X3XB9XG5MTI588O3XEAKS", "OD2IG94FA3YIGCT56N5EKW05VRLVH9PS", "YQJ0522XMZL0TW164810EFI1M6XYYI8B", "OFT023ADUH1ULAL80P1JIYNTIRN8FE9E" ] - }, - { - "Id": "213", - "RandomData": [ "1KLNDADB7XG7OXPMUY7JRY2Z2ARLPC7Q", "IX3BY85ZLZLUSQEVCANRG0XCRVVCS2V5", "ZZY13OYW2I71MIHL56JOYQJS91UCM3GT", "EQ521N1XM0Y826ZJOKGVSGGIPG1C3VK9", "BNW6MOTSFVC72LZDBLXCWUA7JWMUWZ41" ] - }, - { - "Id": "214", - "RandomData": [ "QY6PJ2690YQ7EJQERYAS7HNQMYXZC86Q", "0KQDOJ3JOYM7ED3AGID7YL3JLQCUFG71", "2AG32MZH41DJ5PLJ5XT3581PRH28GIDI", "1UFE69H3T5D7ITN5E3ZSWD63I1LVU1BV", "Y4SKJHN5P0K954G7373NTUVXYM5EXWJ2" ] - }, - { - "Id": "215", - "RandomData": [ "4RJNBCV7Q3D6268OVN1W7XCDJ4W7LII3", "RSFOU260L56ZRZ52NRTJ4W4GOGEGQXWH", "VJPK0U42RALC0NVU94T4Z884Y99OYZKX", "JZEHJUB3X023L2PBUUHVE1SWKUW1UPE2", "ZX2BINKO30H9GET5T84ESZTRHR7Z8JIH" ] - }, - { - "Id": "216", - "RandomData": [ "WAEX9N2GJ22NUSQGA0HWV9JADK41QUQT", "R9NGA56FFY4Z6F6YB1YIBWWW0DUYTBZY", "MJ6VFKFF4BQ6FUE7OGZZ6HR4M0P7LHWE", "8FNXJLS1VTO9GZQG9WKML92E1BIO4H4W", "PM89GQXCX8EN3RYXKJ8Y6K29NI5HCD6O" ] - }, - { - "Id": "217", - "RandomData": [ "Y1U31Q9S9HYN5OKKMVEUJG0FT8W8UQAU", "BZYC6453KPZYVPD87V4Q8LESBPK24B8T", "HELF0INS0LK3QBTE5YA8VUV0VFAQUD8J", "RGRQE8IZHM0XBLBA6F7GA97WTVUUH77W", "MBMKTDA6PK0I38YJEAUPF2IRI47TNYRK" ] - }, - { - "Id": "218", - "RandomData": [ "PDKA81R2FA0ZIZ3U6KQHMSRT24CYFRT1", "3Q30XXLMT1JFCSISBMWDIK87W0IDY2WY", "R9626C7I9DXUIMRJVTW24PTSR6E6PHY0", "EVXDVQW8PNDFXNYJJ8SEF43BQOLA8A22", "O6PXYOYF7XNQMN5DH4XRZTVK1WXHFWAP" ] - }, - { - "Id": "219", - "RandomData": [ "UL008AV5KMHRQMZCTH2ENLC5LE6C0QAK", "X76AXEFHI1HMLD4O6UY836CJI4O3ETE3", "M74TQYOOBV5VD0UIKRFG2CQ15W120MCZ", "XOAOIK8IGJ6IAQFSKGSXN8AKQCX36WYY", "TF8ZZF99S79TFI0PRJRT4OMYO08GXELT" ] - }, - { - "Id": "220", - "RandomData": [ "VIZ5SQ2FHSEP8QFHLIMXEE4E3JK9H3MO", "WP76S56AQMMLK607U04P2XPQNVBIF37O", "G02SSIYQLLH22S36TNOR87W9ART73Y5X", "O8FTEHOMBODQQXY41FZ2OQPIE3SBY1WX", "QUN3NK2M8CPU3FTN2YGY8CJ8S6PKYNXK" ] - }, - { - "Id": "221", - "RandomData": [ "2Q95K4RRNN4LB5P8KFIAV7YOLOLQ4RXV", "OF1MFXC8GYKVI77XRQ9TEXY42VU5TAX5", "ZJ75DC3XCK36XCGNRX9NSDR1Q7UTCHPF", "BO58ABTOXMQ331HZPHN5BJNV2FOGSJV5", "4X4IGHNPDVZFXX7Y04D53TE2BKG4XN6O" ] - }, - { - "Id": "222", - "RandomData": [ "1V8G78TI372QUH8EIZQXFZBLSCH6AT20", "YLOBY111L5B51YH3LCW77IIBTXX41XIK", "FB1I36QR7YMKYGU45OV8752QCNSAD7AX", "W10Z79AOVE9I68NND29NCKNJJKGQOPN9", "YYX6P476NGM25UUE9E7K8XVMNQQW2T9F" ] - }, - { - "Id": "223", - "RandomData": [ "1AUHKQ8I5D957VOY0BQKSDBBCLT9OLD3", "HGB59M3TGYP5X0O2B150DZXY9TE9784U", "9FY0UTYOI7E3XFNM617WQM0STM6QH4WH", "445SCYISCQSGU3A3G2DFBHEXOGGHWIGO", "K693J4KISOT94U70MCKP1QFX0ID6RA54" ] - }, - { - "Id": "224", - "RandomData": [ "KE5Y4GULS4WXXF34IQ4U71X40LCA0O1S", "SYZZYI6FS8663S9VPJXAGL7SRA7SETVE", "DEE8PDF9UYC850BIMRUR00LH1GIYLNB8", "N22YOBFMDXQRJ8X09ZGW9DNM36GJ4RYG", "XEVC7M3LLIODK473TSYWHO9JOP5R46SV" ] - }, - { - "Id": "225", - "RandomData": [ "8J4FMU2W55L0ZKC98NZL3C9IELXSRMRP", "03EA92Q90C0LDIUEN6SQHG26JVAB6KFT", "O5A5FC9G70V1LXF60TFV3AIUBI1N2OCQ", "6H7IIZ9L6MTQUAVVQEKNFT0NXP47LVNS", "XF4D07XBU3YQR19AWF6YDZLNRUU24BAK" ] - }, - { - "Id": "226", - "RandomData": [ "8A3PGR5TQJ2L4J55Q4KFYZO74QVGM5GS", "3ORR8T3EJNI46ASIYZMA04VIV6VZ6ZHU", "CKRQ1O76AG5LRUA48NRWSG192I5C8DIU", "FX1WSBQJ2P9U8J1B511SHVB6SRYST587", "7LG43NL76I4DGHBSR3GGM0NUV4EBN706" ] - }, - { - "Id": "227", - "RandomData": [ "RCWXD6IRQ4V908ZKQFAZY1UH8VI8IJT8", "S8VEUNPUVY0SEN3WE4UH7AH0RPZRYKIG", "KWR2NV0C0PEAACDU1V3OYMBR04WFY76K", "QTIR6BJTESRR5HZPMEZCR3R8U9CS9UN2", "S3TR4VY0MJKG4UWSFG2UH43WBK6690TT" ] - }, - { - "Id": "228", - "RandomData": [ "EY8BXIV0Q9ZHSLDANTN313VXA7PUY11V", "01CGWU46VCDIFWD0G6TPM01KDKB02BCZ", "IDQ1J6O2YQHZZMSN4YN2HLI9A1DLSEDU", "9OABFMRKS006SBV01X6EXKR64Q0S2CJU", "MXZKLQIRHCKRUMR9FMT5I96Z7DHYV9RP" ] - }, - { - "Id": "229", - "RandomData": [ "QGT5LKOLPO6VAAMR91MQTOLN0ANHJT6I", "U4AN3VX57IQ4DLZ71ZY4WB6B5GEK6HC5", "SYAF98YODQSK8RJPLQQT4BVT88SXQM80", "GUMPLT82BK0GTVDN6Z9Q0SBQCQGAQA71", "R1EOF4D1SYRULOAN5E00MSAXT5M4M7MA" ] - }, - { - "Id": "230", - "RandomData": [ "M9Y1RZICVI8CAQFXQ3FMJHO91Q4JSJOU", "MQHL0I6F5YEEU7XC0YNT291FVZ9A49TM", "4N0TJ37H79QUCJO332S3551MZC0AJ5K5", "E2KHHD371FV3TGDLLGHCR0Q8VO3HC68C", "YVPJ9HWZ9VC0J83T8PZCYIOOMLV3JV44" ] - }, - { - "Id": "231", - "RandomData": [ "GTF803LDTSD6YZYXVKIXH5NPGB7XV3PN", "0HT0352EDVSGFSZWW8H9MHWLFZ1Z6XS0", "CZFQG830SDTWMHKYLKAXVQASVIVDDCHP", "D2DPMJPYERQJXA87OCNWW4FWZX58N0WP", "5DTUE5MC4MTD914UKXZBZV2IWR0ZORLO" ] - }, - { - "Id": "232", - "RandomData": [ "5BNURN3T0L1KLCX72KYZAV0KKK8XFXYN", "BEH7OKD73GLN4S6T327D3VNKLDJGOGNC", "XNJG5ZTRH164KMP2NP3M0UUP17WLB6SX", "2IZQI0YEJP6CZTA8XQ29NBMD33P7CHPK", "IIBBW8TX0YDKYS0H6YXVDTK05WXOK0CB" ] - }, - { - "Id": "233", - "RandomData": [ "AV3QR8LY6FIY8COLDHANU4HY8KGALEMA", "WBJDYJ08N9Y8LW22IMLDZZRGNFSG1KN1", "2IB63LW4RC9UFJNMSO293JK7UDZT1TGC", "W6GDU586ZQVXZ6AE2GYNSN7S8EM0VDD7", "678IDK2WP5JNYXIXCU1V53TI8XEPTIKV" ] - }, - { - "Id": "234", - "RandomData": [ "NY0281BRNB7XDU4K6YXAMSCDNZJPFMCG", "VY996PZLTJH356EO34S4VJJ5WXOIRVMB", "81CPU4OQ9MRDLIHQU5WL3IVLPENIBQ37", "6F4D4Z38PC5J2FUNP8XW9BH0G0APQFPS", "STGFNDV5BX51MLTJUA2C3H857D7DZNRK" ] - }, - { - "Id": "235", - "RandomData": [ "WM0I8OAMM1ULGQN4H05QMNZLULHJGRGY", "FVEAVKLG9QZBXXZRZD69SB7JWOYXG0F4", "V6FVMNJ7PYQ6XYY7W0TCVHFEX4OGWX9J", "K5P1SDEM49T3VBW700AQHCJO0A7R8CK1", "ZHV1J7PSVGIWXLTWIQQ5XTBHVAARGXN1" ] - }, - { - "Id": "236", - "RandomData": [ "Y2ENQ4Y2LR4A4X1ORKJSWPDGFNGI68M8", "2R75HFGN1XUFYBN8JV95N5FJY8ICYQ6N", "F6HMZ6HLE60958RE9H9K8QU7MYGJ7DYK", "0GA23BJMOX1REGN0QEDRRVOZLKABZ8OA", "HQIY8YK88W6KZC2GKQ23AH3F1KRTAHXP" ] - }, - { - "Id": "237", - "RandomData": [ "J0KY7Z224FS5YD9IR40JGVA9WC6XH070", "9QB81DIVY994Z8QYLIBGRNJYZLC52FVD", "I26IBBQOVFVGVFKYVIM8Z0JVHNIQBN2S", "O5W7BIWJ1XUM2CCUBNJU3WORSKAY2AMI", "MC2ZSMWNWCHBF63ELYPYDIZ1RFO0I8R1" ] - }, - { - "Id": "238", - "RandomData": [ "LM9ZKMBY0670PMMWR6MDUXFEMAIN85FY", "UQ037D49X17HK8ME32JLVNGXH5MJEXZ4", "1JG9WSZNBNQ3073NYDUGW3CGJCWB0U59", "BDPB2NSKD5KI7N7JC9VADTH8G9ZT6XXQ", "SR1XR1VKVJD1S4J6FM91945S5R52X8NP" ] - }, - { - "Id": "239", - "RandomData": [ "I30PVK1KNKP3PQPL03OUX5RXVJ1A62XX", "6XSZE3K5VYNZOCCOCTC3T31MMC4MS1OU", "X2717ZH6TS98R2ISGN7M03DC6FNB98N4", "K3BWFLQMMFKB425T3LGE3C44Y451MF6U", "FEYY0WN47VAUSBIDK3IY2JAI8H7KPYAG" ] - }, - { - "Id": "240", - "RandomData": [ "I06ZEH3H7LHHCJLWW1RS7I26DPZSYCPI", "U3L2FS9DAB0QB3GZ5KYYHRJA7AVYRKS5", "69XI7TRD2OS5SL4KJAWNN0BCTL4F6LVZ", "S5UCG71M3U629NRVFKORXFRF7UYWYLGR", "23NX11ELJKT24IDG3J9V6DBNNPEVJEYS" ] - }, - { - "Id": "241", - "RandomData": [ "OO9FA44OGDINVYKZQS3PLVUZ19JLXTCE", "WBOPI7F8OVP35Y2ZFOE0LJG34KOAVS0X", "AE1TJ4RTM4A0F13CHTGIOL2M5VV7TFM5", "42217JQK7VOQIQXDQL3CMSIYLOXXJUAH", "RE5M8CF8D5K27LEP8SQHLKTLTEQSV2BN" ] - }, - { - "Id": "242", - "RandomData": [ "VG9EULEOG59QIQ09KHZ0D25HVT24WWMK", "47G1M94WNCAQLCDDNQINCKJ2K1SBSK1T", "SYWKK9WKNCNB2P6SPZQFN8HTXNQVQ2EC", "KR8WP22N48AA6IA549W24VGTQDX6TA3U", "7L0LQJDW7DLP8HWPMU1QGMIZLOGLF533" ] - }, - { - "Id": "243", - "RandomData": [ "FQCVSZOU6950K0VJRHU8JMNVDBACD1QB", "JRJSEA7WFGUHRROU3747L5U3CRSQZMRE", "S4R3RCEQK73D1GEVWPIG6SZO7QPXSQ72", "ZPYW9VC03OXOCRB6M64JELI9ED5BXQ74", "AANLRRVBNRMS5KMQOTKWWXYNHZS6ZBDM" ] - }, - { - "Id": "244", - "RandomData": [ "R2OBDZO5K26W80D40PWDGLIMLAE29ZML", "NABD6KNYFOM31BPRVYFJPAFFUB0CVV6V", "QUI7YA7QC7718PVJUWHLTC6N55T4UKDT", "S1NG3R2U0ZHRCOGFPQS8NVBOX5C3RC62", "4NJHBPQC3XU45PKQYNOE1EG7Z8S7P8CX" ] - }, - { - "Id": "245", - "RandomData": [ "3OWYF9DA9PE0AHTIUVFDX2AZHLSD6SX5", "V7BQ2VLZKOEM9P7RPKN4389AO7Q3Q9EQ", "2JFCGCP8JQ2JXX02OAXWF3BW7AB5ESIK", "JYUZK4LM4OUMFZN0GYPPMRL8HSFGAU31", "HR99DARTZK10IZRHWLYQC282MVR1ZFLK" ] - }, - { - "Id": "246", - "RandomData": [ "V2FXZOXFH50B0UZSB7TZ5NYOTHWRSZ4U", "8RFPT3SIYSIHC6B25902VWOHE0ES1FXR", "BGCIOK8IPLAMERMWF3VT9C9MC8L3Z9QT", "51F633OVASMKVCCWORM8TDS8G0FP8FSP", "4RQNLP3MPASRZY0A5YPHXS91IHZDX8X5" ] - }, - { - "Id": "247", - "RandomData": [ "97PDVYL8Y9STVBJR9EUJZK1LSZEE0ZZQ", "NXR1JXPGNQTY9QGH7HDSONFYGEV5UHI8", "KCG7TSIMZN6J1CLBS7HSWGB9S3VEBTWG", "IVO7KJYP803BQ67D2TNW90LEAGPZ7DKF", "00BFYO1JI1T5NASV6RMSGAGRKK6D38S5" ] - }, - { - "Id": "248", - "RandomData": [ "QXL051PO1DOIGQ1AX32P1290UT5ORXPJ", "JYPZZ20FC70CW7L3T6QAGCDXYVFM6A7D", "XE8SABL4DXN3C6DWIB5UHPDHU2ADWOIB", "AWPS923RVV6SYJV2RTE4EM6HA17IAHIZ", "OL3PQVWPHO9WTVSLHIWDJO7Y0HRI5UQO" ] - }, - { - "Id": "249", - "RandomData": [ "NHDNQFL56YW0NJYOJWB1UFPAOFZJDOUX", "7VJLSE5B70GV1GLRSD9JTY3H2C8KPB1S", "E931AN6E194483JI4I0APLDI2BTPFUW5", "9YQ1MTQFH4SU48I820QHL0C36V983Q8G", "N94KNR5L1U3U3TO32VWPDOTIVX51TSM0" ] - }, - { - "Id": "250", - "RandomData": [ "6LG4D8VL4FQ07RANGGFI3SC8PWYZWE1I", "ICYRMTZ4ALU883KEXRUMMD7NIHPRJ5Y0", "NHR43SBXRLHR8EAVLUCFTO6FFKJEDHUE", "X4U0MQLFQ75B5PPEH3FZ3SG8LMZSJ7TJ", "0C3ETJJ5J6YWT4JZ5E6KC5LEXWP9026T" ] - }, - { - "Id": "251", - "RandomData": [ "NWL3VLU7UJP64UPQD9XEAJG41ZQ74JEQ", "AFJ7TQDUU9Z2QPKDG860F2TEPQB64XDK", "E95ZKS7X6DTATOOLON05NOKIVESCOGZ6", "6PXQTV2YBJ4CISUACZRQ7H70YWDF94IZ", "NXEE0723VB4ETIADURAYYJ9ZR626SWYG" ] - }, - { - "Id": "252", - "RandomData": [ "AFZUNQKE7Y55M2HQW9VS4UADXPW3F5L8", "MYEOSPZDH51ANEMZZMKSAGMPFV684Q9C", "N7SXY37GKRL8390TC7D3U37GMYJ7S0J0", "6ZWQVZA6ODHT5NWF5M66MFRU9MLAT9XT", "HUCDNJ8N7HORVOL8BECG4MN0HCQJN9MP" ] - }, - { - "Id": "253", - "RandomData": [ "QXLKKS1VOS9F1A9VAM8P7RZ5GM6K2YA7", "49A7CAYTMQ1LNI8HD5IAB6R88QD8WR2Z", "SCK29BSAYPDR0NS8NYH7Q957RC9W6064", "XB2K7GIBNIMV2AIU8FU8K5JTGMK6C5D8", "TJ3YUHAHQFUIXKER4OY1F8U12JDU5L9R" ] - }, - { - "Id": "254", - "RandomData": [ "ENCTHUA0ENSELB66H3CYHM2UYB5LEQLE", "FCDJHVJJO7W1QPQ1NHMCILJ2VR5FYZWY", "CN8I7XYWT2JKZAEIVE76DI543KX0ZEVZ", "L8ZCQH30SZSPB9DUMXUU1ZU3SEPW987P", "HU91LC1NKHON0P24HDNCTA7VN5UM1G0T" ] - }, - { - "Id": "255", - "RandomData": [ "2CIQAMIK5GJTLHDCLVP5V46GWNNPSPVE", "R4UXHL354CHM1OKG2RAG1588GB3W832Q", "VECQWQ5A1TATXTOIDHXAOPNV6WQFSH7B", "J01XL4TLWAOI4OKWWVT1F1BF1QT9AZSU", "V8J6216JXMOOAF1RL3S6XG6SZV55KTL6" ] - }, - { - "Id": "256", - "RandomData": [ "S4W5FN44YKD3NXFWZCYGGV6PC1HG6B8E", "AS6FS5L78YINDDEBQJGI5FZ68G3OGX8X", "L82509D300HSMSM9WF0W40I529HMC71K", "ZVCEKJLQGNSF7GUP432A7M2UZ6C12002", "8631PHYM4KPRHD8WP1RJF1NN3RONHUYP" ] - }, - { - "Id": "257", - "RandomData": [ "XZHAM2AWEPFX6KNW8PLAJRXGTQ783LFK", "WA4S67JW14EZW0RSE2P1IXGGCAR64B33", "K4B5P40AGYJPM7U38O3B5OC84YP5QM1Z", "AKP1YVDJBOUTN03EQY7PH2752CB1P4U3", "7UOBS2ENLU9R3TVD5LO2OLRHMT9WTL4H" ] - }, - { - "Id": "258", - "RandomData": [ "31W3M1WYTUEX3QCJQ86EP2PVCGY83R39", "Z2XC621DY0I4H4O6R0FVP01BMA1FCY4C", "0E7B2AMYG2PYUUNH22RCLIT9AW05AWAA", "6GED6MDQNROXKCR1XTMKH20RU8BGJQXU", "2P2OQKLQYAZ446Y7F8IRJ03EPWS8L7H7" ] - }, - { - "Id": "259", - "RandomData": [ "3345JDKMH5WGC5XXJDALIGLCWY841ME0", "32BAC3YCX5JNDWBU95ZI65YXS2IVEQV5", "05NK4WVPO8XM6789XN56X637DNSJUD7H", "KOXII00MJK38IL1V4J70VYH4BQHQDL4L", "BPCRKZ17XSXND5Y1W7PLFGVVH2G2TJJ7" ] - }, - { - "Id": "260", - "RandomData": [ "PR63JKLESACDB41F2Q3G6SG43QJRS8OO", "JZ7V95SMVK3FDSUNBBADQCB6KC92A4VT", "WY3L6FG67RUVZB0L66PR8K8GYAK66ZM1", "YKSPYIQ64DF8RPHJLY5DOEVL0XX54KAI", "E37OSLWYQTW4F9ZJ2BUI3JNUZHYBUVBU" ] - }, - { - "Id": "261", - "RandomData": [ "D74YR20ABHX4R0F17OC3Z2O5QMZLWUD4", "RB1IFB19KTGWVSC8B7EGSI5KS8HFDOOQ", "E2MP87W6XCSFV1J7J1KZQ7MJGQZG3W65", "FZS3FW9EKHTPZZZ0ZK5MEY9GQCJSHQCB", "GXA5JQ2X1GOIO6UQ18RT0U1QZLNCNR64" ] - }, - { - "Id": "262", - "RandomData": [ "FSJBZ3RISIU8K12TS21I8TKV6TF8DZJJ", "JTD5XS17RIAS93F8S3UU0Y6VHYFGXSF2", "8KY1X669B300S1VCNHQJFZTUXRY8MVK9", "CIUZEOLV7UT68FDPCD2QC6XI0DEGI7WQ", "S1XKH68954LUFXWROI5J237GUL8AKFMA" ] - }, - { - "Id": "263", - "RandomData": [ "8DNHS3IGF3UHVDCDRW2ABMXZ3RZ587Y0", "SLVCJP9VAZE9JZUQI4TXNM8VQYNBDMIH", "E4YJRA4CXHAMIXPE6JXDNANGMAWUB7RX", "Q64PAK9I9RAGMVN2JJE4ZE3DQS7ROKAZ", "ZM6L2ADVJPE6AH41W3L23X7LD18SNR3Z" ] - }, - { - "Id": "264", - "RandomData": [ "QKQ9ZCAIGTUKA6DIYF4U8I6BOUHBBUH2", "VOQZ04BU3CWJDXLGX03IWI0IOPUE48GV", "L2ZVQNS3DK15VW81JBNL19FMYILLK7Z4", "6B7L8ZZKHAELR4W1R352V44MXN7IBGSG", "V79UYW3TMCD04353VT4RB6IBHVYV2RJB" ] - }, - { - "Id": "265", - "RandomData": [ "R70T4CD4ALQS1DR3RDXRMBFYZ8MD8H14", "3CJ7CL8SQ9R0PZKED4DY41YP2B46Z952", "TVZY3U1GEEAMTPJ9YIAEEDACN4EBRC2R", "EZG3AVLSD6TZ0L5N24HR91XQVWL9QZYC", "MTI4IP8D7SBHULMB80IW4LRMBZINKLBN" ] - }, - { - "Id": "266", - "RandomData": [ "IQNGCBEN5ETRZQ6JKJBZRCHAC52TGV3V", "QX9D8F96W51Z1AXV39DAKM6GIMEGIVGK", "L8ABQ2LEKEDVKSJBIHZHR2KE134VB2YA", "ZQO39VEAY80GIL50CC8B692TX6KX8ZDR", "QD64DPBXCYTTBE5Q7DT84WDZX4GCLRC8" ] - }, - { - "Id": "267", - "RandomData": [ "5I0FOAXXAK8IQJSSB4Z4GEX39GGIJ9MV", "VUY2NZB7Q57TY5JOMXBR1H20V7GI3ONB", "8NW6VZFL22OKHEED726W854N18HQT3DC", "S5ULJM3WSZY93SSR2DKBR1DDTIEWSY29", "YM1LT33U9JEJG4TJP0XQSCU12R1AIGE3" ] - }, - { - "Id": "268", - "RandomData": [ "6YKR0H78JZCIW46YY5H2BMRW1ASBB3M3", "FKMRUCSI2YG29LE8VDLN8L2THXZ0Y67P", "NIDLRODWM9AMFYWQ5UP7R943S2K7M2T6", "11P1I2QHAYA9LPOTAJ5DQ97NOK3YEFKU", "PEUOJ5ICEI7285RDO07C6PP23BM791C4" ] - }, - { - "Id": "269", - "RandomData": [ "OQTH49KEB29HBEOT20KNIHX9Y2VHSKDM", "FDOSLKIPQ3BEQI0YW3FJRZWH3USCOCV1", "ZXB806HSS57PGSTQB6UZE35QQHY11FAN", "HJO2G280WX1W1HAKACASR6W52VRTHQ0M", "4TH6E0KJ84CRCIYJGO0ZES6LWSAVKOSF" ] - }, - { - "Id": "270", - "RandomData": [ "6O1I9EGJ21TW3F3T6IN3ZBHMX6KVZY8T", "M6VXRQJBHR6N8JRRZRZBBZQ4HPUD4VTD", "29K6TFCP9LVIF4NOO25I97SXQ0QC6FHW", "73U88V8TOJCZDIZNBFZBZLD5RXQ2Z9S3", "D9LLJPQ24M3042THBDB0QG7WZZRKFF4P" ] - }, - { - "Id": "271", - "RandomData": [ "0JWE7NDVZ7HNRNBYDI1W82N7BZWU8FXY", "SO9VGPKX9PBS8UEMY2H6OHQ85YCI1SXU", "JS4CNPRX8DWT049RUK6F70KK8BZSMB6Q", "1RJPZC8IKT8KU7HBZVYRWSWTIUEM09K7", "GF1JVT1SLY4O2AZA3X21NP4J4ZHE7VRK" ] - }, - { - "Id": "272", - "RandomData": [ "IADOF7QF3GF7XI0H4DTDHTU1LSO5MWUZ", "HTF16K55HW7GJ7VW89K4CODZQMDXSU3G", "VP0ED9LTIX5UVNRN626MMZX2PPKTHHMW", "20U4GRT9X0VPSSDD5010XR4627YXZ2MB", "KI242WGOJ7YWEHK7MGYRPW9L6YBJ36K5" ] - }, - { - "Id": "273", - "RandomData": [ "NUEJ0ILITMRZ3H1UX1KSE5VYJR8DV7VM", "X2ITDAGD4P7CEJRY6QVCV11S8PAJKIXV", "1ECA9IRXUGXY7STA9JGELT16B0UX973W", "2MLAHRZY98ROEDUQ6AJBBSJING8JX4XW", "NA5VGT2RTRENBM27FE09X2UJCDXASQBF" ] - }, - { - "Id": "274", - "RandomData": [ "K5BDH9JNH2RUN6HAOBDTDY9VPVSD528C", "Q9CFLYZG4N15KA6F6WWRNRCW5PXWQGRP", "3ODO4BZZL7YZ7EKPZMGJFQZ97PK5BDZY", "5LB57RL577GP3MZ1EI6D9IKNZEQO13XH", "H93VCPRHBLMHKJFU0S03GWZXBYG2A7ED" ] - }, - { - "Id": "275", - "RandomData": [ "J8I3SEZZ0ZCX6CCP86XIC3AUKFTOJYGD", "GI7LAMBW2BDRUB19V04EJ5AP7XTMUKQB", "S8QXE1PW4BPB0TAIOU3T4B3LHRNM3YBS", "UC9VUD43LIKIP9ZOXK8AR7GQFFQWNC2F", "97QYTOYK09IW0U5I28ZT0BBX5SQOXHQI" ] - }, - { - "Id": "276", - "RandomData": [ "PFJSSB4JWXKRZUZUJH4PNJO7632B7JXS", "T9GVLN00DP6D1T8L36FQNB5G1LVYJ3LM", "A18ZOEI6QDL7MLGM4QHAEGFSDA3A1BRK", "DUC9UI7YXI9JZ83QEI42VKI3WQWNKIEP", "VB32IG2WTTN5H52FGN5THZY3LJMEWTNP" ] - }, - { - "Id": "277", - "RandomData": [ "EUYYEAH8QIIC7NV1YRH7NVI5MAR83X99", "F70XGDAFG6C8QV57XVQFMQCTM2LETIE2", "IJ6AW8UUQB1QSJP1ETLIH4XZ5HKO15V7", "2J0HZ5LYA5YKZVADNU9A76VNVHEPXG3V", "P3YJSHBJIWILGN9JGHBG5V96XMWS05A3" ] - }, - { - "Id": "278", - "RandomData": [ "CD4571UFS01LXJHHH4IPFWZ441VFVTTM", "VOJDSEMPX5XF4XIOFOL5WUXPNAAFFOU9", "GO0JADYCS32J8T9HTHAGIX0A04ZSDGJJ", "LY9P79NBZIM32OQ4A3W8ON0TY0SGOG9M", "TT8KUUKU38R9K7HMN4RKUK587P1HQHXT" ] - }, - { - "Id": "279", - "RandomData": [ "JAJJPGKQTBFP61I1SF2TYZ2JY9ME2DDV", "K80KY86GUB0SFPCGHAYLPE4UIAUP4FXQ", "8TE8A7CTIV8X8JDI7F72O2GGDFCXNQMO", "NKUWLDFJ7FC3FHW87MSZI4CFM7455PF1", "JUJYZQ739X5J0NA6TD0B8XFTIOJNJKOS" ] - }, - { - "Id": "280", - "RandomData": [ "9KUV77JQPYZV92P978M1YE3WO0QKHTUY", "JNKQ2O8V4KVK7UTP9JQL8W44R8HHR8J5", "DAMWS8GS907NSSY3GAL7DJ0WTP84H0D6", "B0G6I76AC7LIZQL8JNBQWM14KZDCAMKI", "WAM2L2VIDL4F7S7CEAV3ZXJZ9LVT44A0" ] - }, - { - "Id": "281", - "RandomData": [ "XCVYDTXQ23MLRV721A890QT91X29GCNJ", "KDS46J8VMEB5K7HNO3245AAGSW6Q0XK0", "QCAOCC5RBNWVPYY3QOVNKSNKCMLKMS4Z", "4LPH72LL7K2SNO147DALC7P7Z0L01VFT", "S71DIR6XDJP9056YVQMIRSX65SSGRVUM" ] - }, - { - "Id": "282", - "RandomData": [ "EJAQWXVPHNI2RQH33XEKI6C9J4H09ZGS", "YC4Q4QB857BEK4OPLYN3QKEIHAG1P5QS", "GZDPV09NVGOL57ZPQ2PKLMBO8WJ4KKSA", "QT7U193UZAIK53NJL1LWPFG4XYR9QEDL", "XO4M9EYQ84VLD1TFI9TS85UKMD6CS4EU" ] - }, - { - "Id": "283", - "RandomData": [ "77WQ8BKHD4YUU406FM0QVUM14U96HV8D", "0AOGECGHZMPDH90RNA6GEX9MU4WOBN9R", "6U4TQT1CFT1IEIU43RSGZ19DBBVKQ2FL", "M8GXFHB3I3BU50IMK2UU522FU0SO7RWM", "NP6GC6YWQY750PHK3J9YIVQTGBCOYW51" ] - }, - { - "Id": "284", - "RandomData": [ "HYGQ4BKND7DG56OFTHVYR7E28MAA3K74", "2GXCI1Q29WVKRKYJW75RAHJJTORRAJT3", "9JNYIM7213Y5M4LYY1O6PQ3V6NT4J810", "C2LI69AKAC0HTO7ZC23J5XNTP2243CT2", "B83UTC2Y0D5M0WBSQ31QFS4OO12EHGR7" ] - }, - { - "Id": "285", - "RandomData": [ "T8FUVMGAAET11B330KO9LCWTDOG1KXQU", "W731QR6DX1QB9DXN89N71RWRLVRHGOZM", "X8E3HBMJNKLUWVUA122LKT2ELLQ4AZ7J", "BDNA83F7WEURGB50BQQNWOCEGAS5VRJX", "MCTSHUC7X5YF8L8KQZ3TJUWWAI48LJME" ] - }, - { - "Id": "286", - "RandomData": [ "56EDSMSRNSZ006G5BIP5YZO2P6R9ZEWN", "TTKCG41EGLF1456EC86D4QQFSLYW4T1J", "5LHGWDYGQKZMTW8T9N60HTTCDET4GFJX", "U65SYZR8KZWT1DW5NEWQWABL2EDRU3AL", "BB2X1Q5K68QR79L9SYRBS2AT4TZTV9OQ" ] - }, - { - "Id": "287", - "RandomData": [ "ZKSZL8E6JMUYUTO23E96L82IAI2H0LY6", "U92WRWXTTV2GHM9KF70RASF1SKYCF6G7", "XYDU11LHQPM0FWAXIRB3VH5B4AEH7UOW", "P4TTIPTNWSAVFOV5KA3X5MLQ2C00XEK6", "BZLKDRO38YHCGK5PPI76101CTC0GZ20S" ] - }, - { - "Id": "288", - "RandomData": [ "IETQDK22WAZHFIJSGKLOHNFK7J1A0IEF", "7Y3C0PMEPEK0BU6K3IAOQLL59IS4T2CN", "5TJQOH107H9CDOJNMRHSHZZWN8CS6SVX", "B65RLP5VRKRJMI1V9FRBUUGF4WDPEJ3P", "VLBHS2C6VVA7IPKFHRS1ATDRZZXYMPRI" ] - }, - { - "Id": "289", - "RandomData": [ "QBXAGUCGCVQ9TJ7OL7IW0COCITR2ENTF", "D2RG2J8XOMYPCD8Q2JMPH5SNXU2XCJCZ", "BK5020VC8VHNO99EVBA5AE8IKDTHQLVE", "J9N1IHYBXKQVXE9XVYBAJGY6MXQYHNVX", "ACDOVH5ON8HZYMUFE6W2KU5DKRPV094J" ] - }, - { - "Id": "290", - "RandomData": [ "Z3VUAUCN2WXK98I9CLUK13MPHAEE2KXN", "E7A40AFT4I9X6VDLIPTPPTS6QGN9Q7VR", "8KGC8NJBFAQT3ZSV726M1I7UPDOUWFD6", "XRYWOBN4GRJPC9C1X1CXBI00NVX49YPA", "6U5MA6G5OBGK8SRPBX74CP5O18J3OT4R" ] - }, - { - "Id": "291", - "RandomData": [ "BJSSD000VGJ9BP15EH3M1U7RYRUCXNR4", "HZIZ98MK6GJ6G5MLGOYH0SZQLB3WFXDH", "ZO2MHB5F4SPVLBK3EJ6IYKEZA1N8FZEJ", "CCG2DAEETTMHCDFK0AS614SPJDMPX69E", "OFTJ4RZDF1ZF76W6WDHEHHSHT1SAYZRW" ] - }, - { - "Id": "292", - "RandomData": [ "TH36T5QIKO19FNRNQP2UY57GXM0C9ZPQ", "KDV0DZN0W943QSCFJFTJ667YKWJHFNJV", "8KZB21K0CB7ZADZEJU34GFTNF6PQQFVJ", "ZJ4F2ANS52H49HXH7E7VUPO21M55L3K6", "QYA1IULJGL8N8YO8JITMH9YK4BOQESGB" ] - }, - { - "Id": "293", - "RandomData": [ "SKOKH58M2YPJQA4C87WDK7YQA07GF5EX", "E75YKD0NKGTTUO33HLSG6C0UV7KQ81H7", "T1ESFG24GI3EOF6V6E93N81CHLCM3JOS", "9VA2KKYBTXAXJWFQBZT41NUVACL3DPB6", "4KE2EDKWP8KZ7D2UFWKDZU0WBP2H847D" ] - }, - { - "Id": "294", - "RandomData": [ "WD39RNL7O7O3C4X6J0YRF7GJTS1ZLCXV", "AGD4K3D2KNZ2G7TG258HGQ8Y6UP9VVVM", "J32612WQX5G1IOCW8V7QEQPUIO70NEGZ", "1NSNEXP9IRUKJGQSR3AAYFH3NIYM56DT", "ZRA55ZSLF7IX5ELB7PJUEGAWFY969CEL" ] - }, - { - "Id": "295", - "RandomData": [ "OAV2GVW1LY416U7I6WOPXSPSROZG0VMD", "36I5TS4M2RJPLJZV109MXYY5VCL26QBZ", "M17ALCZO2CXFJ9GHYEP9W9PEHMJRHCQM", "QTDULZJYBVUUBTWW5DD1ABCML3293IGZ", "WKYZ5W69418BP5CY0XVE8YMPQ1JR6K53" ] - }, - { - "Id": "296", - "RandomData": [ "P481461JHE7JDB6Q0DIGWC188JJEMOCU", "5FWV6L446L730CLO4313BZGMCA3UWW72", "BMN8PLTPINKLE7H584JSXJSG8JS6SKHJ", "NE2OYN9SKLUYP4IF27V2NOF23H9G3W78", "GA8AF2GU40IMZ41EANEUYO599AURO2ZX" ] - }, - { - "Id": "297", - "RandomData": [ "NWSO6H990B7WF3C9Q4FQSNJ1F8AFIZFC", "BV8DMNI3NE3XQJ3G7VBUWJEAM1J7H41B", "65VU49XDWMCOTWK5F4HXYVP1Q70VDKWS", "M21VXIL7777KG0R0QN1MWEMKP3E7JC9M", "0UB05YH6SJZ0XFVZQ9E0SJ6IPQG4EOY5" ] - }, - { - "Id": "298", - "RandomData": [ "8VTWY152F43MOWWJIORJ8I3QX2KOSN2E", "V41CW8BYEMVXPT4336W07P701C86QQJ1", "CZ1U4UXJN2EVXFBE8RVV1CHF7BKTAEIX", "C3V01K8JIMMEKLDWB4795X99RWW3JEJI", "TQT3UKMYSLNOZC4W8YRGHJ2O3VIFXFAE" ] - }, - { - "Id": "299", - "RandomData": [ "DEU31KC1RIQUKVKP1A4VWDAKYE98BGBN", "LILVRA4YVZY82IEIL3OWKPRADKFXKE0L", "HCIBJY70GG97OCRQ90WH2OD61KRH5GNR", "9M009C9W6XQDPUVB2ZXURST38MK9H05A", "3R7CL1R70ALE89QGYQPGS2AR361W2APG" ] - }, - { - "Id": "300", - "RandomData": [ "1QK8WTZAH03RHO586DK0KZRARQIO94F0", "UFNSZSTF0O828TJPB20YZY5C8JRGKKAN", "UC6CANJOTE961YB7G3NHEQB5JKTPBN4Q", "NUH6WHOYTMFVZ9LKITAR73JEBB2Z33MG", "JTSGQFL9OZY2LQGK9IHRNNSULD4UOY4Z" ] - }, - { - "Id": "301", - "RandomData": [ "98LGRE3CHBCIFQ2V5S0VW536A74NL0U0", "583MEA35PEKMLKP5LIZ68JDDFPFTKQ1Q", "QMNGXPQ5Z4FRVRUZS9CCBY1V4ZHZ4JU8", "N3597IH523GDDWSY4PAKOZP2U1L7I1BP", "KGD1VV2K1GKHRYSIGT5OJJUYOCOG6JXA" ] - }, - { - "Id": "302", - "RandomData": [ "2036S1CIX0THOHK5JD1Z5WGAWPNSGWNR", "TJP04V0PQW1S0MJG2T73S8FGU3JDNUBB", "MCYF1UAXMMIJ5XJKFG0XZU9VEJGBMXB6", "V0GYYDOHSJQFZ5L6T97G3OL1CDBSN9LZ", "KMXERVWB1SFPE35I7KSMZ4DHOPVUC64T" ] - }, - { - "Id": "303", - "RandomData": [ "815NHGP7N5OKI6XJH3VDQ89QJQ0CAB95", "YWQN8RA15U84P28R1LMIK0CA1OE1PN7M", "5TVWQKL033I59EAQSJKYY0U8UQVTNJLS", "XW86GMBRAWPQSGAWOXIGCIXE8XC9Y1MU", "S0INGDJFH3XBLDPNQ9E0AEPO848TKB2I" ] - }, - { - "Id": "304", - "RandomData": [ "K5818WQLND9JVW34HYTZXWTOK3OLE05G", "AO1PFYO3S2M7FF3MAEMVRDVYLURFIEGX", "H2JG5OYTK0G4JWIFABLANJY73CDVHJUO", "WYZM6WRWP3L160OYLLFG3GK8EMM2KDMA", "F2IV75INUZVU77ADXOJ5EOUPO0HUKYLM" ] - }, - { - "Id": "305", - "RandomData": [ "QKVDS31PD1WDVZAHLJE53R61H2GGYYC5", "NIDXL6U3X31M2Q4Z0AIATPS9O36ZXU1O", "Z00MVN5OYLI9ZT907RQXPBL70EISA5GD", "CMXB0SDNE4MIHSK43F1FDD9XP2VRENN3", "EE7M68APNDTUZC0H3NY5DA98NAW87WI0" ] - }, - { - "Id": "306", - "RandomData": [ "QTDCU885FM1AUO7MBNX1ZSZEF986LBS1", "43DG9XW5P201I8N8CJ6T9QA8497V9BTD", "4AF1L0NO01L7275GVA4CF82N2FM90B6O", "IW7I3WXL6S2HFCG6D1A8HR85I18FONXZ", "57YFAXN8NSFXGUIZ8Q59B7G0YBABXR7T" ] - }, - { - "Id": "307", - "RandomData": [ "4DMHNB6QNBVYMKZXSIG8RYY718Q8WLL5", "UW2CHBL7TOV9MRONMMSOK9BGPPQPU74C", "0ZE0SWPR6JOCCYUJTDWK36VVUWX2V6NW", "UTJXNY5Z6BRBU8D05G6RLTJ4ESF68X6A", "61RTO655H6N1OTAVS77O95LBJPT5S80J" ] - }, - { - "Id": "308", - "RandomData": [ "ERF2RUL8LBJOGRPURTOB0RBAQQJ9NAMJ", "GEX7OHE8V9D8W64298N9UYTWQEMAKMUK", "ZAIB4SGJPPP0OCOTVR9OWNYRVARJ5EYJ", "O2JVY38R2ETEI2IN02O2MGYLL0P3B6NK", "1GMW3242TSVS3TI32DTDZ57HE7J8NEP6" ] - }, - { - "Id": "309", - "RandomData": [ "0INCPVU77WJ3UGS1SWB7NKV5JFS5S6OO", "DZ1UGFOGTVFDWDW7OSP1CRSQXR3KDYOA", "H405O8VMI5O1ERJGSUQAQXLVGL6YMDC4", "HF51M1TQ6DSHC0LFHX2TINTUTFYDB6AE", "2UU9VS31BAENEESP90RZLTV3VLIHCPP9" ] - }, - { - "Id": "310", - "RandomData": [ "DOPSGLTZ3BRIJGPOWIDKPK2I81OKKWYV", "VEK0ZAJXG25KCNTO63U4MEU2VGTO7JOH", "M5XF5ZZV8PDWOSGVI9NQB4JQTRETR506", "NY7G0NSHD956A7NC98G867FSWGWOUGED", "ZGJZUA54QGNC8NQVDCTTZ2APTPUT1EW7" ] - }, - { - "Id": "311", - "RandomData": [ "41H3YXS8CLRZUCTJ0AKSWVO6G3GFQLDL", "TPIHFW6QTVQNKK5Q5K304EKJMKX5RMR1", "HFGF4MDDD48BFBW58ZKFSMROE9459B8H", "DYFFEZWTHZX9GJDLY161CMJ5X1A5RHEC", "517Q5Q1ID172ZRI55THHEGF1PKRMZ1BA" ] - }, - { - "Id": "312", - "RandomData": [ "UUEPLXQHAYYKOQGFTE97A77YVGBV9PSL", "Z7IEN3UIDAGPR4N8DL2V1EAWWP3EV5IV", "GNUQIB10U14A1SH13CRXW7TV7VS89PWH", "1UJEJ60CTCAAJA5EHCLTNU9J39TXT30F", "FWIGICR7MPDU6TM7ZN07DC4GVALKNCS0" ] - }, - { - "Id": "313", - "RandomData": [ "L55W1Y5FVOH8RPNJXW7FC3BC2BVI0HUJ", "6MIAYZFARVMZ55ZGXBX1EMYR4240DXON", "37CEGMU7Q7YQRLG7MOUYT3ETX1G65P64", "G8572UAKRZKHYH9SV6OZD04A2SQOGYCB", "A4KTQJE1OJH4S65Q2YK8AH0PE5FKDVE2" ] - }, - { - "Id": "314", - "RandomData": [ "XIH46PCM1WK3S9S5XAWRNDA2D4PUD4X2", "EPHJZBTMW8HO777ENJXD9XOUIP1C9RI7", "9SYD2IGVRJ5P6W4F7LH4HU2RAWBJKRME", "ZJPPJ4LECBV018YVUVEYJO0OZGCFG6LA", "600WHP6D9D1G8C0C8PZYMY5LTAZC1G7G" ] - }, - { - "Id": "315", - "RandomData": [ "ZV3AIBOEYBYGWTPXQAH1HXXI5OCG04L3", "FVQNI036AU9K9ZZ9UBW18G8C7VF39HO4", "05AADCO0GK0XXMIFZDWYHT48XOPXV973", "FEUEYY6SW5UYQLOUM9E5VZWGACNYW1FH", "N7RS1ERAGDBM9GSLA4KV4BIPRODWLI55" ] - }, - { - "Id": "316", - "RandomData": [ "0NKS352HSEYRYKG3TBX1QTMLYBANB4Y8", "HGVW59SEBDD0M01GHJDKUEOHA9324PFX", "P0JRZU8TTTZNPV88J3F21OND2NV6FZJW", "7QLWQJRXLT1BOA1PB5SBJN5BMGZM9BN3", "JDP9KLRAMSQIWMY1WF5KHIMTUJJKUFXJ" ] - }, - { - "Id": "317", - "RandomData": [ "F82LU1EZNSY17XPAR8Z3GDVA06PACGPH", "4GDYUNG4BG6ZUVW64J3VP4DBN1VYMDWH", "CR60U1PE252AH5QFJSG2N41ADBK31RR7", "TZXCY6MD3Y3TCD4RKQO3743HZ6WTQWMK", "N4QSINQNGD8ZAI79H3SLCYAY5PN1J3XG" ] - }, - { - "Id": "318", - "RandomData": [ "LTFHWLI69BW35EHQ9WLWEAHZ41W29YDN", "Q1NQCZN5UVMBCG31I62WRACLLQM4ZQ7K", "7INE00OJJPBSYGWY84UD6R6PZCFVNSGE", "YBD32ZARSTMB9TWF4Y5454OPM8OYV361", "J74WC35J3CUME5QFP91YWLI4XXR4KL5Z" ] - }, - { - "Id": "319", - "RandomData": [ "XV1CZ9DA2WA2JBLQRJJWBHF8YA9OLB9R", "G5ZTDOQQ505AKPVVMAMACJXPQ3NY9ZZ1", "WSWNM1ND330KMEXIPOBKY8P7HJDJA1QG", "BEN13HJVXIHJTMDLGEJVXODXDYGCYDDC", "NTJH15PIFQXP1FO4G2D6R4SWBZYEBG7T" ] - }, - { - "Id": "320", - "RandomData": [ "FF69D5UKZBQH0X58KL66AHUSBXGBHKG8", "SEJWJO1KH2GPNK5N303ZKBS8UN7PYSDO", "4SYWNJY5TVYHAFF013HRQQYRVKC5QLVZ", "Z2U5VJ9UB8GYML8PIHY5LW7N3HADH2OH", "99SHUJES3WPSKAFKLWXJX0NC4GCOI6NI" ] - }, - { - "Id": "321", - "RandomData": [ "T9YN2148CGBYGPD3C01UFFTJVQMNH0J7", "JH9KL1RU2ZGQZZ5PDIMSE2DNPP2MOQ0M", "7DO9P2RKIG2P8CU6U6K9N12QDV569FFL", "84TVK6AK0BJ8AXPM452RG19FK8637VLD", "AQRES8WY6AILR4QPGSBDMYFH5OKMAGMF" ] - }, - { - "Id": "322", - "RandomData": [ "0F7UGL35JEUFSXXPRQXOTI1MLJIEXKY0", "XDVM76J4YG3ID9YH054TS8VSOUI6CZH9", "P4SPCLSVG2ZNOSJLVBO2PEHZRD7NXM29", "842IRJFPNJNZIID6L7LBKPTLW378NE74", "A0PTZA4L59PG1SQJ9BB0B1ZTLRWXMHBI" ] - }, - { - "Id": "323", - "RandomData": [ "LSZS2TGKC9FL9MUEMX8LDH3JB5IIOG9Y", "7H5I28QQ51XBVNT86RLYI0FDZQR7L766", "9QO1RMLNGSPMU1XXMJM75KQHC1SMRTE8", "41BF92RUF7SZK2T833VBV9AZAGZZ395W", "NRR2ZRXT2117207JIUTY8DM50ME2C21F" ] - }, - { - "Id": "324", - "RandomData": [ "B5L2L0ILFBJ3HC6JJPRJQHXKEVCMN5R9", "AV56OE7RLHS74SYYP4TWLSZ4IBXZY67K", "UJ3VGA5ES97IY0PW7N6TL4YS6BYNRH2O", "JINVZCRO9OELUQGRVB2K9O8ZULZFMRXK", "GS8QM4656RT7ZN7P5G2PPSP5JXANNMCR" ] - }, - { - "Id": "325", - "RandomData": [ "04EBRZF0E7OR5BAHNJKGZI4YDDGY3SRU", "PBG5I68FABKSD79HX3ADB52S9Q7NTQ6V", "P4B35E8QKEFX7MUFE8AASNSTIX528UWU", "EYCJ6GMS5T360FVW52JUP6DBLSUIJGSZ", "SVSIKLJ7WRE9UV3DBJ7GLCEIVB8NVEJZ" ] - }, - { - "Id": "326", - "RandomData": [ "BDOEWNMUTL781DQ0YRG9ILOQRKWJM5LR", "IP8RHZRY6MX9EGQSUIZE8JQZY7XL0DHX", "AQZLF9S9ASD5YPML4EYEFHT89J2JCF73", "F99YQEMUZ0EPGUAJVLRWOCS261M5HJ64", "UJ0ZPY501EPPCD1PJSY0YKOCRG1Y2QNQ" ] - }, - { - "Id": "327", - "RandomData": [ "3J563K46Q05KXCZ2A6WYUGGK5XII6G8K", "08V2I4V8Y1K7PEOOQ8X53Z5XDUBFCVAJ", "2UTZR7UFLY936J40I427TCQBC7ZX3P6D", "1AE4VZ6TORTF0C140L6I3C0ZERWTH6M5", "25B5E9FT7ITBTLLAF57RSXKZKO0DDMMS" ] - }, - { - "Id": "328", - "RandomData": [ "FYN4B6Z0FNLUSZG2GWNL84MEVMU0JBPU", "6B547R8JGHLEMZGVH76R8ATKLIIYL8RE", "80YR3M4ZXEF1SH16F9SLE7V5RVSZIJ8H", "0HGWAY25CH44411DQMTLPG9AF39H3FQN", "G7BLBF5QHXI7D1A03OI60W2TIFRHZUB7" ] - }, - { - "Id": "329", - "RandomData": [ "0QY70QCLQCE17B7N2JNO7UWTFRC5YY1X", "VKGWCDANM6PYSAVGIDPPGXAG4E2IOGX2", "KRFX5KLYJABAE8BE55XVILQ8K927L19G", "JWNB48L710GGV9C5DXNSSBT8AHM5SNNR", "B50RU9K6TZ3SFKNK764XOQXICOAXWQPO" ] - }, - { - "Id": "330", - "RandomData": [ "MYEZJULDNQ83IB303B7WTZDVISPG9XJD", "KOFQFYBNV0K7R39BVK3VS35XVTQ1FFE0", "G5T36MUF9UA2OFDOSNUY3YUQTS5WHJIQ", "VU1WKGEJZYV82CIPQCJ1UQ6RKCKOQ88Z", "MUH4NRELJL9FDVXQJPFFAQ5FXJLH6020" ] - }, - { - "Id": "331", - "RandomData": [ "05WH5OB987SJQ1OZO4EA23Z5ZCGEF6PS", "SIPH9PU4OGGC8WY64W2CV186G1S3I73C", "S90IMHZ8JJWVWW6DNJJTDN60KSAH71WQ", "NEU85PTX642MFMKT5PP8XJ8ED984GSBR", "XFIRB7H8ZWXJUUV7HRMRLX2EFP55RZQO" ] - }, - { - "Id": "332", - "RandomData": [ "2LY9D2R7HRJBWZUTOAWZFTF9MEMWCMQA", "FIQJ5V3P9OK4O1RP5LRQD1IIFYW9Q555", "AI5NJKX2GH00JLVVW6004A7O9HDH948D", "TP3F5DGVYZJ5BS94DBNTFEAALRNBGQ3M", "IWG4RPZSZFCF0BNRIJD7QO7PO34O0FOH" ] - }, - { - "Id": "333", - "RandomData": [ "57XOLFMXM44AC4JKD527M553Y1PXVK2U", "04J3O8GD6QVWU7NTTTK4MQ5AB30TZZCB", "BJJHUQ6FYZA6KJI1O5EB98HK9J1UIXNH", "NTULYF8CXFFXQ8Z2U9E4UABDB9IKZL6B", "M3S0Y7CJ6BN43U4AU9AJSTXNSRJY7XNM" ] - }, - { - "Id": "334", - "RandomData": [ "IDKXP8EW657SWHKQFH00LXS3GFIGYOMI", "YBVZKGUV5NNXVE0KH2TZ7XBVVRRKZ78R", "TY4UVVG8XE57K5HBP8954WLAAAD2ZK67", "O5D7JFZVVVC22DK0KP517DX6N3UUROIM", "I7TP1K2JINJJUTI7ZNSKPEALHGUQVEEH" ] - }, - { - "Id": "335", - "RandomData": [ "MZT4T589XVTT3NM4UW5D577E7IHU0LXD", "JC649NO3PSX3VQR43Z58JALP2P7KYNJL", "7PK1QS4HIBYMJESR1M0AQZ3I0RCTQDFB", "JM5GF0NL5Y0IL8FX7QTMWJ4IWCA8PL1F", "6XD7JMLB8PF28U71MOW9T2O9RWUDZO6T" ] - }, - { - "Id": "336", - "RandomData": [ "7VMY5HOUESNHECKBFJWAY1VDIEQW2ILU", "TV5NII6FAB5BPH5PMS8Q254F9IP01125", "G2YSH726MRAX6UXAIAKJK51Y0ZN92FNI", "I94WTMHO0BDL4HIPVPR0QTVKBA2RU2DG", "D2P70AR625SI2Q3TQ7ONXW1ZOTVTT047" ] - }, - { - "Id": "337", - "RandomData": [ "86HC2LZU7V7UAMSUGJAWOZSQAZSGO7MC", "BUK5J10FI3PCZGYCAAMKZITJO0CC2SG9", "I5TPCXLPS5OVJQ13AQGNVCM2BBRSZYMZ", "XP34XJANZ71438979IBMM2OGS0OAG304", "TZ83W7G1Q2YXKR9DBTTQW9M4BXL659G6" ] - }, - { - "Id": "338", - "RandomData": [ "H7LE9FKBCJ5TD15A1K9WJJHTND29WJ6R", "W2PNG4D5IRNME20J1KEU9UW7Z116NLP3", "NN7LLS47HDN264PUMTILEMSCGRXODGS7", "CU904P7IQHM5G4B5MGU4DDYA55F45P3A", "VQZL5Y06V9579W5LQ2C6WY486949KDNB" ] - }, - { - "Id": "339", - "RandomData": [ "NMK0EZAYQXIDI1BJ93NDN7N7V1P631WS", "W4TWMFH01NP9P1ZE7V9QZJXQ9MENKE4Z", "A0ROIO74VWL9SNR4BK8I1F2MGDX9A4QX", "SZ9ZJL6TXE5C8Y7V4KM9FW757EIE0831", "GXQ2O2UZNOUXKZOSFCE0SRS61D1ED13Z" ] - }, - { - "Id": "340", - "RandomData": [ "LD6KHEGCZWV1CKUH0Z9Y3CJZFUBKAPWV", "V4LG2DKA5CB5504QTUON2E6J4HFXD6BJ", "A9GI9NOXP820AN3O0U1QBI3Q7CMV7W79", "A255UVRFF073LFIQO07TEVH1GZK6A3Z2", "B30IR74EDWLKL9E146HHZN4OUEZ4LUEL" ] - }, - { - "Id": "341", - "RandomData": [ "BE2SPA8Q53QSK6QHVSCEWSDX8LXNI93S", "R9JGGWM371L67MEXYRJ2R9ZTBETDMVH5", "A7AKXJA9GJH5GHZWH9Y00AARK0EBCIQL", "TP6AL3AORKWI24M3P66N6RF97SA7F867", "25L0LZLN9KJQO1ZPNKWGMDPBK6C23DJS" ] - }, - { - "Id": "342", - "RandomData": [ "OZQ7SWSZVTNWIYVF3UT4LZUYQKQOWSU6", "A0CZL17027U3023VK78ITPHYE2RIGDCD", "8RVSW64BX2BOF17XQ4EZTLNVTOVSKZUY", "5R4JGL9OD7V0N3SM431L9NTWDA8ILL18", "INTY6YRF5ZVW0XI05IYQ7IZR7HFFM0D2" ] - }, - { - "Id": "343", - "RandomData": [ "FXRAJ4PFMWQK275Q2INCXKA9XB0YSL2E", "V3QDFIQA2SEL2OZ9MZNDNAF5WSMID1WA", "3LY9R2KU2MKEGYHJM0M37Y1VXUQX5H6B", "5DSQ00STO3LA0AZ8KD6MO3DEUDL6LXYU", "PJJCG1SVI2PDN04X5SM2LUWB9N5WPWI0" ] - }, - { - "Id": "344", - "RandomData": [ "F0VR1W1TUKEVO913IYA2L5J5WHC255GV", "UY8WFN5J02HAPBXAWCN1VPPJRZ4TT9YY", "ESBZBEX520CSYIQVTCG2SPAEIYFQSL01", "DT66978ROS84N6VIJJAQ26GYS7RM9HMQ", "AKOEMTVVDYO9QF0LD6GILJ8HMHOCQWSG" ] - }, - { - "Id": "345", - "RandomData": [ "GS4DRQ5ZYONDRHINHFJCADE1LH2FFTFR", "GH28LX3WBRU7650F8B4LMQFCNC1KY0UE", "J57KOKBTLXATTH5QRXGDY4FZB0UI5T7K", "6PXA7P0Y9L9ZPWTFGK3BTQQO0HIYZ3Y2", "ZZWDT4TB6REN4QKPGPBVZ61P8JKZHB9G" ] - }, - { - "Id": "346", - "RandomData": [ "WH9Z9PVM12ECLCUK72SJ1CC38HEKU434", "R80XQUQ04Z371YD5ZA1OT0PTFG02KK27", "8JUNM63MM1PBJEBKDIVTCPL1TGRK4XPT", "769RD0T2HPC2LNKAEQZBZI5T833FOSSY", "L5DMFTGMZ2MWNSPF5RFN8O4ZBPTK6NNY" ] - }, - { - "Id": "347", - "RandomData": [ "6NQPJ84VKMM65IGQNXJ7MEZ7BOL0A6PL", "PX09BA67XUDWB733JC6IDQM1XTN4XEUO", "6ARIRGON1MJ1BD5EVRR7AHI8L8MSXBKT", "AYZBQVLCYSR1GU0TXJJFXWOZ2S6T4500", "C01MO4YAGOJR0Q21H24N2E6NK9I7Y1I2" ] - }, - { - "Id": "348", - "RandomData": [ "20ZQ3NF3VI9IN69L0FLBAM874NBOV0LO", "GQY91M84XB2TFX9N97HTQH2Q21VPL0H5", "7VC7HATNGRN8TP2HNXPYS178XIHA0SS7", "47VTUCG9N3M8336N9OBXLSMFXDJ83TXY", "8QEV3IWLRPKYP9F4M4AMR4WLUQ6R2HG4" ] - }, - { - "Id": "349", - "RandomData": [ "GY9NZKT120F5IY0Y8PW9TLHE42BNLESK", "JQS092ECKIT0Y0D60ISMUHL5R5T7JGPX", "H5W1G9ZGKUYK1QPDZEWDVGZCFXJDJH2D", "36T3DL00TMCASADBQPHETMBBFUWT0V6D", "1UQ56VANO5UJEZTETHW49YUQ4SYTYHA7" ] - }, - { - "Id": "350", - "RandomData": [ "Q8J7THE5O40X127PAR9S8CDCAABN6RYH", "5W3FPWUMC1PF76YCVISGHS8N5G6TG087", "FT2F91AO7XPHX8EEL92X8R9MYPKIZAFL", "2S9ODTC3IEJUC1Z6C2IH8L8XTPQTR1Y6", "RDOF80B168P4IOK6ZNG728NRTL4XCSMQ" ] - }, - { - "Id": "351", - "RandomData": [ "PMD9NU7L1QKA5EPEFU3DV1ES06VW5NYN", "W8O5LLSFP4FLXNVP60RSZI5XIUIR8LQN", "17N7ZT34BYY0W25MKG0F5GYND0X1CBGE", "O1U09YZM6XRAUFBPY5G2ULSVIA486B19", "RTL4IENVQOIIYY38ZHCG4OUDJ8S941P5" ] - }, - { - "Id": "352", - "RandomData": [ "5RSB3HHUSVLFCJ7UH6JY9VFD9IUJWN1Z", "8MMGF1ERASYJDOAAB828R16KMPCUW77E", "3VHZ60OP11YQ659UHUIYV3HHQC3ZZT4C", "UTPSGKDLTNG0CPNRQRMBZJSAN9J36ZZH", "6V5MPRN7R7EIWREBZMJIG2NLBPEHBJO4" ] - }, - { - "Id": "353", - "RandomData": [ "X93RTAB8DPU2EKN55IEUPRADHUL9MG5H", "SKUXYXRYKKE1IVG0CJL3E4OG8ZJ9YBV6", "UMJ30ZGH1PJEMJ5WNV7D4CCY6NZ9NRAI", "ZIH5MM9NCDCZVJ4Y3XVDERBRJU7N9H4J", "PAPDCAJAVUB0ANDXSAFZ56EHGZV1PWN4" ] - }, - { - "Id": "354", - "RandomData": [ "J2JU30W3NVRUPLR6RJ49CENS5H7MOSV9", "HHRHES31NLMKPU25IZJF1N2EO0YW2JP5", "9RMI3J29PCV02DCLPCEYIPH3OM3N3H8E", "6QL8HTB87KZY2BMLYNG0E0XTJT3RQOFI", "ER4M2EE5BG170TBNARZQAI9F31YY0TSS" ] - }, - { - "Id": "355", - "RandomData": [ "FRUKHATTJLY88Z30RQQ8ZYH5RYSAQPFR", "XJ1I80FA8FHZUAGE77GJDT2RKZ3SRSD3", "GGLZ7V21KQ9UQRLRSODSJ5ODQK7J7XSQ", "COTNZQGMFO9WUIA3OMADOUUK2HJWXT4W", "7TRC781BH1M451TIKE5VXPBR4IUSHUYW" ] - }, - { - "Id": "356", - "RandomData": [ "UMZB175PU95XIZPAXAMSXJ9RR9IZNJ3X", "CZJTCSRNJPAXUOIE3U4HIF8LMHT1YGCL", "GHVTP68FT8JIIM7D0E53OVP608G58ZYD", "MZRM2ZY7WZXJ60CAJQAUKJ6U2Y2RZCH3", "KF6T4VKBP7HZ8G9A5FVRZD2D27TE7HIT" ] - }, - { - "Id": "357", - "RandomData": [ "S3814TFXF9ENCHVVY1VTQZEGM207CGDH", "ZXHEIIGM98M09PBVL7PFWYC2Z1OB3IV9", "56XO9RNPVJTSNOH71FVE08VBVOPQ4FS1", "NM4C1WV4U9TNEUPLTQJXXRI6LW3VC7UQ", "02FATFFFU1U0PI7B8D6N54E6D81F292W" ] - }, - { - "Id": "358", - "RandomData": [ "PDWLOP2OLED56RRCZ2W8AGU5YJ6UOAMU", "87LLVVWTLSC01I9WQYQAN4WIS1XFSH9K", "1T79FFRDFDWRE3EQKKE0ULHEKD348RAE", "T19HK9QKGM4JHFEYWG5IDJ0QM2YCMXEY", "CS7M46FK33THR77F9EH1W1AKBS5RKN8T" ] - }, - { - "Id": "359", - "RandomData": [ "HGGYH130BUOKZS9O5TCIQNCLSXKLBX9P", "4A9K0J7HKR0BM0VSTQW1L0D4D5FTQRYO", "V9PYTYYWV578WB81C21UAIEE7FG5DN03", "2LQNL69529FP3EHC7ORYZDNM4K0NR2TH", "EDGLUUQF362BDZL37E7Y6CDY8DTAGVO9" ] - }, - { - "Id": "360", - "RandomData": [ "Q7LZ86RM7M43LMJF97QN44LCARMRAP9H", "R2UFOW4BWV1UHJNW3OBIFBEVWIYRTALR", "MXLS1E1MCP0JD040D0YWO0CQY9TF7NRW", "JJHU854ZXYF0K5S5O7N2MZDWU542UVOZ", "7D94TK2I589ZUMF2QY1A9YKUFV9CACEB" ] - }, - { - "Id": "361", - "RandomData": [ "JQ2G5XLDEF6N0NBIZBL54OZJ3PY7K0H3", "37QET873MX531741U1N81IG40TNQ8N2O", "7DT276Y0ESTHT6R6U7NTMICU0VOAVQ49", "4Q5YNC4XCW4IZ9L4BR6B9JBZB9BMSXFX", "XUMCA3TSD0Q0O341JU9EU29VPGWNARFP" ] - }, - { - "Id": "362", - "RandomData": [ "QHVFXJ4H7N8J2KKHEKC8YBC5U0W3GFRV", "VBKHIZD901GG4Z3E6OJZPG0OE0U6WAB2", "5NX0AD9PGCI655A47S7152GOK5CSEHNZ", "0NLQBCD2P4SM84TIZ09EDJ6DHJPFARK9", "ZSGRUT34OEMAJ4QQL42OIIWRRHJ2W827" ] - }, - { - "Id": "363", - "RandomData": [ "TTWPXCXF6E08654M293GY61R6ZANJAHP", "MORZHA2JGXRDSXUVN69XFVIX2ES8CK56", "6KVROEF2GU9BPX8JEO9MAUJ0F47CS4G5", "1UGHBDGJ1HQVWHHEGJ4XKS5MB4LUGCJM", "NDJ4R1HBI0V3DYE8W26J9TVJZ3GG1WCZ" ] - }, - { - "Id": "364", - "RandomData": [ "7EIS8MXOB3PT7CJM0N7NFAM4S9FXUAJV", "Y558QW9JERHGDBLWU3QOYYU61NA8HA4B", "T35CGK6ENXJX3G0RXSC0T579K8HCVBCE", "XGWJFJQJ7MAAP6DUWTKY7DRY651HD3SM", "VEAXUQLOC33H56UN5WPC0OGTY8NKSIGD" ] - }, - { - "Id": "365", - "RandomData": [ "4XPK6PAFH6VEKK29LNLQOPVG7Q8VDA54", "WZMHRJRPWJ443CIOFN9F60ZPBINQQOCH", "A1RV7VSB664EU1N4HUPZB07697FI6A9H", "HX3BUXQU47JA6U4J5SI69MFK3VVAPKF5", "7X768LKUE54EQ6AOC5NN2CI4SSH9BQFU" ] - }, - { - "Id": "366", - "RandomData": [ "2ODJX7LTIX2DRA47VG7T71C4OCOQELTY", "0KLC311EU3FFKEMRXKN5SVXBLJ4UT5P7", "EDNHZ1D4P29DV7TK06237XFEXK0T6GVZ", "OIAG0F26GSPZWTPOZT4XCV9Q7ITOBU7I", "HJYN6MTUD6WOHQSD5M3NL7W2JUJRVO5W" ] - }, - { - "Id": "367", - "RandomData": [ "VHRM5CRN9JTG9UIR0QSY0U6JX5DMDB9Z", "B93A8FI25QNBOQ3YL11F5G6BKIZ98EK8", "K3F91HSUH03JG45GCPALK334D200QJ40", "GP1UL37DIG7FNW4PNS6TE8XQ9K68R2E8", "5DD1DK5JR7DD6YRQ7KN7MKVH1KUA68WQ" ] - }, - { - "Id": "368", - "RandomData": [ "C8JJSDLCXWBG5TUL3PAGOHWVR593Z4NS", "KWB8PH849KK0JPMHZJHQ7PB5MY2WDRN2", "JS6ISW5VRGGE76LCT1DPX6V4VGV1PL0R", "7RQ0SEZDNW81I77QM0DMO7FN7BXLAEGG", "PZHPPVTPBACB73VYIFOYHOD9MD3RRNDI" ] - }, - { - "Id": "369", - "RandomData": [ "P2MTZSA1GYKO4DPEP8D50R8AWHCM1C8Y", "73VFQC80EXSTDZEIYYBSKHS83M7SPY9E", "0WRBSJYNAN1D9O66C4XDBPNZLWLDEPKP", "XO3RIDZOAXS7QP9PPAQVA6CKJ1Z68UJU", "CLPUVPY8EJCO7QJ6X6YE9YO1LTHQO3QP" ] - }, - { - "Id": "370", - "RandomData": [ "O74E9O49LRR13YN3S3JB6EUN7YJCHIUK", "3X99VF6ICY2RHX8XFO8VUOSJNQHLF12D", "7G7FYNHN6A9IMDGJZV63J80PE0WE7VCK", "5YUAZ282HVZTOK7KK7VT5938QSB81DPL", "8ZMXSFT7XDVYJGA42M3A9TO65VTG09AD" ] - }, - { - "Id": "371", - "RandomData": [ "GNVZ7K1ENX62NFYKSHFPJOLOLP17VMGX", "DSS5UL6SUZWLWWT06JYT3V41CGORS3SA", "RIY5W3ZHKX4U2A2Y6BBMYX4SX03O7OA1", "GV4O7YDDURIG0K9COZVQ2GM3OGH69LK6", "WDNGFN1H871HOX1N119H2U89JA90RGDJ" ] - }, - { - "Id": "372", - "RandomData": [ "HMTW636A8NR4OFP0O3FILCDCEO6FNA02", "3S9BDER758JOCDVEUJLXB57FJRSS60X7", "XZB6FNXKMHNM2Y9B22UEYC08U42WW8AE", "LM1NCZ9GVBL3SVMURQZEFSIU8CLKVAXN", "GIBQ7W8D2OSX16P9SHFFJ582DGO9NYVV" ] - }, - { - "Id": "373", - "RandomData": [ "O7XKT5X4SVL19V3CXL2O5RDKJIN0I80E", "37I4JFQWTKXYTH3RNMMC5G063MALS6WT", "5H8CM92R5G4U4P0CP5N5WXJWGLA7EEDW", "XD3MI0ENT4GZMFCOV86XT07H8M5B84N0", "CH70WO3Z09M2QTJBIVMGIQD6GVO64DOY" ] - }, - { - "Id": "374", - "RandomData": [ "RQXEHM2HFH7TOF0OC42MSGSWEATA964W", "UXKA6F363FBBTUSB594ALCGK7B9G31HI", "MK804ZS6A6TMFRDUSRF9C4LSRAC5FXCB", "72YIV1HFR79PS3FQ7PYLWIGS9PJ4WX1N", "3RPM2481K9RE45AX4W7080OZWGIFRMS4" ] - }, - { - "Id": "375", - "RandomData": [ "GWVBO2XDQ6BX0BXDPV9AZBOCCZZWW3J7", "RX8HK8JC94JCZ19VTE06NSEFIS8ZCBRX", "XEFCDP3QL6A51MNKZEDRCNT9T2929UA8", "MWOUW7SDLJUQRIO6EYA879UKUGTKPBR1", "6CSF73Y1W9F32CSKODXLUBANBE9QOHXK" ] - }, - { - "Id": "376", - "RandomData": [ "22UOZI9LAIM841RSXI6MNFH4CFD23INO", "L5B9SDUFEMLMZCTKXR2FLL6WVZMTEHR1", "47W80R9UX0IB45F9W3EMPHDA9ON31BA6", "5TR2PUUGRISUC520TM7LCEMX3V9LDG2W", "ZLFKNNTCJ84HZS7EWXJODZ40H384VICL" ] - }, - { - "Id": "377", - "RandomData": [ "P551ZRNG25CEJE7LY4ZQ6OS9RPDTOZQA", "5T24XGOEJCVIX0QD6XF0TVOBM5KKO31D", "OBI0MDXRQUG42JM18AX1TZRKE0R26E0Q", "KS4WR0039YK9PUIDTSMNFATYU8VVV5VL", "3ZTKP0JHJ415PR4TSOJN2NLK8FBTEFHE" ] - }, - { - "Id": "378", - "RandomData": [ "C8FZB8X2JEELIYJCDBDHVITQOJLJY0DE", "WX3QLFSU0QDXI9BK59PCCAS3OZK2WNET", "B9YV4208TSQFE6HPHBOZKACWE9CW408N", "LUWJKPPDIRTTTNZSS5UU9PIB7CR50ED2", "UD3TK8E1VKR2QSC1KUD9FNN6MULI8UND" ] - }, - { - "Id": "379", - "RandomData": [ "O09QTFIU028Y7PUP90UFBDWGZ7HZW63B", "7NOZTVIEMSJNOY86A6IH9HBLE21V8S73", "971TB45NSQ3S3J2A8KZ0YVBZLCV04WG3", "VQNQ7P5FA4ZTNTR4A0XX2GEN6BH8JET6", "JA7N5LDTPU045SM2V10E8SAOLAU5H655" ] - }, - { - "Id": "380", - "RandomData": [ "L3JNWE8ZWEIIPKROZPNROO719SC50ILT", "Y5TCI9GQ2BS3K28BSGG1SOQ65RNDBD8N", "2YUU1PFZJ6YN5EQHTBMUCUBKOWG0VCPZ", "CFAVIOKDBQSVZDB1AGUA0OLIXJFEIOEG", "R9K0D59F1JSWBPVLVPZPSO9X3188IF4W" ] - }, - { - "Id": "381", - "RandomData": [ "LLD02KXFGOJQ5ZHHY4T2YZYD9W6L6B6V", "O5K0M4SL2UIDES2EU0JOWB8WWA0GNLJF", "SXC9OR53LIAEQV8R410F1R9M7XDMEM7Q", "LCUQP20D5PDOB4FABJLWUDNBYZC1NTZ9", "KU2NBRBCBXKLOULDRCK4AL5HYT20090M" ] - }, - { - "Id": "382", - "RandomData": [ "0DDQB19UIJU73BWDO9JLI499YVYSZKMC", "77VLR4BZDZW008OW6YL0ZOD5EE2QDR57", "7RA5QLWT7THTIIIZGBVA9VMS30HMCVWW", "4Z3I8SGVB22GHUX55CKB548MESC0EKRM", "6VYSP91X5A9G2GKJCLR9KV0A0REPQQQ1" ] - }, - { - "Id": "383", - "RandomData": [ "LQJV5EQ5KWF541T8H2X22RBK5Y285MGO", "TI5M6ZN85WZXP4F87FIY2X94O80HMS98", "Q1LW6HBSPZ7F1O5AS3A0DSV6JA778FVN", "W1HYTTC0D0ID03CAD0YTRJ48FPN6JDTJ", "DTSAGGQ91KWMJSFP874IRC5N6JTDFGQA" ] - }, - { - "Id": "384", - "RandomData": [ "H89GKB37JY1HWSYWJ77LJK2AXEE7XN3U", "3WFLS9F6E792KY1NU64IIF06F9SF75J6", "4GNAMNEJ1BHLLAZ9N0N0SVMY5IFTRA8I", "XD7DK0BH1UQG7OVFJT1GSTNJ4ZFDHV21", "C9YHDVYXZF98EG0QX9J8I2ZE0XJUV79G" ] - }, - { - "Id": "385", - "RandomData": [ "1ZD80NCX4ERNTOFY9YQHM4TKJTRPMDC1", "F2GPC20J7VDELMULSVV6R247G3YG6WL1", "CZI1H0VG8GK01O979G70RFJN8JJJETNK", "JMCVD3D29O8LSDF130H0ZVJ6P428RMCP", "39QOMN3GCE0CH855DRPOMXVYCFFJAFLX" ] - }, - { - "Id": "386", - "RandomData": [ "MSSSW0PQ6BXU4GZR97497YCGN1MGHUF7", "3D0YQMINC8RL9A46QYJDLLZXPLF5OIIL", "5010PBAXZR78G1GN7P0TLBWRNCIEHM84", "0GPIJEQOXVO4O1RYE179RYA4EJMN26QM", "SCHAM8D29L6ZW2CWVU9PP9MBGUE91DW1" ] - }, - { - "Id": "387", - "RandomData": [ "FCLLTQLGXE9F2KHMGZ1I6B7T0F413EB5", "ZFUUQ0CFI21K9GJ5N22CLN4EF2VNVTNT", "DDQX0W5PXWADJWTU68OBL8TMKPPYFYTY", "PHG50WF06MOZN04SIBRXFMHETEMKHGK8", "CLYBQX4K3YE8U48UU6QEH6TD9BLVJ4SZ" ] - }, - { - "Id": "388", - "RandomData": [ "CQXBC2CUHH3QHJUZF20K0F0G1VCOMIA9", "FO6DH6R1457ACD50QVQREH960QJR0XI8", "H4K3MRSIK8Q4I0DY0L702S48P9N0WABG", "X82I2BO9DHHG1EY9MV1PZSGZ9MNME2VJ", "7JHJ756Y78XUKYGLLNOBJVQF1DJQYB5K" ] - }, - { - "Id": "389", - "RandomData": [ "V7JR7OBRYCS14VOKFCB0OT9L2BR4WQ96", "DM9NPZN7M6NGDZKFZ8KV9E6B77Y56H5I", "DWYSWB5QYENRG3ID0LEXFO68P7PRARAE", "BEDRA1TYD3750P5EZVFUCHCZZ0DZVNQG", "DIPBZ0C82QTMRAH9CK2OMQC4CO1KY3C0" ] - }, - { - "Id": "390", - "RandomData": [ "N02RA3P8SG1WX0HZSEXLUB4XGU9L91K9", "N380HZ8J536GYPGLGB2TF1FL6FKP3D90", "52J41RR3FOP1FX81OXE7903WXW4COTP1", "3FK6GMUZT9O1LOGIGTBF9C0E8WGEWPOW", "8Y79NBVBDPNAMBLJPV55RJ20OF7TGPCE" ] - }, - { - "Id": "391", - "RandomData": [ "U12WQH5F79CUZ026L6ZBUTEZ6HUHEC5Y", "MIPUJY3I007RHHBYNAHK0BUBXD0JWYA5", "ENHQKHXWDQL3VWRYF53D4V8LYO7F8TVB", "ZCN3AUOGNUGJZ0PAWCD147ATP525JRYT", "4JETJXXVQWZJOYV886T6Q4G1B3NF2S65" ] - }, - { - "Id": "392", - "RandomData": [ "6XOQV618ORKIH1F1J47N72CACMSPJS38", "03N0JFMCFVR8U8UJYW57VT8DUOOJNLY5", "YMSONORES5HMKDQD2I1XW5MG5KG50CY4", "6WKIQF6KE1P0LV2Q8KQEUAJ29LSDHWNP", "GNQY2HXWMQT4PW4KRZ6QVTJ5MSIEX2CR" ] - }, - { - "Id": "393", - "RandomData": [ "OAU8FDX0X42DROMNQIWSZ73WDUMK9S8U", "OBQPB5ENBG211FN8G5XPFT2RG74U1N1F", "5HZQ86LVDIQTEB57GOED4TO4J8IEBUWY", "OX6TQ79JTCM7DINFC7NNJXKL35H9XHUS", "V2EQFLRJO4U1HR1AVDCDGIP1NU0VZ9VM" ] - }, - { - "Id": "394", - "RandomData": [ "S3LKE690PD9ODSEMDHOUEQMMNNDUV5UO", "JHINFQ6YDLXCJBY4QNRSVBHCR8713PEU", "TUE5K1GWLZQ32JDMYIEHOB2I9G6GTF5Y", "GDSZ62TYH4H5UOKH5UCUK7FR166E49DG", "41WY0NP6ZPAU47XU5YL9CKOJ8B796P4H" ] - }, - { - "Id": "395", - "RandomData": [ "1AB32VRREG546VW4JLIGYDDUMM0ZQQ9J", "V324532KH346OUNMOC0VHXTX7QQP51AY", "GWID228PS894JHF29NKOZOC8KF6OMMPP", "3FZ2LJUVDLCJYYN0LYQRRW82UK3X6TCF", "TTBDRMRZ3ZKOL2JV1GDY678GG6IAQ6ZT" ] - }, - { - "Id": "396", - "RandomData": [ "I6ZEXJI9H1Y1LUQ1BH5ZQOJVV46VDQI6", "90GPCE8R8DRFIG4WQR9IA9D4WES2NW50", "S22VNBY6JO1N7ENPAKEWR959XL28VGEL", "H0WQOJIP3C9WIZ7S0D1CSJJS627CIZKD", "JPFGR7B1BZ2OAJ17OKISOB37RETVMGGE" ] - }, - { - "Id": "397", - "RandomData": [ "26M3U0A3CAB2R4RXB9X7R2ZIWHZNOPO4", "SYWE67NXKOPN9AQWW5UMTJXAGEGNBWPX", "WHK2IN1DV9XCMMIV0D1S4CLJBV710AWY", "92120XNJEQ0TVVX46VW7562T6A1WP9MV", "M9CUVP5C0SONL1XQ8D5FNZ2D9H6Z603E" ] - }, - { - "Id": "398", - "RandomData": [ "EFGWSDJQZTHNROIENLYMDHHXG9UOTGG9", "YJJGUA753PQ4RPVV82LUCQB77TQTS57S", "NHYHECTMO2SY0NF0N9P05W7IIMIAUNN8", "S8RK1NQ6I9GJ7MGTOZFTQGX0KP913S2A", "PUG2659ASSS5PYL5GZW4I4SLK09LOYDZ" ] - }, - { - "Id": "399", - "RandomData": [ "GG3NGOXTZFA7X1LWEDVE672VB4RG5YW4", "O2YJ48Z1BDEC3VXTONGLC93JNILM6RXB", "TGS5CB1GN3C22Z1QG81RRL1P9P5WWM4U", "PDTXC2QNWA7J6AQYQ5F8ZFTHPD5XFFTA", "8SMZFEONRO5QNRS89HF1H64KTLI863HR" ] - }, - { - "Id": "400", - "RandomData": [ "Q6KOY1TMR1QLKC47U7X8923CXCF35PRY", "HOARHEJIY3JPPT9RRLO9FIRXCH1VVZQB", "K2E6CMZQXPKFSOWDDXLUBST86MOANYW8", "NIEXPDOFV8LZ7MFYUXS7O6A2JF907YD9", "3M2KJ9Y9JG8DG3BUG0PZFYUQIMOKDYH6" ] - }, - { - "Id": "401", - "RandomData": [ "5L5VT4OU8SYH76VPDPTHJN3F1LC7VO6U", "8BI47PAML41W9MTL08GXEAXRS04H2R9U", "WDI6Y0RYPH5OWHFO20GWHIQ8N0MHV2T3", "5GA5DXX9QRI7EJ5LUPPBKMMOXKS7OKDW", "XBSPHKKFDHGZ9S3E4BWFNRST3VH3EZVG" ] - }, - { - "Id": "402", - "RandomData": [ "OWKC0PDKEK8DGXOFQNDMX7JFT9WVCRAO", "W9LNI0NO7MADTPNGGCM0VISQNET13SIX", "JURGLB7ZAYOL7GWDWQO9EJ2NQ49DHVVO", "DM397G4FFW073HTHSPFNEIS91EZQC4SO", "C9HUMWGPVJ4ST4TJL2U1QIK543H3QNCL" ] - }, - { - "Id": "403", - "RandomData": [ "EL43A846JZ14OAQ6UQFJK184ZM0SPM9H", "GSOH90IM7XR0QPQ3MKJ9I3BMNAEXIMQ7", "0UY6WJ64I2LWJHNJ66FED99NRB39VUEV", "GU961UHDNP1PRODFW41LGM40ULOUP7IX", "Y0PZIRSMZC0YIT5D8YM032O4ZILPFWXQ" ] - }, - { - "Id": "404", - "RandomData": [ "GE109N7FMPWEVGSBPLW1VR35MU99FCGD", "OKRD1EDU1HONGJIT0K94965YK6OOO89K", "ITZKYPJLHBANDPZCLPJ5CMDSP235ZZG3", "HDEWT85KAYW76RV4GMC8YEI6QH55WOVS", "5GGALCSNU85NZFW8H8ZNWHED5IGMC9YW" ] - }, - { - "Id": "405", - "RandomData": [ "CECZLVTD3ZO0I4HKU6XXZI6XCCED6FKU", "JJLVD7XWOVT73N4BA52GLB74HOWIQQHX", "O3R9TWHXJBIDY93ZHDCANEIILQNYKOG8", "O5S954SNYE6K23FIV6ANNGKJUJXCJTM5", "4KY2Q33NVYMII7PSLEDON3UIVJPWGPEE" ] - }, - { - "Id": "406", - "RandomData": [ "2AQREN21DX2Z3BAW3F1EQ8SB0QHHOHGF", "UIPIR8N7MLKZB5OTI22BY9Y4SO0XFUM5", "RWEVV2F4132EX2A5CX8WPFQVUV0DH021", "9PIO027PW7J5HTHZO5USWZPMGTBACCXB", "AAFHUWEKZS9R6UNAOAZLFKFJ96HH07NU" ] - }, - { - "Id": "407", - "RandomData": [ "KH4GO9E11K2DZ7PVFBVCNL6045IYO7T1", "FPHY0GWP57U5RCTBQWBZMLH8LDMS1QN4", "0A7K0158OGGP0BI2LGI254P4HJNW4DYO", "U0ERFJLY0CLFE1IJ4THUIU85UCDQNIDK", "S15961WC4TB2TJ0PAD1L6DG92J6DF4LS" ] - }, - { - "Id": "408", - "RandomData": [ "8AXM6IND7E0ZTFMLLXPKQ2NOV6HW5T69", "IT3TWNT2ZYO2NRQW6V1SOABGWI19A0HN", "I0R9L3Z8EXU2OVBDPV0K2OVHRX6NVT29", "QAUXAQLD52O1QI1AHYTPA7U3FJSY6MMU", "4VLNBOD9KWOAA30I66F79M8SQ0S08WGT" ] - }, - { - "Id": "409", - "RandomData": [ "P4656N83UUFNTU3LTJ1AGPURW37L6NAX", "P4UF64LS7MMPHU956GHZ4GNAJPIDQX7H", "TS8ZAXPY7JD4CEKC3BOZGL2JRT6RVIBJ", "OF6ZWJ5I0S2VCS8FEGKOJHBH0YIQ17CZ", "I4P7IVPUGF9XTGH8V1MP7XAHDY98BOR2" ] - }, - { - "Id": "410", - "RandomData": [ "PDMICB6T10IDIOYTQJ5AVX1V4I3UVRS1", "YGHQ396U42XHO69Z9PR2TQH2M1N4HM7K", "HQPBGIZRNLG29TG7JDUG90IH8PDCVCMS", "5NA7R7T10APIKP23VQUE21KRIHD0EX5K", "8Y7WSIPLU2P8L97TXKQFRIZDDTZK42WD" ] - }, - { - "Id": "411", - "RandomData": [ "FEJWRGKMAJU9LLGIKTD4G03083T9TFR1", "GM3G0KBQAEEIX011MQAKY27OKSYYXK24", "1229S9S9SW4BVVCHB1WDFHCNPP6HWN3Z", "LKQ572IN8B2C853ZQQW5YZZUZOTDDKME", "2E0LFHJISJFEPAPUWG1F18BVU5FSIFKX" ] - }, - { - "Id": "412", - "RandomData": [ "YXJ3ERUIHNMOUUFZ99R6TGN4DF0JB0AN", "8RQ10VPEWS8NWWAA0PTIYNERJPZ91LGQ", "N9PDEN8NUMKAHAHRE0TWH1YVN8RL6PNL", "MSAXG75MQFYMDDJJHI5A1UJWL4ZG6XRF", "98YZAULG4GFBCLRJYIEXUMT1JNLLHYP3" ] - }, - { - "Id": "413", - "RandomData": [ "YTMEPUJW7YFUOHT9NPRYT3VWP6QWI98F", "1MNT9M4E8R05G8NB4M82H1K480YTEWN7", "Z93C49AAUNZBCZQRTO26BG89BSVJXLAL", "D3GGEKH4M8H4CI1IJH904R6SB4ALO1MJ", "MN7JTJMJG8TC9E631M9QLKRW6XFJJ6PV" ] - }, - { - "Id": "414", - "RandomData": [ "V7RYKRZA50T673T67GUB167C6LM5DC9J", "S8QBWITJX8UU0UZDDILCMO3ZAP28F362", "1JO9MSKZXLO3LNLLWJ25067EE1BHQUE3", "C23QGZ0U8WPB9AOXDQM5BBB4MK4VRCJC", "HU1ST4F6TH6ER6EEMND9IJ2A08E65EC6" ] - }, - { - "Id": "415", - "RandomData": [ "MM3PI6DIKQL3E7MPGZJD8J48201U0JAO", "FA1FCY5QK5Z17953WY0G587CR5XSESSB", "P6YEFHMR323DUCA3578BT4TGDZYGBNL1", "MXMAK1YOLIMCF3RO54XGUQSUNSBPTGPQ", "QB0709SDJTZKSRAJHJLH0FH6F1X2ZI5F" ] - }, - { - "Id": "416", - "RandomData": [ "25VDDUY5LT7A1IC5R2IJ4I0L4428LZOA", "YURW56FXVP5GIGF6Y1L7AWKUFKJJ2ZUW", "F6MH1QAUWVXPMTDXZ5JTOQ9BJ6RVX646", "5JBL48FI10KP85HVHVU6PAHY6K749P70", "01UDS130ZA2YGUDNZ5OBM8Q4CMOTALJM" ] - }, - { - "Id": "417", - "RandomData": [ "2UYHLEDP13GOITSMHTFDB5N2KZBFNJ0O", "1Q5V65CU28KT1CWT4CMQGFK7H67WD7CR", "C2X2X6PMRULCV4AIDSLK7JIVF8O98QR4", "62Q9P357WA9V4ILM5ZSVW1U2TBXYSQNA", "DQF3NB2JWNY7KX16XBEJ75HFIXPNGHPG" ] - }, - { - "Id": "418", - "RandomData": [ "W8RNCS936J9JDWS6K0BQMEDHIAVZWPCO", "8RLMFN4ECKNY68BVFSCQG84S4KEB7JHQ", "GUKVLF1656OB1PLK99UDMWI9X3R5J2H3", "C6RMXQKA1GVJU20P84C7ZDEULL8SX6XC", "YV8478WSZTMGA8P5CC6P0JD826AMS1M4" ] - }, - { - "Id": "419", - "RandomData": [ "SSU936RAHTHF17TN5CPV9IMPRACB8JA7", "HRXSNQBGU6HGC8H4MWRPL14KGFR33QB7", "SJ8JKB9OBJADAFMT2HYL2VWQWMLH8IME", "4JY297ULXCNC01KB28AW10F6XSW7Z2Q3", "76J0RUT4XNY0ITZ5CKOAH0MEE1ERKWV5" ] - }, - { - "Id": "0", - "RandomData": [ "M5DFRRSYLJJDF971V10HRGO3H1UNV9AX", "9GN2JS992JU16QU40W3MASZFQK7Z6EDM", "IVD9WFSC11OHVX60HZW8FXXRQHL8VKCY", "GISKMVIVD0UIDST3OGSGREGV8WSO3URR", "YZANEVNVRB4PCON8YSTO16GBC7M0C31T" ] - }, - { - "Id": "1", - "RandomData": [ "JDUNRGY326ZQJ1SUIU0LACZ2T8KHIXTY", "JKF949QR30V4H01LP1SSCPTGN24S5QUF", "NAG9VS0JDJSJR4V2G92RFAV319VBE8VM", "FQRGT2Z6BIP37KZSGBL6YDANPMHW6YEE", "XFDANPJNJ6P6U15RJD4CWZYCQE0GVD9N" ] - }, - { - "Id": "2", - "RandomData": [ "EKG2GYE127W2XD2YQ0M33BS8RBUJYC2G", "6C2KUDKV8DKYC5OMLB040GTC1ILFE5D0", "FQ5VLSDNP150145VWI7XM8P0S0SM1FRC", "ATTV93B27MO9L3K7M0S67POGBFCUA1VK", "K20HKKV3GFZ9TPPZPU9BWUFUFMU41Q2G" ] - }, - { - "Id": "3", - "RandomData": [ "0EZTCCWCEZZ20OXV0MFP1TXZWGC8Z1C0", "MSIO06WM76775N30Z8EOLMOHR966AYMN", "X9PIGI53Z2S4W03JNLJ1XXOADB7090MJ", "TUJ67UUQDKYT4TU0GXTZOVZ9UPEELE39", "PIKCQ7M202XM95FTQGUMGX484JMRQQF9" ] - }, - { - "Id": "4", - "RandomData": [ "RYDVISJIK18V7NAYKUXETQ32OMHGV4MK", "XY5K2UL87MCPYIAQJXH52BQA5KH6LCXP", "OY8JS06ZJZHHOOEFL077XRSWI4OSMOW4", "YWAAK18S1RVC4IVRFCUUF027FLBXLNN5", "CMS2ND4U1PFF5P29I7MK4CY83C480LGN" ] - }, - { - "Id": "5", - "RandomData": [ "D09RZ3DCHA2ZUWC0TBOOBDBAYU8LJ64Q", "I2BFPLJP3KC3J9NGAEOY61MAZ93F413K", "GMQ1U6KI19U0AH0YG2LERFTRPBQQREUB", "R1X7SWWD4F67GV9RIE8CQY2A29MTQ40X", "OSJIT3GUGHKLIVK4B8HNFSV28XESJCX9" ] - }, - { - "Id": "6", - "RandomData": [ "PJTXM08P8O6INQ2HZSRRWNS57QJ6YXKD", "UK69BWSLA1P1VMPS4731VFNB1X05QC1K", "D3XDU2FC9FR480KUB1B03TRP75IO5W48", "AEY2ZL7B201PXSCANF3YAARTLIFYU0HN", "LT44BR5Z498D1C1P2HA02G7AWEQQFJRB" ] - }, - { - "Id": "7", - "RandomData": [ "TOEEYI85KD4BBO2JQ06N0QUEW4H7AOUU", "S6TM7W0UIEPYL58IMH9OMDLC49S3AB55", "TJTF4PL39LEVB53059V2PFHOVQS8E7TH", "JUFCM3N66FOB80B9G28BQCQOBETN7NZC", "27LQ00NCVZ6J0GQ4PT1M8S1HE0AIJ98S" ] - }, - { - "Id": "8", - "RandomData": [ "QLIBPUIPP5P0FGX4YZ8OVNEJGDM90E2V", "0N3O8PP5KM6CDAC7CGUUBU7CH94LHIZL", "D3A1NJ6IJDEJQBGGBP7UTIUGQ0H8UEXB", "XV9JAKT3JLK7QYVF2YK1LE14J3LWB7YF", "PCV5B7G05DKH7W02EBG636ZS4FAG961M" ] - }, - { - "Id": "9", - "RandomData": [ "XFSNC0E5ST5I3T6WDSSA12LTNDB67908", "M8U1EN0O7KOKARYKINDQO0U548A9ZH8S", "26558FS02DDQNAT5O0YT6KUVNZ7FM0ZZ", "M6RDV3LD5MXLXER3PEU8TOVSMKRJHNNB", "ONDRTPKUPVYTWI8JIDZHG0G8K90LMC5S" ] - }, - { - "Id": "10", - "RandomData": [ "9W6JA9KA49T8ZB6DMHBDXF5XHFGUY8IM", "ZGUAMYII3ZMGHIIJDW9FA1430IC520L6", "1GITQ51X82K82YQ877RC9CM7M1JDWNPD", "OQOA9Y2H4LGIR6AB2D75IJ6Y4KHZWYAV", "NGTMJP8IEKHX6DQP0HLSPT4EU0GZRDUG" ] - }, - { - "Id": "11", - "RandomData": [ "LV4KMY1MEZ18CI20419ONRF3MO1TJJ1A", "ZAMKJGDBP8O025CM7Q5ZEG33QB877ID5", "80JB5RRYY78ODPBQMPW3OB6SHT4HHFEH", "5S1BWBQP8HBHHOZAASVRVKQ6404LWJQS", "20TVX94K8G4HAZL244HZUXWVC4H5GE2Z" ] - }, - { - "Id": "12", - "RandomData": [ "0SOQ5ENAYKTPPJ6EPBR2C07FE7T228E4", "NFQRK470RHBKEGF28CPFWAX9UJM7VUIZ", "GYBK2P4VD1L4ZXB7204ZS8HNRR6ASAE6", "8LEPF4ASI4B5Y2K7IOF5ZSGHRX2LS3DD", "WO5NTW27ZLRY7LZZG91D5JHQF67RBZAO" ] - }, - { - "Id": "13", - "RandomData": [ "17IJ66OWVHFNBSKG8DETB9IMHPIWYK59", "LC69CQ2JVFRXE3PWW1T8UQN1Y5BRY17L", "LFB8VKDSK486RUINAVA717O4ZEKHOLV4", "HGM82QALXBX0SQKDXYQC09TO0HJQA6D8", "JDYKIKVTUZJ0JYLI4GT05SDHX7HUGTK1" ] - }, - { - "Id": "14", - "RandomData": [ "7ZRO194NC7RBZ3EC5AW3MND0ARXLCAMA", "OS2UH6R4LGX7ACR33FZG7RPUV0OKMTLC", "UQWHBT48T1RGZFZ894R6KGD7DH9RSHS1", "5UNTPK2KL0WF9I4PAQKRCP1NNZE3UNQM", "JZLF1GSZCHUTU874NTQC6AZP3AG0F8Z8" ] - }, - { - "Id": "15", - "RandomData": [ "KK5J7ZY47VP44H3P1KQA6NPIA5L192UD", "RWJJCY6X4WELV5VVH184SYC64XJCN74F", "BMMH8TMDO3FJJEXFJ0TI3ZV2UMOPP3J7", "29JJSOWXO5QZS2X09E3WNWLL0TXWE7YU", "TIRJ4OW5E537I6J1YYPKAWTFX7S809SR" ] - }, - { - "Id": "16", - "RandomData": [ "H5FKLN5UR7SS2ND4J58QRNT6YLW65XEE", "MM0M09QK243DEBMJ4YY5BC94MJW918Z3", "3NFQX0DKOXXXTQ1W8MBH9IDKM5ARMQS3", "F9J066VEVORNOMK5R9BP7R4UK4D1ZW77", "E3RUGBZC07WU1Z5AVE9NPD6XEYPB24O8" ] - }, - { - "Id": "17", - "RandomData": [ "QTIU5ZZQK9Y95J3V9DGVWUSB73PRVXK6", "SXEIQKF5PSCPP62554CYX3L6AHXBKH5W", "Z1RIFVEY8KFERCVAAUW0UVJYLIHIXDVH", "XQ0YPUZKZO0MXHO7WXAZVEBDS267N5B4", "Z8QBL7VQ4LBG56BD3KW9C6WTOXGWX273" ] - }, - { - "Id": "18", - "RandomData": [ "N5XZ1NVYCU4JD5IV13DCJB23L6WY183C", "OH29IMMQZ77SBMQTOU54Z4ULD4N5167D", "0256CIMPRXNLEK19PCJGD9NTWQ6O8QZ2", "931JRUQFHQMBRJH3COPYX0A1OLJWM8QA", "7VLKSRR5VD9WWLCNIDLTBAFJ3A4FK43J" ] - }, - { - "Id": "19", - "RandomData": [ "9ME577KV6TCT1NEDJ6NJW787QCRRXMU1", "K0XKHGPL20WS8VRP615ORUWCNGP4Q37T", "8LIB046CQBQ6KQ84UBV5RGK0DU6A1V59", "2DTXNQYB527PD027HVJOHCC2AS7G75L5", "GRDG7LQEMTAYI4WN292GLQ10A1W4SSD9" ] - }, - { - "Id": "20", - "RandomData": [ "RCJWXV96EFBXBNTG6UN8DFUZZMGGZWV3", "PAHFV9ZG96CFPDYXHQ88EF6MSU7KP3GR", "TIHAGNV64H8GDOKVXT9JXXYKE5XACP1G", "ZUWH6XQ35BD7GZIEKLW64736T76K0U4P", "P2RS2DZ9CFOWT1DOWT0025M10ZX80FCK" ] - }, - { - "Id": "21", - "RandomData": [ "HYSOI0LHWW3YTHM23SYH3DWTP02CP0J6", "CDO5IZG6HTEGBXHSM5FIR5REB89S7J25", "N7VQ3RTEM29K8QS1SJZTVAPHVK3JZX88", "0I2EC1Z5MA5Z5GGVQH9XTJKMSO4SYJOY", "3BTZYNZ0T4GUE0MPDI3SXKOR7PWY6GHC" ] - }, - { - "Id": "22", - "RandomData": [ "WG53XQ7CSJEZC0H2CPOQQ5ASXB1I1A4N", "XE774S1XK0AOGZPHH4WR11W0GNGVYYLR", "O0C83J7TX1F05VL7WUB7ONV5SG1RLG8W", "OSAPXRN76C3AW65UBJ9EXOCBFGQWSQIR", "2SLMV6KFGDALTUJWLHQCG48AP8KRA1PP" ] - }, - { - "Id": "23", - "RandomData": [ "4LHDUS8E847UN0RV64LKAGK8TK6WW3EP", "XURIMGB2ILDM6OXZRYUGQEPXAJTKVMSF", "0R62JJIZ3SCZC8BFXHF7I79TF4HDX0H6", "27VPS4QIQ5N8CZUCINXOHV73SMWOCECC", "LG7FMWX216QMTBRQJE5JD2YG927FHBGL" ] - }, - { - "Id": "24", - "RandomData": [ "3LX61PZV04WKFUJQ5GF7J29SR1FTZRU0", "0ETIOUY3PJSIFOAPTQJB5ICALEOAJF6J", "J6TABACLRLSAK0MC00AIIT4SBS7JFXUJ", "MJ8J5ANSO8TT0C0U2MKTEYB0BB9TD2F4", "1IXA2DH0NS4J9L191MR3MAEYIHH3B3OV" ] - }, - { - "Id": "25", - "RandomData": [ "3Z2RP02ZFUFW3110J921KLR0E92U5NZT", "DIQJSKUBT2Y24R5QQRUBAWKRIBNQ7I32", "5WTUKRH9P1ISXZ5WDLDN2XSQ89BR7EDK", "866I8KG8JVWJO24SF0MVEP9HDCWLP0CL", "X7T12XX3FEEHBJBFETLG2SGS7YF6Y4TT" ] - }, - { - "Id": "26", - "RandomData": [ "SKVRJD0SCSQ9L1G3ARG6O5TF0A4DR1EK", "VUY0YU6B23EJBGGFSM5HYWEX1P0IJWAK", "OFN1CPFQUFDV0JEU3YVF57W9QA8I3X2G", "23552PCCGPWSST7SLGOUA5OQTOKBQ6X7", "N626OI1OVS8QLDR6DQ7WJHG7OOMOEBVK" ] - }, - { - "Id": "27", - "RandomData": [ "2ZFV0ADDOA9R68EQ7O8A9AXG05R95NJU", "7YYW75FDN4IJHYAQJ5R0DVL2B955SDHB", "0OUIKSSBI4WF1O8B5B0A5SRLM5U8AKUK", "WHS2E1F0NPRI8FAXB3ARNHFI7J6O8TB8", "KMSU6F7D59WQBJMG576HJC7PBK545123" ] - }, - { - "Id": "28", - "RandomData": [ "OS7WXP1656WNUYGY6ZSAW4ZIPCSWJCID", "G2CSMZTQGALMQT4MDH8GI1GT3ZHU6EW2", "YSH2WYMGFC4WSM15HFTCEC5OWSYWS8TB", "OTY7LC0O51AF7UBQ7LM0VUXWX2GD9ZXH", "T3I8Y4TFPEHMBZRBRIZHV2P36BKT6WPF" ] - }, - { - "Id": "29", - "RandomData": [ "D3WEMC2D1HLRMKV7LEW19QV0NOCWTAI2", "ZBIHDNZPPWPOR8RVQMH1AXFXI5079FT0", "8S1LCN48OHLNAGJP7RGH2Q2B5V9HW1PK", "CZP8GGTDRJM3L2WBVLAS9M7RZZPQNXLX", "1BKL1LJ08CZTE90D88WL17K018IQ1C04" ] - }, - { - "Id": "30", - "RandomData": [ "7ZBKRLKKCJU6XON09LSOAA641UU2C295", "M4VO8PVWYMJRNODMUSQPTL473GS71RHJ", "JYT2391TZ50Y1ORNQHIUMUMBAYU16Y5H", "F9HZ4KTV06ZYVFFOZFQTJW7ZLS2FOAWB", "9TT1G2SGYW4P4XQ4SFC1IM7SCSNLSOG0" ] - }, - { - "Id": "31", - "RandomData": [ "JYYCWNI7XK4W2R4YC7WI753XVAZYOHXK", "PDGG8OIE7FE7RKZVYZJV182N5BQVYUSP", "WUHYLXZYYRL215FKLE9Z7CSRL2L77WQN", "WYL7DAJB9V6KX9V95GKUU2SUB0NSM10C", "B7GDUIGK480LGI4MGLB1M624F15NX0ZI" ] - }, - { - "Id": "32", - "RandomData": [ "44IZ3SPW9AZWCGN26BMAZ9ZEEL83M3WD", "JSQM9ESX6O2MGG28NDRWOYS5EDVRUWKF", "NVNUZB21SYDKHN88S9PJLAZU9VH6TADK", "EW8U3IJLKZEZVHY0FW9VGA4N52UE36IR", "U3GVPNFKZD9V5A926Q06BSDE1UYAYESO" ] - }, - { - "Id": "33", - "RandomData": [ "RWE1BDL2RY5DBIR531HMGLPC0B34YEWV", "VVEI5I13E8PNXADTD3H67FHFHCA9KRDM", "CJRQDI9VAOII6CO08J147ZYQN9B3H1TX", "4CKNSWP43W6S69IFXKBA0IPNVADEHFNI", "5UO41BHL36BL2FTN06G60S6VW71RTLXX" ] - }, - { - "Id": "34", - "RandomData": [ "IYXMVONVCZG3HEUQRZOK9RRMX2I4JZ1S", "JNCERH2MTU4BMDNRNLA47MY1GLY2GSMM", "7YU4BP8J7B1PWQAUP0R8Y7V7YL8GS9GA", "IRDYSSQ7M165VJEZKDMPBNX9CXF0Q207", "51GFNMC7KTW7B0LPHJ5PW0843DV5MZQT" ] - }, - { - "Id": "35", - "RandomData": [ "A894C9M8BPFR108ML0TH6LLF2MLJ0GUU", "CC7C0RMI67NGUQDDFJUWGJXZX4B0XDI5", "5VPY36V3NLL97EVLIIDRW8N3PHO6PWU3", "ZSL8BPKIX0I58X1SI0RO90J7IVJVRZN1", "0SKO3WJ385450S51Q5XZEG38JN0PFZ08" ] - }, - { - "Id": "36", - "RandomData": [ "MQFQNMYWRYQE6NGZ0REVBYXUYLFP53XI", "E6SJMPNDHAHPZZC6HAYYUF6Y3U1BHJ1X", "AHA957MLDBOAQH49IJI4E9Y994Q2XL57", "JUPRYCAJXNUS06HV0238A6SBTBABQUY2", "GQ052NKGI8G1PFICW4C5S67NCN8XC93D" ] - }, - { - "Id": "37", - "RandomData": [ "Z2MJFL3MRX0BZ0WN27OWS2JJTN3OPXDI", "FDCW397KAZN5G5XL1U4EVHU6SCZ2SP73", "TR6WY9T3AEV3ONCY0RX438X8TFE0JE2V", "1UMZ9AW1BBERW0REABBA1DAU48CT52T5", "L9C4BNYZ46224GL2X90HD14XT14A7D6I" ] - }, - { - "Id": "38", - "RandomData": [ "RJFWYWDWMMG5KI0YWJ55CL2UEOLJTX11", "AUKVBZEA5E50V9NLAGOYHAGFQURKL3DY", "UO507FX7F4A7QB9FA9IMJDT9OEEQH3ZC", "AGGGDXO5TRSNAIZPVLJMU0PQ55L2BG0L", "F76K43BNVN32VF9GPY55UNRK0ZKILV4M" ] - }, - { - "Id": "39", - "RandomData": [ "0GHCLPU2J50H7X5Z5FNMK512QWTFS3C9", "TQBO774AEDVYWKMD3UNFIRB5PPWY5PJQ", "21XRVR17LNHHJCGFKPL7P71BOF8SLGEZ", "3E65X5SM2P44J4VNJQOPDLB59VCPTJWE", "ISNFFKSO79E9C61UTUJ41YVSDA5B2C2T" ] - }, - { - "Id": "40", - "RandomData": [ "3ZW1QQH889SEGB2C3S68A1MU75CFPQV5", "GVGNKADDMK62GQLBH3HKG4SCMB4VOCTR", "NW8V5P13P3VZ4UORUA7VJLZLCDBJGSYK", "1POTRZG2BN5MI3H1XNANE7HC7WS1OSX6", "EL8PG5953ET5PMDJ5JV3RLF3HLV4GPOT" ] - }, - { - "Id": "41", - "RandomData": [ "08I642V2NFTAOMWVTJ5E64P2FFH4JEYO", "0AERDGODX3PM1FP5ZAL7TJW6TQ0ZV1SI", "RFJNHFRM42RCOCBA0MFJ314QNI7XQZR6", "LH4V5BXTS9C12USQO09JWIP0K3A9I45F", "KV1HIPEZYV14YDY30QIZ0IJC2ELCAYKX" ] - }, - { - "Id": "42", - "RandomData": [ "D7RH2KI9VKVARUBHFHI1WGPBLYPDECY9", "KD11VQAPHJEPXJVHDD73PTB7RP6E5F5T", "VVZN3KVYG3UNB9OBDIAAE5T1C3JFU6UC", "NU4BTHN3SIWW8Y5SB4AXF5O0B7K9APEK", "IR9RFMR54GS6I62O81EZ676SFD9V6N2C" ] - }, - { - "Id": "43", - "RandomData": [ "EMORYNMZNE28MSSFF6BILOOLUQLCM59Q", "OQ15SLZUOPM1E8FWU4QAMU0Z8C6IBKMR", "FLU61XW3GQ45CWGWKZRRP8E3ZB6QPRSE", "C5V2NJ57IW4504XM6J7M34BGH0HZ0FOY", "7Z2GANJB3TJ2EID4NUUFTGKI3OVXBFHC" ] - }, - { - "Id": "44", - "RandomData": [ "IF8ABRLSA6TJVJC8WNMFVIE1PUMV2V9X", "MGT8KD26JCFXWBWUMWAY3BQABGUREZZO", "656PZEYSUP5TCREN82JFVL3KZT7DSL2U", "M101EH5H8RDOF77TBHSMPT2VBW0FHU9I", "XLHL0NJ16CHEHPE2WNCL2PE28FZSR09N" ] - }, - { - "Id": "45", - "RandomData": [ "R404ZW3X81PMLYNWR7T4SYPHGONUY1KG", "C4WMZKC9TONBA1QJ2DATGF43PTXKII9H", "RJKRCA7H5TKEKOHO8E2V0097927FW11K", "PGT1R9G1G3XX40SALIMEQNQ0JMRJC1UE", "29ZE4P797AP7DMDJK73NOW4BZ3RER7ZO" ] - }, - { - "Id": "46", - "RandomData": [ "IT54BOF6LNHQ7TX6JI9F7GZFFXOB82RA", "LAYTRII517BBPNDGGU5J7TRB4ZYOAE7T", "6GF74DPB9DO9EX02TH5N6HC1TXY1U35W", "ASFIIGMCF4J3ES6G9642JUWYENOGOXRG", "I29WSRTN42HC7IXB0S2X9CMP5QE42FXR" ] - }, - { - "Id": "47", - "RandomData": [ "NDVMSKYRMR8QMT150MQ643GGPT1CNYUY", "F0Z3XKSQ3KKRE5DLYIEPZ0WT7O78TVEY", "6JLW37IQ49DUTYBTQPNEUF9PDG6IMU7H", "FWU5UQR1AYVZXCAINORDIAD1J5SXB9DK", "C5O6DG8A7WD5UJ2AGY58C39FS3VZ74ZB" ] - }, - { - "Id": "48", - "RandomData": [ "VKX1YDEGPRFV6HHADSRNDEHI5IOKVJCD", "6CKJWAMCTZTVYOJKVUWPMM7QDO6PZ3UG", "OBY368NCFO3OVWUR9DZAXW0UF4FIE7M0", "EMGWZPNWHTK8TT5Q3OQWETT2KEYC2F8I", "BDJIQ82TZC3DM2AW8ZOZQ0WU3OLU1L3C" ] - }, - { - "Id": "49", - "RandomData": [ "UC6QJXA5W77B0PPSDCED0I1LQYOCWH2O", "I1TK6UMKYSDT3U4N83QYGZLLKV9VJ8JP", "ES296FVT04PHFIR64AD20DHTPHALU1B0", "JXOK15R2I68MKEGCDD1I4QZAKJTZFJ98", "2Y7R3HE9TKU3F5ILA7IRA3638N9SL2X8" ] - }, - { - "Id": "50", - "RandomData": [ "79TVGYI681ZT555PAIYHBS892ETPHVX0", "XW5FLXFMZMSIEM7CSURCDQ6PBU2BF3YM", "E86JA0DNDMSZ9Z5QGQ7XEVXH0QD04DH6", "XFEFQYC1QE918GQLZM4Y5BISKZSTWNSA", "FVB3VZASNFG9W6ITA1BSISAW6V51FSED" ] - }, - { - "Id": "51", - "RandomData": [ "V8WMEW0AMMK04J6OQ9T5LA1WVP794IN5", "ADOXK6ONABG6HK1XZQKF8J1VG91ZZ1FD", "9PZ04JETVF4K35OKYJKN8H60M3QKFZYJ", "5D72UB2PM0U2PQ1LUQBPQ2E1T8NB23O6", "QUP08W0XQ4BHXDL6BFZZXJ3D8FJWX0WS" ] - }, - { - "Id": "52", - "RandomData": [ "MXM5AAM8ZO8V07DPXRAXDYIH0M23NE90", "HT491P5B319JKHMAB38F09OXOEEXITUV", "OINHDDYHV84MZ86SA11UF49IEHVWKI2J", "GN5C4F77E0T1EC8QHVXQ1AQTJFC6SB6N", "GUFLD4Y543PPKHDCIEPZULRF7L2ZCBOD" ] - }, - { - "Id": "53", - "RandomData": [ "3GVT6WMM72W8VBJCBAXNWH24C9O1C923", "OLVDVTGW2C12ZTU6C0YCNARVN0R6IVK7", "93TJPFQR4AVUPAFTPRYLL0PN4905CJOG", "14259KQ7KGIMP6FNV7R079WJNFPPPVOU", "WP2VHJTFA1BERC873MJF1XJ2ITS44ASY" ] - }, - { - "Id": "54", - "RandomData": [ "2X09EUGLOLZF7R1LHRWCLJ39GANY1ZK9", "JMM4M93JG80Q7D401GXNOPNT403DGSTZ", "BZ6VF79HXM6NSNCCGW6VC7V4939VGZCX", "OBOHGJV4HPZBSAARY07UV8WEECVL7NB7", "KJ8Q8457BBNWHTM92S7Q2SBPOKCEXJ64" ] - }, - { - "Id": "55", - "RandomData": [ "N11IBTT449STV96V0WTPPVF2HSBX11J1", "FTJP2D7I9DV39R4PNROB0RO2W8BSS5CC", "01OC0Q2XYKQM9L2ZYWKJNIAXER33BO0D", "ATCID1Y6Z1MQBC2KFM45U3ZS007JX9VK", "TMLQJUW68NUW5UWCYTXZU4SH3URM4PJZ" ] - }, - { - "Id": "56", - "RandomData": [ "FC6Y0LBV077HIDWGE5UEL6ZY3EXYCJCS", "D4Q2X7LMRC8W7L808LI84FOIMI5VYNSQ", "5OEOW4SGTHWI8D1RF601BDY8QIPPCZYE", "TR1SHUDD2COWTFKJQNQ1X1P10F7NODE3", "TRZQMIKV3W89ZBOK8G8YJ6R2C92BWZZY" ] - }, - { - "Id": "57", - "RandomData": [ "7UDBQ47ID58A3QCZ0XPHFQUWA7OMQJ8D", "6JBE7N4EJ0UO8Q8V7CK9KSTRAQATQV14", "65ETP71N3L8P5FYT82ON892OZTDQNLXY", "80RCMOGAL7G8TEW42QVXGO57C0453L9S", "XKQEYVHTVOCB244V6IY60ART5TAVUKGA" ] - }, - { - "Id": "58", - "RandomData": [ "7YLJXSGGJBB2L4FI6I8VWD2X26JEVW8L", "ICDESU7OCRWY8ZHAO2ZMMUN36XR0JCVX", "D0UJ0AZLKUTEQDZDYIZ26W8XYKI5DHF9", "69UHF8KOCNB2BIM28OBAN20R16UQ24ID", "OTIRTR708L0TUGVQ7Q7YFEWDJDPIN3WI" ] - }, - { - "Id": "59", - "RandomData": [ "E7NSA5JQQLCCCH6ULESL6T8K7EHPCZNE", "YROX3DPBGQI4BUBBH47ILKLV8CU5X3O0", "78NV3I1IYRFQKEIMDGIH2E3OF3Z0SUNN", "CS6DHQI8DZT3F5K44H2RVH83F8PATAZE", "D2O2HEFX8KDDU9JKS46K2624UC8IAHOD" ] - }, - { - "Id": "60", - "RandomData": [ "9P0NRRWZCESKD4IGZFRZEPMG9TIFG7W0", "5AEFI62BIGIXNR0Z42T40Z9TCUN7JRTE", "R2PD0C73MQQ7HY2S2TKOO1AFAUCXT520", "WDFVBW8140SJIBLO14EZGF0Z1KDF9JJR", "X0LESGRFUSTYJ069IY6Y0CTRNP41T21U" ] - }, - { - "Id": "61", - "RandomData": [ "QAWS0H5UN9EXVBQAND6LNV1VG30DM0W2", "18IJEOJB3LL1855L93NQ5QG4JAM6Q2IW", "MM6W3H6945RCJ9XK8PDTMF6K2N9DCMUA", "CYOV9IR26OV98EVJNB8BYYKGPW4QH27R", "LQ9UVBLZ8KW8U6LX200AOTLOOHGNNBVE" ] - }, - { - "Id": "62", - "RandomData": [ "QDYREAXM0ICOCLWSKHXQC6D2FVGO47L6", "ZSSQI3T2CNKFQ7MDUXCGNEBTA6MT4JR2", "7GYT3GJQY5OYW8LHJC3G5FTVQ8PMQ982", "5RIKJ2JOOWSSZM6CUFJ1QL71WDD4079Y", "7V2EZB8R3P2JWB5DBN2L0HMUUQXGZOYQ" ] - }, - { - "Id": "63", - "RandomData": [ "W4UET2MSH27ASYEVH93MFY80IIUJO11O", "1MW2Q1TJBJE7JLC6LB80VLL8645LHDEP", "ATJGBMFQPUL5TAR6FX7N3B3PAY6V6IB7", "FY6ZC6595SKB9QO5N8GUF0W903FMPTUH", "SOZ5D14J27RL11QUKAI7CR1OC78I0SUL" ] - }, - { - "Id": "64", - "RandomData": [ "7DSV0S2VD61IJKH8NVCOLWFBWK2F2VTK", "NFNXJ531IX4FZTF1ZA5EPFAL8R9PZW2S", "NR4D7UZS2LFY29MCFBP2ZO4HFCZ25NBW", "4L1HYB4FKNME9MT8E6KYG929XX8547WO", "KT3QHENDGKSLB0H2T1X9DMP4T2TBD9LN" ] - }, - { - "Id": "65", - "RandomData": [ "173QTC09SGS6RQ77PFLDJWL7D87PVLAH", "9EUD61JQBXQ64TNC5WW7XHDEW6MUFLOG", "FK7M63AY65CWGPDUV4T8ZDT1BPRAOYLZ", "IJ0TWAGBW8B2FR8H329K1QRC1GLQLAJH", "TMN6YT8VXRM0C1VURKHVZA822Y2PY00V" ] - }, - { - "Id": "66", - "RandomData": [ "Y4I3DCSJ4OWJE0A9U18B3XRTOVD91S67", "10CHT2QP171LNYYCY2561Z2BMYPR8TRL", "RZSNY2Q2KTJ56GFZ7BL9X9FC7A54N9QI", "PP3YGKN5LCWHP7FFTZU6HSYSTPQX6WPL", "CAPQNQTWXPYUN8WA5ZLXOTB71LF0408Z" ] - }, - { - "Id": "67", - "RandomData": [ "XKFPRY2CF7J14EEV2P1HL16S9RYBL227", "Q86C2HSG6IRQKJDXGT7O91N5NWQ9A00M", "FML5HB2V6UKCJQI0OB515N8YUBZG1TGF", "RFL88IPE1LRORLW7N0V858R1NWKGMV4N", "NEUEEJ2GW0AT5THJO12A7IKSXTUL7J1G" ] - }, - { - "Id": "68", - "RandomData": [ "REBM0R2E8PME8854OA1V23PE4BRUYQIM", "83C1S5T78YCS6FTZY077SGNXY6SYAIPR", "H9GF5DMTR4WE07IYR168TK42QODWN460", "IVK79O3UOOPYTJ60X3GILR86FOYRAZGX", "765FWLZD8LUF5GIGRM8TXXO1WO2VZMTY" ] - }, - { - "Id": "69", - "RandomData": [ "H10XN1DMDDKA63A8FS9Y1WAJRDSISENW", "157DPU30IVQTNO42N3PHM57V1RGJI538", "0XIA67SVYIPFFQ5DJZ4ZZFJ68LL8OTSN", "1R2ZG46QK4SDQ1PLVDASAEJVNMBUVUGF", "0COYXG7P3NO5WGQH5ANLS9MXIGL32L50" ] - }, - { - "Id": "70", - "RandomData": [ "XNMNN1XPGVYXZO9H64ZUG5X000QR4DWR", "SYII3C3DN8F6KZ73HE77WKT1ZWWWLGUC", "8HEBG0N3AVGIZ0PB3WJZGZ5HEQTHPH1H", "NC7DU5XQ0D7ADLB8GV2Z646JM66ZHGN3", "394X3MR7839C24D2OUB4OCLSGY1X98JU" ] - }, - { - "Id": "71", - "RandomData": [ "ZDHEROF4E51C54RR3DLWFTO1YLQFU38A", "UPMYX9L9PH0TKIXMGJ45WWPGZPPF7AJK", "61SPR2432LH725QQXE8K8DN7AG9HTFCP", "7PXTZH4NPADLORN489S2B8L3OUPK3XKW", "J2AMI70PKU589CTT2FITXJN9D3FE2TT1" ] - }, - { - "Id": "72", - "RandomData": [ "0RBWQAWBJCSQCN3MB6SYO08AOBJO2VX0", "AEHSA6C1SHKV066ZA3D6B5N9TBIP1HJX", "P2P8GKLF40FHQMJRETN9S1ZF0I99YW9L", "8XG8R7TZR7BKZFTG10KI3JEXDKH7LMRH", "04J2GLAG9YRUZOQVZ3H7L1RYSS5HZWOF" ] - }, - { - "Id": "73", - "RandomData": [ "Q4U460AQZDJF1U8Y3WIRET69NVKXP3RN", "JMD54VY821HHRL68UGNDN6A77URKPMB6", "W66PQD4I7JYNLZSBYMDIPN9MMG7JDOTQ", "ZLUVPRSQMFFEIWVICQWDJ2QJ7TCJFUET", "0IXAE7VH4W6KI5EZUYHW2PG74LY6OIK1" ] - }, - { - "Id": "74", - "RandomData": [ "AVN98VEF5OJW5FABPMZRMR1KC0F3IY2V", "MFJWRF09UC1NFTBYKWRBS3OT3C7IQK6G", "VXK06OUKW06KZOFSYQTWH0DS002OHSSK", "GV1SJK25BGP27E3P7PU91J84U29GVFCE", "HWDEWWINXXVALKUW6NR27TS7W67RKWK6" ] - }, - { - "Id": "75", - "RandomData": [ "ELVLAY3KGGMEY7TJHNJIYJGYDGSZZ1CB", "MZ69ZJWHTGW1HNIYNXJ7NCH4F6H3GDVO", "DK19BUU71BYRXORZ73MBSFXKRB32B2BQ", "VHX6WJX2DLGLNZG1PS5M1T68XRR91168", "AI6Q0VDXGU7G8M724CNT7YYBKZIE2XBL" ] - }, - { - "Id": "76", - "RandomData": [ "PILE20A3OHGHV0AKUZEYOMAMT5FBM85S", "SW00B29EBTEZSRPUZ7UDSM7CH8V7V9RP", "MXY99KJ1ZAW4HL4BPUMON1AFYYSCGBTC", "CYM43PVPY3NS0D46ETRAXCBUXSLL1HUY", "RT1T89IA960UOSPV3W7XTTP9W2HKEJXQ" ] - }, - { - "Id": "77", - "RandomData": [ "IZBGLL7FKRA0MRGED0RFJ7E7E16G185Z", "JJMZQIJRY2MCSZXFVCGO2SHKUDCTP1NM", "WKRCERX4Q9QRVCOPE0UZ1R70CCENGZC7", "O9QIHUBEOM72BZZSYXPZGYVEM0ACNKX0", "7TDVVGHTYQKOTFZNMVYTKM0ZOL5RU91E" ] - }, - { - "Id": "78", - "RandomData": [ "YG4RVD6SP5A0OGVHAXZ1VEPU2NHKKZ8Z", "YFZMLH1IYGDPMALHZYQ7J9TU0JZI6WH0", "6KBJQI525QDOAAI2CAUWJBQYWFVBSSMC", "9NSB8C0R2XB26ETZB6G5BVR54MXLW4KN", "DAOXSG39KD3V9X2RV6AVMRBO6WGWPO58" ] - }, - { - "Id": "79", - "RandomData": [ "NYZ506G4DGV7155HUFZ03YAW9A069GU5", "I4HL760ZZFSG5DWA18BJYEEZXC60FK46", "V0Z7YUKXPABYG406N0FAELGD0SX4AATO", "KVUFNZMGYO4XDQT3MAMPF32KTWHF6PXO", "RWNVKVSXO8M0RS9J94S9YEIQ2KW1SGKJ" ] - }, - { - "Id": "80", - "RandomData": [ "0PGQC7T1RZBHRB2AW7GC6X0NO72991EH", "YCABMSHBK1S9DB81RVEV9HNCZ2CEFT20", "U3TPB1YDZF1EF0KM8BSNWTIQZ7LTPC61", "91OJRT007A64PI78SZGEBOEAVCZDPEYW", "JAFNMA4PL1QVXNARAMB061ZVXNYP3WK2" ] - }, - { - "Id": "81", - "RandomData": [ "MJUPCTWR503J7SNHCIDCD7ZRKU08MPVY", "RYJN3VOQ0T4G8QXE9RMUSIZOUDES2YFP", "EE2JJAOR3XMTDTT46V84DAGJ843ZQ5XB", "NPB3XN59D5155FLATKWH0KMD7TKOGYA8", "9LGXRZGS081HJLN3S2GGJQLCD76ECQ2O" ] - }, - { - "Id": "82", - "RandomData": [ "425U9YS4DDR1SE3WFR5OR3YT9DTU3CPJ", "FNMQQ344JLDF9UU9DJ8VUO6AEMU5E8BA", "XHVF1MGMXBEG0SUPTUQTE4Y1QLMEI80L", "KDS18OH0DV8TK0KV2FMTSS62T4ZPACDY", "K35XA2QEMZPS6EQZB1LCWG22GZHEY10B" ] - }, - { - "Id": "83", - "RandomData": [ "SJJR4XV9ZHG3CN6PNAOI0BCDADQKULQU", "8NAW494OGMNO98Z3320YNRLQHFQ1GKON", "1V5ZNJUOF9CNXXDBOXR2V2HQBTPZSDH5", "8AXOD9PTIMSNO83UBPMT2W29OOY3446C", "2HPX9Z8OH8TIJ3BC04XC0YDMIY9YLWZN" ] - }, - { - "Id": "84", - "RandomData": [ "PQVHTGUMQ7L4CTZUNVD9H3LDDDPLZJDV", "IG33I3TTKLW2MIJY8OLZSZGWEREQ1IWH", "30V506MTBUZ5HS0530NL8NDTAGZ0ZD2B", "ZO9WWO8CB1Y8AKOV1JWA5LIQXC5TGW47", "1YF2TEIP2KJHZESZ2D9QR2FOGS8USO5P" ] - }, - { - "Id": "85", - "RandomData": [ "60GLEVBWBHIUBB0STF0CXOQ9T1WAFX6N", "P4K98HUGCMPJTUME2QANX21SJH2N8AQN", "L5FH11UMUUAK8HP8OSIZXTZWC1Z0OHHB", "6C8YOEMB5X2D1QUC148Q20Z2FSFAB48N", "M9O6J1TJFH490V5VGW8UI1IFMFS59M9B" ] - }, - { - "Id": "86", - "RandomData": [ "ZO12CX3AKZLV60BUXT3O5NEV1IUDIXJ2", "I2JL4DTT37JTPXJWE8IQTUFLKGA3D02W", "PSNDQZZU9KV7DVFD978JP3JXW7BXC0PD", "FXE7KFFOIXQJ8IIYB73F1SHVJZQSXBSJ", "4R2QQH342TA2N9ZOZMWE7JLXQSXVYX1H" ] - }, - { - "Id": "87", - "RandomData": [ "EGOQP1I3D8NHROIJ9B2KPNMVGFA8TIFE", "23XGVI98E3B85DFBKOVX5Q2143KK1KJ5", "3JPX1BY1C4GVMNZC99XFXSJLB5L27YH4", "TGFWYRJJ03UAKGOQDIK1WEHKADW5Z54O", "XLCGIDNSZNP48IB5R5ZYNPHP84WU5NT4" ] - }, - { - "Id": "88", - "RandomData": [ "8FN8DIH952CJYNM1B1O4GFAHDXHOR2XM", "3V524C1IXZ3UN80VR4SD8ZX2FF4QA3RC", "FZPDRU699GGQMQ4F6W6XKTNE7CXYILH4", "I1PXTXD77TE2THQYLZTO641WLLFP6I0X", "8MIVAHWJT8Z0OVV0W8NS237O92LHRYBZ" ] - }, - { - "Id": "89", - "RandomData": [ "2Q3G84XDCJ58EBHZ0P284I5FP4VI5O24", "7A782O11KJPS79J7VVRB5C4UUX1EJPIY", "QAADDJ7LXBYU2MIPUYWJ7194FMNFXXS4", "B1C78G3MYFN4OK2IPLUU381ZBF7151YA", "S3SAKLQN4KU1NEQ5UF0LC7BDAN53ICQ7" ] - }, - { - "Id": "90", - "RandomData": [ "RMLV127E5G0SN9L6ZBG0BN8V1PA6PXF1", "3XKB34E1HWP6GSZAC9DG606DO03M2AYH", "B9Y0ZJC47OSO7BOJZ94QT85D1GWDB19G", "7I5H49L26IIRHRGMLUW2GIXCEV8SW93G", "PLRZGGOZYCTLZO5JAK1REHAYU2DJA2F6" ] - }, - { - "Id": "91", - "RandomData": [ "PCC6AQFEF7EEYMM0ZYRMILBHL2FNDFZ5", "6X6XM9JTEWLHC6AHQMTLK3YDA4VHL2B9", "HJHBQZO0O8HV94FO2770WNUD82WROCIM", "VM93Y810836MVDDGYGPN4KN4YECXC6LM", "Z49X4LZ3GG12QHR5ZP3IW5SL8FEU5DYC" ] - }, - { - "Id": "92", - "RandomData": [ "RUX1DPMMQWGXSVNQWH8XCDZ4MYZZHF7D", "SZK6U01JDQ1AY42N1X8YFA9O42PP0XFL", "YDF3KR66QYUWLZFR5L7TGJ7RZ6C1LMTQ", "LQLUZ9DJ1CHQQNCEW7TOZWEPFXDNPEVE", "FEL4NU26IY1EBQAM47EN2E0YM6PB6Z4X" ] - }, - { - "Id": "93", - "RandomData": [ "QDLMCH1CEXGB49NZW1TS9HLANWSQF1AS", "3EX7FYKWFCJE8Z3MS0OEGMXJ2K9PYK6M", "XXH0MQT8R6M77GCX2G8PM5LQRNF4Y475", "G6RKRD9CGQXKAZMVHLWSMQA2L1I8KZJW", "8Q1AZ2GZG6J6HBQ1BUWNIPTZ6Z804B1Q" ] - }, - { - "Id": "94", - "RandomData": [ "GBLT8L5PF7LPHDUKKR60D6NT7BEA3P4F", "E2ZF0620YGHLEDR3EYPNEANKX1V6G5VZ", "CFLPNPTNYGC6YCP4UL6F9RAEOPR8L5T3", "USI82CPYECY78RWVM1M59QZUEGA87VC2", "XJLG3QBR5HA72DF726VTTX4E2Y3VBR1T" ] - }, - { - "Id": "95", - "RandomData": [ "96KZGQ15Z5A1Q22BBDFA9TJAPHNFXQPO", "PR863Q1LFZ3XXCX961U8L0TPWJK8CVIJ", "PVL935IUL45JZVMMTNJ55QDZ7SJTG2JT", "RTIB0YGAT9XR4KZB77PYMMN8SWBKWZOT", "UM2GNLV4HIM63V4X2IWINUGEFJSEX5O4" ] - }, - { - "Id": "96", - "RandomData": [ "UE6SRTYVLURD9RF62OSOCGGAGXAD2RHM", "4SMZZMFJTA62DDEYEVMINA1N76M3TU24", "NEIREPHQII4CKN6DSL8HF98418139MZ9", "IBO84XTZO69EGZDU9JKHVVZOGOZGXNQ6", "T43I88I51J2I94YC4H40BSNWMA2P7NBA" ] - }, - { - "Id": "97", - "RandomData": [ "PDVL55VBAPQM2QPL0XLQTZ5BRH58F27O", "I136IMH9W20VBA35VQZKBVQ0HU4X9W5H", "RBEBXSCNQM408J9QN9MZDXNXLCYYST99", "7SDA62ICNM3Y0Z17VNJAJFE4YRZV3O46", "N42QG8TV1JL03Y6VK1DEJ9Z2OJMPCXI9" ] - }, - { - "Id": "98", - "RandomData": [ "R6K66L1W3YI93NA9VEKCKZXOEAB6WESD", "BMJ6N9Y89RLU0Z8AIM38NGY1J616J49Z", "GF8REEVVQLD3OCYPCBYKKU04XSWRI2ZE", "RWOV0Q5E0IRBC5MHIM3IGZOVOD3WRENY", "W8M2XDYVFUTCCY22FPI58R81I2GWXJWW" ] - }, - { - "Id": "99", - "RandomData": [ "43PESTTFXICWGLSZLARB5RZFAUU56B86", "77IJJXJV6DHZOMV6JQLW2V0MDKE89YIW", "KFYIDJQY15E2JA0X9YVP0LEMH5F9TLWI", "4VPJXM3AAX56Q8CDTQ9LD268BMBHEREP", "I67YURAW4UPDQH5I2BPDMLFCZQHLLV5S" ] - }, - { - "Id": "100", - "RandomData": [ "SPXTAOTCPMQSN2S3Q2PDBAC7159EJYLI", "Z6UATLHORMXA4WY68N4SG1RRN02FOP21", "BH2QIRKEUAVZNCCEGCF542C8PCX3TC9C", "T68X4IYRDZ7GF1EKXY9MJ76IF4AF4RVS", "ATFQEPJ7NY1E562X7MF4CW2W9ZRAHTXW" ] - }, - { - "Id": "101", - "RandomData": [ "EPFWWYGIOB8VF2NJBNHRL0PO0SQO7J04", "BFAQ0GAJF7QAXHQHMI84LFKN916DH2KE", "LEUA17S5M8LOKP0TCJBZK5S54XR9K7BN", "WLYTWQPPZDSN35CUBMB80U4QWZFEQSVP", "68190G6V3W9HNEB8U6875DWCRI67KK9H" ] - }, - { - "Id": "102", - "RandomData": [ "SDR5ED34QQEEVWDRXGUTTXT3MZRRK9KS", "X2ZJXG4QDERP8RR4FPJDZQX4TYSOWMTQ", "FWR2734QMEQOGE44IWM4ZG2HE409YQ30", "UAJMAY7MV21V9JXO3XG9AY183JYCC426", "KZ3G4S4UZ9J6PHH5GLFAK405ILS094J0" ] - }, - { - "Id": "103", - "RandomData": [ "95KKPRTL3VJAP4TVC350Z2WQ987T9DV4", "0T7T76QZ14GYUZQO27YF9SBHJ3KQUAL0", "APK579YFNG84V75JRT1CPP5HSZJDW9F1", "SQXFPVQ2IS22TGVM8A9AJJLVTCMHZUTO", "BHLFJZ45C836WCXME7FV9ESJFCWMIJCY" ] - }, - { - "Id": "104", - "RandomData": [ "9O1M4PCIGE8KPO8QPAD1P8O6YBAHDSW2", "5F7ILKRY56O5FH40DF6IFLIA94X2P4FX", "RFOKRZFESO6TTT1RHJD8VOXU66JRXYIA", "11OA2UIOA2Z0OZRPDGVG1HBCS4NVQYR4", "G522F1YXBZ83Z6FHP4NQDCJU0LR8GX8L" ] - }, - { - "Id": "105", - "RandomData": [ "L5UT7YKLS8EBJINWYGFVKA0DVIC3JZQO", "1WR3LWJ0TB8E7HKR85KARMBKEQ7ZWQC2", "S0KW0TKB6PCICVGO7U5OPP6PUHY5YUDC", "9FWH6Y1OUIDBJ3ISKT2CVXNC35CT4PNM", "L9I799RJ2R4GL5F18GUF1BRL1TNBVITE" ] - }, - { - "Id": "106", - "RandomData": [ "51ZKULTLCTJE3G080LUY4HUKS6FPVPXT", "8ZLUF5GXXJDI1MSU2OLKY4JXGP1XFDZW", "50GD5G35E6BVEMTFOUWHEN5DPYO0DSRT", "TRMBGOZWVPF13YT45VJUQSRS4CYG2D1W", "PRBW9S895AWYIEK1EU4RI7DBA4GE0S4R" ] - }, - { - "Id": "107", - "RandomData": [ "YTMLW64NXKZP62KZ26CIIJNSOAWEL4IM", "GEAZ28FHZR48HXFHURM3QWIOF37VKZB2", "BNJ12V7314S1POK15OU4SO6U5VT8BT79", "PC74NNP9TSCVDR91TF05FHKWRZ5GB81I", "7TLMRQNR9UK9MKROV2P52B3I2LNYSI7U" ] - }, - { - "Id": "108", - "RandomData": [ "13XTFXKC2J6U6KJGIRVJT5P6ZDUGDZ90", "W0HSW7J8SMDTEIMRBGQBXYA6O14BCD9D", "JG8GC1TKHX1H161Q1DE7I8C8ZLE5CH6O", "MAJ8KFPKWF3973ER9NK89C4LD9R0WYI9", "1M41X3FVY4KDEDA5HX5Y77PKF84LYYX8" ] - }, - { - "Id": "109", - "RandomData": [ "73IU8M4GIYKE20GA8VT92TC47UVZ8469", "HLGL4Q742YQIWLSP14MDEXFN1OXN0FIN", "2K6QT5FSXZGDC3HWCG7DR35TF3TP3TDX", "QCQLOB55Y3PPRCL7HALUHE58PNK0L0ZD", "VTX9N6IALBPYNPCDRWI2ITQLHR5B1EU8" ] - }, - { - "Id": "110", - "RandomData": [ "EM38OLTK2KIFZHVAKGIZR75CCL26AHJG", "RQTBWEZGC797KKW9650U54QHQ15DSXKV", "BCYIXTNGRCXT7712Y3AFQYLX9MU4IVXP", "XO5IVNLMRTD2H7JS9CPZXFEN0BIL9T76", "PI6SCTGKRXX7USPCDB5GG71SJRRUFAN8" ] - }, - { - "Id": "111", - "RandomData": [ "VHN9A0QP5EI9RH2IVFH7X1ZRQOJUCWFR", "KYLNEQCMVPLBZ2ACYJ992QL4R6TWR6NJ", "80Y25PDFD5LHPY1XNG52XFY4NQ6I7P4Y", "CCC8DHHJF366EDO3F5ILAUV2C4POT5HX", "BWFNV2UG9VX3J10KCCDBGTXRQK6J22ZJ" ] - }, - { - "Id": "112", - "RandomData": [ "WI5R8AIMLCMP72TKEEMQ2FQR8X7L6LOG", "6OHB6ILB400EGIUY0VEXQJQQ1NSKD7PA", "YFTSVRO53LWCOMK0CJUKG00W70KS0A77", "K0QAZBDJGI4FXOBPC2H4NF37P6V4H6F2", "NY1Y5JABGKD76U9SY4P73DUF6SV3QIBK" ] - }, - { - "Id": "113", - "RandomData": [ "DC28XNT22GYCB6B46CFMRH8JEW1MYGV7", "I3432B5LLWFWPSDAR07NCZ35DS4BVGEV", "V03IBIB4H3B4BM3WS158JH4TA80KH40E", "STAZY58IYCGJX831ZHS3KFMN6JIDS1XM", "D6MSLE7W2WKGBV5CE9V9L63MHX3OX406" ] - }, - { - "Id": "114", - "RandomData": [ "P3G0VLPUK6AX5GMKOG9TGXBGDALYLT98", "6N1IPEQ2TAZP6GQALSAR5H0129XUA1J0", "6C1SOD5JZG9F8VK7TKN3SSCYXAPPQ512", "18T3O8WHW01YIU3GZ0B0OPHN9D5OYP23", "PHO9CQSVXGG20OPCGJZZ4BOL0F3KDHTH" ] - }, - { - "Id": "115", - "RandomData": [ "88JBF4EJIPCIJPXVX2IO0C8N2CI7WHRQ", "X932FO6MFQRO8GBKSIXL9EQ595IDVGWA", "8WVKW4PI55JJUTPWB7PNUGQSS83KG308", "3RQMV1YX3OPD4GKPPVBY1IQ2FC2XBFCB", "FLQDDCBJI1UF0MYLXN4U1CGUBYHT9AWX" ] - }, - { - "Id": "116", - "RandomData": [ "MO8S0HLNU2PAYKB2NQAXKRJCF5BP5SKH", "E63MOGUQBRA9WF60WOFSA9M4E5M5F6RC", "RH51RZOH6TV3RKQ98K2RM2HFT8HS3ZKE", "98SPJFJ7A8WQNTN4PN64EAZYA0HTR5OG", "JQ4T1A02B4QOF01AVNCQ2PA9I3OS80PE" ] - }, - { - "Id": "117", - "RandomData": [ "TPH7Z3DOWE3JTKSK9G7E38O3Q4K7WH4K", "PM40S3L1KX3YW0Q8KET12KLVAOR4TF2P", "JS4GQ21F4G4FF0GZOMWRXCSEBIZEMRIE", "5NOE5JRSMN7WQFQKH1QHSK1HA0FHCW2N", "80K1LC4F4EFJF5Y52O7VBBWUVHDFDKPZ" ] - }, - { - "Id": "118", - "RandomData": [ "VTY05Z9E6LMOFRBECKPXZHM7D0FD8ZBT", "YPYVH79CP2ZZYHOEF9C251AOH1WFT5FH", "J3Z02Q7EKMH6SWI6LB89WIX6PKNPL4TU", "WRQ4RYLZB8STUD6USZ3S7GUAF3LSCR2Q", "2XJAGOOX0I7Y0EMLO27VAAXQ6PZYN3WU" ] - }, - { - "Id": "119", - "RandomData": [ "FB0635OELG2YJ6KBR9DJUGP293D0Y0K6", "VNSYNPRTO2K4I9H9FYHN0N99W87A1YPU", "65C5OVXBRT515VTAWDVAT6GINTCPSR1Z", "N07N6LVTAF5GRHDBO7NXCOA9Y3R5TITA", "2FOFXGDKSBAOBA1FPAAUDDX8Z7YC3ZA1" ] - }, - { - "Id": "120", - "RandomData": [ "W5NL38NI3DFAOW8XCLPSI86ZSPPZSAQ3", "BI1GXPMRX11A8WUC9AARJSTX8Y3OSY02", "WL9G41AW984QH5055NZRA8TTYEH9W889", "B8NWXOHHANSLXDQC77SF8J2X2QR0UBAB", "95PISEIQFRQWQI5VYEBYP3A2GZ3G7RX9" ] - }, - { - "Id": "121", - "RandomData": [ "MRL1YHU3YCAQ2FHUU5CQ9LVG5WC2KCTY", "4RK96E7QTIAN3U9ASJWBPH9A5E6BF2SW", "SMWK5HXQ8V61LINKWBJBPSIWSJD1H6L1", "ZN4Q8ZFKVGC3LHYW1VODSRGAD92VD5IC", "JEB8O6M769PJPPLKURAWRHJIG4N96TGZ" ] - }, - { - "Id": "122", - "RandomData": [ "7ATGF0I4JQHTB7UYXSBW5VUB531UTNBM", "2ZLO5FE3IGMAAZGJJZLORU4LPSLM9YL6", "P41MVF3SNHNZITBFWRK3BX4I498N324U", "4QVF84YD63BKGFD6QFZRNR429SRVGQYU", "N24285G23H7HVUBZ6C6YDNHMW3GPND6Q" ] - }, - { - "Id": "123", - "RandomData": [ "FQ6NLL7V86XFUXGPQ2YET9R9VRGFZ0P0", "KQBFXYNVFKZGZB28W09VO26G9723E26H", "R75DWA12OC9JKKJTZHS813LSU5G06UQM", "ORY2GYMV9GGM3X6YXID7J8PXVMT04A64", "VW52WRMB578VX9Z79RCXQTDPBAG3FV08" ] - }, - { - "Id": "124", - "RandomData": [ "KM0G1DCG6CCM94AWXV1N7JNCTP0VKS5J", "G9KKISF5O61OR0QHATGT4NBB9YXMNR5N", "H2GAUZOEQ69BR9U29TV0MMP38ILT53R7", "BNHYUQWKFCD8O9TAD4M45EB4NNBLO4IX", "OBAD26IT6LVJIQP8ZLQBQWB6MMKHOL6L" ] - }, - { - "Id": "125", - "RandomData": [ "4PTM9PHHV38UT1V78CWCOGG19D1PVBEU", "OKO37C9JDJQXYQNU0NIMZ37YJ1M5Y2VT", "YNGIN295DM8EZTDT0GZI225UN0TFZDUL", "X69KKEH7NNIM5280X3FSCM05SV5WJ3FA", "1XR3T2IW824PTSZU23R67BJLGD2ZIVYT" ] - }, - { - "Id": "126", - "RandomData": [ "HIUHLFG5VTUJRLM95K4PMJC0OFWQASNN", "ELIK7RJWXWKOR93413370IH7G43FS04C", "FHFGDBBNBH2Z8YIOM2YGYPW6DKEDYEE6", "1IIJ4W102Q6TPS9SWP20BYO0VJD278Z6", "C570P8T0A8OITDQULVQILO5D3SYVS923" ] - }, - { - "Id": "127", - "RandomData": [ "09QUVICX5CZCJFGS2SRLRQVYA367J8HB", "FUSUW59CT3NJY23YLG29RRMJO2U1LEN7", "4Y7ZWW57TP2XDM9HAIWCFHTYIIF4LI0O", "PQO95EBYL5QCYYFC2M0DSK1WFIROQBVK", "YNHX7AM6G71K0R9TCDC9RW5EY14WXXHK" ] - }, - { - "Id": "128", - "RandomData": [ "JGNKQSE1947UTQ6XI7LM9V2BSD8FGZIS", "ZRAUDYCU9KAXZKVI5GNZM5KYNM2NT8VJ", "VP5CPLUT40NYVFMHRZK9LTF4GMG16ZAA", "Y0BKPS3TW45WRVCI9V53YW7CJB6CF2XF", "ZMA4DC1860NRXTMUK72K3GMC38AOW0O3" ] - }, - { - "Id": "129", - "RandomData": [ "GZ6FVHF63667IPOZYL2HAMMTA8BEBNMG", "MUL8XH9C25R6JO3NULZL7G23NNEXGA4P", "U0VXEQCRM0OF5QJVEYU0XAJF2RVKCL52", "ABLT3GJDJI8H1X87ESTSPE2TRP5X51OA", "4WE3EZ28PQRPCBNESYGT2NM6J1CNKVIR" ] - }, - { - "Id": "130", - "RandomData": [ "37MFSF2O0VD9WMRPB0EHV5IQKIUNXOX3", "IAVEYIWN512HKNK6JWLTRA58Z64KVO1M", "7K0V1N03E1L4CBG78XDACELIFXP2OM1R", "AQJAWYE66SO0ZB6XZ6M7K0J28SQE77O2", "943V1FKJSHEU0VSE01CR94GKHRBEHA88" ] - }, - { - "Id": "131", - "RandomData": [ "DW04HK6TVCODWYCN9MNG472EYTNKEGCS", "JFQD4Y6Q5T57PDYTOYF5X1DG3WGY6VPP", "A63QH8SKP7LLB5ZV445PBG4RBKKISHTJ", "DQ7SJHLQF4P0Q2F86V3C0AO3BMO7YK2H", "NCIU7GLXTPKG0EBJFML6ORSDCDQ63N25" ] - }, - { - "Id": "132", - "RandomData": [ "BIMOTUAZJGSLZHC7LE2L8536TFS40O3G", "XPFS2W0VLWXH8HN5BTVZVQ6FPP5OBG94", "NMYKBUEYOGAMIV7L1W2G3EVGS9DM1MTF", "W24WTC3QP7LOPU73STWON3BI1R2CR16B", "X40P1L1Z3M153G08CK4HZE221V5CK19X" ] - }, - { - "Id": "133", - "RandomData": [ "AJ0V3RBG27VBCFPU039G7YMSC7YGQZOB", "MD4UQFEUIXP2S10VFKMQ130M6HS6340D", "SUY8L5EUZP7JJTALGCAFN8JTNSXIXH0N", "7MK8C2JKG10M5QDNHG014V0TKFU3H67R", "ZTM6IBJN2Z8VH7Y7OJAQR9TLW1X6IQCK" ] - }, - { - "Id": "134", - "RandomData": [ "3IXLEGEG7M8EWELNRWO85RAZAAKRNMFL", "XY28KN3IE4SEAPYSPKPVCEOMI7KD6X2U", "HWR8MMDE3F3B85YVM2BD6TJSKP0MCZLR", "B76O70FDGL26LMNMIZ1EVZYYN9Y6V0CD", "4LAB8KXVW86V1MG7COEM8H5MJIB8CJRQ" ] - }, - { - "Id": "135", - "RandomData": [ "JYC9MMN8CFSW2C6A213HWZFWPX10IYSM", "RQMDJGU0AGJ2ZJTHMBGLQJ3TTQTYVXZN", "WFFM030VGDHQQM7GEUOHSH6IX2T3X5EM", "Q6FTDHQSKUEMBNDHSNUAJR4PJ6Y7J68K", "849UGNC6D578CTGKZMLJLED9B0JHSSIN" ] - }, - { - "Id": "136", - "RandomData": [ "W4NHNTAEKX7NT6M0ZOI6VY9419SPE5OV", "XTMIF96GMG9YHZPFNTRDKL275TPNAUAO", "JL0ATEUZSCUPYKXBTNBUNKKL1ONVUSF1", "FUO59PVJ81VH1MIU5O4WSPB9APIF08F9", "63KE62CE22WWYDUOG30FYSIZTP4TGPS9" ] - }, - { - "Id": "137", - "RandomData": [ "VVK7CEYDLZ403OK74397IALOUVUQ8S7M", "JWAC2WMBEW38YR5FE6YMQV0VK6MQUHF3", "2RRGOHFIQ72WGM0CZPLB3U5Y6P26J5Q7", "RAGGAZ071Q6T2EO7GJ1F5D9HW3K9PI8U", "Q5FGGTCAYOKMYM52A509ELBNA8UHO1SS" ] - }, - { - "Id": "138", - "RandomData": [ "SLC68I1WH1QQ3WTJ7R9US8QE31FH95V7", "614NJ931DD2N5VUNOKJ7289T47DGCTWM", "FTTB2GA8YHQPGDJIH23ZVYE81LSL5XYU", "QQHLBSVIJLJURUM1Y58K070ROUJQXYCA", "S58058GYGUPKPTRH81XAYO4TZZ6QJEVV" ] - }, - { - "Id": "139", - "RandomData": [ "JIBWWW5ZYKDGRQC4DCR5BBMEBOAGBZPB", "84AHS4UM67LOKYCJXBMHX0UH56UIVZY9", "4BHXP5MIRF9DZ84NM1TAMIOIK3LVKM0G", "JMTIQP31YDZR0QR6CH54GYWWW9MWT18E", "O24NPV7771LIS6R3LPSDQ6AV06VQCHI7" ] - }, - { - "Id": "140", - "RandomData": [ "FVD7WERRK86PNNEZSSKEI5YR2IWS9Q4Z", "TND63THH8B3R9VIN258U7EYJ7VFNR8R3", "EH59JH68LCFGCGSHAJ0DSK2OY39IO3Z9", "U9N2ZIDU99J48SH1D7MIHNK3PRKPHYTR", "NFWC2ZS2FGESB7QGWIERRQ2GZTNI7XML" ] - }, - { - "Id": "141", - "RandomData": [ "Q2R25F8NPUDBJ12RAE39TC96NQNILJ4R", "43CJPXLQK1B6N07705H34N2N2VPP2ZBF", "0VHQZTCN2MZ2BCSWSPRQCAXQAZQ4I5YU", "Z5G2TQIH34ARYAMZC26MHVDZ80P9CHE7", "YECF60DBHKWI9G2AM12Q9MMD2R42BIEV" ] - }, - { - "Id": "142", - "RandomData": [ "ZD2T7G3LY4F785Z17OXLPY7M19NP6KA8", "GBS6NJDF8Q1EGPE71C5XV3FBFQ183NOO", "4H07M3NYKRM963FM4PX4PMMN5R07RFLU", "BNJ9YHU8YHMEQGELLPDO0U8R4NC5CQGF", "F27SUFXX5ZFHAI6YMOVCB74QO1FLFZ5I" ] - }, - { - "Id": "143", - "RandomData": [ "AG9XJW1F2QSAP1RWQNTX4EDH7QE2ALSG", "37G3JIP0WQJVO4BXKT41FIN6D102R9FQ", "7MGSUXNH73AO4S2DPQRRQ0AVUK0RSWIX", "L3XCXSDWGX4MH8CU9WMBRX9HMU8K75YK", "UNDB50P6N5L36XOVHGS5KHFX3QZDU2ZK" ] - }, - { - "Id": "144", - "RandomData": [ "8T244AZIGQXWMGKZFMC1N3ANHQHPBMMU", "FA5N4U0GRJY3TSKXF97H086FSOWO2JH4", "DCQLL74VW5JDEG3YFUKBPE4HEZ4Q8LOH", "C4ZQC9LHFLV4Y3ALV7JH9GO9IJHVCOXK", "RCBJRMWGJC5DT9TKYS5ACGH5P0I210E1" ] - }, - { - "Id": "145", - "RandomData": [ "YKNV114IKC87KLPI066TTWIL5F40E4OS", "7EPIW7T7YW09HJVEKAC44UHBCC0V6EEQ", "YQAF5HW2N8566IEVUZPE2UYM6NGUH7AU", "SKL1JPIDNJR5ZLF38EBHY9YD2XIRBBVP", "7LNV7MMEQM0SC2XVIMWD635SWH8WH1CL" ] - }, - { - "Id": "146", - "RandomData": [ "XB8N7T6V260MJFB99XJZPSSDP49ZOZ7Z", "KO5A3JXYPBLADTJQG9WURM6FT48DTGGC", "9AB5KAF09UJOHSA5VTTPDNH7SZR9LUEI", "4IACSNGF36U6DR8A4CRAW19V3ENUSGOO", "QAU8R7NIMOVG2K3A1REJDDWCJPJNAWWW" ] - }, - { - "Id": "147", - "RandomData": [ "RGQC79S6YJYIG23SKM2BCFLMOSZCYAHZ", "29ZW40D28HU3PN6QW0DX3UTL5DYOJPIY", "B9QGDGYTJAC4UR7AWJQ77U5HPN10CYST", "862Q7ZMPCTN3SZ1NGY2A9L0RDJ00P7RV", "ST5YYRC66A4NGCZ0WNTO5RTXFLMY9WAE" ] - }, - { - "Id": "148", - "RandomData": [ "C2K83DZZV6E8QNKBT9EBODZB9ISNEO7J", "A0LO107TY428NVH2ALE9S809CJ9UULVH", "947ZB6J3CVNUK0YOAZM2J71CAMLR1M8M", "JV9SXR1ECL77UFYMVUU4927BC5ZYV2CZ", "WBLY1F0S8I08A4S4X85G2DNQX7P22DTJ" ] - }, - { - "Id": "149", - "RandomData": [ "IHKT4AVQ4B61B9BIM5AW657TX4B3Z805", "YQZ3U89XNPM1HWOX6HP7C6NNK15A8106", "KBCVKIYO5MIQTFLBPN7SS322DMS3C8YW", "YQQGU3NYTBBZY63EP4UV4INRIKR7Z4L6", "YW1DYFRV9J8R1DDGSNOIND2QC97KLP8Y" ] - }, - { - "Id": "150", - "RandomData": [ "0EBBEZQJN8VVJ6ZEGLOLQCTU4LBYHHKT", "KK1XBCB37E4ORHGFK2DAAWHXVQH3Y1BG", "YBK9FCDEJVOMHEDWE5OODJTXCDBU4IEF", "DY0P6HAIZ90PI5PRNUZ3NWDOSX6BASJB", "RIITNX064FZDTDPHYUHJTK1RVL6JL9IH" ] - }, - { - "Id": "151", - "RandomData": [ "0Z79W5DZ429I795OHYMQL9SHR18C0QU5", "7SN3GPU2QRP0LTTVPRBWW150H0S47A8N", "HEKOWBI2DT93U167HMXIP8IFWXWP705P", "SCSHJF9NJJTC1BFP4VXVNZ7J5E29P24N", "YTLSJZXCNJ9FPFNURGVMCJC2EJLENA8Q" ] - }, - { - "Id": "152", - "RandomData": [ "PFNI0XGF7UHE024Z0HRIHSKORSOANSZN", "LT0J1F44AQOSC7CLOVOGSZJ6490HJG1O", "543GBU8VMXI0D2MUQCV2ET4WK4P2PWV3", "Y9XHE5K3X335QS2CWG1GU9JL9G6HFFF0", "CPBDFEPU12EL09F1BNGJ4OIZ0LI78DXR" ] - }, - { - "Id": "153", - "RandomData": [ "XC3BQY6R0GP258VABFF2965XGMN46RVY", "EWYXGEKMQYSX9P42ZH6375S0HF4EKCVJ", "V0YIJ84643MKOHY0SVEZV11ID7PAKGBN", "DJCI1VS0MA9DTIMAQDVY75Y38PELT3VX", "18GFEP96DOMU2XZ5VPUGUMQHUJKLRGHT" ] - }, - { - "Id": "154", - "RandomData": [ "OMMVBG5ADZVTTDBLZJZDJPCOR8U5FXP6", "G3FQLE3PUTC517YRH8VIRDJ9J7DCV94P", "JZM07V9VPKT0MGXUKDYGCHPDTGGNB13U", "YXWCU7TW9A2GUTXCJS1SLYNCJJG1OVTY", "Q8BYUVAMTBHBOISATDET9LJAJT2L12HN" ] - }, - { - "Id": "155", - "RandomData": [ "QEZVR8SYSO8JQMXB0GILRAYFZBPB3YV1", "44VKS6SUVQBUM9T751VUU65PPT6QSQ43", "3HOV1NS3YXZB9E3ZRSFCDBG88F59ABBE", "VH1EU8GSI167G4QK0H9AL201AQXVSS3W", "VUQ2NZETMW3MFJ1EYUJ3CB33R9DEKUAZ" ] - }, - { - "Id": "156", - "RandomData": [ "8JLVOY7BCQYZ8OW1YS77JATT1WLNVAI1", "VDO57G0AWI0WND4DMMP2XCQ7Z141MTPC", "H6D5A13S26LBJ7GX2HBJUQESXQFFM9XD", "2YOQA9DVS6A01OY2VG9FSGR12UHUWXG2", "IIJVT0X3EQ0XPN1J1NUFASUVGWYP1T84" ] - }, - { - "Id": "157", - "RandomData": [ "0HSTFDI5SFACP4LO382JDA2ZXXP6BIBV", "R67I5HDYEZX4SSFLLKV20Z1ZO26RXM3J", "EOUT6CSW4DFNM8HERDV1WJ41FH4DKWA1", "6N0D7WPI197WUNMPU19U1CX4T2OZIPLI", "DNR9IDH5YN9XLIH15OTTWQA405UEHZ9M" ] - }, - { - "Id": "158", - "RandomData": [ "XZTH5NGQUE6OCATLVW4362VXMXINTCX8", "NX9WYA6RIC9STW1ZMISV5GQ5D64IE36R", "Q8AOB6WV0MV33CD05TBLTCCHGDS2FXMO", "FRCVVNYPV74TUWCB2DMV2V7N63H7O4PC", "9GXLASFS4VZWHTWUBR9BK1WUUYZ2F1B1" ] - }, - { - "Id": "159", - "RandomData": [ "R1TO80AK840G5KFMGX665N2HTD1L3MND", "T8FP9HVKQZDQAPYJSMVR5E5D9L559ZQV", "RXW7F0N9CVQGKMHDPR2R15IPCBQXM0K0", "IR8M31D28WPJXZ2XE1PS694WPH4EKZWM", "LZ73N4KXOASFQ81NI2TVK23IXM7V79SJ" ] - }, - { - "Id": "160", - "RandomData": [ "9D8719JKR1E6RYFRPR5RGBBS5ZFB6Y0O", "RJFNA3VJSJESY709GQGQEBC8BPBC3IN2", "AZPIS2QV5W866S488G5QSKKQGHLU2SPK", "6LR8RSQN9UURCGBTVDDWN6J0P8CLR63M", "HYAUA5QQ0RR702NAF28YP279B1SSQF5C" ] - }, - { - "Id": "161", - "RandomData": [ "0HKOFRSZWW65PM9XVCFZ8E7O1ASJM8AU", "VOHTR94YJIC25BUZ257O9GEWJ6WF8JNY", "WMJAEQFVHRPZBETZQ2RRAWUPKVJVMZZA", "5OGT1TVLZMGS0PUEM7YF15XA130TGUIR", "1O3X8A76HF1YPCZ5AEIPAUJ90F183BFE" ] - }, - { - "Id": "162", - "RandomData": [ "DY0LV7GM927WE9UZE5SBM3RHF362I9CG", "9WU1MNJD85QHXW51VC38SD2JHTG1AND9", "00WSO3N1VPDQNJTT8EHGGEY63KU2HRCV", "1QR69MM2ZBMDAL679X36G72WC0YEJUUD", "MSY62WTV2ORE1V6ROW2UYGO4Y54JYITF" ] - }, - { - "Id": "163", - "RandomData": [ "RJ1RXAEMDHD1QY4R4G0W1AOFD4I72J7U", "5MWS3O4NRPQRDXNAANPSS6NR4VO22HU4", "KT5EBMXPLMELU7CPQI7P4OC88FYI9CVJ", "5WGU1J8XZ9GF2C76T8LUKF95Q7F5YPQJ", "14P70SYHJJZ4I6G6I1YB0A90WLD4DD9K" ] - }, - { - "Id": "164", - "RandomData": [ "T7O7W9FBKELBPFXU0JX60OS05ZLPO4DG", "KOLKSJKIWW0WZ7KRXSD3PCTEOXB6XZWP", "AF1B3MBR9PKEX6A7P4161J0H4G54HNU6", "9KVUGJXLRV4A1PQSXDR370Y0OTGWQHJV", "4OENKQ1FGQOFP0PO0NHD618JW4FWCA5J" ] - }, - { - "Id": "165", - "RandomData": [ "LIFNLDIGMLWRLTLYD16D9FZDP50PKECG", "VE4GUBDXEA1UER7CTRTLE1KFSC8QM26I", "JQ6GYEDCYJ88OF887X52V1C34YYRDWKL", "ESLYU0OPNQX53L0MEATY7DXROCMAQW8B", "8W464JNGJQOEEGAT7LNCDWOA53KRON81" ] - }, - { - "Id": "166", - "RandomData": [ "RV6GQ4S4XMOQZTNHC2CFJ67MH4BA9516", "RWWSK3CD2SP1H8KLQDOVL3SVYU8W3R51", "US8C647J09M0QGEJTZU6QFUYEA4Z4QJL", "XYGZ9IOWGF5MQ1FSPYDE78KO7J76AHOK", "ZBD29PKKK80LKIHM5LKFNFNYN11ZKSV8" ] - }, - { - "Id": "167", - "RandomData": [ "0VWPYNTAO239I9EYCVAY6J7UXOOHXUA1", "M1UYW2YS2J1ULOQOXCXZS6CRYC1J8LN4", "1BWROPCJ6R6XSMII8AUU7KJPZDATBPUQ", "662K289HAO2AAO9L4SK7127Q2G1LPTIR", "7P0VT8Q9BMUSSIPKDYZSEWZD9LRWHY2R" ] - }, - { - "Id": "168", - "RandomData": [ "FLDVYO26CK6OIO8T0RH030MK0XVHQ42N", "UCNHF4WZ63P40K4VN750QBXP824A2UPI", "RT3FA1O64R3AKRUP2A4T9C6TP7IN9V6L", "OHNGQYUWT859HXFQHOI206IOXK0DSA7J", "URVCEN9DPI9AH7L122FUNEVS88TF7RDS" ] - }, - { - "Id": "169", - "RandomData": [ "BWOZBDL3PENS6IHZ99KZ4M6Q6DDG43F7", "ER9VSVZZQMFI0DV003G8GOXZ07379E9V", "8PNOIWHNJVISHXZ2RMQAXH1Z4K5V11ZM", "NTJLZHSDW2ZUFFSCHBQXY881XYU81WVR", "66FXNODK4MN4SGUZ22N0LBXOVSXBWTMA" ] - }, - { - "Id": "170", - "RandomData": [ "HHYI94Y37F3LVDJRD5G9I4F4I0B50BXK", "ANXKRLZ7ET2GIM3SIG71NN1MB49J33C6", "RSKHP891GJ4ZB9V67TWUD66XVLIXLPEK", "Q6YZBVCKGFUESCKBIDLKGS2UVWWE0MQ0", "FUIFL54MQMO7M2FTAHOIE4E8DDDP88U3" ] - }, - { - "Id": "171", - "RandomData": [ "Z3983F0MJ934D4I3RCDT8IWKPJBI2PNR", "2VIS3HZ5QB8EAK5J4K764A5RHYSUERU4", "WLBSW09JNIC6JRKFO2NRRRX100LFZF08", "QESYINWEKYSW88HZNMGMEDNEYK25O4UH", "RDPF9V7AFIG28B21TV1M9O4N1NA7V10P" ] - }, - { - "Id": "172", - "RandomData": [ "ELE5SC01PFG56UGXRAM3DHICICNVV9PN", "S0YX67IQ5964I8QGHMPUP7M6CBWPYEGQ", "Z3NF6S0U157ELN4KWHOJT48VO1U4K321", "3QEOVKKYV52T9IVZHM3RZ774421E85K8", "DGK5JPZL60XYBOVFG5X79KB5SJU3SGZZ" ] - }, - { - "Id": "173", - "RandomData": [ "U4Q37ZP1XRV9JI3PGV7DIM92EPM9562Z", "A7DH82IQP6KRZBVKQEW7JWRH5YZSNP61", "Z59MFVRONQXLCRCC3CT0J5PNP5MKCZD9", "AS23CJE5WIT29GFNVWZL6FS3PV6JIHLX", "NXKTZIAT7YDAMXOJZ9YQA1D5A8NQM4WP" ] - }, - { - "Id": "174", - "RandomData": [ "75PL5WXMWFNIBRR2HWUJT4XVTPS05THD", "BYDQHCODLM35O53SQVJZKN6CI31PD6RD", "8KGNOBUEIQ7GB2HYWAJJJR2Y1AHOL9AO", "406DZQDPAFR4PZBQVD3CWH4RSSVO3G3J", "PSML5E9G64JD97IC912IG81X5PVG4ZW4" ] - }, - { - "Id": "175", - "RandomData": [ "MIP7N0VRDWG280RUJSOBNUDR0ZPPT2LG", "HO11SLZJGLET19YF8A6LKUQ1E7GXKF8K", "K9UT9ZB83F5CQTZ1AJQS5A6X79XVFB8A", "M3I2OFGJ98RFZOLVIOXBYQPKD7V9CQ32", "H4ZWL7N4DHS7S08TYBN0N7M6O7YQTGHT" ] - }, - { - "Id": "176", - "RandomData": [ "FZ84YYJKB27R7S2M9CLADCOJS3INI6K7", "A9122D4A2CZU9596FMRR5GPDLYM5P6CF", "SAR70AT5HKIAM3KX4MI5O3C3TYQE18U5", "AUC8NBFF3VKU8O1SNYBDYG0Y8XNCTOEJ", "0MA10LJ2GDC2TR4E781C7RH44NAZXDVO" ] - }, - { - "Id": "177", - "RandomData": [ "RA4WO91BPI6VD7FQ3IEUXCLIFG7MLTFC", "RYLSXI07HZWYVW06IT6O8B0PZVQHBP06", "C3EOWX2VSGN8PXXSPAE1W1DP863C1T51", "80V1SMKU0L62X19B881BK8JLZYQ04039", "KVAYB5AD0UBL5L2G61D314R9QJB46UZA" ] - }, - { - "Id": "178", - "RandomData": [ "R6RB1L9D7YK077QN5J4DXAIQEAH13GHG", "4A3840PU1A6CU0CT3X8W0WMRYA71DHJ1", "QE56ESTF4JLWDF6N7Y8FHUQIYMJ33XRT", "0EVP4FOLE32RK0NTET3OJDT6YXI1IZLG", "1258TQS1JXAO297880YJ4DKXVZ1H7WCP" ] - }, - { - "Id": "179", - "RandomData": [ "RVZS4OAYABEWCEDYZK3SACMXSIN3YL4X", "UV6HJPDTZAI29YUQWCRW3UPPJCAVBG9Z", "GRBRI6PJGJ293TY4Y6HW3H39GR8HPSSS", "ATVSWCI0XHQT2PWZNG6F9N58XCL18I4X", "1J9J7GHWXQ8V1KH14I3JWMTWXW4T1R2P" ] - }, - { - "Id": "180", - "RandomData": [ "N21SPM1H8KRSPKHN4T6ZOUBO0MWLLY4G", "YTI9SYLRRWLM5AHNPRYHVCA20M2D0Q5J", "PL45BH4GIOI2JZT0EI549WVVSPIG6I1A", "0B6UFMLHXS9G4ISB3C8SUBK20IMW9XJ9", "XHBI29U26XHQXO0K6GN4KIPY0E479ZI9" ] - }, - { - "Id": "181", - "RandomData": [ "J9SXGKJ3RFV743FLRBZ2KOZO1MRYFX2G", "PHHX6DEW7TMEXS478SP7APY4KD632VY4", "MPRWVROO7C51CV1ISUZWI5FATNN2HK4M", "5R1HBHLRDAA8U71YLXLH5BWRJRDHDVGX", "HT5U3UGKIHSH4HPVWYRT9WQ35J8UEDNS" ] - }, - { - "Id": "182", - "RandomData": [ "3M0BBH51QA9XTPWBBSVOEXXVCCZTVWGE", "4ANSQOTO3ZD8X2JQX6SWS8NGZF88RLG3", "343SBEVW8GVOTY7J3J6YEUW5XG3KQU6R", "TJE280OSL5XLN8WAHYFIPRZJI854LKGN", "KD4KTEKC4ONI6LRYT2C1OYCCT5UA5TGA" ] - }, - { - "Id": "183", - "RandomData": [ "ZJBJDMQCNDNAEQM6QHLSIO8VB20YUKHL", "HNSXJHUHMANLKB7CSXTXIY2KKPIKV1SD", "6C308ZXIWDFHAXL94YF60TDTVHM49JWU", "RKOIIHE3ALAFSUKWDIP7WWMN8JF0M2JN", "QV00JD1XTL5PS8BA7Z003Z857BJ8BOQI" ] - }, - { - "Id": "184", - "RandomData": [ "BXY73TN9R2NK074AIE2XBTT1W52H43WE", "5XN4JEHNL0JBLYEAGIZ7W3GSE7K81GFX", "GJPDT90E7OLKJRP812AVDYSBQ50M3IWF", "VV5CIAQHSV9IR5IWRMG9FUTR1NWXJOKY", "1GZYWNZ1L3CSZJTVXD4RBX9ACOK5N37E" ] - }, - { - "Id": "185", - "RandomData": [ "LLQLGUAEXPXLRB1R3BAFT3WEGYWHC4NS", "58HN3HPDDZ4W9XTAW3BL22URYLFR83C3", "CFQS4OXVW7C49AFSFVUI2BZDOZYSC7FK", "XBT3HAGIFPZ500SYGXMMI3AAPMEEZFTY", "21G7QLKEOMCMM4MYGAMOV2B4ATO46BTA" ] - }, - { - "Id": "186", - "RandomData": [ "5AC8TUH4MI760XXUAQ8Z2ED90M777PHN", "2CRL1OEV2RCN4FDN534QD4I17CIGXK76", "AUDYGM3VLM6KCZFVJTBDV1J83ZNZG77S", "TFNKBPGTAJF077YI7X7EI4LJKE4Q8DPN", "OO07M5T3MSDMVSA6AF1T93JZ3D97U0V6" ] - }, - { - "Id": "187", - "RandomData": [ "31LTG15CDD1009X1D8P2M5NVEADI5WIW", "7GS4HRZJJZP6CT94QH3WK2U8N0OFYXGR", "4E3TR3UWIGSWPRSVBJ2Y2WMEWTQQCUUW", "S7B8ZPNXWHODJ7S6I2DP5RZI1Y77METX", "V6DSQT6V5FCVHJ4YBUHKQF1BI2HASQKR" ] - }, - { - "Id": "188", - "RandomData": [ "X1RM3APY6RTZPDBR4I517JGQFCJYM5DP", "4U7Q2R4BFSN8WBVF0ZGKUSUOUAH100MB", "OD55FUZMN4WO5I4ERE7WY35L9T61KDKO", "FMUSGZ9F947Z6FTLGDKW3ZMVIT5WY8CJ", "TIISXM81E1W46FP39UUH3YUQA9JW3NRB" ] - }, - { - "Id": "189", - "RandomData": [ "2XGY7BX4FSRCDRZDEBWEN4Q5X2RYCL71", "KVCI916860CLGSMSJGR11MY7HKAET913", "U01RPQDNFYIX2EYFP8P63GA77EBY01O7", "8I0Q04D3CEWCDAECV5ZVT59O03UKPOWN", "JLYUNIOU5V3ZT736A8D5C3NDIMZ7K2NX" ] - }, - { - "Id": "190", - "RandomData": [ "RI22MUYMREZ7BK439YKQL1KQ7ULBTRKD", "IGHKEBTPJ0N8DPC8R67VR6LZ8M42JX3A", "4VZ4CUZ8F5GUNMNSRMTWTYWL4SM1G1GW", "7NDRZH67H8QW01LV9MK6DGQF9OATH72N", "YTXAI52KPWPVI9UDG123QJT068RLHM0K" ] - }, - { - "Id": "191", - "RandomData": [ "GC7GDLMDTARQ056936NQE86O96DKNRCC", "6FOFCO94OZKQ2DABBSRL9JFHFTGHICZB", "7OUVQ07P6TBOYQV66BI5A1DW9GASI2WM", "9ITOTOVKUCOQI1TZ7JKG34BGK7VJ0PGE", "6YPP7GNRQ7K8MXNIXLU8SQTEHMEV3LUF" ] - }, - { - "Id": "192", - "RandomData": [ "5KTULE2163Z5TD3WUMWP4IVQEKHUC2XF", "NFCCE36SS3CY0XVESSBRYFLXYDPB6HYE", "FUSOA1R1PD6AG6ZRZDBU0GQI4PNBN5WK", "E8TGEGE0AKCVIKQ1N8M2FEN9DKTUOQNU", "RV5INTMS9KTQE59U8VXPS3FAUUC4XTMT" ] - }, - { - "Id": "193", - "RandomData": [ "6REWOIO3W434U65IK9W228BXQ5X3QR5Q", "8AUW1NF0H42YAKPYZ4UX6U07PQFTVUNE", "9M6UMIR646U8FNXGQ8EW7HTNJWGKHWEW", "QYYXN4MQNX3AA12C39CWQ0G13SKZCGZH", "17RRY92VWXIKOSNR3ERITSGZR634TWOH" ] - }, - { - "Id": "194", - "RandomData": [ "8VJCKLN3GQA2R6NKF268YQYJ1191G8B9", "JBL3JLHS0YCCRNHUTTZ10PSR7ALSLVXI", "PATQVUB4VNHAOV1OTOIXIKJ3T45J9ZGE", "A3XR4198R5FMIRDMI787NA9E0Z60Y245", "GDAU7JT2PJFNE6VC1TAC1J0A4T1E5IKZ" ] - }, - { - "Id": "195", - "RandomData": [ "AKFERSP9NGRE4V93D49F11D7N9ZNSP6G", "9QN40RVIEBZV1WFJU7BBJE7IGI1R2BR7", "JLFOIFCWJ1A0CSF04Q3UO574SEXS0DPC", "U1LQR0BP4O2SEGGYDAWMI6TOOK5DRU6F", "L7GKGZJDPNZ9DP0M89OZQD4XH7BG577K" ] - }, - { - "Id": "196", - "RandomData": [ "SXHGA5RO0T64GUK9UTFSGGYHDSDIXDIR", "PPQQITLDRA87G9RXXCVL2PEL89CR2I1W", "KPO0D41BHCAFH0ADBPVUS7YALERIQ4KI", "IMW1U0U2LTD0P8EI98PMXGEN0OP8NSUM", "1165DJTL53I837UMAIIRP8VCHJAGKVO3" ] - }, - { - "Id": "197", - "RandomData": [ "909XBIE0PER38FU33C7EJC73F4X4IMAJ", "OP9C86L2ESCLQ1DCYHMIYKT73GRGUKRD", "DHPSFS461FA1AWMO0VFBA2VE6CJ1PEH3", "A9HIMV7GMQRSJ26G3DQ9EQDLWKWDICRW", "7G0BPDBFY9YTLC4EFC7LYIZU55VB937J" ] - }, - { - "Id": "198", - "RandomData": [ "84VDB510CKLF2TAUQR7GFG8ZRGFTRAF4", "BOVQQ1CJLHJN6T1M5BVR51E265V50HIB", "FRDN7TDYPX477U37O2YQOY8KK3UVGGTE", "9HIPQOPL76CI6G5MCXR8S2XQS2DE9SSI", "E08ZLNR9NNSSW0OD8HSSZVVHU16XLKLO" ] - }, - { - "Id": "199", - "RandomData": [ "N3DFIFAYFRUEJE42O9G2AATTE1FTR4YC", "CDF2XI52H3MIAQ7P7DJLETOMKTAQ9RHL", "2SCF9CFFENUGXKTY30WNVN7TZ2SDIO30", "WAPRO2Q58DG18HY9AMXJ430PVSPGTC70", "U4UX5CJBJ1PRGGVRDSD51T52JA66MJL5" ] - }, - { - "Id": "200", - "RandomData": [ "FQHDWBE7DWADNIJO78DB8C9A92N5FNY9", "PTMZ8S4BOF1ET2OB0R8OGK7DQGE4YJ20", "7AX46TQPDBW3K4QGNMEXOK3FWII1N9NE", "NBHTFUEHBTKEXD2W07QMFEMXGRHYKYBD", "XSQJX7B3I6W49YSTPWBQTB9IZTMXNP7N" ] - }, - { - "Id": "201", - "RandomData": [ "SGQFXT826WDIRRXR9YIXWUUWSHTDUNQ2", "9JL3HM55XJU6700H64YZHJ07V4WPA5HT", "GLJIG3KW2MANAXY1RMH0Y1U0SOHNZQ52", "BAZVRRBCUB65JN67F48XXR4P1S01W67M", "QHL98CK9KFFX4ZQERJH4RIEUGK481JQX" ] - }, - { - "Id": "202", - "RandomData": [ "EUOBC69CU8MSMHVCCVKMZC4ID13YILIB", "YRSJKPCUKEJT5VH9Y26F8E8B0G8KDL4J", "0L34YM1WT0BU2LMRT39QOCCUSRSDR1Q8", "KA2U2NLLAKWICOJP4Q1KLO4XIILG4YF1", "KCJ1S2ZGRXPEQ4SEICJAAGX6GEMTBERL" ] - }, - { - "Id": "203", - "RandomData": [ "E489ER6B1V2X8ZHN0H81PE0DPNVOQGEN", "FD9V6TA0FHJPN97Q6834G06AE4T05SVU", "QPR4ZVQGGHVH5L0PQERRMKHPG9RC9J5X", "VY88RC0LSWX8EZE2EDK1BEHGHCY0ENG7", "M8VGN17NNG80WILR4Y869EVRQ20POAGE" ] - }, - { - "Id": "204", - "RandomData": [ "Q0VFD8PMF7N4GRT90G5PPK8IME0VAR8N", "93J6XFO6JV0C01L8I1ZIF1ZF2N29I3MX", "8A4MHWMU28F3U6RV31MI20HIEEEJNOYP", "JCD0690WPEPGV5V65GGQRD5H2WHDSCHN", "JZUR20Z4A03YKAXJSINGII8FG68K1XEN" ] - }, - { - "Id": "205", - "RandomData": [ "6C65KDEFRMP1KG6188VJYBEB1PK62PCN", "VP1ID18OEIZ62G499GL3B4Y575D53HNB", "JCF5PYYG9HFPLIJVVK6VEJM105KIYDV6", "5XXZA9UKSE34ZJTZVSKSL1790OETNPS6", "VJUYVUUV0WD9QRCRLVXF3DVDZX9W5A6C" ] - }, - { - "Id": "206", - "RandomData": [ "V6IPZ5DB8Y1YY7TIMWH22NDSXQ87U80Z", "ZANTJW2QRWGEL6P2D0JI3EKI3Z1I7GQA", "8C9YU99041KGG8H1AG33YR5VZF0T4TTL", "FGGI71IE1TOC4EB4SAH1MWMQGO8OJP5K", "I8AA184J8ZCED30VD5B3M19S40CT335L" ] - }, - { - "Id": "207", - "RandomData": [ "YE46DBDTG83WUHNMXMLNOB7Q8RGB6KQE", "40Q894SB2SXO8N8WMZ5QRR7WGO7V5BW5", "RY131ON34JU5OTRUTUYHO9XM332V66G1", "616KVE57LCWH7BIW7MCLMOQRAPA7W168", "D39WXG9OY05MNQP2VFYT35ORKOKGE7LT" ] - }, - { - "Id": "208", - "RandomData": [ "GXEDCV90NXWVSEEU9HLRDMEHPRLI52K1", "PLFZMM0AG7GGJ29GK0H6W3Q3T6YUJ05U", "N4GG8OIXRLLGG88WSF7FVNFW5MGQXF0P", "BV2OW2H6STPKSJWU7BCE208AZUKWI29M", "U5EVGUAZ8BXB84DV0VSVCWXLW1YCRVY0" ] - }, - { - "Id": "209", - "RandomData": [ "UC0XFBONBNG0C7C5QY6WJNJ8H28O57HN", "N7R5EPQYGETZQ6JZZ3V2YBQG31QMCASD", "F3NFPH1AIHPE4TSKTJZCMOYLQKBM9DVG", "WQTWTDJSCUURVLMJIF33LP11FBZEFOAE", "VJRNA51Q9GA14G0E82E4K15GY2RRNEMX" ] - }, - { - "Id": "210", - "RandomData": [ "UQ5M48JMNM4EPA68LUGNKG44NKZHNKC5", "4MHOLNKAS1R7710Y5TF389NNVB9TJC9D", "K8KD2SX8JG4SZ66VTAL4EJ74832JN10Q", "2NX8RX5N5HT2F5YZFN9I0E9BBPF90NUS", "PN0LJ7E6E886ZEZDECEA2R0XOV7CR6WS" ] - }, - { - "Id": "211", - "RandomData": [ "XBM1ENPHICE2GCL60C5YJTZ7XC6XACPI", "MQJX1781W61ZN7RLJALPB8IDMPEBQ2HG", "X5QZ3YE2DEBN29TZVUO909HNIFLM26K4", "YVCRR1SV5SL764LM6OQ5OHPXYCRYM2AH", "3GYH7BI3C2EHYKRN49PNQOQQFO3OJ3JC" ] - }, - { - "Id": "212", - "RandomData": [ "SEDZGEP4GW3VCI9OVE4NMW0P0HCSI3UI", "TCYTG1HZUVH4V4N6PO3F96Z6NY98C6WM", "CUCATPH47E21O6354FD3AOJXM2GS1IXX", "952B2NN9H8H5D8RR4EE632LXKPX0JZCY", "QF1TE2CQ1DWBHOTOLYXXE03HTE0NZW0R" ] - }, - { - "Id": "213", - "RandomData": [ "6SO8G7MBBXF0FKQ65JPUBPT0LUA9CZ1F", "MEFY9VINLVVRVDBIY3SQGGQR8YWV6N9M", "69OBE16JBCIP3CEIT1KJHL8GYYZL9WQ8", "WJVVZAD76IOE7BX6TOCEC0FVBHMQCVKO", "VK2TRSTTYNM864JWA31VUL66EAURXX4L" ] - }, - { - "Id": "214", - "RandomData": [ "7ASXIEOA4TQYNGYG80QI3Z3JN6PR8B5B", "SBA5MVO5O00B5HS7LOS7GWRIGIJLZ6C2", "XPFMF24MLU3C92OGORGUT846U2ZDMCGS", "Y7OPBF1STGVW2OIO4C6H0SJZVI2ND1AI", "NLOBN8EJZXAMMIEFTKIJG81FYZ43NOO2" ] - }, - { - "Id": "215", - "RandomData": [ "GNIQ9HB68XSCR6MMEW33S0COUINYDL5K", "JIG99YFMJMLSQZX1MSY0VUJPK3604M2W", "2H2J0NNQQRUGPU74UWLVWEZY81YF1PS6", "TYZJ6OB9FIJEADA05BFHAHAXREL8ZHYB", "8XX14Y8GUMQO5VY418J0JK6LXC12CCJ7" ] - }, - { - "Id": "216", - "RandomData": [ "UIFMQI5HD9WX1V26QQH0772Y1LD16GDS", "CS3XQLOSCCWKXIUBK5LW4TAWPRVEFEK7", "5EUJ2FQEBZY5KSAS1BRA4RYTRHH80JM8", "1ZOTYLJFPGUE4FL6QCNEWJCOPA1U7RO1", "M0DVDR4P1MVX6TZM6KSY6ILRXADXUZH8" ] - }, - { - "Id": "217", - "RandomData": [ "232EB028H7NKYPS6LOYW805EOW7DNH5B", "EW4D1UKGSTR85A2ISHLFBV9C7XZP2ZU9", "CLFCUOE0DSEPJ7JO3ZVG60ATW2GE55N2", "8R5T40YDCUBTQU39OLWCEODMKWP1IA5I", "ELQ1BZTCBRELYRCC9GZUIKYUOTJIL64B" ] - }, - { - "Id": "218", - "RandomData": [ "Z3OFDB7Y2UBWK1X3TN2CKLA3W6NRQK1F", "WCW4C787IA2YJCKW5PY8E20N3VSHYPIR", "359HF31VO43JTLTUW1WAV2A4LIBRP1J3", "2K5NCCQCYDTJ9R4RB7U63H5A4F671JFX", "UARIQFRULTMSI144NUPRGN9UP5T6FTLO" ] - }, - { - "Id": "219", - "RandomData": [ "76Z99WB5QAVK5M1DKCTH3YQHA72VWUO1", "I8VLB541SUBG1ZZDDPWD9DUJQS8C3QI5", "V3B61PCPH2YJWJPKIZRH8K2ENM5T627C", "LGU7X2LXNG6HPKXGCX4E8B6KB7TPUSSO", "4W8PYRXQN442OUYDYYRJ83EJKK60J6D4" ] - }, - { - "Id": "220", - "RandomData": [ "YRN3MHRUAN0EHE6QIP05BJQBSYFOV7HR", "19D7H50RH6IUD9CFOPR3FH3OBMLYBC8D", "GIMHA8JNZIYEA58SVAAFPNLTGY55UCPE", "8FN4W5EPGDD7TZOFO3CBC3X373ALCO3X", "3TG4SD505V9LKOARK0Q09NBESU7343M2" ] - }, - { - "Id": "221", - "RandomData": [ "KQD9STXK8LGR3LTS2TBM7CXPRBM7GB6B", "IHB3KA80DG2YHULGBOAL1A4I3YRRHZD6", "PEIWJZH2ULI0J9I70F61AVKIM3AWTRSN", "C6ICMZ6LHI0Q1E84QU1C3M6449JQZUJD", "25XN0FVBIUU243RI4GG8ZQU0AOIMPQWW" ] - }, - { - "Id": "222", - "RandomData": [ "9XX6QVDK904I1E9ASBWSOKNMK7NL7IV2", "772GFV1JC599WL85OH4N4EHYKLVTH1N0", "ECL4L356JMPTLN088R70OI830D649IBL", "SI5UAEUVM7ERYYN6VXU04WM6DRDH6B6A", "KEACSG746MOQDQFB0AJMYLQ558QSANZL" ] - }, - { - "Id": "223", - "RandomData": [ "ADGTXKOOZ03SI52XMCQ51UM9YFHT0P3T", "WDQAKVOQW4X8S8X9G2F863TQ0H5SD4YJ", "6J5FP2M0XAJ76OQZRHN7J4X3U9JC05M1", "GNBIDSUOPOK5TVTM0FA6R0ABWBUQSKA1", "XS1SMIV9X8R4U1K8P7MU4QJPN9WC7D5F" ] - }, - { - "Id": "224", - "RandomData": [ "OSHA3B9SUBITJGR40VAV7P6HJMFNVTBT", "CLPBTJEO74A3H0FHR1LLDKI8VA1R5W6A", "9ZQ70QLRQVXDPD9SG854I0P2DRPSSXSL", "7A3SKIRBQ34RWETSBIL70C2JKY4JB293", "DMFPJRI8Q4OO58F876RJLVU5HUHVNI9X" ] - }, - { - "Id": "225", - "RandomData": [ "4AOK8EIUANQ6XNOMS6LEL0RS2KHZJWUI", "40T4T593Y6J8EYH4G5DQ65MET6RY6TLN", "2HB63T2X7SQOQTNECNTNTDM9OPLXNL6F", "V5G6WKAWDQTOO7X9SNVT983Y5CSOHEJV", "VL3VMRR2M6JDU7UQ1LF9ZMFXCSBT2VO9" ] - }, - { - "Id": "226", - "RandomData": [ "G72DECXB63GDY0E8SBW69J6JFFS4Q7A1", "RK6WEQMZYDD6FC8LOCB09S96BT88T2V8", "3PVN4S3BZ7H5G9DCGHQN6J28K9UUSNF5", "SFD0RVQ5JABBLE0CQ51MMICTXWD57JTL", "1LMA6NVV0UE5I0XGISEWV3TKDTD4RV8A" ] - }, - { - "Id": "227", - "RandomData": [ "QZK910GDJFV2EGL697WPE7Z72C7MJ1EE", "WDPSPXOSMAMPI0G7IG5U9S5T9MHY233S", "BQGA03QLSDDDUJZB6ADD5TFDI6SDPZZS", "H4O1UFGOZTC5O18ZXG220ZXSKC14KN62", "NV6057Q04YOMQKYR72PJ772RH5RSOLEL" ] - }, - { - "Id": "228", - "RandomData": [ "XJR35I30ZB8BLKBAOK6R8X5Q3OTAQ8MS", "UCYH24WY8ZT591G63QDEOWNANBAQZ3J1", "ZQQIV4ITYITIDAQCHWGA4HD8ZY314F9F", "P1FTK8K9HUPGDE6NU8ICWJ6RMSS6ARYS", "IN3M471JMH2J164U2PG666SF4XG2QN80" ] - }, - { - "Id": "229", - "RandomData": [ "578ZLTSWG90PRXZQX7EUK2VM4XRH0938", "IBN48EJI7UZ7GDYH7ZESJNQDLV5XCL5H", "G1GPJ5STY5XZDYF09KJB5KZ5UKSMJWGW", "YS0P7I8CHV4N00AXQEX2B4L5BL48MGJB", "YBBU7031LH3KQLE4K56F8OU3G4NWNAZB" ] - }, - { - "Id": "230", - "RandomData": [ "L2ZZZP0ZL6Q3BBPZGAYRJEDJQIOCNGNL", "S28XWPE4EH4B811EPYPMLH1HZQIQBXME", "SFLJD1D153MCKBLZQKXZ0B9KA18GGY3R", "5ZT2PSBXUYQR4Y7XETA0AWNRFAIL26UH", "A5HUSSJ7I9ECUSPL4LBXXCRIMBXOJZ4X" ] - }, - { - "Id": "231", - "RandomData": [ "EJR9RNFWJCRASL7WV7RR56T7O9HQ44YT", "FQ7LBQ4RFPOVURZBEA3MHN2HZTVRFZ1O", "N85BNWVEDAMPR7N6JGL4BMM2Y0VR4MLQ", "XAHWWYXSOYIGBMZ1FYI8N7NBVDNXADJ0", "Y52RZ0KVT3PMDF0LA3MGEND0XGATKARL" ] - }, - { - "Id": "232", - "RandomData": [ "ORRFUIBONWPUSA7QMBXG1DWL2B4T01KS", "LE7VYV12272R8SIWIUGJNLTL5GNSNSYW", "M6IODL20J4O4KENJ3IKGUAFAUV0RIIOJ", "IGEBJ3S71Q9S6YA03DZFIRBL1I3RVKSB", "QEVE9L99ZNOEAWD5U9YETJB1E3KAAALR" ] - }, - { - "Id": "233", - "RandomData": [ "78B1D60RDZP4D7KEF76WWNRHD49GA89Y", "C7GCVM2YIGB34HXHSG5CEZ5UR4YI7TRE", "002F0IT2EINPMXM6G1Y4D6UMCWV0XU0Z", "Z7DDORQJXC85LPI3R2BF5WB4FPDEX2FT", "RY0PUJRYKPHA7YBWO1I5TU3C5J78OMV4" ] - }, - { - "Id": "234", - "RandomData": [ "7ONXZ3JIKM4QPA6ROR05UJA74YTKLTK8", "3MCTLN7VS9VGZNW4NQT6W0JYNQ3AJ860", "B6WD8MFBTENUX4HQBY749NMDCOG4T6LU", "C4E30T6AKSNRMYATJN9VAB1XUTAUGLRX", "33S2ZNZS26UQA40ONWVG70TADRJHSM49" ] - }, - { - "Id": "235", - "RandomData": [ "B0YTGI35XQ3DRKWZ3WHTZKZDJRZIES9P", "CUPKGGHE3ZSQ6QT24TN6EKK1AUKZSV1F", "QNA75MTWOC0A1IG386OUECL2KXKV6RWH", "8N9TPV6R91SCUK91NR1VGGBOCIXHB706", "QSCOIXNMA6VNUIIAYSHP0AB1LVRG8YPB" ] - }, - { - "Id": "236", - "RandomData": [ "AVWBHVT0DPVKVY33AWTT0LGQRKCWGGNL", "QTM9WG2C9RLKO0FX2XGLF6LZOGU7T6U6", "BK4CL4H34QUJ95B0EO4TABFUHWUQW5TD", "6PJD6DM7PMRYMC0TE32EBB6AFK4ZK1H9", "6RMUW84BC6DXUQHF6BL3CPB5TJ8WIWXY" ] - }, - { - "Id": "237", - "RandomData": [ "FS24ZF6G80CE8IPYCZ2IQN6RPRAN9I2P", "JPRCYNP0EF4LN77K3KTT4OI2VKPIFTGZ", "8W5S1N9ZJBEKSUERT0TZYIU4GZQN7GVU", "8FN0COTPK4K2K7JAG7YO9QAZBBLB6W1C", "QTMNHNPFGEP482TJPPH9RGVREXYBCRTX" ] - }, - { - "Id": "238", - "RandomData": [ "DHM0V533STI5BG1JRCWQP1VJ84JTYODZ", "U101Q3YUWNR880Q76PTA5CILWC20WKED", "QTKJPA2XNB4BKXLIOMWI4C3SSPFOB88L", "JNRPPGR6W6W3IHA90UMJY5INZ20A4OWP", "DS16F62H5ZW8QAJLOGXRVYXNFDZWPQBI" ] - }, - { - "Id": "239", - "RandomData": [ "JGZZPE331EO8JK6ZSPVY0F3P5N1BGG1O", "YNYKKU5KM3ZRJZE4HADA5MREMK4CN2XV", "NAJ5VWO8ULM6PMFFJ64FC1SL6U7A036U", "GEDJPIJUVFPTAVYAEY2Q7RSVR89AZOI1", "O20KI60AXJU6M8KL575CAQWYVS1RJI5H" ] - }, - { - "Id": "240", - "RandomData": [ "7XFI4N1H713Y7VJSXYE1SG17GBZ0EJ1P", "ON9Y3CQSGYEIX719IJ3VDDY06HB3YADY", "ANKUWVZUHWV4CSKIJZS5PFLKYJ1VAW3F", "UPIJXGNXTINQS3YO63T9SHI4C95M3DUU", "3PJWKBUCL5LH2514UNYHD4XNGNHYKA3P" ] - }, - { - "Id": "241", - "RandomData": [ "Y2XDUCD5JQXX5BCGHB2PPMR816P7462K", "B6T9HYKSJ37WGARFKAQJIOALKYLXWGAN", "YNV9RD8T1KFVP521PKW3PSCX5IYTNW5D", "2U73ORXHB7S7IO6P5THMUH7GK8EJOPFE", "OC3479M8WO2SAEPQLJX3OTTVW1SPNO3V" ] - }, - { - "Id": "242", - "RandomData": [ "1NSFVBR6HJZFOPFGTX7E2MZ5TIIFR7UH", "VG1WVJ5K10WF3NGHWM60QY3OYXWN3LPJ", "ZSTIXSUK1XMB0UBFBATFA416MM88WSRQ", "LMQL38TD1V83L2YEWRM21KJ40X5KUVXJ", "G60NEZLCRQNP58UUY4MFFYYBDVVGDISG" ] - }, - { - "Id": "243", - "RandomData": [ "7ZXPCKA6FJLL7492CLW0JSDRIYKTEE9I", "7GRGKFSN4P96NMDJV2E2W16PVFGNAQ1B", "JDN0M2R62I64THE5VB7M9HVFKBVF9ENN", "X8WJ9N62KI9N5C6OBK29TPBCRHPKHM6X", "5TGVU46HEEB1IHKIFGEYMO3I6U117VU8" ] - }, - { - "Id": "244", - "RandomData": [ "LLSM6L3GOU4PNK4K7HFBIILRZ7YACFKT", "TDP6Y8L4M7K2TO4W0R4ZQTZDABW8W3DJ", "JL5K47V86KYK7S7LCCJVKUC9NM6XMNHT", "3BSISU23553F5OFREK5UTS8ZI56RA7WT", "DER69Z2SKQZP17D8GOTBRX9LD39XYK28" ] - }, - { - "Id": "245", - "RandomData": [ "IKB17JSPSNKD2T8K27LVOVBQFG2GZF39", "Y1GQ5MB66ESDM6ST5Z418GTXIVV1QM0M", "TKPBMRPP5OZKC7DJXIK9KCBRISHK0KPU", "OFUBQQHNJP5URJVLRMDHB0CQJ734JFYV", "8F66NB2GB605HR98762OGHSYDD2SXMDE" ] - }, - { - "Id": "246", - "RandomData": [ "0JVMNY7QT6GEAHI2846NMKO0WH2JJJTZ", "2VE75XVI8M4KBOY64AU3Q02Q540F5XGK", "NQLODL6KIXOAPEZHT6OJY0JC3XCB7QNL", "FU7UCJ3TDKU2M1B1FSV9J7VWHJVPI5M2", "KD55GEFKD5FOGQZBWL5P4OCH9KN2XNLH" ] - }, - { - "Id": "247", - "RandomData": [ "71RJ5GUBML5N1GQ1UT37A786BY561MW0", "U8RO9QGQ04CSSYP23WIDUOHA3VIHKYKA", "YF33ZC1DNMGG4PNMIDCFDSFG1QUNI9GC", "TB3N4WD14F0HHAFOH58HVF7F9XBIRN5O", "GDW3VARV9LK82880LGGMA8ROEXOHV4JQ" ] - }, - { - "Id": "248", - "RandomData": [ "JLAEOM3HNNHK49NAYK7LHSOHWIY7VKAF", "C4YR73M8N89W1HUFKNSK67I073SFX5VC", "MBH9K6D5888IT1QPXTWH10IEW7TELGLR", "M6KZ9U4OKXM89AHFMCREJOLW3DNNM8T1", "XQ5WR0QDZH7EOJEVZO1IYGI8VX65HQCL" ] - }, - { - "Id": "249", - "RandomData": [ "EULSEUYWWOPBQHIT91X7HKCQI6B34U6I", "FWA38VRE0EWK1GSOPN6P2ED3S4KHT42B", "SH64HPUNKSHCY2ZCOXORYQPASGKELJV5", "MU1UKXHA2SFJ7BFZEI25QLMC16MAEQBA", "7L0DAF11QNYFKFCQBV9DQZPBHZ2NKG6M" ] - }, - { - "Id": "250", - "RandomData": [ "QFMVLBZ9QBPCWG1V359TQ8TH5Z6LMOQK", "RMZF2RF96AXPKNOA8GUOGN5SVFZWENWB", "UFUKRV2M09XQLE6RK5MG4CDERGUX1T5S", "NV4F3DSNNIYH0OGQIHLJAQHSCQ3LAFUH", "EED0J1YGM92VN5OC9EPTHVR7NMDMKHMI" ] - }, - { - "Id": "251", - "RandomData": [ "XQDVLQGQTE6BXWEGC0L6ZB9SXFN7YM6F", "XU86221T78ADZQK1H7KU6QSWRU8FDJ2G", "I1NDXHNJ8290A62G5VZ0CLIGBLPH4VPY", "F348CHDATAVEQ1VV11KRTBE7SGBM2FPM", "MLVHB4EYSZHBZE0JZ4QCL7EDY7P5F0IN" ] - }, - { - "Id": "252", - "RandomData": [ "VJ1FGOU7XV944CHNQ1W7ZMBOGRSDOIS1", "Q3QQMUCLKTPZ8JJV0CONEKYIHN9Z6QSO", "DHNAW1A6YLXG6LP6H6NM4EXGFHI9UNO3", "ABW06I99BRY2WSM67CRADFU8UH5OSBML", "74F5ZZA86OLMQ4TW5MCS5O05QXGYNUQA" ] - }, - { - "Id": "253", - "RandomData": [ "FN52MQHHBSDZ4ISZYITG83QSEKOBTMVL", "7LGC91KOF4QMLABIFQAEBKBM7NYCCFYZ", "711SBP078EAENDHDIF6CLRKXJ4FWCHM9", "F0PTJSHZ0DG7J683FV36JVOQREIHKD40", "2A8WYX308GMILMNN5LQRNP0TM9CEJAPW" ] - }, - { - "Id": "254", - "RandomData": [ "IPFI8MFS1D8CJGEE05L8XNNMKPJYVYR8", "1095GFOSG8ZKQXKG47ONYR85B28SDQ7C", "VALSGI7VQ22YXC6WEC4XKDJK1D4OH6PZ", "BWYPM19V9265ZJH96LOAWJ1S1B1DOTOU", "NCXBNQJNDJYSHNVR54S5RPD14GYL96GP" ] - }, - { - "Id": "255", - "RandomData": [ "OLSWWGVPBA6NVJLNPJHUBSD796GH18NH", "CID5485ZJC3QSZFU5L50YWO5IVWZ9NYD", "XZKNGQSRORK8ZWOJ0VLQCXSQ3IWJMGZ5", "O033O2OP2OLHLPGWHM8OBHAAH4T73JEI", "2PU82V58G6XYLLENC9C9HL3G03WUIRVT" ] - }, - { - "Id": "256", - "RandomData": [ "JDO65H4VR9HFTMY6ZF44GFAQVNH98K0Z", "KEOI6IS4FQRIDYWNFZ4CW1MEC8KRA5XG", "IR4P8P9RXAZ0X2M7043IQYDT1JG77A4K", "3K9W3HPZ0NPWBWQJVN1FBO0UOKYYJBTW", "FP6M30DTOESCJRRE36MUJYIPUOHSS1QY" ] - }, - { - "Id": "257", - "RandomData": [ "32QWZDP4JH175XL73T5MZ9MRGR2PTVAX", "X4JQA5PZQRKB7LU6CJZ95E94P8QILALY", "HDJAO568EG5HYLU476MJ5B1T5PACOGNQ", "FW33CTSHN14ZI1FEOVLPXC2GM0F944T7", "2PCBR02NNF6EGCLEJ6X3582D4XRLNTNS" ] - }, - { - "Id": "258", - "RandomData": [ "I762YDWX27BSFXAJPBZ7GZC4X8H4JQA4", "1O6JFSPFJ9A87J8GXH6L3PLS4CE052OL", "6G1111E6WTXGYE6OABHCUYBMCNOCOYJR", "VZB0RGP5CAZJ1E40FZ04VM1HEOZNMCR8", "JGV9CG63WL9T91U7TX6Y8P6J73VDRBTA" ] - }, - { - "Id": "259", - "RandomData": [ "T09VT4X926HKMIIN313YF294KMCIU3LU", "28AI19OZA65BHW6ZVIJ0H4501FKH2PP9", "VXROI9V4NEYI68WYPMXLUVM7DJRWYG6U", "R6QUERRWXOMDFW32SW1P1DP9KUL8R8FG", "HD1ASCU75BYFIJ1QPZECPR3NRQJTGSEY" ] - }, - { - "Id": "260", - "RandomData": [ "JG5C43KPC3T0PJ1B24S24C00KOSB2A1M", "6A5BNZWWOYAV7C7HYI0MAM3GPF2QKIXB", "CH4POZXDI6NGCF3HQLNTJPMTGZWH7FLF", "A8T0IS39VXDD8XDKMU995D2X4KIYDPGC", "VIFEWC98RN8WLIVTVL5MGLK6F557JE6F" ] - }, - { - "Id": "261", - "RandomData": [ "RBS0R9YJUBSRFGLVZZD1U36J7J80HCYM", "R2EK04CWXV1E3219UKHUBEUXEI2HA8CS", "NF9NBB44WQD9B2QES9F64ELMHQGRB4WZ", "TJ1Y3O7TPN7UBVWM2YZA2FYJ3XFU5N22", "4OQ2A1LECWRRG1LW43ZNEV6NUS4GIMXB" ] - }, - { - "Id": "262", - "RandomData": [ "UFZWF4LAMV8FXHCCLT0BYPXIRCHS7F5Z", "8P7BBZQASYATX1ZMP24ZWWNERQECW2DH", "0JGIKAAVC0S9OEV0N4DEKFCMB2TUUNNZ", "V32OURCO1JX6EO0N5OZ1Z87UG4GSRPBZ", "M2OULGF52YMBSGHXBGZGXWAW6II0LU7M" ] - }, - { - "Id": "263", - "RandomData": [ "H8ULAFCYI49BV5CAWSQK04B021YD8PUH", "0A3TV6X5DA83W9BAFID2DWVN64TIQ902", "J1KUCSO05VG05HD3ZY70L2EDPPX1MOOE", "JFU5YQ7W3N7SP5RZ10S2BAQRXHFX5WNQ", "GCQ0XHEJ1L685WXT88AW5WCJYCIQKK1G" ] - }, - { - "Id": "264", - "RandomData": [ "AQLNO1BTVJA0DSWATVZ7W0VT9HBU9Y8R", "UZ7OKKFG6RBWWMGGQH7ZV3UJ51NHZQT7", "KTGNUH0JQSAEZ87XA5E20J50FYTS67QQ", "7ELCG2VIQYIC2PU640G4L1GBXPI6YHMT", "BUGVX5RIK5LCA37ZDXYG0WEG7JO0TYUI" ] - }, - { - "Id": "265", - "RandomData": [ "LZBII9I9J8UQPEB4RT3ATG2PQAXNQ0YV", "KC0L2ZQEOZ62BY13IUIA5UZF6V2IL4SS", "J8FMNZC2DYW4JAO1I4F5SX00NVOG6H2T", "GNSCSOQSSP7G7556HA9RZXAWIP92L555", "6DX6SLJ4NWNC0U2SZR96HK4TN64DPYHW" ] - }, - { - "Id": "266", - "RandomData": [ "UBK4H9O50FDCJ85YWRC359YVIESVQGPZ", "P0SZK8K0DEFCH1JOAGR7VN1VNYVDQ2OU", "0NWSQGOXGLZ13WOR4DVKYRDC96MVMGKL", "ZUM3E084231KX911KEJMHD6IJUTT42L9", "AOBIJVMDF1S503O9EULI78DVYDTUHP99" ] - }, - { - "Id": "267", - "RandomData": [ "S1JI8SRY1FHQVASQGTOJRCCCLPUGB25Z", "1SM8TFBWDWQ10XAXUCNXB0SPZG7S8KX8", "KRYCYT6AS2F4VKLXP6V8OIYAA6JMITX2", "9SRJ889BGNFIUY4O4JDCZYUB3YB1KU18", "EM4D2CYR6U2ACPPMC4R8QVDL7PQK6I0V" ] - }, - { - "Id": "268", - "RandomData": [ "VGDH30V2VWFF5T9NIZZPC3STJTFNWOUY", "3GP6MISLJZN4Q7POQDCGTLT2XU7JUIFG", "BQLYECB9GNGNQYDME16TMOFSXXI1KJ0A", "TG29W0KOCC9FEGL8QVF3MW4WK3BR4JZ7", "WF3J6D0NRSRJO9NRLJLYD7Y6MFZ2Z3T3" ] - }, - { - "Id": "269", - "RandomData": [ "MCT9MCCM51M4FUIKPUFU7B3YR670O7YY", "8Y6MQOEIH83LV4117ONEX95LI4RQEM88", "DX5RX54BQ7M9ISCXFG29UTA82VEV6XD4", "94I78KDBULY0W6DZ24K8T8NTX7YC1JE2", "3S9NKFZ5D0PI5KL6RO3CMFKAQYKAVAKK" ] - }, - { - "Id": "270", - "RandomData": [ "H66E60PWEP53TFYMV1UNPCPYH86V4YJC", "QEB9NHA18G77JRRLA7O3P65EQI77442Q", "F3MODZ9O13OJESOZQUV7JQWTJ6SEJC7E", "OR1QFDIL8ACWSVA84IQJI4GZG2EHG4FY", "5K4X08TNMK9JN9BX6TKAVX5TLBKM8BED" ] - }, - { - "Id": "271", - "RandomData": [ "5N0I0NH6YD7856MG1RKWUEDIOLLZXGOL", "F5OAJ36TLOMS07XOZDVR0RT0KS3PBSIS", "ZW29SM77U1LF2VSQX7AUU6UYMXZ09RR3", "G32DFX6MFX78GN8ZAN1ESX72BDX4WG8C", "KR982OL9AXO69WS9ZA0WZNLS6ACBAC09" ] - }, - { - "Id": "272", - "RandomData": [ "Z4YYN96VB1D4JA3PVYEVQLN6GRC1MJ98", "6PHE73VZDFU7JQI5HXPM7ESOR1R57FJ1", "2F743YR2CPSK0PX0IGUY4XA262XGLZ18", "53EESOCTFXJSWHXBE1X1UU7FEF7AALQN", "XTP7KTH4EBTGNSFYFVBUCANL599MQBS4" ] - }, - { - "Id": "273", - "RandomData": [ "H64C201UT2XTB11WAJ5PJ6KWFEBLU4NC", "TY8RXC5P4RAJN4JEHNMHGCULVH6YYQAY", "PU9M2K87NQV25AJL47DGSF5QEX5PGH0N", "QL4256L6OP40R1PU8V30M3GJZSIEOS0G", "ZHMUGRQ8VG2DLF9MIKRUN9BWEUDMYHS5" ] - }, - { - "Id": "274", - "RandomData": [ "YXAJP5ORF5EGBD7TT56EBG2ZGZPVNEJO", "Y6PXEZ7M69PS55VBXU23KO4S5LD0P3DB", "V0REXJO37TIB0J4LEN83LQDKC723WH7C", "6O7ENQNNF951F21WQ1VC5KZFWHC0RUG0", "WFFMMZ7X9UXMUMEJFGN4V4HVY1SGOX5V" ] - }, - { - "Id": "275", - "RandomData": [ "2EEAXPJ047CKWNUJC2VLGMF17TXUH1JM", "YCTPHDW06XAX279LGJDVBUOQ9NCD2YTC", "Y0VU3EB9G4PTLR9AULO8YXKEXDQ4AS8H", "D79CLORBHEPGF4ESNCTQKUOAPR6ZYG8Y", "6HQOS7YF3M0TID8398Q88R7ST8W4S2NA" ] - }, - { - "Id": "276", - "RandomData": [ "G1K8O09QONW7342LSD000AZOK74UK3XB", "90NQ3AOJ8ATU59YYFKMOCWKFC5XR5PFU", "0U8DRMSRYQ10QETLIGOAQI9MPHO8M6OT", "484LAVH225ZV5UZ7MMJYAFERVVYJ7UE1", "CI5RKHKW9WIVSNR5SRVAXZSY4MZO675H" ] - }, - { - "Id": "277", - "RandomData": [ "07TXYHXECWZO7S8HE20Q8EEMZHW7S5ZB", "1A5U44GK3R7AAE1MOSKEGOIV3G7RU0WH", "6XX6WNMKWQWRHEMUPKS9UV4M1J1Y6ZZD", "40DNR40AF9R011OZ3MBKHWWL2KFMWYO6", "0SWRA9DVUS3VDDUA5C4TXP6HD2UGZNOR" ] - }, - { - "Id": "278", - "RandomData": [ "VVAIE7Y4JQ0Y3BHYZERT35JLWPNHP75G", "EMASDL68NAJGYIOCV5QU54Y0LZWZTRPM", "UTURBYVNITG3VCWOAKWTQKLJYJHOZHO6", "U7WFX7B7KCMMY4EJCIYJ555KIK31RHYB", "EJIXQR0CJYJN88V3F7LQSFBYCL6NEKQC" ] - }, - { - "Id": "279", - "RandomData": [ "OLHOWR3VSWAGWRLKY9VT6IS9ITVEUM88", "IG9X0GHXEZ76F4CUAWYEY6GF2IGC6ZAF", "XB7PRYTR27PGKW4NRAD8X3JM945SAE1O", "Y2ID6WCMCGM0QA5FN2V5VCR41VPX2BRY", "FARSO1Q4715RRT698ZEIS63WKNLLGPTA" ] - }, - { - "Id": "280", - "RandomData": [ "ZXUPSN1WL173GANIZQZD7IFJH5IAPFXS", "H5138QRV7R6189PJ9DW00QDQSLIWF1HG", "DPWLJUKI8DFPMNKHQ8ALS6211KLXH5QG", "KZXTNEAP3N2WLXEEABGG06YHW4T8JWAC", "X8FWZ13L8USEEGQDGGWGZJPOBQ6TUCGG" ] - }, - { - "Id": "281", - "RandomData": [ "NZ8MSROII4IFNTCQOP1CA4NNT1UJ5K16", "OL1OHEVY2O85BJASNPEEKDGSMU317FN7", "CL1C2YIJ4CKW6RMJ1C5PFWVLFJBXL31X", "AA2ZS7ZZH5KI3UW4ITA4J82P0P6TXV8A", "KXV5ZW03MGHKMMRVWGO137NBHM8CBGBV" ] - }, - { - "Id": "282", - "RandomData": [ "6J8G80FW3HRD0SDO8L6QGHHMKTXMXY2G", "EWNDOLW6B28WQJLZJUEZKVPYBV5OC28F", "PL9EE9AWYAONJV6AI8DCTC5SGYB3PH3I", "43GEJHVJURAKHBPQY5GEZ5VMPR7P7GGQ", "GFTPO10BN3SBCVLFIVEUBYT8H4Z2JFLN" ] - }, - { - "Id": "283", - "RandomData": [ "LTDBSAB7EE15NUJ4F2GMCWPRWUIUC81H", "RE0TRJWIUHQ67XVXU5WR89KZEVP71Q4G", "NTNI30M6F715FSU89U9GLKIS4BO63ZQD", "MKTNJM33T0MBHPTVAR7HRY5CK5O2MPCP", "QYT58HYW0GXU7HKOR35M1JWYOQCO8BRD" ] - }, - { - "Id": "284", - "RandomData": [ "Y6UT6XX32KQKAKEDU9KSUZXHB5QREKYZ", "ZU6BX0S4GCUR2LXEM93908S8JMRAGFYS", "W1VQODP3QQMSEGOZHMFFQZ80B71KIRXA", "NC4B0HZIUASKVA3C82239SB625OQMEU8", "2MECLN9AX7VQHYEAEYMQZ4A4A7I52J6P" ] - }, - { - "Id": "285", - "RandomData": [ "PTSJ511U21GC7VZE0OMX1EJ7LKCNEDIN", "BGBXG5FM71X7X87OIEFN6IYLJU8VYNQY", "T2A1UC85I9Z9QMKNMXF984R2R0NV7TYT", "L9N47G3FGJF7SY47KUIAIQZYLIJ4YM8Y", "LGYR8PPG393ZZUK35QLMLXK4JZTZ79Q4" ] - }, - { - "Id": "286", - "RandomData": [ "LQVM9N84FCHIXA817P9IAWNY54HI60I4", "T8NJ873RRRGIQCGI111R9H3ZC7QFF08P", "4MZZXZ3AVR1TPFH3Y9RF804LFXGARYL1", "T1ODMRUC816SQKK7ZWRGI2QDRNT9S2S7", "GAAX1EQGOPHH4M55NJK5HFS0KKV97UTF" ] - }, - { - "Id": "287", - "RandomData": [ "J8LPJWFVGK13VJIFSYWJSX0ASKMQSRJ3", "5B76APV0DYY6OYEBCQQI8JXVIL79KZDY", "A77ULMEDD6G383W3GLNCBB5WOMXYRWQN", "VA6Q1TZ0LMEBD4XPZE28LAW9BLG9YPVR", "Q2H77FBWVX1Y63STYI9M3RBUN6PPN0B5" ] - }, - { - "Id": "288", - "RandomData": [ "0XVKWZSTCGNYJ8CH2WKQQJY91WUA0VJ5", "V57JII79ZPJWENKP3HW1PVOR8WT9FR3Q", "7RCOA39UYL0A9B5NMEGT9RQAQQKVY73I", "V3ZWK6OAHBCD4OS61FXALKRPBC7USN61", "RSOGMIDP0GL7PMFC7N4SK37LLJVH94R3" ] - }, - { - "Id": "289", - "RandomData": [ "FLVM9MUSCHKF8UAY64WESNRYVD4CX5Q5", "YR1D13CV3LQCT2N0J7LEINK13706RS5G", "1PQQ367C1BLH7PF20E3ZULWKH9J4CGDK", "QJKEL67M9INHBD3O18GNZFWQ2GJ3WD9V", "7B1YFBR3HQZL8PJDF5CE90VKW3LFWDZ6" ] - }, - { - "Id": "290", - "RandomData": [ "I1KAMFJ0QMGIPKSM6GX1A5VHPQCLZMGD", "13DGFJ0AVLYWUM4LL8IQQ86NFCU5C8AD", "GCRWHLHXPWFYG8XCW090EZX36ZACY57X", "KUQR5HEA1UB32HGHPRJM8K9QPXZRKF8U", "YSOVSFHOW99TY3AZT3WHVVYAVABHSXZV" ] - }, - { - "Id": "291", - "RandomData": [ "VREK3VYKK409KP2VW98QS18D3NASD968", "JN7GZ068EM605ZZFHQUSZID4SBRPUGGL", "81Z7SV66D9LF5HHDX4KXOOJAKDXYJQN8", "GV2E92XVTYOZ779L3N106S7TRZWO8IXW", "WN9JPDE5HYEZ9UDMEM45YXBYXIWKFIXL" ] - }, - { - "Id": "292", - "RandomData": [ "B2CT7Z5ZJ6THOHU7VJKVN179LLWGQ3Z8", "A2YHRTPPQEW2E3KPYZY58B7K4DHWCZIP", "GUHVTMPC45FJEF4SBGR1E4985OMNL2M0", "5GVTWY6MKWAD6YFZJZV6IRKMVIZFAB0C", "SON7TL5MJFRS35CHIXEWHPSO6I8O91LI" ] - }, - { - "Id": "293", - "RandomData": [ "68USKHF74JWDA2TZGS6N6D5C59BLMRMS", "3IV4KT6ARH273PODZJIQ48M2DSWLG4VM", "6DJ1HYOWW55ZL7JQV8VDJ6Y462126U4X", "VPBZFW5B4V38DWRGIG0HIRD9PP4O6VZB", "AID56UL8CTIXCZ1JLVU04WOELBKZ1RFJ" ] - }, - { - "Id": "294", - "RandomData": [ "5275TVJY41FYIQ7ZYVDLB9GO38U4KVGV", "O91K150ZL55DR065EUBGN3I6VTBUBPOJ", "VUJIYW825O9FDD6DCY0ZTAIU15ZH3FX6", "RWR7QXHRWIL84C3RX8RNYYZULYR3608Z", "0CXQV9XPRIDKZJ0YCIU5YKI277V1FOU6" ] - }, - { - "Id": "295", - "RandomData": [ "KVI1PM5XLC5PVO5C831YFDBQ44TYO5JD", "XGADA8JZM7TWO2HSBS3MX61GU27U3GJP", "221ON2C9UBLHUPBCXAX5C7P1P4TIBY5G", "XD3VA2EJQ32VUTWF0462TNN4MA9TI375", "FFUQVQB56NPJE4H6HNSG1DWJ08IA3UAX" ] - }, - { - "Id": "296", - "RandomData": [ "56PO9FUK3B6G8E0S3CM4L0DCSK0WHBCL", "M1NHP27B3HN0HQKVI0H0IGME3M5YP7D2", "9U3H1SDAEKADNN5C9ENQ4LCGPIOC6IW6", "EV1WXD40XGW8FI1PR3ZKUW8YRX1SDAD6", "XE82WIP5KX3XZEBGR9UDTLLSWDEAMMWW" ] - }, - { - "Id": "297", - "RandomData": [ "C0KAK83IO4A72K9NVUBEQAMM2QFTDPS8", "AHV83A6SFLZZLOZME1O2LSGBN8H33KE8", "LC6VZATUXS9ELXAN02PMA0XSATV52DY4", "H0NISEXDI3F2TC0Z74DA527VPOUFOX1U", "3E6VJ15WFLEHV4983678AY9O223ETRZU" ] - }, - { - "Id": "298", - "RandomData": [ "BU8OFEPF8Q4UY0AUOWMSZ3UFES3R80DY", "VTGA5U3ZQ2AT3O0B2IZ6FH4IA3KXL8HH", "NG8EU9Y42XB72ALZ11YZBGTOY79CKGNS", "V2GWPVR2U5ERF7P9RU5TJRGGXUPWAWUW", "JTMA4YJFK6FFCBI1S9U0K4IDVA95G427" ] - }, - { - "Id": "299", - "RandomData": [ "LRIVVOF2KZJNMBDWMYEAB3LPLIP4ZO9P", "DH4V2WGD42PVV41U6MSS026RF3KM9LC5", "03KEGS3ZRAGIO04QR47M6RZKKMP9L4DS", "ZU51UWNNT2AZWXDP944FN09IE933D4OX", "7XT34C54QU3DR9YXJ99R98E9VWXU3TJZ" ] - }, - { - "Id": "300", - "RandomData": [ "ON29EJU789Y3651ELGUD46X8SUIHOLB6", "KEYDHZS9OCTAJLCZ5TJW9F4S03QUBMSX", "71S2HX6WYUZ1NXZHRSM5CP7EJFNOI88C", "U6CR3JRHXW8PQDFCEJCSAXVS4NTBJSNZ", "VXGQVHNIAEIPQRYGAKK95PB7LTXP0Q7E" ] - }, - { - "Id": "301", - "RandomData": [ "II336YR654R5PFBNZNB9IO4FVJFBU8RU", "GDGIX4JM2NEB8FSFRK0NO864OXIXSQM7", "M6ZM83Z5DZG4J2HP0ATKIEFHGM49VV3M", "AHYBQGHYU4JZ2CUVP26S6CYI1RFV8ZJR", "534CDG9U35ZN4QOE1JT3ZLQ7SQJ8AVZ5" ] - }, - { - "Id": "302", - "RandomData": [ "V249HSRJ3LYANLOLCB4ZFQ2TN6TX6AUI", "G31CVP6J2K9NWPUGC85809ZF9KWL83M2", "1Q4TTMZXFU74QO67LNV8FWRGDWCL3UL8", "8HWGVBW0JI2GC5YUNY9VIOWE8YP7JO3V", "J96J20MK05Y73LEI8R7FUZZUURH6WZQ4" ] - }, - { - "Id": "303", - "RandomData": [ "OH6C9O2XLZ5NZZKXUG82RYATJMZKSPYA", "O3SWOBJTYK344M44HTMP0XNZHM3XZSE6", "B485GYJS7PDG5FZ6R4C9CIJ1Q3PBHW3F", "F639O9XTK4RLUG4BX6F5PF32UHPNIHLK", "V7B8MZSRGTZI08GJ8OOKQ80ACAOHUKKC" ] - }, - { - "Id": "304", - "RandomData": [ "SH0WF5Y7OXY6QVBWAFO43A4WHA6MKL76", "IWZTIUDDZQ52K4UR82GO5QIRMDOE9MXD", "Z2X35SOPCLFNEBMNQOOSETA2OHHEG8EM", "22CRG1VQN0LUL4ML1BYU8F8G24OXKJJD", "G2UM84GZ37ENIPRT45NFKTOX36ZLM7FD" ] - }, - { - "Id": "305", - "RandomData": [ "RIOSJAM6491AAU7NN42O6E3WO7SCF5M5", "2A69B8K4TRLK2NXI8M7RE0HMO1EMRJ18", "W5I9Y8LPU85P3T4BKJD3750C3TVK47MJ", "0MX7EXUAAS6G52T56CCIG8B1EFGEMBUW", "VVYR566XZD2O8UHAAZN15ED2K528QPX8" ] - }, - { - "Id": "306", - "RandomData": [ "8KUJDBA9GOSDFW3U8GEXY30RR6G9E7GJ", "P4QX9768ZNUQVAWXCHAKKAJETD2G5A5J", "IIXKGFVBJG7LIK5QKS76768OULE5E0CY", "RLIMMLR6W8AEC86JHM6ND8LLJJ05BZ7S", "DJ36BSD8BAK854LWO5X23ZUS97CDVW56" ] - }, - { - "Id": "307", - "RandomData": [ "BRB3EAIZI8MDYNPP7DQGCEZNYK6EPAMO", "EO7N2SROX8U5NR4WRXGRGZ462XE4DDJI", "V78JPBXOWBTDU3AGQJW234IPUAVEOXLT", "ZLKPTUGP915EG0M9X7O3RQO0YSZPQTA9", "09NITUX5CG3C9DJ3YVQQJRCJ7T1A519Q" ] - }, - { - "Id": "308", - "RandomData": [ "06OGNDQDKS1KXM1VJ615CU0J7EL93WAL", "HMLDZCQUENG0Z1VV1F19AEOGFFII1QKX", "SPDKAY6GPG0YO9TGS0HX5BLD8F7T3H3X", "DTHKYKUDJUT3NZ2GVC0BIW1RE9M40MMH", "NCV51IRHFENLRRZIN081R1OQ10GY8ZM7" ] - }, - { - "Id": "309", - "RandomData": [ "HLQKD7ONVS5EJQ9WJER9NV0VYEDBC2JP", "1PDGBPEQMUF96KHL0UO3IMTVV4W83NK2", "IPN3M3U49BX2Q1YN71KSNPHO5SVH2FW9", "KN0R7O979U4GZ0F4FIBCC2O3I874INB3", "PXSCAHQS2NS3VAZEM1BUEU7R86J9QFZW" ] - }, - { - "Id": "310", - "RandomData": [ "TB1BID381SJZKVHHI2RQMQZ50ADE8RCX", "X5KUJY6J8C2VKHHNZB0YXIKCL5KH9Z9J", "QVBPKX7T5HSJYDUT3ZO71N9OUHINOZKJ", "DSEYG1CBDG2PZBOIL1NJKCSDVW4CPUFG", "7JGF95NBWN3UVUZT3ACWMA8AABDT79WT" ] - }, - { - "Id": "311", - "RandomData": [ "BWRP4IIPOLW6J8RB7KJOSS47KFF723EW", "0JS9CJZV1WIAOC1BTBVX0HBS1UEZDLXU", "H9FAPS8XVYX5K3SINDN1HQ6THAHRE9RQ", "9Y3O61VBC7CCTGI8B6L976M0DW2PKRTV", "GH6WAEMWSMYKO39B2JPIXRSCLCKJ8G0V" ] - }, - { - "Id": "312", - "RandomData": [ "OQ6MJW77TZRVHCMKX0WBBK8ZZ3K83CXM", "VD586X2GLSY8A75J0AWHTZTESHXPL9DR", "BE9EGNNA8QZSV9Y18BH3PP26T1PZ9M4M", "PH7580CMWWJD9ASSS5QK1JBVMCVP7XAW", "VMDNC23I84G3GZ7SI7HE5UUFGLT5EWO8" ] - }, - { - "Id": "313", - "RandomData": [ "WWRW7EQZCIL6CIOWFDGAQ50A28H0J8DL", "QIGUIKUERRCWJYC8770BQOS05Q487ZQE", "E9Q4B4O4SCS83D1E5J2MHC5CZQY1QVH2", "B7SJHH7DS5TO5T62Z0DY6D6CDOFUFXN6", "5075VR6XLZ3MTRGGT6B0ST57BPF3CM75" ] - }, - { - "Id": "314", - "RandomData": [ "SWTEWAGH3PMGKUTWH9AJVXNL594GMDU9", "27467CTS047CGYXR5SVDLXK4IHJWG950", "4NOM0XYFPRT00KFGMMK3RRXEX9X037M0", "9GI3KK1I3QY4DTE7CCJ3ZBINZJZ098LR", "F31TCL6CVB9B23AD4ZY0YSB784DAUAJ5" ] - }, - { - "Id": "315", - "RandomData": [ "EGYK2V50FGIXCHU6JW6JJU3W23UHH6SU", "2D6WE0KI47VRKN51KG17EAVTNCS9BXTJ", "YX58K82SLXOM9LMO827AFUQ2RMICILHH", "OL3WS6QMOIWQVJUCZDAIZSEEHDR8Z0K9", "QH7YS05CMVW67AGI2GMEL8R6GZPPPSWX" ] - }, - { - "Id": "316", - "RandomData": [ "8W9NM5T9H86E5IGG6IFTNFYS0AR3KQW3", "887LB356WN7MCMA8TITGNCK37QXLO0Y1", "LCF6K4FDMI7AIMQNASJB7QQ6YENUGUS5", "YFB9GDYYDQ3EFJVVAJL5RX44WJIGQV62", "ZBLCKQH64V8RXL0OS2T6JXOBLGN75SHS" ] - }, - { - "Id": "317", - "RandomData": [ "TAOE7SKUBPB5ZNHKS4XYB9TCWK1EDKAM", "NP7W7WQ9R953WSM88COB4TQTRLRX1FR1", "OYSJPVM6NXGCEZQE83GA59R48OEVF3HL", "RDP7ACSNZSXGMOO15MY89Q5PHYKBQ10U", "P5UBKTD5K2KNLLRU9N02EJLBHAZL2R68" ] - }, - { - "Id": "318", - "RandomData": [ "1D0R3MRLI2YGGSD6GZBDA7PGTT3K32D3", "6LVIUA1X5PTMUF4Z63ECQ284YT8KSHRQ", "Z5K465LG8OHVNDWOYENAXAMDN1UABQEY", "7CWZ4A3BS7EBVMQU7UVO4R3YSGRELKFR", "KTYLQ6TYKLRZ6LSAL9DR5Z4PJ7HXSZ0H" ] - }, - { - "Id": "319", - "RandomData": [ "2W1BYEEBA6DSAE2HYQ2LHYWUZICSZ5GV", "VJ6KTRMH4CQ8VLPEFA9B7OAEAGLQCWMF", "0R70HSXHEVQEIX9N27MY6EYGI2KMF5EI", "0KIDOZ6XM17L766MH8XFJXIW30RPILCI", "RIO7P58DAZMFGMIM57EGH89DCVKXHRPB" ] - }, - { - "Id": "320", - "RandomData": [ "ZY4ZR97M9UETLDQQSETKG5ASIL43UL5T", "KKPRRS5691GX3Q18F3FD7E43XMRGED1Y", "ZVJAX889JXKOYNY2T5Y1F1VFQW4FBZ16", "AS7IG1LH4G4K3QEJYYWJPAT79DUBD37T", "5OOGQQV1UQ697LMARURNCSQ999IDHKDB" ] - }, - { - "Id": "321", - "RandomData": [ "IKOPB83IC4Y9ETAX1UTTMURM8PHQHSUK", "M50X668T0JKI3R4P9VMX0UYY3BQW0MAU", "KOWJ3M04V92DJISRU1RVG6T2GB44PM2O", "I07P4VVW4RB01VPUT9C85PON43C2S5OJ", "GO5TLDW8G51Y42BVWJLQK3T2MTUBS3D8" ] - }, - { - "Id": "322", - "RandomData": [ "C2UN06IPND2AXZTC2RFIT89N4CG2TUPM", "12WCIX5ZB6CGBTEWASJBX4OD3GSXZQ62", "XPI5DQ3EWQHX62LL7U1ALOZ6NSJBFHAU", "AJSVKJTTYEPHW1HA5H0FY5RJ0MRVH19O", "PXWWJ0AXAILG9RJVKIG7R55F1J4818M7" ] - }, - { - "Id": "323", - "RandomData": [ "FA29EU0EGCEQTLKJC6K8VB7U1R5A5C6C", "6OA8ZKQZRC1O0PVQ8V55XNMECHHXZ0ID", "GBUEKLU2PURSJS3M6OCKHAPSC66RC3A1", "3YIZ4RFWBCQC634TO51KX85FWBBOPD0V", "UZZUKDRPJPJEUMWJBMCHCZD42DC3P1H8" ] - }, - { - "Id": "324", - "RandomData": [ "M4RHDJJKNMBIZ1UJO2MDASS4V52GBY9R", "HL2Z4PG1C140Y5FBT3OWPE73LXVIRDJZ", "MUAO84P8WUAIY2GZ00XIJNCDN8NH38K8", "SEOD41CYOPA5DYETQ6S0QBQ9S7AAQHFX", "JC0TOD58Y843MGAY3417QTSQYOV60CIG" ] - }, - { - "Id": "325", - "RandomData": [ "KMVB8UEMATCSHWWL7LGVPHH0TK59R8IV", "ZXS9V80IZO77Q9IC2K9O5W0DF4RXZF5C", "KR2UDXZ8U75BKKKTB3HG83ZD6P30RCTU", "T4W9HY8EUB380Z24U7W67YDQ1ZXY38RS", "OLRPXKMM5DW7A1MGW9GTQWW41FHSAJLW" ] - }, - { - "Id": "326", - "RandomData": [ "TLTPINGJVJB4CFQAMRB427B1YXYSD3MV", "19OYH78J268HV22VZGGTHQ4WK20VZYG1", "7PCC122OS2C594G64C36X2NLF1OPHNUD", "0HJFZZ46N1APO8WPV40X5JDEC179ONHF", "I9F2UBGFH6S6186HE83MX6HQDED824SA" ] - }, - { - "Id": "327", - "RandomData": [ "U5GP245UYUP90HND4Z4QT5SL1YYQ7HNN", "OSL62RPKCJYCRI0619DC9CQZN5XDFPWQ", "HBUI5RLMKUNKHP3S82Y8DKNLBWS73LEX", "WH5QXRAKY12OYGS7BFEN0YM6XIGI8OT8", "QZX9UN5Q2OJMS8X4EU5YG167482OK1MJ" ] - }, - { - "Id": "328", - "RandomData": [ "H389SSNYJXUMO9OYVLENS41Z2ZEVUQFA", "BAEYAXMVHHOTGUT5TD29X91NBJG2O1D2", "RUKO4ZY89SGLPITIGJCQYGNCJ1X1RTHP", "EVBVKEA4P49F3P72Z8VEZWELHHFDC6QP", "K0G4H77CJHB3HIJ344BS7DZRR0OC971S" ] - }, - { - "Id": "329", - "RandomData": [ "NT4CICV2AT5RVLD97MII57SHBZNRT5DL", "QSPXNHU1IJSOHH6FWPEWZTXPBXBTZDIF", "QTBC5PV01Q9VPE932H5D0QW64AW0GACE", "AN7YG3KG3O5IUCA7XH1SIFO96EI535U1", "O4UBGLX86YKLVOM29ZC8JT55871BVPN8" ] - }, - { - "Id": "330", - "RandomData": [ "4D4ZR80LU2WU5COS2Q5D3VR48ZCIUVNQ", "KMRRTWKA91NQ6LA6TIIEUJEIW9126S18", "PGJTV69FG4ECIA8XYGYLNI5AHI5T5REQ", "9PB0BRLWJC8ZFCAVBEDZ3PVGKIMMBPKY", "0XC29IVH5BBKJG5EIKS1OOXU35P3E8V4" ] - }, - { - "Id": "331", - "RandomData": [ "2K9RAHV3S541NL6DNID06TKLAR9D22C6", "QHR9HNDAYZISU6GS8MQ6547JAXRSISA0", "27LG3769ECCHL10DLRFQMGBVJI8U5U2G", "YRZXVAYAPQ122Z7I6NH0MUOW5Z6V8MDU", "K6T3CDSL3FA5OJ3UK0XRMB3DCD15DDBD" ] - }, - { - "Id": "332", - "RandomData": [ "MHS5GEG2467HUSIW5MKIYVHICQ08MXHZ", "D6TG17NGT4WQDWST5EA122O09J30NHQH", "YHDX9B578EZ490EP7GDHXQ7KS2GREX2L", "NP25S5U3JC2YDU1JFN3GDJUHK3FH4N3L", "LNQU8I6CWK7UXIG8B7L14VHE4UVZZM95" ] - }, - { - "Id": "333", - "RandomData": [ "IRM0DHL7Q0U3L9UBWHF6CCR0FMZNXHMJ", "KBLG6Q43WOKDBO24ATDSHC3G9WV0R7KJ", "OKTKYNFGMMKX1NZ1U5NDE4CIHEGK4DMZ", "EBZ04SGXO7F52GPV64GVUGFTHLCTG4LI", "9UTZY86BZ0ZGYHPBZVNA60E76FSTQXQT" ] - }, - { - "Id": "334", - "RandomData": [ "V75HXZ787F63R85A5A3VRKLJPV3TPMVC", "JFV1MHO9XOD13LQ8KSYP35CLVW1B6NTV", "T3UMMDYXW47CHUPEF4I6YGJNCJG0QMCK", "5SIA0DVG4A388ADBGW6BFW6NUGJD78HJ", "1XGZLPOBJBCXMKPCFFT3QBEIV5PU4SJ5" ] - }, - { - "Id": "335", - "RandomData": [ "2THK3OZ1I52DUJAK0H72OO30S7EP94H0", "2G42DEI1P1UUIBYL5F3XVRQO0Q25KJ1O", "YBKNOHHV8FMX4IRQI2U4ATFLZQCWMMQF", "AG6H0L7X8HYPE3UR8LWSZ6NE69X7FUJV", "YHWYLKZ746635ZG56UXA08QD22K1X9SN" ] - }, - { - "Id": "336", - "RandomData": [ "7D07G6GYVZX2AUIG32BU6J500T5S98K4", "OS519JYAO9OALYCHUE7588QYHAGXAXYX", "P2NRZQGTDBG744PCQX85AO6QCGU9CB91", "L1VSKVSD7O161T3MUEGMY3WA67PS6HQC", "CPWDJ715F57WX9YTMHO84WCSEUVNGAG0" ] - }, - { - "Id": "337", - "RandomData": [ "7Z4M60DXMLH269N6I6FZ3SHPME8ZLOZF", "ZGZ7FLWWD0WTPKWFHZEJ4Q6PSPA21OM7", "WCDZKP17KSVD6X9CS3RWKPKIKKPZL35Z", "NY7NH6417H9L53T4P8K760XG14PAABVQ", "X5ZI0W5V80YDP9NQ1UKNS73XA0VMR406" ] - }, - { - "Id": "338", - "RandomData": [ "VTY9ELE2DZ8FCU02R8JP0I70CCH9ASDE", "91R6KOMQQRK38XVQ934TVLFNV76BDE2U", "V4GKC4RDW39J8E1OR09HXUTYWELMRKML", "ZZHDRKOFL162L6PQGSUMFV6BKRX7TEVL", "QYTI7X7GM456X1NZZ4G909GE2F39WQWH" ] - }, - { - "Id": "339", - "RandomData": [ "FVLXMGTSVOALZANTE7IY7WVQRPP147T6", "IX0CPZNSKYOM95O21J4ZH7JSA4F712XX", "4ECCJLDPU0NJIIQWAW9VC4YKOICUTQ1S", "B0R52MTQFPERTAJ1OT6E2CUAP2YAJT5E", "95IS1V3YDTPX0H0N8KGATWZ8FRQ9YSGW" ] - }, - { - "Id": "340", - "RandomData": [ "U9RY21A2ZHBJW7KIBKC8M5UMFJMJF4AU", "M3C0ZCUHKNKLVQMHHH8NQIJZPFSTO0X5", "HR624US8Z5X8UI0Y6EB75WDETNKUTB2U", "0PEETTMXZ9XVULEGO4XJY09UN2IRJ7PY", "CDIEEWFM2OH58RUIIEGZOS5APT01L5O1" ] - }, - { - "Id": "341", - "RandomData": [ "U9TRCAB1YKRKSEW5HAIE1ZJTHIZV5NB6", "AQL88CGICOADBVRL75TLXJ95Z9J4KQ5L", "JVJC3X6E39CMYGSW0OXA30I0QQI93L8V", "SZ4QLOSJ8ORYHXGTRXD624SSMTWNO7LS", "AQ39LBKM6OCOJUT3JZSGHB2YHLD22E5A" ] - }, - { - "Id": "342", - "RandomData": [ "D8X13GHPM1AO2DJ2A3DZPFK9XF2A8ST1", "SBLK619DRC4QBO5DBK28BGV8XYEXOGQ3", "HJ60296I3AHML48JJY9X0VZMQMWIXMYK", "VAI1RFLCOTFB8JX3Z4NZH3CWTTKPMYUQ", "L60KWG1EN6IGPYNGZ3S399C27VH856Z0" ] - }, - { - "Id": "343", - "RandomData": [ "9YZCSMHTDJMLU5G5GDZTF1RM38MA83JQ", "GRH18LYNV9Z0W1HBPM11GGVIGNIU9HUK", "A5EDYO65PM7GB10B1LUWBRKA69UVCEOO", "OPZ0XENAP6M4JOGPXG3YW8ISVEGZ4L2L", "8T1WB9OW7UGEEP1S2F75KZ1QGGFT7XGD" ] - }, - { - "Id": "344", - "RandomData": [ "DB6ZXUNX2G0C1EOFMY7YN7AI1KP435ZJ", "OCBCTB5H1JDE9ZZC29GJ0R0GBY8MES46", "RQYYDLVL2Z6E45IBVNC4ZPT6M5B5CSDJ", "PGXSBA9QO4QBUVMGP710QAHB71MIK0JK", "WXYXH09UOVP48RM0S5PE1M2P8VUKY1FX" ] - }, - { - "Id": "345", - "RandomData": [ "VGO67Y8Y7GL4UNDPPVZPKESK5IYVFZ6X", "P2I2DP3461HVA75VSE4CB0MRXEBZAMSI", "JYO1EKMA24ST77J7MDCB43VZP1E8ND4U", "I9LMSERI14KHH3T05EM6JRNQCYLMGOWY", "A8K8V7OIW4J9SOSWINDJ17K1V5K32EBN" ] - }, - { - "Id": "346", - "RandomData": [ "HWGISVF8ZDKOHN7XGZE3LN6DYTM0WUQR", "3626IKDWIETXW5TH7WXCAIC3ZDU8JPLE", "X3VLVAP5VSVG4IQ2AF2A7NRV38HEZFM2", "3OA3KHV7H1RRX59QW28EXLHKMARX3KFQ", "F2MPIXS3T42F597890S7GIFSH0RJZ8D6" ] - }, - { - "Id": "347", - "RandomData": [ "VBM4TTI8KFU2SCOMCTYC2IJ6W4IRGIDV", "16T4WCPPSTXBYN9EMEGFJBEN2PIYK02B", "B8AWSTZ9EIUJUHII4DFCB8L01FCH40E1", "0VAZMNV2OHBAQ53UHA4GU0ADWK4NRSFO", "E2S8HS5RRNX47LJ6MR9367GAV7CCSIK5" ] - }, - { - "Id": "348", - "RandomData": [ "BW6XN4NYENYHCFGLB8A9TLRGVRNJQ38J", "C23KPVTSEKZTJ98Q10BUIKMZF0C6RDIL", "OPEJM56PPS5IW87WS6SZ2OA2PDFYTWAA", "CNE35YD54VEZPEDG2PNUVTTAOM4I0H62", "R4GI3D133W4GJLMLA85DJQPT4EOS44EW" ] - }, - { - "Id": "349", - "RandomData": [ "ZMHV84NYYU18YM1DASI2L2TBOWOZZI98", "RIR6D0NFVGPYZQ4RMKSLWML73GGLQX9P", "V3QQ549JFCGEN4M727MO0XLF6TD7TCZ7", "H9D5AOVRKIGUFGU83ITTKUZ7RLTM1CZD", "MJ7N1Q7NL5DRR1909FDLSGXWKFOY5J0I" ] - }, - { - "Id": "350", - "RandomData": [ "TCH6JGHNKFHPRHQ0L2MW9OUFVKDVCJSC", "E58OTDR370AN9IFCYYMC7DJERBK8DVKB", "WFKVJBGILTYIOHGNEA6N6QFBW46S2SZM", "P8047T3XSD0NPA0K473DY7EG9J9PEXQ2", "3L3PQMPVGJ53Z1VVDWX5YWXS4U4YUOS4" ] - }, - { - "Id": "351", - "RandomData": [ "X7UDHK4SRI6PBLQIXOLSAVEHXKV6R1B2", "0AG1GSN31ENP0IQTDVBFD94B3NP6Z8A0", "HEYBFZBEAS15HYQP4C35Z5Y1GE83DQD3", "DXHWUPNNU6EVI83E6ACXFEAMP74A0IBT", "O81UQ44PYPL30DSHK36COQX8X5GXUNXL" ] - }, - { - "Id": "352", - "RandomData": [ "4VGKHJXBGX903HWLOWZ7L9F8K27VXG4K", "1A8F6HABF461Q7FPJ5I7XZA5QIAPMCO9", "2Y82IROHWY1QCNRMWRM286XCACZYHVZD", "Q7829NG2QBL97T2C0X24ZVB6A62F109B", "9Y9FPYNJKUM6VYEQJW8T24N55B2DUBA0" ] - }, - { - "Id": "353", - "RandomData": [ "BJAJTXWBKTUFJELM1L6E1QJELEJN6KYJ", "UV4LX47WA6IJJIW10PLIE58VA58PNIEA", "4LUXJ9Y7OJE4HA4CRSXR9PEZXJL26RI1", "1IO8X9R00O450DN9A575VXBOG59AY6A7", "AND9V6PSB71UVJ8T6L1ATNGEHA229QC3" ] - }, - { - "Id": "354", - "RandomData": [ "N64NAOOEQO3X6Q276QEME9NXG82UDWTU", "47HZOVTS7XUFTSI0H46TM0ZNTGGCW4A3", "4J28IDSK6WPRPIEYZBMJ0AHEH3FIPQ5C", "W0KJZJRELVW0LI8LCSMUR1D4BY0P7K5Q", "0M4Y748QTI7FOR3954G6ELV5XPIBSCGA" ] - }, - { - "Id": "355", - "RandomData": [ "ZGA8NJNHU6AI47QU41UDE8LO09ASW67R", "C6PIQ4VVR8MIKMAZ9XH1SC614VIOI4VX", "8TG7SIE9F8WGWCEN8LS8ZG99AYN4WHMW", "NYJ1GDH1TIVTQ0E1R5P7MW82UG744JN7", "WA273NG5D1OQUPTKTVM11OK10RG9FN6K" ] - }, - { - "Id": "356", - "RandomData": [ "4Y6Q7G8EYU4UHRIEXXKJ7VGIZBHMGHZ0", "4EW6SCMMWHDGUZTIICLSCWNJRY069W8Q", "5E0D5MVUK7WZS9XAS9DD5GXH1MO4MQNA", "JWLQ9PM6Q1IEAX0SAZO9T4VZQSLS81I4", "UWP6YHBCWGXE7SHDW53WBNQOAW9QE48Z" ] - }, - { - "Id": "357", - "RandomData": [ "SOUNH443XMNMHR18KI6C8V2GGB5BIU82", "I7VT7452BA8Z9EHT5BG57516WNGG82UD", "NVDJ5HAPMEB7WCGB3LGGOC4MGY7UXZ3I", "P5LOA8XXB0T343KTGENWWOYL00CGJQ2W", "L2S002B5XSFXSASNONNSLGWBHAYJ5QNU" ] - }, - { - "Id": "358", - "RandomData": [ "86SBLT3ODR8DIA3ZIZ26DJLEGRT0D1AG", "EUZVSQC5T8P4HS2GH8BFYRRZVN539DKL", "R18XLHH2X7ME3R7XYNTF05SXD99EUI5Q", "XDMPUF491JR1EM5EQHFVUFVWJKTMHCHP", "B6R0ESDTTTORN1T0E5YNDK5RR0FJVR1Y" ] - }, - { - "Id": "359", - "RandomData": [ "CBZH5EA7EVBA1EIS13IMO4M0B9IOM37B", "2ZOLBL5940IRI40NRXR2JOKIZ8G55VVK", "Y9IBZ7QQ7IRYV5SGI57YMF2NPGWCE9DJ", "E83IVYXUHA4A7VW4QAW9Y68SH5WSKNM7", "FITXCJUUINRLL1Q3U1WDNDUIAKB0CEJ3" ] - }, - { - "Id": "360", - "RandomData": [ "Y65YC92HPC1LOWHPP28S1IUCYKX1H4RD", "DXXO620U9PYKMI3NDVLKG0CPL2A2MA9V", "VXH193TXBNTLUK0PRJYWTG7NVHCD18I9", "PDYYACNJCYI2G05BCVLCMNBOZ4F10P5D", "FU6RVBOO5OT47FG4MABGXGWCBK8G6WTX" ] - }, - { - "Id": "361", - "RandomData": [ "3FWW4OPBG6G73GQUYLPZOYP973PLDHSJ", "56B1ST98V9919ZJ43OSUG3IE0XZB8E79", "N6B7FZBELREOYY9HUVSYZ7DCX7B4489Q", "BANCYLZEMOIZY4PBYRQNWJJP39JHXGJN", "RYMXK6TI5NMLYNN2R9GMRW4218JYBRQF" ] - }, - { - "Id": "362", - "RandomData": [ "E5HAS1118IRI680PVR0XA6643T6MX4GO", "7GG3GNKZIPOJFV62H3DU12FH9MG85OED", "BDL027JIGAPURXZIXEF31VWEB833GL43", "LLHBKGAJU5O0NU0MW8L1JKMPQGZ3DPB4", "GVJGPY8RE5J6H61QIRGIADUA91VDRGGE" ] - }, - { - "Id": "363", - "RandomData": [ "3TU1LT6894WOBPIUPIVVJ33DBIGXC5A8", "YECXLAEYUHIGQF9TTAYIUU5AZRZDNI6E", "3YZ6NUIOE7BBUXX6IWEBG2NEJC74LBKL", "LDM1QCG82JDXT3PC4340E47BLUXLWODC", "WZZQK5PGQFJ7Y0VPW5ARHUHRGKQ5O4LN" ] - }, - { - "Id": "364", - "RandomData": [ "FBA4D918NXJ8U9NU9IZ1NW5BRIK9PT1V", "352W01LWDCDTKI6G756FFU9TF8M5Y1S4", "6XFYH04I7CYLSL1JMECUXVPJ6JR1OQ7L", "TJXWDH9GBXID6XA3HDSUZ8GKI527JC4R", "EM2IYEFEE5SANMNIIXUL7NWVDMOHPB78" ] - }, - { - "Id": "365", - "RandomData": [ "319U52FC7NQ3PG75SUYWSST1ZHFLZ8ZC", "8UHVN3MQSRNU63F7PTY4NKPKHH4YX3N9", "XN448LSZHIEBE945BH6GJ4ZXF6OF8Y2Y", "DO6T9K8EA9XFGNFIN9XP7GZ3XGZC7N1T", "PP70DK60J1FJHUR21F18BN17YD53V6HX" ] - }, - { - "Id": "366", - "RandomData": [ "IE01PPFCD6FFAPVDZ7L1V2RBXABAOCFN", "USBC4ZMLAZ5EHW6JR2DYUPCPWYEOOFXA", "12USOTJ9U9167M4AE2SW8Q2FPVPFV775", "B4NPCN47TEDVYGSJ4DKWWBBK9PD2DDOW", "C65C9P807VD4NHRJDFLRWKI92DPXKC3P" ] - }, - { - "Id": "367", - "RandomData": [ "0QS2LPKOFUYB8H7283Z816A1X5J69LP4", "1XE6YY7X56MCVHBVFXZQN5Y3Q0EPGOP3", "F4JLCADJ5BD4T7FP4Y0MV8R58KP8USRQ", "RS617ZSETQVL23JSVYVRXCIHMNM2VFYN", "UWMABNREFV3FNGDFA7N5792PKZPUN0TO" ] - }, - { - "Id": "368", - "RandomData": [ "1H0FRIRHGQMCJC3GKH1Y23QV360L870O", "COOFP7X2PFYQW0GI5JJG95W81FMUSFII", "Z7A4YX1MT9IWE98C0RPZYUPG2POKVDJJ", "7P1Z0LTIR7WAWA31GJ3A0TUFS3CIJR1Q", "Z8YZIJMO8HH17OT1WXDLJITN4VG7JL9A" ] - }, - { - "Id": "369", - "RandomData": [ "FGKYLES67OCSL3HDJKVVNPGQPL4WCOFW", "IGV0D5QSEHN4GABBNDX8ZNXZ94JAJ63S", "IQKFIR9O3DRFCMKOJ3I91H64T51JWQII", "N5VZ0626EIEW6RXXT41QX41BTPWMZZ2N", "4I2G0UYMAL5SCJ8BHE01Z2VTDTGKKPHO" ] - }, - { - "Id": "370", - "RandomData": [ "Q02XZQ69GOPL8I8JRUEV9AYBXIDHOOCU", "EQBLRLM1H1VKMJU5U62ZKVPQC09RNZU1", "M4GSHX2GINNIOOZNXIWSVMKTAVJ1L4NS", "G48SDCX7EWQ7HHBYBW3FDCG9UXRVNB5N", "95BUPGKVUYO85ML3TUZZAIPDX87PUCTC" ] - }, - { - "Id": "371", - "RandomData": [ "1D7MFQI4LIVOYHDHLXC2LGM1P77QJ5AS", "ELH2P9YCM5N2XAPP50D6901V0G6HT1VQ", "ICJNAK2M99QP2UDPSRVT1ESNTVCIDRSU", "K7UU0CPU717AKL3FCRYCGCYDU53PITJR", "Q6F4ATYQBBVAGSDI27FV2QOHIQA4IALN" ] - }, - { - "Id": "372", - "RandomData": [ "SPTOF8ET3IAEQY7C2VWLOXZAR7WUS3IB", "ZIS08ZC42W2UPJ1US7CWNA940T6HMTA9", "A9PIGGECT2S24EUIGBBV0VXYIXAO34RI", "V3TQ4SNM3ADVRH9W9XAKSPJOL09SG0IZ", "KKGBUEOYYZ10SCHBXOOF3H0FTFEDS4GD" ] - }, - { - "Id": "373", - "RandomData": [ "1NLGA8B5JMW3YS6JT852LD5CUBRP9KF3", "SY9E0ABZMT5QV7RBI5UU9O2XRIW9QV68", "G3K9T1SS7GP1HPRXTQGD0V3E6LWSNBI1", "X7J2WRRRNBW38AQC09PAP2IV9FDIF9E5", "8YEKFZAC9Z0Y8AG54U1OWHL4YY2RNILN" ] - }, - { - "Id": "374", - "RandomData": [ "615J5G7B8MBZCTW89IOVI0I0MJVQ6TY0", "NM1HF69YWZQJFW1FC3SF40FGSE7VUQEP", "YKM01O3CIZ8SJ8U0SQOCAS6WHVYB8OEF", "VAV5KBNXAP7E2W6TTHDDCBPFOZSGZ2D4", "V27JNZPQD0CUV14UYFR1KADTVPQVSH7I" ] - }, - { - "Id": "375", - "RandomData": [ "LDSAZXG41XAL94UW58SUKMTVYNY7J475", "34JSI35A8X9X91U153ZUYM79T7LM8IU6", "ZESEVBOBDRWXM6V627BPENGQ6J8KSTCZ", "CD85JPG3PYRH0JXXMOTBHF1L7BHLDDSU", "P6VJ80XN0HAQ690XVL8E9AS7LW7HH40M" ] - }, - { - "Id": "376", - "RandomData": [ "F723YOYW0GK9FLP8LUZ2EOUOOY8L2PF6", "RXK8G69HWLN3ZS29G86XE7H1MNP9QN3L", "AOSRAQ2OVSG3A0Z568F4TS1TQTW2R91J", "SC3KAK90FRBW1O0WYUDSH81RW8AQ497W", "07L87O4V8PYBRF1C39D65JBTKLYBKS5F" ] - }, - { - "Id": "377", - "RandomData": [ "UP54C1YJZST2K0ARH7X45A0R51XW03KP", "TSRBJ79BL3HMZIIUKH4M5AJTYN8KDCT5", "HDJ1I9HK8VTB3O1XSDLT98USI7N68Y7I", "KLEW9RLL9TOJRH0KWL1A0A6JT0SKWLMJ", "YK1RJFXB1ATPUKBAHCKW66SJP5CJ8BZY" ] - }, - { - "Id": "378", - "RandomData": [ "HEVGQJBQX0J0RQYIYRDTBZM12SBNDOCZ", "K4HPZ5U8B38GX128G3UR8FXS13N8HXNI", "YTPWIJT37ESH0GEAZCGJ4V1EHZX5RW0N", "QZSDMGZ7J1T3XQ1VZNIERDOC1KPTVYLK", "NE0AYBYTMJ9CB8R17CFENW6NKPLB1GMU" ] - }, - { - "Id": "379", - "RandomData": [ "PJPSZ06YYZ1HDMB33YVSTH71INZJZX1G", "7OW2S8BHFRPX4YJ8NSHDU3BILYKLAX8A", "7VKZZJK5WONC1J6UE15HPYVDNOQ4XZGR", "SO0JNUIEHMQGP9QC1ZHJ21VI9GLL2PH6", "H5UMTXHUS0ADIPYN7OD8S7Z03RKGI7M1" ] - }, - { - "Id": "380", - "RandomData": [ "ET9UPESERX0C1SAUS8NNMJOKG3SCMAMU", "NI8YPD8358Q5GW9LQ0XJT8O5FYNVVQ1R", "KFYSTLEP9USN2TET3HVWNCBP3DT10MIP", "H9UA8Q1EVIK9QADVU32N4EDIEJYQ2NYX", "MCG28DVMPRBE1B8297G6U4UC5L5Y2LMI" ] - }, - { - "Id": "381", - "RandomData": [ "TWWN4KWQIP8ND9QCK5Q4G2CSRD7XI6UE", "F2UEPU8ZKZXE6H9642O64RB1TE51M9IL", "44IKOLXZ70UQE8WKDB2PSYJX03UKZHML", "RMJB9ZRSEY9E7VWVSVXLG22GVUTV0NAZ", "OI92YULOUKK4YF0FH91DUAEYTCQPF511" ] - }, - { - "Id": "382", - "RandomData": [ "XJZYV478KI16S8RQ3NO1V6FNELIVD6IY", "STHPPCUNB33LJIGVVAV1R9F0DMTKVL5N", "ADN80CA03AZ2D4E5EWACKRGTNRLCTK1Z", "7QLF5H4S957QJMXJIYF9L2DS74VJ07HT", "J95XS8971RDPTZJA3B44E2OFM2IBWV2B" ] - }, - { - "Id": "383", - "RandomData": [ "XOHJRA0JYHH3ZX9HUUPYDMORVZK008LG", "ZB1ES9S3LVG7VUPZ2AQBFD8L90Y2ZAS0", "6BEY64YVBVNRGR6AKV7ZSJAWCQE2K0DK", "DQAUQ128L49TZRES4XREC3IWARVQZ6KL", "RDO0QMUS29NXJR6VLW8XI9HJIOT8FMIP" ] - }, - { - "Id": "384", - "RandomData": [ "UYBWCNCSD9MDPUMTUAED8XCS5ESC2VMQ", "08DVPKS8UQUJXD4XBANFIEQ6WT1859ZR", "W6MRR1DKRFTSC251K5A1HHHWRG86TTCU", "0CX11MFJ7DXCU834X9YA98JOY09L3H18", "D92AEEA7Z04ETFBTMEIT5CU23ICAN3Q0" ] - }, - { - "Id": "385", - "RandomData": [ "MZ9VF3ZT91KIDF5TZP9Z8HCAOAH5B9U5", "JE24FPNSOZUE2MYXNTL7412EW8GFW3R9", "HO89MANJCQKIW8ICMTSSYWBRLXHHJI5U", "IV6NNYLNFB5NRUSX0D3DL8KUMQYZ3GA3", "UZ9BB4ZYIENW1YA1FTQFO2JKKMB6AVT8" ] - }, - { - "Id": "386", - "RandomData": [ "BB21UQW5OF5GUX2YQ6UJZ4O2QY1Z33XW", "VOVZ5JHY7U0J7CZWTMPDBKIGWAK5Z7CV", "RIVFCC2HZ5MFEF4O8FFQNUVKGOD58L9A", "SF2YQUTQTIOF8DCRF67T1WI7XK9X97IN", "6LX9MF7OVY6EFPMCMVZBOPI564BFV6RV" ] - }, - { - "Id": "387", - "RandomData": [ "9BJWQDF99S8DZD2I86KOIH9QD1CRE13Y", "HKEEF0WJQZC5QEG3C2HYVCN2B3SZBX5H", "ZJ6O9XCIKA8SED99UJOMUFDE7LCMH6I3", "45GHH13PZ8NUE5Y73TE1ITXTG2RYV0AO", "2FYJ7213P9WV1SABXETY2QULIWAPKF39" ] - }, - { - "Id": "388", - "RandomData": [ "8928HPAA2LMI6B2Y1PAQHMVLUMBK1LTK", "GWX2ZB4HES6REMOG4MY4EN1VNQO4O0JQ", "1CCKOA8ZV3MZQEHH84PPXZF25BOJXA3N", "JPZBKE24O8JLBCFJJG5TK33C6JOMWZCU", "98QBPF74CVAYP4126E9RFJDPVWFAZPIZ" ] - }, - { - "Id": "389", - "RandomData": [ "5YLCWE3EIARY2FWCSWQRZVPZ4BP3A6FX", "NL21SYG1L4IE2PWQ9CSC819KJVIVYAEL", "53KRM5U3QYF4MK7PO937OCZWMSR6QVDK", "06I8EFEDSZWJVE78Y3GZHG73EYF3OXM5", "V5EQC8KJ50PYQPBHUSIXOOCU8P4QAKZ4" ] - }, - { - "Id": "390", - "RandomData": [ "N1XZAR60S73R0JMZX7J5PYQH2URWE4JU", "AVLY1LHDVRFQUV3ZCE3CA3OYKQ6P9KVY", "YJQF7Y7LZGJ7T9XH02T9BGUHGWOLP1DL", "6Q2LFY1OHRM4UQFK3ZZH0WXRYJ8KJW68", "C8BCHMBCAF2T3ZWZRDRZC6UJ3KW5ZREU" ] - }, - { - "Id": "391", - "RandomData": [ "VO2VPDDRXWGV3DY9WI3FEH6FN1I6ZGMT", "AH7P7BKOAABPZ8QZWWJQX9QOSWIX4G1R", "KXVWFICV8OEDFQQOLSJD655A1T6L3WT3", "JTFBN4UOUXSI4MIBG3ML7YUO2V5WL02L", "4L3WLOBR85SINWGOK5E9KI6V81J287C3" ] - }, - { - "Id": "392", - "RandomData": [ "5GOTSW0114NCFMAGOQLQW2AWPIXUFJSA", "3YNGIX5YENHP44PW0CNSWVHDG1EK9GWS", "MMIR9481VXLJUV2U2B3C5AOHQJARSVY8", "0ZDSV8X5DV68J8TU8TR8MTWM8BAZ4RIA", "8NS4RK94N78KDP7R0PS9D0WHD0TT77BW" ] - }, - { - "Id": "393", - "RandomData": [ "M6A6QYCYTWUOUMISDS9O9J6H1K100P7P", "6M7HPABBM3QRGHW0SBPO8XXD92FF6M8D", "YESHPBDDR7BF2PBTXBIYATRIZ3HW56FA", "4M2BZPLQ8M7BVRKT1WR5DJDFXJSV3QIV", "2BLQX94IZ10XWPXISY5IOJ7VJWNP60XR" ] - }, - { - "Id": "394", - "RandomData": [ "ELJUG4611IGLSQTHWKDFU9GSEZGBWOM9", "EISKGDBX2ERGDVC3CF3VWR6FF0QQY4EN", "5GGK8JASIPNQRAOSXN8QV1MWLMEQXV97", "9EK6P243EKMHEQXFM83K6Y2E4T8VEU5X", "QPRN0RC4SELKOFR5Y9DZ1ZAKLFC53JYU" ] - }, - { - "Id": "395", - "RandomData": [ "OZ0Z8KO45811MR0ZBC7FQG51PHBUPGBJ", "Q15ZO27OUJ337I74PN40LSDI39J0I4OY", "7SLVWBKIFSUHMC3GJHFCMK77YX5OSGGZ", "4F6P7MHOCVV37551FDRAZMLWUN78F5Z8", "M5MHGOI791A1ZEA21EIPZGAS3K5UOIIG" ] - }, - { - "Id": "396", - "RandomData": [ "5WQCSXV14TA8MT6PNEHBXKJG44N5TYS1", "S36DX7JESRUFGCFJNPHKBGTUMKIYKZIG", "BJPSX22Q4DSF0EA2ZDSERIZLKL1MYV33", "JND6WWWVX1P8YN4IKQ9GHEZ3TDILBP1J", "JY6MADFCR6Q020X6RTCIWXWFYKNSOKUH" ] - }, - { - "Id": "397", - "RandomData": [ "9FZ9RSHHK6ZKX9A3QM4RNSWVC0XZ0WXG", "MJ0WAXO8L47Z8LSZKTBCPC4RTD604RRX", "JS8OJN2375FSU7X1I8PGVV1JOID61YE4", "MKQQNEQ61IFT7M6WQFS6BLCX0Y9AJ5CI", "1LFKQGOESTPMQHMCMRQVGI2BH3ZYEPW5" ] - }, - { - "Id": "398", - "RandomData": [ "G61VGWFJ1NNS50HSM7Y2PQCTTDCXQZAC", "6TFUP05ZMG424JGRVGMG14Q03ICCTS3B", "NKWLUXCVB8QJWKZJ7VBJN3LCDP0HY2G3", "N2PTX468E0E3OGETT2F7RTYT9UHF657J", "1W634FWCYCFXYSX7KHY5XIM4E5UDW1CI" ] - }, - { - "Id": "399", - "RandomData": [ "35B1KKYNGCIONB5R6K4ZGBVTKCY9VSP7", "A733R5W9SKZU97RD9CHM6MB2KRRIWY2Y", "XLOPHCAAX4G6MATNUV9SLDAX5BS9OON4", "RA7YSB57CGYCFFPJ8DXAYKMTK0UGTAWJ", "QMOLD54TZCPFO7S0VJAK0NFHYNN1QZOB" ] - }, - { - "Id": "400", - "RandomData": [ "TOV20EFDIDLW4HFNI4UJALSDHHXZRDD9", "XNV9MZ9RE7BXBSNQIATVFFBI5SUTQPVF", "AL9QWFBS4CFCK5BZ3HRRTR4SMND3EQAY", "L5X0T63D9B1CA87AQ5ZJ8DWSRQEJBHNN", "CQ1OILF7NNSR01SNPDNJ11ZHJEJC2UC1" ] - }, - { - "Id": "401", - "RandomData": [ "YNATHT1E025UVE2Z80473EWL0TFECDE3", "L03N18F5MIS95EWEMTDCZF7T1Z2YOWCX", "XCJ4LO79U8UVVWQV7A1S9CDG2JWCGRRZ", "G5L25137VER1UM8EJG1N5TXV8DCB253D", "R4O0LX0FH465VMVPLR390D4WH031Z1E0" ] - }, - { - "Id": "402", - "RandomData": [ "KOJ07I3VQVFAX2AWSWZLC3MN92SU38QP", "ZGUGC5SDYHTF849OZHJCC3YQB60FZI1R", "E0LQI3TWEWW4KHPF2E4WZON6SDFGFMNQ", "PBAITSG6XW8QG3F4QUMVNF20MO8EYNR1", "IGOJHHWJ789CQ7ZY7KZU92CKJJ5EUBHK" ] - }, - { - "Id": "403", - "RandomData": [ "EGHAO6XJ7CXOGZKPYKGNX72PEEA7LSZ6", "0Y7KZZKBXQX7EXET9QPJ44XHN26J6Z8P", "N1XR1AZ9AFZHJ5KQAQ75CPB6B0673AE7", "SHTN9W180PJZEP7SRPJQ2CM7Z1QBE1GA", "B1ZCL7QNY9EXFM1V2NQN0YFP5WXIGZ48" ] - }, - { - "Id": "404", - "RandomData": [ "JJXM05HU85138Z1N94J1L2JNWJGYJIH8", "EFN6YP46F6O46MQG5JILQDXRAK0QYTK0", "Y2Y3M5ZU9NVPNOQJ3A2995SBS55NYOHV", "VYGEYX4AUYMDRHEV4RXY0K02JXKQ9L5V", "F94ZIMVFG2OLTPTK1KTH0T5K7N4ANNBJ" ] - }, - { - "Id": "405", - "RandomData": [ "208RNONR5SR85PJ4D9ZY1Y5VET14RU23", "1FT2RC7M7BLIC7OSEA7NYMRD5MM3XSAK", "ZXG05QMACM1ZMXSHEI0RXPFOXP7EZDYO", "BASO0YWXX6KLV10I3FZO2SXKS1CQSHK8", "XMYMEEQQWC30E335YZKUOKWSMH58VGEQ" ] - }, - { - "Id": "406", - "RandomData": [ "VLXIDODZZI2ZZ7FY7H1360UNZF97IR5Q", "8NE2GV1JWV4FS73PBGBNOLT51KS8PFRH", "NM1L3NSMPSHL5O52MU5BQRBW4JB6C33Q", "DX2GGRVYYY86EH9MO0V5JP16KERULWJV", "Y0IIWZW48HN2SFSXKYRMH8GY655BABMB" ] - }, - { - "Id": "407", - "RandomData": [ "ONHN900ZE17CB8NFV3JXE7N0TTM03U37", "4LNF7FYT82IQBEW7S0QG1Z7Q9R3PN95U", "79H0VIHQFZYMZ7ZP7PIDDXFFO6GQLIG9", "6YSB66LKS9ABBU1C2NR802QK4CLYC1E7", "TZQBOXTBD8VDWED3FDX70IIEHHH3UXI1" ] - }, - { - "Id": "408", - "RandomData": [ "5DRME0XE4Q42GMXZ8RS8DHGLQL3HQZQP", "03ITW1ZPQTDKNQ75TR5CEJXX7G527QXE", "9OBNDEDG2DRUD67AO7X94OLQGUVQ67RA", "58K9OU1POYKB2CTBI5N93YKVDVGSSWK5", "WQYFV8W4GIVGEJXDBUHATSHHYZ52NI61" ] - }, - { - "Id": "409", - "RandomData": [ "NOPLNOPKIT3VCER37DR8PJLDJRR6C3R7", "L32Z4MZWF62AZWETHB4K07LDDLB67SHO", "C5JIL28VN52SRLOXM7ZA8GGOSYVTK3ZW", "ZN83N5HPDJ75F3W26OU93GP5Y50WGPLU", "FG3EMUKQZJ7ZJLIYC3W5J02S7CESFVIY" ] - }, - { - "Id": "410", - "RandomData": [ "8N08ARPMEDJUI0WNWBTM2PKPNKGKP2LE", "AJ06UJYVOK1FQIKGQ15DB65TCKVZLF6L", "2ET99Z2MN88RXF8FA93Y6HDENH4JY8KJ", "OPNLZKH08T0C7N57MQZLLHPUBOV15TXO", "YYDI1WPZ2C0MRBGAM77IJ97GA3KKZP5P" ] - }, - { - "Id": "411", - "RandomData": [ "5MNJKXFZAASJRCC9HVP8VPFZ16H8MFAM", "HKRFX7ZY1IHJQXY70KCDA64QHYSNPHN5", "9FCHV7MK50GNH5JDIKHBC6MKQA89PMJU", "5MJKVRL382HJZQILPOFF9L2D220U8M4T", "RWR4W8R08OCJYDU92XUAGEVTTGR3115V" ] - }, - { - "Id": "412", - "RandomData": [ "8Y2D9NYQ7OGVITOZH01K24MNB8LQQY8H", "SQLAKRAO9DD179KA11VA9U3DLPCACHAI", "Q9C2HOPZ0MLY0UPBXKZYC7H8XHY5P9M1", "C4L77S2NM6KWIEM09AN1SMFS1DEAZTK0", "AUW6JREFRLLGXV0S476OWUI0Z3F3N2X3" ] - }, - { - "Id": "413", - "RandomData": [ "WUWYSQRR6IKGA94GNWF1X5EPL5GPLK1Z", "YSUC9BANQOSNKC0089P1W5F0QGMXKCFV", "QUSRO2HMW2LIM0FJFQQM5AC2M3W2ZNDN", "I66ZUILG1DF4U6NZADS3V20QSZFVFPWJ", "Y79Q3PZ6FKV25HIPP61V5K1QGQG4DZAM" ] - }, - { - "Id": "414", - "RandomData": [ "Q6GW776VOVXLH8VKRZFIXBOOFTKNI43P", "JJL9BVSSAGHJWQIH56MOU2YPS1QNWTMT", "1IC7WWI6GXHQ3E2ZLCRMSP5QV6RKEF5R", "4YSOOKVJXQH6UHWN91CUB9AMNVM0E81A", "20WEVOLARIZCH86NKDLNDKP4XGA274EY" ] - }, - { - "Id": "415", - "RandomData": [ "YGE3UR1UPBD2K8EOY9QBXN7RK1RPNSCW", "EANA3C23L07BHXUZBWE8OCBLJXT29MH7", "9RYJUDUWGX07P6JXH1N0OEHB9C1GT938", "SAB09KE8BR11ME5MN6VI8QS5JWKRMOCG", "31OO5TY7WPZ6MPZ5HP3XOVABRGQM9WWX" ] - }, - { - "Id": "416", - "RandomData": [ "OU7VZQR3IYVS1WT36PK6UP2I0M7YDL79", "3CR1SEF089P09RK5XWPUMZC92Y4MT206", "0VZZE1L2JU8UABJJCBBQ5NXE9S83J3HF", "JS9N2V15KWK20R80PVKR1JBN8UZV2STQ", "M2LSC5RQKGFID5NRUINYTZO9RWPH5FC1" ] - }, - { - "Id": "417", - "RandomData": [ "D3P7GQYTE3HVD2KCHHBUF46WOLAPQJUE", "DOEJPPLEU3U0S35YMMAYERWJ62T5PID4", "ICRZXBX166ALJGEVPLDDJ69V15MW6QYL", "00SPLGBLZI2HRL90Y7PDF9VLC581ZA4P", "IZVTYYJJK1OAE1EP5V88AUF0FGMPHJWZ" ] - }, - { - "Id": "418", - "RandomData": [ "NM920QC9YG3NVUHL1S6DB6PXT4ORM3BA", "FZW12MZPT8K312EU9BYYNSXR6MI5BUX4", "E2H67PSP3QTCVW51Z3SKEMXWBF4PD3N8", "LPY8UIWTSJ568U5KRRFICNZ1FU42VDL9", "CV1G76GRG815R0XQJT8VXF58Z639N47P" ] - }, - { - "Id": "419", - "RandomData": [ "854N3ZNULYBEV4KO6OTBFZM7Z3QADGDM", "AM7W6KXUGNK8D1M4WOC9K6KIT6YAIMRE", "VYDI7YSW1851ON37QWOYEDBECYC9WXM3", "6GNOYD776PIMAS3GD0TW72ARX8GJVTAD", "WB4I9OJMYQ2Y5ZDT4555DZ6DF61Z7XMN" ] - }, - { - "Id": "420", - "RandomData": [ "PEZ9YVGZRH7QAMW74WOZXEA6F0CDXTOA", "EPI0AE5JZGO62PC3J35KJWZKE237SDB7", "26MVD5701FAQ0EE0YI33YE1SZ8WHK80V", "EQE5DQ0N5FTDVITAXDIJJIJYE36FJZP2", "OPMJ9IXHSP7TUX7QOWUHZQM6HQ0JUVEG" ] - }, - { - "Id": "421", - "RandomData": [ "Z0ZF6KAPQB13L0DR5P0WFHD7CPCTRNW7", "L13381UEVE1XZSVQMJNE4RASX1CQHR7C", "O3ST7KSE5WAAQPIU4WGH9SC30KGHYD6E", "GYJ5ABTC1JJHR9BHTSWVK0C60Z3WDLP1", "Z642GMU3CEQ0I5M0J9YFRL4QVMELI79Q" ] - }, - { - "Id": "422", - "RandomData": [ "3RRUFJAG83SGJMY5NCNEXJKOCNG3IIVF", "FA60N1V98RHY2XGJYI8FU43TGDS1DG8Z", "IMBJP7SVRNFFCWVOH7F9KPVKHNTJI361", "TRQPV6410MYGYXRURDUGB8O211CCNIMX", "ROVVGF3KDOI81OVT692FI0ZUCXY441NS" ] - }, - { - "Id": "423", - "RandomData": [ "9AZKB5NMKKCX0QBMFTFOQHO0YBSTR8QL", "A080ZKRAWP48XC4VWLYLW9B1V8WAN45M", "41W9RKX5BF2ANQDVG67FJEZBZGE0YRX1", "USD5P5ELX3JQGAOF5A3Q7ZCZCUKLG6HT", "RAQ5MHFL2VSQ5I4Y295XXH45PO35V3E0" ] - }, - { - "Id": "424", - "RandomData": [ "WZ8GUT2X5SXLHW44ZVSHBT6KFVP8OK09", "Q13FJYDJGI2FTTX3U9F9K7ZC3YA9D4JU", "2X4P2ZUBSJB3111W7WOOF0ZTC1LVXEGL", "8HM5YIB4PERB66KC7OBQQ4PB8LNAN8NN", "DZ4TO57YVT9AJXWFQJYJCZ4E2K6N5ARQ" ] - }, - { - "Id": "425", - "RandomData": [ "0D8GC1XBQM575O2KYHUDKEKN5Z1D8U3V", "BTKGZQDZWW2Z46JOSVZYPNFV2UKMATD6", "TK5LDWVHD5RXLUT8QMVM5FFXNYNFF1YC", "T6GUA7K6ARUU6RKHBM5X80AOEI7PIPCM", "GOEPO97SCYLOUU15OFE35BE352P295XV" ] - }, - { - "Id": "426", - "RandomData": [ "PIORN43BONVJOW3TQBADLIQEKLTVTESG", "B09LGJSTMCOSQ4OJ85L74UJG1JHCLHSJ", "4OIXXSNHTQ1I48YQ6JXY3UMRR3T6CPIE", "UEXCW0VQREOO3AL3V0GBT3QJC0G48RFE", "IWYZKW3FXHGYG8YQR0KLJGU0YOA5U1RA" ] - }, - { - "Id": "427", - "RandomData": [ "8JFGMWS97ANMX1CEC0NIG45CB7A6W8V6", "0F072RD5ILOI2IC7M533OJ4EODFOVWN8", "ORWSBELUXS94PWJ35DT0E2RQLVTZMYJV", "8P4LVU5HUIG6J9Y13LTRCX4W9FGQVWI8", "IN6A28HKIMF6WVHM625AE1TKVHLQOPW8" ] - }, - { - "Id": "428", - "RandomData": [ "AHX5CY85EJJ0R8AO74T30H3Q4WPUX062", "0G5O7MJH3955S32XH6ST52H2OHAQJNIN", "NQAKCWQVUL91M87B31N0IM779D90L38P", "1SSC3RUVP78T2QQQJ9WRASFASCL9W0J1", "NT93P5IMG2KLNNESXTQMGRPINRT0FV8Z" ] - }, - { - "Id": "429", - "RandomData": [ "XHGJQWAN1KKHI4XF73MDK7U6D1Q8MRGU", "3VXGH5BASCU6GIAS4O2MJ5O0WKFZFBBJ", "EZOXGQ7C1LUHMXZ507E8Y3L7G7T70M4R", "BK2Q3NMNQ0V8LGN9UJ8H7DVLOQQJ7ALO", "QDGB5ICNV1R8HMW9UUMRNXT7ZRCN6DPQ" ] - }, - { - "Id": "430", - "RandomData": [ "OHRI9LDMHUWFVXDB4QZMX4A3TIMOGZRS", "LBTA5OAIRAK3AOMCNASPNC3UGYY09YFS", "DD4UEDGPQQ5WUH2F6JAFGCEIH93HZJI2", "42Z7T28K4D87HG985T4ZYALB8VMFJ9ZH", "ID12R5VDL0KCDHBB95LGPTD3QY88Q2A5" ] - }, - { - "Id": "431", - "RandomData": [ "N1YDOHQ970N70J71UKFOXT2Z97L37XXT", "ZPZMS8W1OMJYFGDG0GOFWWI499DQ5XCK", "D4ILUVIVYO9KKDT34EC0JR6CG4NS4F51", "K8VK72WF82RIW7U5QJW1ULBV8FEZIZ1S", "TIALSJ5BR72QAXPJKRCUSEG879M2Y76I" ] - }, - { - "Id": "432", - "RandomData": [ "B8ZO6IMHOVJWTUUKZ4O0XG9OCCNS6DNU", "ATPB8BNCF5G75TONOBC3TGU48KM343KK", "HYWAETMYRMV19BTSYAD5BTA48VCYZTHL", "V5ZG7OJ5YNMHU34713F40OJYY1BTQY98", "EKGELNUK1IGXH3KF0F65NMVGWBRGNZPA" ] - }, - { - "Id": "433", - "RandomData": [ "ONCKW0VNI5DSIVR5R53K1DU2ZARK5O7B", "2GI309T9UTWSJC8ATWZR6EJL3KVWJLS4", "8BZBMYFRL30IQCTWBQ0IZPEX77AQO70J", "A2THN6X5RHFDOA4018U2UKES7CEPYZCO", "CRIYSMJE251RJBJ6DJYPM8ZZXBKL1IG2" ] - }, - { - "Id": "434", - "RandomData": [ "E0A62GHPZP9YTXI52IMOAXCE2SARC7MT", "Z8MTAME6CJZ68AGA2OST622RY6EJF0N2", "CP8UKZ4QEPM07FF1MAZXP3X7G44DI41L", "673SBVZCTCPRPBTT0M7FAZMJ2BOQ51IK", "YA3ALXZ0LWENOFRELLN56VLHUU0AHJH2" ] - }, - { - "Id": "435", - "RandomData": [ "4F3PITHDXH4NV95WUJFTNMNCZWP16ZSB", "PLTIMC61EJIZ07WVYDP7EXOR10ZVEQH7", "Y28JQWKSNNPEEYL193C3KV717BQVMKWX", "CKA89NFC37T0IJNDO7VKNNXD4GMPFYFD", "01C3XN2WYA9MBHSXXNGOYMJYX7D2AZ6E" ] - }, - { - "Id": "436", - "RandomData": [ "1Q9QHUPBF9VNNKBXXY12R1OOROG0K9V8", "D5VUHBQD7FJZ05KM5PFM8EXACV93OZ0G", "NXKSZRPVIX4MSZXVD3444JA9HVSWCXZI", "ODMDV1XO9TDKKLSM7NZU46LDWLKD83TV", "8V7PNUAMFQ4LFZZ6CFYZ7ENS1IQKQTPG" ] - }, - { - "Id": "437", - "RandomData": [ "ASMYND9NNNPOBA77VOB3E3X3IOXEDZ5V", "BYKXMAS9GLLUZ9R0KTYCSWBG4SQ8P4JY", "R3NMZKUU5BW3SDEI764UA2DOWE23UUTL", "BXC5WEB98DHQ9IY1OHBTAZXY080VS0AL", "SK14BJW354V7VWOOQBPNTALLANEXOPRH" ] - }, - { - "Id": "438", - "RandomData": [ "D68ZQ30FVHXGEZDETLFRLX2S9P4XE8PP", "MO4ZYZ7XLJ1LMEHKKAECKA6QEQZB8CBX", "1I3Z5NP3OSFB5QF4HTND4NFMRNVIA6YI", "IETELRP6UKY244UXK43OZ72OCQIS2H3R", "37206BT0EQSTZNSX277FDJTLLFB4J7DN" ] - }, - { - "Id": "439", - "RandomData": [ "QG87B31JLDKIOJZZ8UZ4JXOUNRP19YQH", "NFDTOVV8GY4A9L7CQM6ZHID21OTUOAJW", "WC5IFGKN90YV3OUCUNKX209ECK1ABAUG", "OHN6QY6KBS0RUR9M3QABZW36C0G5OKL8", "GSGVBXW5QAVJASUULPHV9SQ1OR4ZRB51" ] - }, - { - "Id": "440", - "RandomData": [ "H1LBKNLF3EVYAU5TGVT9CZ8XBPHU37NO", "F4CJHSJ8EB157213VKS6S6YR2XA5F0L6", "0GTGSVMXMV4B8DZJXN8TOR6IFUQTSN2N", "05E1JUL984U7BXTZ80H112RIKKB7F2F8", "2RKD97ADC8VT79GRB1V1FAV7N5R8TO4G" ] - }, - { - "Id": "441", - "RandomData": [ "ZVEUMQ0A0EZ2H8LLET6OGO215MZDQBUX", "EP4M4WEVAUABL30PUG49SQ9L3NZ90WUY", "UBY1E8QROLNVN0QCWKTKHUFYPSSQ7E4O", "ALRJE8LVZMUHCN7C6XNQCJQ96AMVQAUJ", "Q8VBJG7X98V598VCVPTK1NM14RNDWZEZ" ] - }, - { - "Id": "442", - "RandomData": [ "1L0D2630Z0RDYV97OJAAQKSCW4G134AJ", "36DYISKYW3VA6IDJSPYMZEJR2XR8ZB64", "ZHJ1SKZ69LNWZRFN07JNFXUZXW6UBM8V", "70LZ8L1H02NN0W1KRDH22TZBXUE5OE5X", "M2Z9GQPPGBWNKG9A4VC7EG2OAJBOH53V" ] - }, - { - "Id": "443", - "RandomData": [ "6ZA772EBX1W16M1QVDB2C7SG9K86OBIK", "HAQUFBCBQBJMTBSYSU2D3AT8G48W4HWW", "TLT55GLUB9LAXFW82JO4IERGRSNLDPHJ", "PX3ISW3LJIC3ZTKBIA4U22OP4MNM2ARV", "1CVAMOPFQDU9CXR7HMCCVXQXINOGIQSJ" ] - }, - { - "Id": "444", - "RandomData": [ "1RBW8JY4UYDZHONG4QFQ7O9EW7199J69", "ULIUV597YIS7T0P4AHL2LCLNR7AARZ4L", "1DE5F2V9QH1Y5CU5R7827EYS95DX59P9", "OHGPWUYIVMMEKXRPMESU0BNXPW6KY7ER", "12JY6FJ7J0GV2UHMOYL0R5IN3TAAYOTX" ] - }, - { - "Id": "445", - "RandomData": [ "H4MSN2TH5ULA4155OT6AWNA5T64NFJJ5", "GTN7HZ8VED56UISCYEVESSB44R8R7GCV", "LQ3LN7XYVK5SRDLLO2ZAXFMYRTC00RY8", "BJVEOGY0R7THWSM0FXCERC8FDE44578D", "W7QHSH6HD9S0VFC8GLUDOTR9LPAJM44T" ] - }, - { - "Id": "446", - "RandomData": [ "8PVZCFI805BSTIU8C5XUM4ZDPR6DGW4J", "E81GTM6BDWMSS9QC5CHRGKHD0SKUIF1E", "A1NUQNOZ8WR0SGUPB3HDPNC41XPACL27", "4IS0W5WRXRSU3RVU74TO7YYXYT338OWX", "3T5JY43FH0P74SBKB5CI2NAGT5BDC2TJ" ] - }, - { - "Id": "447", - "RandomData": [ "450JVL6DBNHHI12GRS1CLO4PTZ0220DO", "HGC911Y099HOG272C5VTAQ8QAL06VDLL", "K29CY2O04BDMHQJ01706ETO0HW8QB2E6", "Y5DN25EJQ5Z9NWJTB9EXNOG1OJ4C48YB", "7GYLN5763QQJ3PNVNOPCXRTJZL9TACPS" ] - }, - { - "Id": "448", - "RandomData": [ "GXCG87GGBI3787795JZPTWOPXOWB5N51", "A7CGNHXPIIAPXWL1OAX0MA9UJWSTLEKY", "MC6B41WYWJGKW82BD4X5ZFOA7S60YDDE", "8MCVZK6WO9ED3Z8K3QQQQO8HX6DM45AS", "FBLK5HM27AR0ALGITV7HWXXTO573HU1T" ] - }, - { - "Id": "449", - "RandomData": [ "9V72NXPVEXTQ7HHLZ42J725SN16AJSVN", "I71OOO56GLC9DHWGYVDM1SVG0OOW1OMV", "BFH9P27L96DW06OGFZLXPIW0MVY99IE1", "9Q789W05Y1N4P9Q3AHQCCYG2TRX4E8L0", "2LWJ8QGT9P9X51KNF4922CYKKEOR851Z" ] - }, - { - "Id": "450", - "RandomData": [ "PXBDMG4TB7CWYS71HKZJ9T70WL94CYUD", "YKHI0GA89P059BV1HWKYGRZ6ZLQAHAQM", "M98OKYBAJ1JT2C0V0HWPN67GULTOZA09", "8OT9DHRSUKPOIFDWU5KAOB8QC148FXKJ", "AKVOT1RS0D5CQS8OI634Z0V7PC6LMSM7" ] - }, - { - "Id": "451", - "RandomData": [ "AFO7UZC3N1JKF59U3P0J4QTJZX8Q4GGI", "17CKDA3T39Q7QL1UDMR61DDUWFI70V9H", "VBSH3YR2VHP49V2O5ONRYJQX4RY8262H", "9JMO2T0O5ZLTYIUAM4BMISSMV5NLAS9Z", "PH40JNWMX9W9868W6XW85Q9R0A36GOOM" ] - }, - { - "Id": "452", - "RandomData": [ "ZVERN418IZYI5TOY60PM6B38HN9JUZFJ", "UJJM2RIC6X0G20VHVF9P9CPY2FJA4ROS", "TOYVJB6PSNPJKWGQ12XP0ZKS4UTWHHHO", "JIWNCA8TJT7WWGNF83JC4824EF1YSJIL", "FA9C93O13DGG2Y6XHOXO8FUKP2I7IJB9" ] - }, - { - "Id": "453", - "RandomData": [ "LVQVHKFFPSI12VBQJDRDV4NAQYWGUQSU", "BG5GHKQ6IS8Q62R412YE28OQIQFSY8V8", "9YZW04I8XU5D56DXH2P22N2D1O80F8IJ", "7AQID5D7TZRHDLVLNRL5T3GV5W4M6R3Y", "MVG5Q4ULZSIC6UAQ3WNXXN0E45NQA1AB" ] - }, - { - "Id": "454", - "RandomData": [ "624RFZ5S69FBUDYKWNTKEFB94BAUREL8", "RGGD0SLD040XHZT0GC4WH07015WDZLB2", "YHTO7VUEBQUJON1FSKOOJY01IPM45IOO", "2899GF3VRZU1GXMNDRUO7WSAQ1FRJ0I3", "CFQQO29NQ27UD8VVD80OY9RGP9SO9MM1" ] - }, - { - "Id": "455", - "RandomData": [ "R1ZAG59LRH8EZ87SGUNKA4FCXKBPJUNE", "QFDLJUOI9O6QANQQBAIP8B1WWWN63TC6", "44XT5VIVFFKV8YBK4VNIM7FPOQYWHSOQ", "L9WGZ6UQ1XJ31FY7UCBIG4U6YIFO7WOX", "14J8C5U7A7QZXMXI20BEQFJROZRR1GTF" ] - }, - { - "Id": "456", - "RandomData": [ "IWC66Z5ZREIIN5IMU6WGUJHVU1TMNDF3", "OKQBK1MD5LWL6AETRE65TNU9PQMEFSLO", "9O4COHC3USKIX5YTX95JHKJBZRV3PH7M", "AIMRGBFJCDLACMLU12RFWCGZE3M7VINM", "V8IOTGNV4WGD9I8NFBCW02Z7BXNMZIY4" ] - }, - { - "Id": "457", - "RandomData": [ "Z8PED7BUP5LA6DZ5481TG1V3IKM53A6W", "7MNA34KIARH5QYB87RR0QEX8NW52UF1O", "9YDT0ZCAYTSYT0MTJO8MSGF2YOXG8RX5", "0352VRIIORB7W8PWJMTFHO53TK4LC5BG", "5W8Z4U81G07BEHGZ9A7W8SYL8CIKW6FT" ] - }, - { - "Id": "458", - "RandomData": [ "Q5C9AZ2ZO18QQ4ZMEFMC8OIN8X12MXEK", "UOUIEGZJHHIGTH4EN5GRUDUBWZAN8AN0", "WY6CJQH7PD40GB402XOQQWZR4TVPGMLH", "4RT4L257YJCRI35V5KUKV7JA8OIZ411C", "2W6YR9P92R1HUIIAYAU51AW6HT56UFC7" ] - }, - { - "Id": "459", - "RandomData": [ "SAZW6GE54VSDFCP0GHB4G5K1AAQ7ESPX", "P4ZUTWDR6ZAGSS0FEF0MDI0WZ7V60G1M", "F5YLN5HTET8R4DJRJL391CTHDC4VAH1Z", "8YBW3P2I8HITJJ2VXDXPN2VCMRHKBVT7", "2ISFCWY4SUBU4974JJ76TMMGD8KMHRHM" ] - }, - { - "Id": "460", - "RandomData": [ "XK1B0WSBP2620AIMUMA2XWNQ6MCELLWA", "NY6TH6EX06Q1PUPC0724RPZB7KENTOZE", "G5OCEYEYINC0FWBM7AONT2T885W711DL", "GMVTFM8B2EWDN85LJ2PTALUNMQEICH7Q", "K0T3BRGVCMUPFQU9AKY8LUL51HHZIZ8V" ] - }, - { - "Id": "461", - "RandomData": [ "GF3WOBK1W4QX0FI55EI1T8FZPYB3KRMN", "N9IAW8V8A6MQDXEW9L3ERHCI9DH0AQRE", "SDJ17HI7SK0WWZW1UP48XI6G7AAT148U", "PH8AONZ1D6VGQPWKRPGUVTRKHC36GZFY", "LGHO0VNH0D50WZ0SOZBLYN950Y2LT2UN" ] - }, - { - "Id": "462", - "RandomData": [ "075KHHU5B84SY0XSMLSQX398GLYC3CX8", "SRAZ4PKHFGKZTRH9BK8HJD0686D6SRC9", "L69G08Y6BLKRTJOZDZBTDQYO1D17MOYY", "EKOXRBJDVBG73INYSN22QS64HVPXG1UX", "XWNJ41ICP87BK1VS0CO9V5HVOUP5WW64" ] - }, - { - "Id": "463", - "RandomData": [ "RTKG5D40E0NSV4UQA67EMUB1P25KLMQ3", "CCT1RPXWHY45SZ9T995ZY1R7ST0DIUO2", "JTQSL39VJK7Y0FI02MKMR0EKUWJ7YUNX", "JCV9IRIGAKQO43GMKAL6KCKTOF7YTB6Z", "6JOXTJRKEDLGJ0Q1P6XXIRNH1CUCTTW9" ] - }, - { - "Id": "464", - "RandomData": [ "N1RUOS3BSA2G0EJXZGIXNJQP6H6QYO1U", "QM3RJ5M6DVEIZGQX27NNK9VELCYHWMND", "IH0NL1N43MU1EHZZ0JY0BNKR0YGHGFK0", "IA9RQDMATTU8P3AEM8QNXWC57JWWVGXX", "B3TDHHJX6XHS3LC7XB5IZ7DV8EUGQZPN" ] - }, - { - "Id": "465", - "RandomData": [ "566VJ77EY2QAPTCVHZ8TKP8E08EDXDGH", "I4W6OQX0E0T6QCGOB89105CQ725L24RV", "VJ1V6FG0BIOU5BXX1ZBYDPQM1G8WVL7K", "J7KHKUS51IZSQRU5EHTD22SF2P30HUF0", "KEL81QMHHF65075JVCRN14RQPEO501YH" ] - }, - { - "Id": "466", - "RandomData": [ "D9HMGWEY4M6X6XP5TTEEC18QW4SWBRQP", "QZ11ZSC972TP84T2ZTLHXUELA10MDSXN", "6QGH5YFARFGJITS1K07SFJ25UP08205P", "FGSRXM6ANKZRO4DRJ9BMVFHXYLWP7GI0", "J0EBAAE836E4TKRZLJZ3YS3A853MZRDH" ] - }, - { - "Id": "467", - "RandomData": [ "C8HX0BRI5DTZBMDN36DYRPB16DDEH1IM", "262UD49K2R8V9E9W2QT2NO0W7Q0W8MBD", "4G6ETTJ87369RQ12EQM1IP8OGGXXEMLP", "Q403I5CJGU5UR0EQZ7SR9J5PIR7M5W4U", "SRTXZ8UIODVXUO6QCG7G43PG9LU07ZNT" ] - }, - { - "Id": "468", - "RandomData": [ "0KBAGR10NJD6YH43VQKYYX0YBNXON3KY", "ZB6JM5KUPH2UZTR1Q1FROY4DUM923NNU", "8PGWKVRZG0JR4F9S667WY3JBH3Z96R0C", "3IVKM4Q5KPKYPMIONQ67P15FFFPR6R2Z", "9GYVTYFBPCMITVV4UKWPU3XCNQFHO982" ] - }, - { - "Id": "469", - "RandomData": [ "WUYJYW5YL5SNPWVUTU6W5NEGTVIDT8WQ", "DTV86MG8P7EZKJX04VX3CM7JQR0CO1FN", "IBK5AXXHO8H7IP5J8SI8K2N0VMSOWDTX", "20RI810G7QPEF9ABWQE6SGDPYUJYFIVL", "OTFS8XKG1BA3NJUVLQ2F8XEVXBUOSBBZ" ] - }, - { - "Id": "470", - "RandomData": [ "5DZV4SD9F8EQGJCP9XNYPPN0PU46C6Y0", "AL8KT812N3A9TXPN9EP4YMJQZ8GKYG6J", "KNQ4L15A6VKWOOH2ER77Q4CYBRVU2QDH", "71ZFHUBHJO7DBXBL1NFHI82QL223GKHP", "RDZXYBVUP0YC68WOQJ3PL6889J4P1HB8" ] - }, - { - "Id": "471", - "RandomData": [ "HRW87OWZ2V1SK0TMFON6Q2EUE0YPHG2H", "YZ5OMYQCXEWZFQYJZRJN4ERONB3H0GRW", "3T3U5E9R7LJMGPOYCPZ06PNUIQBK4JLQ", "W96VWDNUR2QT5FI8XFELR10OGJMOCZWX", "92ZGS2B9BEJD94YCIDXYFA95JSPN09S2" ] - }, - { - "Id": "472", - "RandomData": [ "F2TDPCP4EEKMSWPMUJG9B8R8346AMXIB", "WQ8GKVXGY2UA0XNXDD2R3S0HKVJVFORQ", "6IZBXIB9WAKIORIFRJ7J51IEZ15YLCAK", "KDER8L94B343IR23NDD6RIVEAUL6MMXU", "9A7KM0HFJCHB6P5H8CLH8E3CS9RN9DRY" ] - }, - { - "Id": "473", - "RandomData": [ "GK3HUSRX68WOBUHUZD8KBPV4H52MI4FG", "VS4WVYXPUYLASOB826Y5FGX1Z89Y0EOB", "2P3SZV9AQS0MDVM244UMGJBO5D7WY9ZP", "KJHCVTIG7XPXQKXDWH46UC5SOPXVYMMQ", "2KC4NJHLVNOS4O7UQ3ARF35HNZYG5WRV" ] - }, - { - "Id": "474", - "RandomData": [ "L84GH20M9TKGXNY9RCF5L4L8O5QYVAP8", "53H5T0NXCYRVSYUAAYY3RWJQX61MMC09", "DMK4G3Q0ZR2XNZQ0LPX7LVQJU0HX9ALA", "7SRGOZ4GI8EA3VD7QBB6O3XS5BJPV21Y", "F205IJLVUQZNRQP8XKH79OVE49KMQPVP" ] - }, - { - "Id": "475", - "RandomData": [ "HQ4B4IZGZQL7DKBPWK2KU3Z1HWAI98FF", "5JGBWNEPVBITDXAU850FXK5N0D4IHQG0", "LGC4DA3IGMZTVGXTWPKEI9SVO2KTT5HF", "4RI6VFQ8BS8KVM2UPKV2GCSLXRPLZKYL", "FUYD818Q8MCZBIAC9ZDIJP8286IDZFI1" ] - }, - { - "Id": "476", - "RandomData": [ "3XEAYYWXMF3492JPRNMAGQB0V5EBS403", "DK6OD9OKCP6EVE3GX3WM3HVNVOP2UVFR", "OA0Z65LS9B70U6FRC8OZIOA5YT2ZTV0R", "KOZUNEK1REM1K53ZI80VHQJ9A4ANDW8N", "LPQFGUD7YWHECIV3ZDQV4FK3F0UTD7Y4" ] - }, - { - "Id": "477", - "RandomData": [ "F8Q4PXSY427UIE71JHXAGMTFFWAQAU31", "8N8D10NCV21BHZVA22J6KYY3PKY3WBXK", "8GW5G49S3UPNVR8QBAXIK7RKYFXRBUQT", "EQCBCZ4821DZIKH8MI2VNP9BZMHAGSQJ", "D5JEO6NLGYQS31BN8YE324FYQBMZR42J" ] - }, - { - "Id": "478", - "RandomData": [ "L4VNBDUQ5QPZ8RH7L3CRNXQJ0UXMTX3M", "6GH9FYM4EY8MOQ093POX1K5YNMXQPH6H", "WD22KI2XRHNYYE4J4XTEJGUWLSV3A5P6", "200KX7ZVW1GU6H9JRNW1Y17QTGR1W9WW", "1R57OTV688RS9A0DTMLXJXIB3J1RQ88X" ] - }, - { - "Id": "479", - "RandomData": [ "EU2OLB481Z3ZJPQTQNIJX8MEJ4EE1EP9", "94NPHL2RSN5T4S1O3IBD0Z9FHYFQ60GX", "J30PBALEU01KD3K1D0KTDLJK4IITFMU2", "GIJA1MN266T97YCONNNGPWU8TPV3218I", "F9D4TJ91NRWG2JMFF4F28OMUYLQM0UAF" ] - }, - { - "Id": "480", - "RandomData": [ "7K48VH5EOW37ANFKCPX7WGJ1WTGH2XA3", "RRJSPOU79BNMUPUKGGJK6DT0BDMBBXL1", "VAQSEW4Y508U36GG96AWNZ6N8SRLBS6L", "0W0U9BFTLUPGE87E6FBFWZN6DCUVFTXM", "3X4GGWG70RK3K0JAVMO5Q0YAJ4Q7RTN2" ] - }, - { - "Id": "481", - "RandomData": [ "7CMRD08K8EPFOUWN2UA2E15C837MGJQG", "DR5HN264OE6MLSVZHCE7TVYGGJTK3WDZ", "XIC7YP9AYGO94T1PHIEDESXR3YBDJVA2", "AHZDQYA2CDJMHYMXSDCVRAUEVUD9N61C", "GV8W3X9THMABJLKEMNVFTOLAXUR5VAOG" ] - }, - { - "Id": "482", - "RandomData": [ "MHFVZ034ETNF9T5KJ8X9KWS1K89JGD8H", "74YCFZPWU0BABGBEZGVWNO50YOL10TYA", "UGHE43FUTAPUUS0D75U9SL3T88N0NX5A", "CBP496J5BBCN9LFGXH459YSJNYG5POG5", "EOSTC5EAVY8RIQTX3HCG39BNSGRK0NQX" ] - }, - { - "Id": "483", - "RandomData": [ "4HIU2VD2C3KK0BA7ESCHLACENEA6O4KH", "IKWBH84HEKD9Z0XRFTGHLIL3EDHYVGNI", "SCCPO9ZFX5DA6DPXRS14XD69937E1GW7", "75RXXHDG4ATQFL6BYUHCPTUPFCQVBUOR", "IFDBV19JPU9XTQ4Y66QH9USOKBRV1SEK" ] - }, - { - "Id": "484", - "RandomData": [ "WCH9H5P6U7X4T65ZI2ZFDGSYXZ1UJOS6", "PZBRI5QAQUWB7X4NF2M939GQTTMSE4WG", "P0P35OQNLYYTTQ194NORBSDQSV7ZT86V", "7QWGIBS1L9YFKW6C1MX0QEF6X8LKQ14M", "1DVD4U135XGB47G5Y57HLFF2KZTK0HKU" ] - }, - { - "Id": "485", - "RandomData": [ "FLNHB3IHU4538DCZ1PVV3XBV732FBRDX", "MW5TT945X0WRJM4GX3SKWZ0SJ2JIACFC", "0IQMHSF2U08CAULV8WRH92BW5NJ10W5U", "UT0B5S8EXZ061XSZQXJOU7D7H4Q4JOC7", "5NSQ3KZQXNUJCE4H5UKCNR9XQ23BBD4I" ] - }, - { - "Id": "486", - "RandomData": [ "X2BNFB5G720HN35C9J9ZD9UOO4ABQYPT", "SLVJDQC4YEEU01JW61B1EFFXHX9KA30J", "NGYBHV8THFA95AXWVOEYXXPNG8BQR134", "O5GTDHOK2SU9EG2H9MZVZBVZ1K5JTRBP", "LGU93DTNA35ECPJ9F4REBHFNJR22ME0L" ] - }, - { - "Id": "487", - "RandomData": [ "QEX7V3O63MV5FRWLB5EZA7NDAH0MK0A5", "CUY81LOMQULZWJH24Q1QABLT1T7NCCVC", "L03U3YTZR2JPWYR1A7R49U5BJEGIOBJO", "9IN5QW9F6B9H157CBFNEU1D141LYRLLP", "S5PNKVKN8L77UXJNGEGIXE3IFWBYLKXU" ] - }, - { - "Id": "488", - "RandomData": [ "0TZ6QT2Q59GI3FGGS7RNFC1OBHIXUVCY", "XMHB8M7XM0NY8VP9Q4GN2KPX1K4JLE5J", "7SUQ8EHFA4BPYDPQ1IHZPY5N7TJXSYLH", "4E0QA8BLXBN8I99X5ORD7G3JXHTP5UXL", "T4VUN9Q2H5COL6E7UV2DHIKXKR23PWQD" ] - }, - { - "Id": "489", - "RandomData": [ "NBOOOOK57Y5CEP70CV4J1TEKT7J6GXNV", "O9AJR0TFL7FSMHT5TC031HL46E4QFOYK", "LKXFOYIMCZ83NW8LOONE6T3HXFNN5C96", "J5HCUOQ54O1BIRRKFTC1BUO1QQRIL4RA", "ZBUSO61A7RJS128FYCIM9I5YQPVD6HU9" ] - }, - { - "Id": "490", - "RandomData": [ "61LH795J1C3TK59YRMUIWFAQF5B8KXD0", "7JVAQ1IZG8U7PMOUQ7VUXLN105BB779D", "8DVAK9H0D5BXUDB3RQSNBTDW64KV0H1J", "9R8M1OKRZ5Q1KZGX3IUROWBP99EPYW96", "D1YDEYBDFBXGDLLGXW1RXJ5NPTM1J42D" ] - }, - { - "Id": "491", - "RandomData": [ "5TYSBDTFGQMM85LYX72C4SJ36LXUMK3K", "JUKTW3FTDWLG7SOUHYEMCZINJ4VZQ836", "XBDOU1B32J9HGD5N6CNXFRITL6K2HPDF", "3PS6PA9PWKT30AHG8H2NVF0G3TCYRJVM", "F4O1U986C7B57O3KZE3AWZTYZMD58L8M" ] - }, - { - "Id": "492", - "RandomData": [ "YHX6WPV9J6KXD4JO018NPVZQKZCI6C71", "9YG016YJS400O6V4DYFGMU7DRGW7NNCG", "8TYOYSW3DZ4V49CNEHFH71PO1DIUK16F", "1U15HGGUCMCXZMIREI2FI5JHEJWVKBSM", "3Z3KIGG7BUFUY1ZP40QB8076KU17TVKA" ] - }, - { - "Id": "493", - "RandomData": [ "304AS7J7C4EX0YSMUH0TVROC16AYPIOQ", "KE187Z67RS9DVKGWBONM41PML1IW7VS4", "QXNV7TO5K2BCSKRR0OWA4CVTYPWGQKA6", "AEX76UYRASBCZM4BK05T8R9OC36R7IO9", "2FCNWTUFZFAMAT4LVV50OR7SFJ5CXHU1" ] - }, - { - "Id": "494", - "RandomData": [ "DBJTKQO0FZ32RWNS9U6MMYVLHTHNYRSS", "VII8KKBEGFUYXFBS5MDCKHOPQ8M1IBCX", "HLHINPIZT2FHD6YCRZSLOPHN43RM8J5F", "C6RL73EQENTSBHMUJJKTS1J2E4NU760K", "6AEHOMFYVBGB6ZLXR7CY9MWLXYHDPTSI" ] - }, - { - "Id": "495", - "RandomData": [ "WIVBCFF6EV8RUH6PS0DA3BKUO2T0FBIB", "S8OXDKUM1FUNNF1P21UYQSOU7BXKVP1C", "M78W3ILIG1JYR7GJBE7NRUVAU4ZCXK0L", "OSAQGFVTQMSYJ0DA4OIQSNV2M8C9TJV6", "A8J960C6SO7EB6130YHIBK2B6IEIDWAG" ] - }, - { - "Id": "496", - "RandomData": [ "0VYKQEEDLM8EPQ0PGII4BM50FICYV335", "N1NQIQNWUD7YLYVQRYB5OGEO07FHBPSS", "TC0YCKH04VJ7PGOQWWH618RHW9ZKKFVF", "VOFJ87NGRLA26G9USZUPIV0VUSCDU6QY", "AEMAAFSZIAPQ7ZLPAF1VUF69YUYP4KVU" ] - }, - { - "Id": "497", - "RandomData": [ "4L1248TNH5HIGJX4HWDPF5D5HMLQQC57", "O5VV8SUBWONZ8Y3O64HHHGP9I6USWC6E", "9J3LYB6YCB30RO6TS7TW4XZIPVNB8COT", "SJZY5S057SFFMYS39BAZSKJMTU5CX50A", "XJIHYIX9GYYLRU51CTB6BYAH9MEKXXHC" ] - }, - { - "Id": "498", - "RandomData": [ "2FSDQLF1NAT4V759YE9E3388IAHLDNMS", "RWTMB2K1OKTBFGWBREVSYDI8GU4PD4XA", "XAN8OT863HZTK63BNG39144ONVFR75YT", "WSOE3YX8GZZQNZXK03B7AYJ3G9U3OR98", "TG62SYIZS52BFNAY740E31T8JU84D4UZ" ] - }, - { - "Id": "499", - "RandomData": [ "007H351CULOF5HY2865T04F2W7S80NWY", "KDLOQ34CDYTRMNDC6F6H9A85VEU5M3MH", "Z0415JLEB2PCLXPJ4QBUROYJFQ3LI9ZK", "MM1VTMGW41GGV6T7YLB611ZKBUWOQ95C", "DFZ854ZSJOZZISYI65X772SUWRU802G4" ] - } - ], - "CategoryVersion": 7999 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/when_serializing_state.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/when_serializing_state.cs deleted file mode 100644 index cacae1aaf..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/Serialization/when_serializing_state.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Numerics; -using System.Text.Json; -using EventStore.Projections.Core.Services.Interpreted; -using Jint; -using Jint.Native; -using Jint.Native.Json; -using Jint.Native.Object; -using NUnit.Framework; -using JsonSerializer = Jint.Native.Json.JsonSerializer; - -namespace EventStore.Projections.Core.Tests.Services.Jint.Serialization { - [TestFixture] - public class when_serializing_state { - private readonly Engine _engine; - private readonly JintProjectionStateHandler _sut; - private readonly JsonSerializer _builtIn; - private readonly JsonParser _parser; - - public when_serializing_state() { - _engine = new Engine(); - _parser = new JsonParser(_engine); - _builtIn = new JsonSerializer(_engine); - _sut = new JintProjectionStateHandler( - source: "", - enableContentTypeValidation: false, - compilationTimeout: TimeSpan.FromMilliseconds(500), - executionTimeout: TimeSpan.FromMilliseconds(500)); - } - - private void RoundTrip(string json, bool ignoreCase = false) { - var instance = _parser.Parse(json); - var builtInSerialized = _builtIn.Serialize(instance, JsValue.Undefined, JsValue.Undefined).AsString(); - var serialized = _sut.Serialize(instance); - - if (ignoreCase) { - Assert.IsTrue( - string.Equals(builtInSerialized, serialized, StringComparison.OrdinalIgnoreCase), - $"old {_builtIn} new {serialized}"); - Assert.IsTrue( - string.Equals(json, serialized, StringComparison.OrdinalIgnoreCase), - $"in {json} out {serialized}"); - } else { - Assert.AreEqual(builtInSerialized, serialized, "different to old serializer"); - Assert.AreEqual(json, serialized, "did not round trip"); - } - } - - [Test] - public void round_trip_objects() { - RoundTrip(@"{}"); - RoundTrip(@"{""foo"":123,""bar"":456}"); - RoundTrip(@"{""fo o"":[1,2,3]}"); - RoundTrip(@"{"" foo"":{}}"); - RoundTrip(@"{""foo "":true}"); - } - - [Test] - public void round_trip_arrays() { - RoundTrip(@"[]"); - RoundTrip(@"[[],3]"); - RoundTrip(@"[3,[]]"); - RoundTrip(@"[{},[[],null],{"""":[4,5,6]}]"); - } - - [Test] - public void round_trip_values() { - RoundTrip(@"""stringvalue"""); - RoundTrip(@"34"); - RoundTrip(@"{""foo"":""bar""}"); - RoundTrip(@"[1,4,5,8]"); - RoundTrip(@"true"); - RoundTrip(@"false"); - RoundTrip(@"null"); - } - - [Test] - public void round_trip_strings() { - RoundTrip(@""""""); - RoundTrip(@""" """); - RoundTrip(@"""foo"""); - RoundTrip(@"""\"""""); - RoundTrip(@"""\\"""); - RoundTrip(@"""/"""); - RoundTrip(@"""\b"""); - RoundTrip(@"""\f"""); - RoundTrip(@"""\n"""); - RoundTrip(@"""\r"""); - RoundTrip(@"""\t"""); - RoundTrip(@"""€"""); - } - - [Test] - public void round_trip_numbers() { - //RoundTrip("18446744073709551615"); - //RoundTrip("-18446744073709551615"); - //RoundTrip("18446744073709551616"); - //RoundTrip("-18446744073709551616"); - RoundTrip("5"); - RoundTrip("5E+123", ignoreCase: true); - RoundTrip("5E-123", ignoreCase: true); - RoundTrip("-5E-123", ignoreCase: true); - RoundTrip("-50"); - RoundTrip("0"); - RoundTrip("-0.03"); - RoundTrip("0.0123"); - RoundTrip("-0.0123"); - RoundTrip("-1.23E-123", ignoreCase: true); - } - - [Test] - public void big_int() { - var serialized = _sut.Serialize(new JsBigInt(BigInteger.Parse("20000000000000000000"))); - Assert.AreEqual(@"""20000000000000000000""", serialized); - } - - [Test] - public void undefined() { - var serialized = _sut.Serialize(JsValue.Undefined); - Assert.AreEqual(@"null", serialized); - } - - [Test] - public void undefined_property() { - var instance = new JsObject(_engine); - instance.Set("foo", JsValue.Undefined); - instance.Set("bar", "baz"); - var serialized = _sut.Serialize(instance); - Assert.AreEqual(@"{""bar"":""baz""}", serialized); - } - - [Test] - public void whitespace() { - // nothing. we only want to test the serializer in this file, not the parser. - } - - [Test] - public void big_state() { - var json = ReadJsonFromFile("big_state.json"); - var instance = _parser.Parse(json); - var serialized = _sut.Serialize(instance); - Assert.AreEqual(json, serialized); - } - - public static string ReadJsonFromFile(string filename) - { - var assembly = typeof(when_serializing_state).Assembly; - var availableFiles = assembly.GetManifestResourceNames(); - var streamName = availableFiles.Where( - x=> x.StartsWith(typeof(when_serializing_state).Namespace) && x.EndsWith(filename) - ).SingleOrDefault(); - if(streamName == null) throw new InvalidOperationException($"Could not find {filename}"); - using var stream = assembly.GetManifestResourceStream(streamName); - - var doc = JsonDocument.Parse(stream); - using var ms = new MemoryStream(); - var writer = new Utf8JsonWriter(ms); - doc.WriteTo(writer); - writer.Flush(); - ms.Position = 0; - using var sr = new StreamReader(ms); - return sr.ReadToEnd(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/TestFixtureWithInterpretedProjection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/TestFixtureWithInterpretedProjection.cs deleted file mode 100644 index abfd41948..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/TestFixtureWithInterpretedProjection.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public abstract class TestFixtureWithInterpretedProjection { - protected ProjectionStateHandlerFactory _stateHandlerFactory; - protected IProjectionStateHandler _stateHandler; - protected List _logged; - protected string _projection; - protected string _state = null; - protected string _sharedState = null; - protected IQuerySources _source; - protected TimeSpan CompilationTimeout { get; set; } = TimeSpan.FromMilliseconds(1000); - protected TimeSpan ExecutionTimeout { get; set; } = TimeSpan.FromMilliseconds(500); - - [SetUp] - public void Setup() { - _state = null; - _projection = null; - Given(); - _logged = new List(); - _stateHandlerFactory = - new ProjectionStateHandlerFactory(CompilationTimeout, ExecutionTimeout); - _stateHandler = CreateStateHandler(); - _source = _stateHandler.GetSourceDefinition(); - - if (_state != null) - _stateHandler.Load(_state); - else - _stateHandler.Initialize(); - - if (_sharedState != null) - _stateHandler.LoadShared(_sharedState); - When(); - } - - protected const string _projectionType = "js"; - - protected virtual IProjectionStateHandler CreateStateHandler() { - return _stateHandlerFactory.Create( - _projectionType, _projection, true, null, logger: (s, _) => { - if (s.StartsWith("P:")) - Console.WriteLine(s); - else - _logged.Add(s); - }); // skip prelude debug output - } - - protected virtual void When() { - } - - protected abstract void Given(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/specification_with_event_handled.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/specification_with_event_handled.cs deleted file mode 100644 index fd6f2e66b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/specification_with_event_handled.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public abstract class specification_with_event_handled : TestFixtureWithInterpretedProjection { - protected ResolvedEvent _handledEvent; - protected string _newState; - protected string _newSharedState; - protected EmittedEventEnvelope[] _emittedEventEnvelopes; - - protected override void When() { - _stateHandler.ProcessEvent( - "", - CheckpointTag.FromPosition( - 0, _handledEvent.Position.CommitPosition, _handledEvent.Position.PreparePosition), "", - _handledEvent, - out _newState, out _newSharedState, out _emittedEventEnvelopes); - } - - protected static ResolvedEvent CreateSampleEvent( - string streamId, int sequenceNumber, string eventType, string data, TFPos tfPos) { - return new ResolvedEvent( - streamId, sequenceNumber, streamId, sequenceNumber, true, tfPos, Guid.NewGuid(), eventType, true, data, - "{}", "{\"position_meta\":1}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_creating_jint_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_creating_jint_projection.cs deleted file mode 100644 index fc86faea1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_creating_jint_projection.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Jint.Runtime; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint { - class when_creating_jint_projection { - private ProjectionStateHandlerFactory _stateHandlerFactory; - private const string _projectionType = "js"; - - [SetUp] - public void Setup() { - _stateHandlerFactory = - new ProjectionStateHandlerFactory(TimeSpan.FromMilliseconds(250), TimeSpan.FromMilliseconds(100)); - } - - [Test, Category(_projectionType)] - public void it_can_be_created() { - using (_stateHandlerFactory.Create(_projectionType, @"", true, null)) { - } - } - - [Test, Category(_projectionType)] - public void js_syntax_errors_are_reported() { - try { - using (_stateHandlerFactory.Create(_projectionType, @"log(1;", true, null, logger: (s, _) => { })) { - } - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - } - } - - [Test, Category(_projectionType)] - public void js_exceptions_errors_are_reported() { - try { - using (_stateHandlerFactory.Create(_projectionType, @"throw 123;", true, null, logger: (s, _) => { })) { - } - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - Assert.AreEqual("123", ex.Message); - } - } - - [Test, Category(_projectionType)] - public void long_compilation_times_out() { - try { - using (_stateHandlerFactory.Create(_projectionType, - @" - var i = 0; - while (true) i++; - ", - true, - null, - logger: (s, _) => { })) { - } - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - } - } - - [Test, Category(_projectionType)] - public void long_execution_times_out() { - try { - using (var h = _stateHandlerFactory.Create(_projectionType, - @" - fromAll().when({ - $any: function (s, e) { - log('1'); - var i = 0; - while (true) i++; - } - }); - ", - true, - null, - logger: Console.WriteLine)) { - h.Initialize(); - string newState; - EmittedEventEnvelope[] emittedevents; - h.ProcessEvent( - "partition", - CheckpointTag.FromPosition(0, 100, 50), - "stream", - "event", - "", - Guid.NewGuid(), - 1, - "", "{}", - out newState, out emittedevents); - } - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - } - } - - [Test, Category(_projectionType)] - public void long_post_processing_times_out() { - try { - using (var h = _stateHandlerFactory.Create(_projectionType, - @" - fromAll().when({ - $any: function (s, e) { - return {}; - } - }) - .transformBy(function(s){ - log('1'); - var i = 0; - while (true) i++; - }); - ", - true, - null, - logger: Console.WriteLine)) { - h.Initialize(); - string newState; - EmittedEventEnvelope[] emittedevents; - h.ProcessEvent( - "partition", CheckpointTag.FromPosition(0, 100, 50), "stream", "event", "", Guid.NewGuid(), 1, - "", "{}", - out newState, out emittedevents); - h.TransformStateToResult(); - } - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - } - } - - [Test, Category(_projectionType)] - public void long_execution_times_out_many() { - for (var i = 0; i < 10; i++) { - try { - using (var h = _stateHandlerFactory.Create( - _projectionType, @" - fromAll().when({ - $any: function (s, e) { - log('1'); - var i = 0; - while (true) i++; - } - }); - ", true, null, logger: Console.WriteLine)) { - h.Initialize(); - string newState; - EmittedEventEnvelope[] emittedevents; - h.ProcessEvent( - "partition", CheckpointTag.FromPosition(0, 100, 50), "stream", "event", "", Guid.NewGuid(), - 1, - "", "{}", out newState, out emittedevents); - Assert.Fail("Timeout didn't happen"); - } - } catch (TimeoutException) { - } - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_defining_a_js_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_defining_a_js_projection.cs deleted file mode 100644 index a2970fa3a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_defining_a_js_projection.cs +++ /dev/null @@ -1,529 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_defining_a_js_projection { - private const string _projectionType = "INTERPRETED"; - [TestFixture] - public class with_from_all_source : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.FromAll(); - b.AllEvents(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_from_stream : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromStream('stream1').when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromStream("stream1"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_multiple_from_streams : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromStreams(['stream1', 'stream2', 'stream3']).when({ - $any: function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromStream("stream1"); - b.FromStream("stream2"); - b.FromStream("stream3"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_multiple_from_streams_plain : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromStreams('stream1', 'stream2', 'stream3').when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromStream("stream1"); - b.FromStream("stream2"); - b.FromStream("stream3"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_multiple_from_categories : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromCategories(['category1', 'category2', 'category3']).when({ - $any: function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromStream("$ce-category1"); - b.FromStream("$ce-category2"); - b.FromStream("$ce-category3"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_multiple_from_categories_plain : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromCategories('category1', 'category2', 'category3').when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromStream("$ce-category1"); - b.FromStream("$ce-category2"); - b.FromStream("$ce-category3"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_from_category : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromCategory('category1').when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromCategory("category1"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_from_category_by_stream : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromCategory('category1').foreachStream().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromCategory("category1"); - b.SetByStream(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_from_all_by_custom_partitions : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().partitionBy(function(event){ - return event.eventType; - }).when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetByCustomPartitions(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_output_to : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll() - .when({ - $any:function(state, event) { - return state; - }}) - .$defines_state_transform(); - "; - _state = @"{""count"": 0}"; - } - - [Test] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetDefinesStateTransform(); - b.SetOutputState(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_transform_by : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({ - $any:function(state, event) { - return state; - }}).transformBy(function(s) {return s;}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetDefinesStateTransform(); - b.SetOutputState(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - public class with_filter_by : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({ - some: function(state, event) { - return state; - } - }).filterBy(function(s) {return true;}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.FromAll(); - b.IncludeEvent("some"); - b.SetDefinesStateTransform(); - b.SetOutputState(); - }); - AssertEx.AreEqual(expected, _source); - } - } - - public class with_output_state : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - var z = fromAll().outputState(); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.NoWhen(); - b.SetOutputState(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - public class without_when : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - var z = fromAll(); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.NoWhen(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - public class with_when : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - var z = fromAll().when({a: function(s,e) {}}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.FromAll(); - b.IncludeEvent("a"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_state_stream_name_option : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - resultStreamName: 'state-stream', - }); - fromAll().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetResultStreamNameOption("state-stream"); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_include_links_option : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - $includeLinks: true, - }); - fromAll().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetIncludeLinks(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_bi_state_option : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - biState: true, - }); - fromAll().when({ - $any:function(state, sharedState, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetDefinesFold(); - b.SetIsBiState(true); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_reorder_events_option : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - reorderEvents: true, - processingLag: 500, - }); - fromAll().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetProcessingLag(500); - b.SetReorderEvents(true); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_multiple_option_statements : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - reorderEvents: false, - processingLag: 500, - }); - options({ - reorderEvents: true, - }); - fromAll().when({ - $any:function(state, event) { - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetProcessingLag(500); - b.SetReorderEvents(true); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_foreach_and_deleted_notification_handled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @"fromAll().foreachStream().when({ - $deleted: function(){} - })"; - _state = @"{}"; - } - - [Test] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetByStream(); - b.SetHandlesStreamDeletedNotifications(); - }); - AssertEx.AreEqual(expected,_source); - } - } - - [TestFixture] - public class with_deleted_notification_handled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @"fromAll().when({ - $deleted: function(){} - })"; - _state = @"{}"; - } - - [Test] - public void source_definition_is_correct() { - var expected = SourceDefinitionBuilder.From(b => { - b.AllEvents(); - b.FromAll(); - b.SetHandlesStreamDeletedNotifications(); - }); - AssertEx.AreEqual(expected,_source); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_initializing_state.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_initializing_state.cs deleted file mode 100644 index baaacd4b5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_initializing_state.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_initializing_state : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({ - $init: function() { - return { test: '1' }; - }, - - type1: function(state, event) { - return state; - }, - }).transformBy(function(s) { return s;}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_should_return_initialized_state() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", - Guid.NewGuid(), 0, "metadata", @"{""a"":""b""}", out state, out emittedEvents); - Assert.IsTrue(state.Contains("\"test\":\"1\"")); - } - - [Test, Category(_projectionType)] - public void transform_state_should_return_initialized_state() { - var result = _stateHandler.TransformStateToResult(); - Assert.IsTrue(result.Contains("\"test\":\"1\"")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_js_projection_loading_state.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_js_projection_loading_state.cs deleted file mode 100644 index bbf3537b3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_js_projection_loading_state.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_js_projection_loading_state : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - return state; - } - }); - "; - _state = @"{""A"":""A"",""B"":""B""}"; - } - - [Test, Category(_projectionType)] - public void the_state_is_loaded() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""x"":""y""}", out state, out emittedEvents); - - Assert.AreEqual(_state, state); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_not_returning_state_from_a_js_handler.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_not_returning_state_from_a_js_handler.cs deleted file mode 100644 index f0c440a8e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_not_returning_state_from_a_js_handler.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_not_returning_state_from_a_js_handler : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: function(state, event) { - state.newValue = 'new'; - }}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_should_return_updated_state() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", - Guid.NewGuid(), 0, "metadata", @"{""a"":""b""}", out state, out emittedEvents); - Assert.IsTrue(state.Contains("\"newValue\":\"new\"")); - } - - [Test, Category(_projectionType)] - public void process_event_returns_true() { - string state; - EmittedEventEnvelope[] emittedEvents; - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", - Guid.NewGuid(), 0, "metadata", @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsTrue(result); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule.cs deleted file mode 100644 index 8ba7a6139..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_partitioning_by_custom_rule : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().partitionBy(function(event){ - return event.body.region; - }).when({$any:function(event, state) { - return {}; - }}); - "; - } - - [Test] - public void get_state_partition_returns_correct_result() { - var result = _stateHandler.GetStatePartition( - CheckpointTag.FromPosition(0, 100, 50), "category", - new ResolvedEvent( - "stream1", 0, "stream1", 0, false, new TFPos(100, 50), Guid.NewGuid(), "type1", true, - @"{""region"":""Europe""}", "metadata")); - - Assert.AreEqual("Europe", result); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule_returning_a_number.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule_returning_a_number.cs deleted file mode 100644 index 5a0bf514c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_partitioning_by_custom_rule_returning_a_number.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.Jint { - [TestFixture] - public class when_partitioning_by_custom_rule_returning_a_number : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().partitionBy(function(event){ - return event.body.index; - }).when({$any:function(event, state) { - return {}; - }}); - "; - } - - [Test] - public void get_state_partition_returns_correct_result() { - var result = _stateHandler.GetStatePartition( - CheckpointTag.FromPosition(0, 100, 50), "category", - new ResolvedEvent( - "stream1", 0, "stream1", 0, false, new TFPos(100, 50), Guid.NewGuid(), "type1", true, - @"{""index"": 42}", "metadata")); - - Assert.AreEqual("42", result); - } - - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_faulting_js_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_faulting_js_projection.cs deleted file mode 100644 index a94055df3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_faulting_js_projection.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Jint.Runtime; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public class when_running_a_faulting_js_projection { - [TestFixture] - public class when_event_handler_throws : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll(); - on_any(function(state, event) { - log(state.count); - throw ""failed""; - return state; - }); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void process_event_throws_javascript_exception() { - try { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 10, 5), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - Assert.AreEqual("failed", ex.Message); - } - } - } - - [TestFixture] - public class when_state_transform_throws : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: function(state, event) { - return state; - }}) - .transformBy(function (s) { throw ""failed"";}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void process_event_throws_javascript_exception() { - try { - string state; - EmittedEventEnvelope[] emittedEvents; - Assert.DoesNotThrow(() => _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 10, 5), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents)); - _stateHandler.TransformStateToResult(); - } catch (Exception ex) { - Assert.IsInstanceOf(ex); - Assert.AreEqual("failed", ex.Message); - } - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_events.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_events.cs deleted file mode 100644 index 411383360..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_events.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public abstract class when_running_a_js_projection_emitting_invalid_events : TestFixtureWithInterpretedProjection { - - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - emit(" + FormatEmitParameters +@"); - return {}; - }}); - "; - } - - protected virtual string StreamId => "'testStream'"; - protected virtual string EventType => "'testEventType'"; - protected virtual string EventBody => "{}"; - protected virtual string FormatEmitParameters => $"{StreamId}, {EventType}, {EventBody}"; - protected virtual bool IsNull => false; - protected abstract string ParameterName { get; } - [Test, Category(_projectionType)] - public void process_event_faults() { - string state; - EmittedEventEnvelope[] emittedEvents; - TestDelegate td = () => - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - var ae = IsNull ? Assert.Throws(td) : Assert.Throws(td); - Assert.AreEqual(ParameterName, ae.ParamName); - } - - public class null_stream : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "streamId"; - protected override string StreamId => "null"; - protected override bool IsNull => true; - } - - public class empty_stream : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "streamId"; - protected override string StreamId => "''"; - protected override bool IsNull => true; - } - - public class object_stream : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "streamId"; - protected override string StreamId => "{\"a\":\"b\"}"; - } - - public class undefined_stream : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "streamId"; - protected override string StreamId => "undefined"; - protected override bool IsNull => true; - - } - - - public class null_eventtype : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventName"; - protected override string EventType => "null"; - protected override bool IsNull => true; - } - - public class empty_eventtype : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventName"; - protected override string EventType => "''"; - protected override bool IsNull => true; - } - - public class object_eventtype : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventName"; - protected override string EventType => "{\"a\":\"b\"}"; - } - - public class undefined_eventtype : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventName"; - protected override string EventType => "undefined"; - protected override bool IsNull => true; - } - - public class null_eventbody : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventBody"; - protected override string EventBody => "null"; - protected override bool IsNull => true; - } - - public class nonobject_eventbody : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventBody"; - protected override string EventBody => "'test'"; - } - - public class undefined_eventbody : when_running_a_js_projection_emitting_invalid_events { - protected override string ParameterName => "eventBody"; - protected override bool IsNull => true; - protected override string EventBody => "undefined"; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_links.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_links.cs deleted file mode 100644 index 043b3eb4f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_invalid_links.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public class when_running_a_js_projection_emitting_invalid_links : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - event = {}; - linkTo('output-stream', event); - return {}; - }}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_does_not_allow_emitted_event() { - var ex = Assert.Throws(() => { - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out _, out var emittedEvents); - }); - Assert.AreEqual("Invalid link to event undefined@undefined", ex.Message); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_metadata.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_metadata.cs deleted file mode 100644 index 5a9c60453..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_emitting_metadata.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Diagnostics; -using System.Linq; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_a_js_projection_emitting_metadata : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - emit('output-stream' + event.sequenceNumber, 'emitted-event' + event.sequenceNumber, {a: JSON.parse(event.bodyRaw).a}, {m1: 1, m2: ""2""}); - return {}; - }}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_returns_true() { - string state; - EmittedEventEnvelope[] emittedEvents; - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsTrue(result); - } - - [Test, Category(_projectionType)] - public void process_event_returns_emitted_event() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("emitted-event0", emittedEvents[0].Event.EventType); - Assert.AreEqual("output-stream0", emittedEvents[0].Event.StreamId); - Assert.AreEqual(@"{""a"":""b""}", emittedEvents[0].Event.Data); - var extraMetaData = emittedEvents[0].Event.ExtraMetaData().ToArray(); - Assert.IsNotNull(extraMetaData); - Assert.AreEqual(2, extraMetaData.Length); - } - - [Test, Category(_projectionType), Category("Manual"), Explicit] - public void can_pass_though_millions_of_events() { - int i; - var sw = Stopwatch.StartNew(); - for (i = 0; i < 100000000; i++) { - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, i * 10 + 20, i * 10 + 10), "stream" + i, "type" + i, "category", - Guid.NewGuid(), i, "metadata", @"{""a"":""" + i + @"""}", out _, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("emitted-event" + i, emittedEvents[0].Event.EventType); - Assert.AreEqual("output-stream" + i, emittedEvents[0].Event.StreamId); - Assert.AreEqual(@"{""a"":""" + i + @"""}", emittedEvents[0].Event.Data); - if (sw.Elapsed > TimeSpan.FromSeconds(120)) - break; - } - - Console.WriteLine(i); - - //TODO: replace with an actual benchmark - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_with_transform_by.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_with_transform_by.cs deleted file mode 100644 index d4e897d9a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_js_projection_with_transform_by.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_a_js_projection_with_transform_by : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({ - $any: function(state, event) { - state.a = '1'; - return state; - } - }) - .transformBy(function(state) { - state.b = '2'; - return state; - }); - "; - } - - [Test, Category(_projectionType)] - public void transform_state_returns_correct_result() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{}", out state, out emittedEvents); - var result = _stateHandler.TransformStateToResult(); - - Assert.IsNotNull(result); - Assert.AreEqual(@"{""a"":""1"",""b"":""2""}", result); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_projection_with_created_handler.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_projection_with_created_handler.cs deleted file mode 100644 index cec704dbb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_projection_with_created_handler.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_a_projection_with_created_handler : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().foreachStream().when({ - $created: function(s, e) { - emit('stream1', 'event1', {a:1}); - } - }); - "; - _state = @"{}"; - } - - [Test, Category(_projectionType)] - public void returns_emitted_events() { - var e = new ResolvedEvent( - "stream", 0, "stream", 0, false, new TFPos(1000, 900), Guid.NewGuid(), "event", true, "{}", - "{\"m\":1}"); - - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessPartitionCreated( - "partition", CheckpointTag.FromPosition(0, 10, 5), e, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("stream1", emittedEvents[0].Event.StreamId); - Assert.AreEqual("event1", emittedEvents[0].Event.EventType); - Assert.AreEqual("{\"a\":1}", emittedEvents[0].Event.Data); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_emitting_stream_links.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_emitting_stream_links.cs deleted file mode 100644 index 056596b77..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_emitting_stream_links.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_a_v8_projection_emitting_stream_links : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - linkStreamTo('output-stream' + event.sequenceNumber, 'stream' + event.sequenceNumber); - return {}; - }}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_returns_true() { - string state; - EmittedEventEnvelope[] emittedEvents; - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsTrue(result); - } - - [Test, Category(_projectionType)] - public void process_event_returns_emitted_event() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("$@", emittedEvents[0].Event.EventType); - Assert.AreEqual("output-stream0", emittedEvents[0].Event.StreamId); - Assert.AreEqual("stream0", emittedEvents[0].Event.Data); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_with_not_passing_filter_by.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_with_not_passing_filter_by.cs deleted file mode 100644 index 842d86d13..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_a_v8_projection_with_not_passing_filter_by.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_a_v8_projection_with_not_passing_filter_by : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - state.a = event.body.a; - return state; - } - }) - .filterBy(function(state) { - return state.a == '2'; - }); - "; - } - - [Test, Category(_projectionType)] - public void filter_by_that_passes_returns_correct_result() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""2""}", out state, out emittedEvents); - var result = _stateHandler.TransformStateToResult(); - - Assert.IsNotNull(result); - Assert.AreEqual(@"{""a"":""2""}", result); - } - - [Test, Category(_projectionType)] - public void filter_by_that_does_not_pass_returns_correct_result() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""3""}", out state, out emittedEvents); - var result = _stateHandler.TransformStateToResult(); - - Assert.IsNull(result); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_bi_state_js_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_bi_state_js_projection.cs deleted file mode 100644 index b65efc7ab..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_bi_state_js_projection.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Text.Json; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_bi_state_js_projection : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - options({ - biState: true, - }); - fromAll().foreachStream().when({ - type1: function(state, event) { - state[0].count = state[0].count + 1; - state[1].sharedCount = state[1].sharedCount + 1; - return state; - }}); - "; - _state = @"{""count"": 0}"; - _sharedState = @"{""sharedCount"": 0}"; - } - - [Test, Category(_projectionType)] - public void process_event_counts_events() { - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 10, 5), "stream1", "type1", "category", Guid.NewGuid(), 0, "metadata", - @"{""a"":""b""}", out var state, out var sharedState, out var emittedEvents); - - Assert.Null(emittedEvents); - Assert.NotNull(state); - Assert.NotNull(sharedState); - var stateJson = JsonDocument.Parse(state); - var sharedJson = JsonDocument.Parse(sharedState); - Assert.True(stateJson.RootElement.TryGetProperty("count", out var stateCount)); - Assert.AreEqual(JsonValueKind.Number, stateCount.ValueKind); - Assert.AreEqual(1, stateCount.GetInt32()); - - Assert.True(sharedJson.RootElement.TryGetProperty("sharedCount", out var sharedCount)); - Assert.AreEqual(JsonValueKind.Number, sharedCount.ValueKind); - Assert.AreEqual(1, sharedCount.GetInt32()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_body_reflecting_v8_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_body_reflecting_v8_projection.cs deleted file mode 100644 index bdb703baf..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_body_reflecting_v8_projection.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_body_reflecting_v8_projection : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - if (event.body) - return event.body; - else return {}; - } - }); - "; - } - - [Test, Category(_projectionType)] - public void process_event_should_reflect_event() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - Assert.AreEqual(@"{""a"":""b""}", state); - } - - [Test, Category(_projectionType)] - public void process_event_should_not_reflect_non_json_events_even_if_valid_json() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents, isJson: false); - Assert.AreEqual(@"{}", state); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_counting_js_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_counting_js_projection.cs deleted file mode 100644 index c50dd4565..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_counting_js_projection.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Globalization; -using System.Text.Json; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class when_running_counting_js_projection : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - state.count = state.count + 1; - return state; - }}); - "; - _state = @"{""count"": 0}"; - } - - [Test, Category(_projectionType)] - public void process_event_counts_events() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 10, 5), "stream1", "type1", "category", Guid.NewGuid(), 0, "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 15), "stream1", "type1", "category", Guid.NewGuid(), 1, - "metadata", - @"{""a"":""b""}", out state, out emittedEvents); - - - Assert.Null(emittedEvents); - Assert.NotNull(state); - - var stateJson = JsonDocument.Parse(state); - Assert.True(stateJson.RootElement.TryGetProperty("count", out var stateCount)); - Assert.AreEqual(JsonValueKind.Number, stateCount.ValueKind); - Assert.AreEqual(2, stateCount.GetInt32()); - - } - - [Test, Category(_projectionType), Category("Manual"), Explicit] - public void can_handle_million_events() { - for (var i = 0; i < 1000000; i++) { - _logged.Clear(); - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, i * 10, i * 10 - 5), "stream" + i, "type" + i, "category", - Guid.NewGuid(), 0, - "metadata", @"{""a"":""" + i + @"""}", out state, out emittedEvents); - Assert.AreEqual(1, _logged.Count); - Assert.AreEqual((i + 1).ToString(CultureInfo.InvariantCulture), _logged[_logged.Count - 1]); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_emitting_js_projection.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_emitting_js_projection.cs deleted file mode 100644 index 6364911a7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_emitting_js_projection.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint { - [TestFixture] - public class when_running_emitting_js_projection : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - let targetMetadata = Object.assign({}, event.metadata); - targetMetadata.g = 'h'; - targetMetadata.i = 10; - emit('output-stream' + event.sequenceNumber, 'emitted-event' + event.sequenceNumber, {a: JSON.parse(event.bodyRaw).a}, targetMetadata); - return {}; - }}); - "; - } - - [Test, Category(_projectionType)] - public void process_event_returns_true() { - string state; - EmittedEventEnvelope[] emittedEvents; - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "{\"d\":\"e\"}", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsTrue(result); - } - - [Test, Category(_projectionType)] - public void process_event_returns_emitted_event() { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "{\"d\":\"e\"}", - @"{""a"":""b""}", out state, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("emitted-event0", emittedEvents[0].Event.EventType); - Assert.AreEqual("output-stream0", emittedEvents[0].Event.StreamId); - Assert.AreEqual(@"{""a"":""b""}", emittedEvents[0].Event.Data); - var metadata = new Dictionary(emittedEvents[0].Event.ExtraMetaData()); - Assert.AreEqual("\"e\"", metadata["d"]); - Assert.AreEqual("\"h\"", metadata["g"]); - Assert.AreEqual("10", metadata["i"]); - } - //todo: actual benchmark - [Test, Category(_projectionType), Category("Manual"), Explicit] - public void can_pass_though_millions_of_events() { - var i = 0; - var sw = Stopwatch.StartNew(); - - for (i = 0; i < 100000000; i++) { - string state; - EmittedEventEnvelope[] emittedEvents; - _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, i * 10 + 20, i * 10 + 10), "stream" + i, "type" + i, "category", - Guid.NewGuid(), i, - "{\"d\":\"e\"}", @"{""a"":""" + i + @"""}", out state, out emittedEvents); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.AreEqual("emitted-event" + i, emittedEvents[0].Event.EventType); - Assert.AreEqual("output-stream" + i, emittedEvents[0].Event.StreamId); - Assert.AreEqual(@"{""a"":""" + i + @"""}", emittedEvents[0].Event.Data); - - if(sw.Elapsed > TimeSpan.FromSeconds(120)) - break; - } - - Console.WriteLine($"processed: {i}"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_with_content_type_validation.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_with_content_type_validation.cs deleted file mode 100644 index 4afad4d6f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_running_with_content_type_validation.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public class when_running_with_content_type_validation { - [TestFixture] - public class when_running_with_content_type_validation_enabled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - linkTo('output-stream' + event.sequenceNumber, event); - return {}; - }}); - "; - } - - protected override IProjectionStateHandler CreateStateHandler() { - return _stateHandlerFactory.Create( - _projectionType, _projection, - enableContentTypeValidation: true, - null, - logger: (s, _) => { - if (s.StartsWith("P:")) - Console.WriteLine(s); - else - _logged.Add(s); - }); // skip prelude debug output - } - - [Test, Category(_projectionType)] - public void process_null_json_event_does_not_emit() { - string state = null; - EmittedEventEnvelope[] emittedEvents = null; - - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - null, out state, out emittedEvents, isJson: true); - - Assert.IsNull(emittedEvents); - } - - [Test, Category(_projectionType)] - public void process_null_non_json_event_does_emit() { - string state = null; - EmittedEventEnvelope[] emittedEvents = null; - - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - null, out state, out emittedEvents, isJson: false); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - } - } - - [TestFixture] - public class when_running_with_content_type_validation_disabled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - linkTo('output-stream' + event.sequenceNumber, event); - return {}; - }}); - "; - } - - protected override IProjectionStateHandler CreateStateHandler() { - return _stateHandlerFactory.Create( - _projectionType, _projection, - enableContentTypeValidation: false, - projectionExecutionTimeout: null, - logger: (s, _) => { - if (s.StartsWith("P:")) - Console.WriteLine(s); - else - _logged.Add(s); - }); // skip prelude debug output - } - - [Test, Category(_projectionType)] - public void process_null_json_event_does_not_emit() { - string state = null; - EmittedEventEnvelope[] emittedEvents = null; - - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - null, out state, out emittedEvents, isJson: true); - - Assert.IsNull(emittedEvents); - } - - [Test, Category(_projectionType)] - public void process_null_non_json_event_does_not_emit() { - string state = null; - EmittedEventEnvelope[] emittedEvents = null; - - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - null, out state, out emittedEvents, isJson: false); - - Assert.IsNull(emittedEvents); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/when_specifying_meta_data_for_linked_event.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/when_specifying_meta_data_for_linked_event.cs deleted file mode 100644 index 601dc6790..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/when_specifying_meta_data_for_linked_event.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - public class when_specifying_meta_data_for_linked_event : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @" - fromAll().when({$any: - function(state, event) { - linkTo('output-stream', event, {'meta': 'data'}); - return {}; - }}); - "; - } - - [Test, Category(_projectionType)] - public void meta_data_should_be_set() { - string state = null; - EmittedEventEnvelope[] emittedEvents = null; - - var result = _stateHandler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 20, 10), "stream1", "type1", "category", Guid.NewGuid(), 0, - "metadata", - null, out state, out emittedEvents, isJson: false); - - Assert.IsNotNull(emittedEvents); - Assert.AreEqual(1, emittedEvents.Length); - Assert.IsNotNull(emittedEvents[0].Event); - - var metaData = emittedEvents[0].Event.ExtraMetaData(); - CollectionAssert.AreEquivalent(new Dictionary {{ "meta", "\"data\"" }}, metaData); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/with_deleted_notification_handled.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/with_deleted_notification_handled.cs deleted file mode 100644 index 8bf82acc4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/with_deleted_notification_handled.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class with_deleted_notification_handled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @"fromAll().foreachStream().when({ - $deleted: function(){} - })"; - _state = @"{}"; - } - - [Test] - public void source_definition_is_correct() { - Assert.AreEqual(true, _source.HandlesDeletedNotifications); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/with_foreach_and_deleted_notification_handled.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/with_foreach_and_deleted_notification_handled.cs deleted file mode 100644 index a0e7f5435..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/with_foreach_and_deleted_notification_handled.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class with_foreach_and_deleted_notification_handled : TestFixtureWithInterpretedProjection { - protected override void Given() { - _projection = @"fromAll().foreachStream().when({ - $deleted: function(){} - })"; - _state = @"{}"; - } - - [Test] - public void source_definition_is_correct() { - Assert.AreEqual(true, _source.HandlesDeletedNotifications); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/with_no_when_statement.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/with_no_when_statement.cs deleted file mode 100644 index dfbee02c4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/with_no_when_statement.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Linq; -using EventStore.Core.Data; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class with_no_when_statement : specification_with_event_handled { - protected override void Given() { - _projection = @"fromAll();"; - _state = @"{}"; - _handledEvent = CreateSampleEvent("stream", 0, "event_type", "{\"data\":1}", new TFPos(100, 50)); - } - - [Test] - public void returns_event_data_as_state() { - Assert.AreEqual("{\"data\":1}", _newState); - Assert.IsTrue(_emittedEventEnvelopes == null || !_emittedEventEnvelopes.Any()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/Jint/with_return_link_metadata.cs b/src/EventStore.Projections.Core.Tests/Services/Jint/with_return_link_metadata.cs deleted file mode 100644 index e2991a5d8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/Jint/with_return_link_metadata.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Linq; -using EventStore.Core.Data; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Jint -{ - [TestFixture] - public class with_return_link_metadata : specification_with_event_handled { - protected override void Given() { - _projection = @"fromAll().when({$any:function(s,e){ - return e.linkMetadata; - }})"; - _state = @"{}"; - _handledEvent = CreateSampleEvent("stream", 0, "event_type", "{\"data\":1}", new TFPos(100, 50)); - } - - [Test] - public void returns_position_metadata_as_state() { - Assert.AreEqual("{\"position_meta\":1}", _newState); - Assert.IsTrue(_emittedEventEnvelopes == null || !_emittedEventEnvelopes.Any()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/SpecificationWithEmittedStreamsTrackerAndDeleter.cs b/src/EventStore.Projections.Core.Tests/Services/SpecificationWithEmittedStreamsTrackerAndDeleter.cs deleted file mode 100644 index 714bafc56..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/SpecificationWithEmittedStreamsTrackerAndDeleter.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Tests.ClientAPI; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Emitting; - -namespace EventStore.Projections.Core.Tests.Services { - public abstract class SpecificationWithEmittedStreamsTrackerAndDeleter : SpecificationWithMiniNode { - protected IEmittedStreamsTracker _emittedStreamsTracker; - protected IEmittedStreamsDeleter _emittedStreamsDeleter; - protected ProjectionNamesBuilder _projectionNamesBuilder; - protected ClientMessage.ReadStreamEventsForwardCompleted _readCompleted; - protected IODispatcher _ioDispatcher; - protected bool _trackEmittedStreams = true; - protected string _projectionName = "test_projection"; - - protected override Task Given() { - _ioDispatcher = new IODispatcher(_node.Node.MainQueue, _node.Node.MainQueue, true); - _node.Node.MainBus.Subscribe(_ioDispatcher.BackwardReader); - _node.Node.MainBus.Subscribe(_ioDispatcher.BackwardReader); - _node.Node.MainBus.Subscribe(_ioDispatcher.ForwardReader); - _node.Node.MainBus.Subscribe(_ioDispatcher.Writer); - _node.Node.MainBus.Subscribe(_ioDispatcher.StreamDeleter); - _node.Node.MainBus.Subscribe(_ioDispatcher.Awaker); - _node.Node.MainBus.Subscribe(_ioDispatcher); - _node.Node.MainBus.Subscribe(_ioDispatcher); - _projectionNamesBuilder = ProjectionNamesBuilder.CreateForTest(_projectionName); - _emittedStreamsTracker = new EmittedStreamsTracker(_ioDispatcher, - new ProjectionConfig(null, 1000, 1000 * 1000, 100, 500, true, true, false, false, - _trackEmittedStreams, 10000, 1, null), _projectionNamesBuilder); - _emittedStreamsDeleter = new EmittedStreamsDeleter(_ioDispatcher, - _projectionNamesBuilder.GetEmittedStreamsName(), - _projectionNamesBuilder.GetEmittedStreamsCheckpointName()); - return Task.CompletedTask; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/TestFixtureWithProjectionCoreService.cs b/src/EventStore.Projections.Core.Tests/Services/TestFixtureWithProjectionCoreService.cs deleted file mode 100644 index b70ec318a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/TestFixtureWithProjectionCoreService.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messaging; -using EventStore.Core.Services.Monitoring.Stats; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services { - public class TestFixtureWithProjectionCoreService { - class GuardBusToTriggerFixingIfUsed : IQueuedHandler, ISubscriber, IPublisher { - public void Handle(Message message) { - throw new NotImplementedException(); - } - - public void Publish(Message message) { - throw new NotImplementedException(); - } - - public string Name { get; } - public Task Start() { - throw new NotImplementedException(); - } - - public void Stop() { - throw new NotImplementedException(); - } - - public void RequestStop() { - throw new NotImplementedException(); - } - - public QueueStats GetStatistics() { - throw new NotImplementedException(); - } - - public void Subscribe(IAsyncHandle handler) where T : Message { - throw new NotImplementedException(); - } - - public void Unsubscribe(IAsyncHandle handler) where T : Message { - throw new NotImplementedException(); - } - } - public class TestCoreProjection : ICoreProjection { - public List HandledMessages = - new List(); - - public void Handle(CoreProjectionProcessingMessage.CheckpointCompleted message) { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - throw new NotImplementedException(); - } - - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - throw new NotImplementedException(); - } - } - - protected TestHandler _consumer; - protected SynchronousScheduler _bus; - protected ProjectionCoreService _service; - protected EventReaderCoreService _readerService; - - private ReaderSubscriptionDispatcher _subscriptionDispatcher; - - protected Guid _workerId; - - [SetUp] - public virtual void Setup() { - _consumer = new TestHandler(); - _bus = new(); - _bus.Subscribe(_consumer); - ICheckpoint writerCheckpoint = new InMemoryCheckpoint(1000); - var ioDispatcher = new IODispatcher(_bus, _bus, true); - _readerService = new EventReaderCoreService(_bus, ioDispatcher, 10, writerCheckpoint, - runHeadingReader: true, faultOutOfOrderProjections: true); - _subscriptionDispatcher = - new ReaderSubscriptionDispatcher(_bus); - _workerId = Guid.NewGuid(); - var guardBus = new GuardBusToTriggerFixingIfUsed(); - var configuration = new ProjectionsStandardComponents(1, ProjectionType.All, guardBus, guardBus, guardBus, guardBus, true, - 500, 250); - _service = new ProjectionCoreService( - _workerId, _bus, _bus, _subscriptionDispatcher, new RealTimeProvider(), ioDispatcher, configuration); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - - var instanceCorrelationId = Guid.NewGuid(); - _readerService.Handle(new ReaderCoreServiceMessage.StartReader(instanceCorrelationId)); - _service.Handle(new ProjectionCoreServiceMessage.StartCore(instanceCorrelationId)); - } - - protected IReaderStrategy CreateReaderStrategy() { - var result = new SourceDefinitionBuilder(); - result.FromAll(); - result.AllEvents(); - return ReaderStrategy.Create( - "test", - 0, - result.Build(), - new RealTimeProvider(), - stopOnEof: false, - runAs: null); - } - - protected static ResolvedEvent CreateEvent() { - return new ResolvedEvent( - "test", -1, "test", -1, false, new TFPos(10, 5), new TFPos(10, 5), Guid.NewGuid(), "t", false, - new byte[0], new byte[0], null, null, default(DateTime)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/TestTask.cs b/src/EventStore.Projections.Core.Tests/Services/TestTask.cs deleted file mode 100644 index ea7229406..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/TestTask.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services { - public class TestTask : StagedTask { - private readonly int _steps; - private readonly int _completeImmediatelyUpToStage; - private readonly object[] _stageCorrelations; - private Action _readyForStage; - private int _startedOnStage; - - public TestTask( - object initialCorrelationId, int steps, int completeImmediatelyUpToStage = -1, - object[] stageCorrelations = null) - : base(initialCorrelationId) { - _steps = steps; - _completeImmediatelyUpToStage = completeImmediatelyUpToStage; - _stageCorrelations = stageCorrelations; - _startedOnStage = -1; - } - - public bool StartedOn(int onStage) { - return _startedOnStage >= onStage; - } - - public override void Process(int onStage, Action readyForStage) { - _readyForStage = readyForStage; - _startedOnStage = onStage; - if (_startedOnStage <= _completeImmediatelyUpToStage) - Complete(); - } - - public void Complete() { - var correlationId = _stageCorrelations != null ? _stageCorrelations[_startedOnStage] : InitialCorrelationId; - _readyForStage(_startedOnStage == _steps - 1 ? -1 : _startedOnStage + 1, correlationId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_catalog_stream.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_catalog_stream.cs deleted file mode 100644 index a4b053a87..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_catalog_stream.cs +++ /dev/null @@ -1,47 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_stream_position { - private readonly CheckpointTag _a = CheckpointTag.FromStreamPosition(1, "stream", 9); - private readonly CheckpointTag _b = CheckpointTag.FromStreamPosition(1, "stream", 15); - private readonly CheckpointTag _c = CheckpointTag.FromStreamPosition(1, "stream", 29); - - [Test] - public void equal_equals() { - Assert.IsTrue(_a.Equals(_a)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_b == _b); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_a < _b); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_a <= _b); - Assert.IsTrue(_c <= _c); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_b > _a); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_b >= _a); - Assert.IsTrue(_c >= _c); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions.cs deleted file mode 100644 index c8951d2ce..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_event_type_index_positions { - private readonly CheckpointTag _a1 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(100, 50), new Dictionary {{"a", 1}}); - - private readonly CheckpointTag _a1_prime = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(100, 50), new Dictionary {{"a", 0}}); - - private readonly CheckpointTag _b1 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(200, 150), new Dictionary {{"b", 1}}); - - private readonly CheckpointTag _a1b1 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(300, 250), new Dictionary {{"a", 1}, {"b", 1}}); - - private readonly CheckpointTag _a2b1 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(400, 350), new Dictionary {{"a", 2}, {"b", 1}}); - - private readonly CheckpointTag _a2b1_after = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(430, 420), new Dictionary {{"a", 2}, {"b", 1}}); - - private readonly CheckpointTag _a1b2 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(500, 450), new Dictionary {{"a", 1}, {"b", 2}}); - - private readonly CheckpointTag _a2b2 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(600, 550), new Dictionary {{"a", 2}, {"b", 2}}); - - [Test] - public void equal_equals() { - Assert.IsTrue(_a1.Equals(_a1)); - } - - [Test] - public void equal_but_different_index_positions_still_equals() { - Assert.IsTrue(_a1.Equals(_a1_prime)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_a2b1 == _a2b1); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_a1 < _a1b1); - Assert.IsTrue(_a1 < _a1b2); - Assert.IsTrue(_a1 < _a2b2); - Assert.IsTrue(_a2b1 < _a2b1_after); - Assert.IsFalse(_a1b2 < _a1b2); - Assert.IsFalse(_a1b2 < _a1b1); - Assert.IsFalse(_a1b2 < _a2b1); - Assert.IsTrue(_a1 < _b1); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_a1 <= _a1b1); - Assert.IsTrue(_a1 <= _a1b2); - Assert.IsTrue(_a1 <= _a2b2); - Assert.IsTrue(_a2b1 <= _a2b1_after); - Assert.IsTrue(_a1b2 <= _a1b2); - Assert.IsFalse(_a1b2 <= _a1b1); - Assert.IsFalse(_a1b2 <= _a2b1); - Assert.IsTrue(_a1 <= _b1); - } - - [Test] - public void greater_operator() { - Assert.IsFalse(_a1 > _a1b1); - Assert.IsFalse(_a1 > _a1b2); - Assert.IsFalse(_a1 > _a2b2); - Assert.IsFalse(_a2b1 > _a2b1_after); - Assert.IsTrue(_a2b1_after > _a2b1); - Assert.IsFalse(_a1b2 > _a1b2); - Assert.IsTrue(_a1b2 > _a1b1); - Assert.IsTrue(_a1b2 > _a2b1); - Assert.IsFalse(_a1 > _b1); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsFalse(_a1 >= _a1b1); - Assert.IsFalse(_a1 >= _a1b2); - Assert.IsFalse(_a1 >= _a2b2); - Assert.IsFalse(_a2b1 >= _a2b1_after); - Assert.IsTrue(_a2b1_after >= _a2b1); - Assert.IsTrue(_a1b2 >= _a1b2); - Assert.IsTrue(_a1b2 >= _a1b1); - Assert.IsTrue(_a1b2 >= _a2b1); - Assert.IsFalse(_a1 >= _b1); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions_when_updating.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions_when_updating.cs deleted file mode 100644 index 9bb942d73..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_event_type_index_positions_when_updating.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_event_type_index_positions_when_updating { - private readonly CheckpointTag _a1b1 = CheckpointTag.FromEventTypeIndexPositions( - 1, new TFPos(100, 50), new Dictionary {{"a", 1}, {"b", 1}}); - - [Test] - public void updated_tf_only_position_is_correct() { - var updated = _a1b1.UpdateEventTypeIndexPosition(new TFPos(200, 50)); - Assert.AreEqual(1, updated.Streams["a"]); - Assert.AreEqual(new TFPos(200, 50), updated.Position); - } - - [Test] - public void updated_tf_position_is_correct() { - var updated = _a1b1.UpdateEventTypeIndexPosition(new TFPos(200, 50), "a", 2); - Assert.AreEqual(2, updated.Streams["a"]); - Assert.AreEqual(new TFPos(200, 50), updated.Position); - } - - [Test] - public void other_stream_position_is_correct() { - var updated = _a1b1.UpdateEventTypeIndexPosition(new TFPos(200, 50), "a", 2); - Assert.AreEqual(1, updated.Streams["b"]); - } - - [Test] - public void streams_are_correct() { - var updated = _a1b1.UpdateEventTypeIndexPosition(new TFPos(200, 50), "a", 2); - Assert.AreEqual(2, updated.Streams.Count); - Assert.IsTrue(updated.Streams.Any(v => v.Key == "a")); - Assert.IsTrue(updated.Streams.Any(v => v.Key == "b")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_phase.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_phase.cs deleted file mode 100644 index 93aa936fe..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_phase.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_phase { - private readonly CheckpointTag _p0 = CheckpointTag.FromPosition(0, 1000, 9); - private readonly CheckpointTag _p1a = CheckpointTag.FromPhase(1, completed: false); - private readonly CheckpointTag _p1b = CheckpointTag.FromPhase(1, completed: true); - private readonly CheckpointTag _p2 = CheckpointTag.FromPosition(2, 30, 29); - private readonly CheckpointTag _p3 = CheckpointTag.FromPosition(3, 30, 29); - - private readonly CheckpointTag _p4 = CheckpointTag.FromEventTypeIndexPositions( - 4, new TFPos(200, 150), new Dictionary {{"a", 1}}); - - [Test] - public void equal_equals() { - Assert.IsTrue(_p0.Equals(_p0)); - Assert.IsTrue(_p1a.Equals(_p1a)); - Assert.IsTrue(_p1b.Equals(_p1b)); - Assert.IsFalse(_p1a.Equals(_p1b)); - Assert.IsTrue(_p2.Equals(_p2)); - Assert.IsTrue(_p3.Equals(_p3)); - Assert.IsFalse(_p2.Equals(_p3)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_p1a == _p1a); - Assert.IsTrue(_p1a != _p1b); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_p0 < _p1a); - Assert.IsTrue(_p2 < _p3); - Assert.IsTrue(_p3 < _p4); - Assert.IsTrue(_p1a < _p1b); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_p1b <= _p2); - Assert.IsTrue(_p2 <= _p4); - Assert.IsTrue(_p3 <= _p3); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_p4 > _p1a); - Assert.IsTrue(_p1b > _p1a); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsFalse(_p1a >= _p1b); - Assert.IsTrue(_p1a >= _p1a); - Assert.IsTrue(_p1a >= _p0); - Assert.IsTrue(_p4 >= _p3); - Assert.IsTrue(_p3 >= _p1a); - Assert.IsTrue(_p2 >= _p2); - } - } -} - -#pragma warning restore 1718 diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_prepare_position.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_prepare_position.cs deleted file mode 100644 index de7de5484..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_prepare_position.cs +++ /dev/null @@ -1,54 +0,0 @@ -#pragma warning disable 1718 - -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_prepare_position { - private readonly CheckpointTag _aa = CheckpointTag.FromPreparePosition(1, 9); - private readonly CheckpointTag _b1 = CheckpointTag.FromPreparePosition(1, 15); - private readonly CheckpointTag _b2 = CheckpointTag.FromPreparePosition(1, 15); - private readonly CheckpointTag _cc = CheckpointTag.FromPreparePosition(1, 29); - private readonly CheckpointTag _d1 = CheckpointTag.FromPreparePosition(1, 35); - private readonly CheckpointTag _d2 = CheckpointTag.FromPreparePosition(1, 35); - - [Test] - public void equal_equals() { - Assert.IsTrue(_aa.Equals(_aa)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_b1 == _b1); - Assert.IsTrue(_b1 == _b2); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_aa < _b1); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_aa <= _b1); - Assert.IsTrue(_b1 <= _b2); - Assert.IsTrue(_b2 <= _b2); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_d1 > _cc); - Assert.IsFalse(_d2 > _d1); - Assert.IsFalse(_d2 > _d2); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_d1 >= _cc); - Assert.IsTrue(_d2 >= _d1); - Assert.IsTrue(_b2 >= _b2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_position.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_position.cs deleted file mode 100644 index fcebb3fca..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_position.cs +++ /dev/null @@ -1,47 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_catalog_stream { - private readonly CheckpointTag _a = CheckpointTag.FromByStreamPosition(0, "catalog", 1, "data", 10, 12345); - private readonly CheckpointTag _b = CheckpointTag.FromByStreamPosition(0, "catalog", 1, "data", 20, 12345); - private readonly CheckpointTag _c = CheckpointTag.FromByStreamPosition(0, "catalog", 2, "data2", 20, 12345); - - [Test] - public void equal_equals() { - Assert.IsTrue(_a.Equals(_a)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_b == _b); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_a < _b); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_a <= _b); - Assert.IsTrue(_c <= _c); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_b > _a); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_b >= _a); - Assert.IsTrue(_c >= _c); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions.cs deleted file mode 100644 index d3b60e62f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_stream_positions { - private readonly CheckpointTag _a1 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 1}}); - - private readonly CheckpointTag _b1 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"b", 1}}); - - private readonly CheckpointTag _a1b1 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 1}, {"b", 1}}); - - private readonly CheckpointTag _a2b1 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 2}, {"b", 1}}); - - private readonly CheckpointTag _a1b2 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 1}, {"b", 2}}); - - private readonly CheckpointTag _a2b2 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 2}, {"b", 2}}); - - [Test] - public void equal_equals() { - Assert.IsTrue(_a1.Equals(_a1)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_a2b1 == _a2b1); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_a1 < _a1b1); - Assert.IsTrue(_a1 < _a1b2); - Assert.IsTrue(_a1 < _a2b2); - Assert.IsFalse(_a1b2 < _a1b2); - Assert.IsFalse(_a1b2 < _a1b1); - Assert.Throws(() => TestHelper.Consume(_a1b2 < _a2b1)); - Assert.Throws(() => TestHelper.Consume(_a1 < _b1)); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_a1 <= _a1b1); - Assert.IsTrue(_a1 <= _a1b2); - Assert.IsTrue(_a1 <= _a2b2); - Assert.IsTrue(_a1b2 <= _a1b2); - Assert.IsFalse(_a1b2 <= _a1b1); - Assert.Throws(() => TestHelper.Consume(_a1b2 <= _a2b1)); - Assert.Throws(() => TestHelper.Consume(_a1 <= _b1)); - } - - [Test] - public void greater_operator() { - Assert.IsFalse(_a1 > _a1b1); - Assert.IsFalse(_a1 > _a1b2); - Assert.IsFalse(_a1 > _a2b2); - Assert.IsFalse(_a1b2 > _a1b2); - Assert.IsTrue(_a1b2 > _a1b1); - Assert.Throws(() => TestHelper.Consume(_a1b2 > _a2b1)); - Assert.Throws(() => TestHelper.Consume(_a1 > _b1)); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsFalse(_a1 >= _a1b1); - Assert.IsFalse(_a1 >= _a1b2); - Assert.IsFalse(_a1 >= _a2b2); - Assert.IsTrue(_a1b2 >= _a1b2); - Assert.IsTrue(_a1b2 >= _a1b1); - Assert.Throws(() => TestHelper.Consume(_a1b2 >= _a2b1)); - Assert.Throws(() => TestHelper.Consume(_a1 >= _b1)); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions_when_updating.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions_when_updating.cs deleted file mode 100644 index 4d79fbeb7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_stream_positions_when_updating.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_stream_positions_when_updating { - private readonly CheckpointTag _a1b1 = CheckpointTag.FromStreamPositions( - 1, new Dictionary {{"a", 1}, {"b", 1}}); - - [Test] - public void updated_position_is_correct() { - var updated = _a1b1.UpdateStreamPosition("a", 2); - Assert.AreEqual(2, updated.Streams["a"]); - } - - [Test] - public void other_stream_position_is_correct() { - var updated = _a1b1.UpdateStreamPosition("a", 2); - Assert.AreEqual(1, updated.Streams["b"]); - } - - [Test] - public void streams_are_correct() { - var updated = _a1b1.UpdateStreamPosition("a", 2); - Assert.AreEqual(2, updated.Streams.Count); - Assert.IsTrue(updated.Streams.Any(v => v.Key == "a")); - Assert.IsTrue(updated.Streams.Any(v => v.Key == "b")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_tf_position.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_tf_position.cs deleted file mode 100644 index 7ee71f7e5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_by_tf_position.cs +++ /dev/null @@ -1,54 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_by_tf_position { - private readonly CheckpointTag _aa = CheckpointTag.FromPosition(1, 10, 9); - private readonly CheckpointTag _b1 = CheckpointTag.FromPosition(1, 20, 15); - private readonly CheckpointTag _b2 = CheckpointTag.FromPosition(1, 20, 17); - private readonly CheckpointTag _cc = CheckpointTag.FromPosition(1, 30, 29); - private readonly CheckpointTag _d1 = CheckpointTag.FromPosition(1, 40, 35); - private readonly CheckpointTag _d2 = CheckpointTag.FromPosition(1, 40, 36); - - [Test] - public void equal_equals() { - Assert.IsTrue(_aa.Equals(_aa)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_b1 == _b1); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_aa < _b1); - Assert.IsTrue(_b1 < _b2); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_aa <= _b1); - Assert.IsTrue(_b1 <= _b2); - Assert.IsTrue(_b2 <= _b2); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_d1 > _cc); - Assert.IsTrue(_d2 > _d1); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_d1 >= _cc); - Assert.IsTrue(_d2 >= _d1); - Assert.IsTrue(_b2 >= _b2); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_phase.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_phase.cs deleted file mode 100644 index 330d73a91..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_phase.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -#pragma warning disable 1718 // allow a == a comparison - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_phase { - private readonly CheckpointTag _p0 = CheckpointTag.FromPosition(0, 1000, 9); - private readonly CheckpointTag _p1a = CheckpointTag.FromPosition(1, 500, 400); - private readonly CheckpointTag _p1b = CheckpointTag.FromPosition(1, 500, 450); - private readonly CheckpointTag _p2 = CheckpointTag.FromPosition(2, 30, 29); - private readonly CheckpointTag _p3 = CheckpointTag.FromStreamPosition(3, "stream", 100); - - private readonly CheckpointTag _p4 = CheckpointTag.FromEventTypeIndexPositions( - 4, new TFPos(200, 150), new Dictionary {{"a", 1}}); - - [Test] - public void equal_equals() { - Assert.IsTrue(_p0.Equals(_p0)); - Assert.IsTrue(_p1a.Equals(_p1a)); - Assert.IsTrue(_p1b.Equals(_p1b)); - Assert.IsTrue(_p2.Equals(_p2)); - Assert.IsTrue(_p3.Equals(_p3)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_p1a == _p1a); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_p0 < _p1a); - Assert.IsTrue(_p2 < _p3); - Assert.IsTrue(_p3 < _p4); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_p1b <= _p2); - Assert.IsTrue(_p2 <= _p4); - Assert.IsTrue(_p3 <= _p3); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_p4 > _p1a); - Assert.IsTrue(_p1b > _p1a); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_p1a >= _p0); - Assert.IsTrue(_p4 >= _p3); - Assert.IsTrue(_p3 >= _p1a); - Assert.IsTrue(_p2 >= _p2); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_to_from_json.cs b/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_to_from_json.cs deleted file mode 100644 index 2d1ed17c7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/checkpoint_tag/checkpoint_tag_to_from_json.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.checkpoint_tag { - [TestFixture] - public class checkpoint_tag_to_from_json { - [Test] - public void stream_position_should_not_overflow() { - var checkpointTag = CheckpointTag.FromStreamPosition(1, "test", 9876543210L); - var json = checkpointTag.ToJsonString(); - - var jsonReader = new JsonTextReader(new StringReader(json)); - var checkpointTagFromJson = CheckpointTag.FromJson(jsonReader, new ProjectionVersion(0, 0, 0)); - Assert.AreEqual(9876543210L, checkpointTagFromJson.Tag.Streams["test"]); - } - - [Test] - public void data_and_catalog_position_should_not_overflow() { - var checkpointTag = - CheckpointTag.FromByStreamPosition(1, "catalog", 9876543210L, "data", 9876543211L, 9876543212L); - var json = checkpointTag.ToJsonString(); - - var jsonReader = new JsonTextReader(new StringReader(json)); - var checkpointTagFromJson = CheckpointTag.FromJson(jsonReader, new ProjectionVersion(0, 0, 0)); - Assert.AreEqual(9876543210L, checkpointTagFromJson.Tag.CatalogPosition); - Assert.AreEqual(9876543211L, checkpointTagFromJson.Tag.DataPosition); - } - - [Test] - public void prepare_and_commit_positions_should_not_overflow() { - var checkpointTag = - CheckpointTag.FromPosition(1, 9876543210L, 9876543211L); - var json = checkpointTag.ToJsonString(); - - var jsonReader = new JsonTextReader(new StringReader(json)); - var checkpointTagFromJson = CheckpointTag.FromJson(jsonReader, new ProjectionVersion(0, 0, 0)); - Assert.AreEqual(9876543210L, checkpointTagFromJson.Tag.CommitPosition); - Assert.AreEqual(9876543211L, checkpointTagFromJson.Tag.PreparePosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_all.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_all.cs deleted file mode 100644 index dd24aa7bd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_all.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_restarting_with_projection_type_all { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - private Guid instanceCorrelationId = Guid.NewGuid(); - private Guid queueId; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.All, queues, publisher); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - - // All components started - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - instanceCorrelationId)); - - // Stop components, but don't handle any sub component stopped messages - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - var stopCore = queues[0].Messages.OfType().First(); - queueId = stopCore.QueueId; - //clear queues for clearer testing - queues[0].Messages.Clear(); - } - - [Test] - public void should_not_start_if_subcomponents_not_stopped() { - // None of the subcomponents have been stopped - - // Start Components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_not_start_if_not_all_subcomponents_stopped() { - // Not all subcomponents stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - - // Start Components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_start_if_subcomponents_stopped_before_starting_components_again() { - // All components have been stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_not_stop_if_all_subcomponents_not_started() { - var restartCorrelationId = Guid.NewGuid(); - - // All subcomponents stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(restartCorrelationId)); - - // Some components started, but not all - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - restartCorrelationId)); - - queues[0].Messages.Clear(); - // Attempt to stop the components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(restartCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - - [Test] - public void should_not_stop_if_not_started() { - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - queues[0].Messages.Clear(); - // Stop components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - - [Test] - public void should_not_stop_if_correlation_id_is_different() { - var restartCorrelationId = Guid.NewGuid(); - - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - // Start Components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(restartCorrelationId)); - - // All components started - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - restartCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - restartCorrelationId)); - - queues[0].Messages.Clear(); - // Stop components with a different correlation id - var incorrectCorrelationId = Guid.NewGuid(); - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(incorrectCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_none.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_none.cs deleted file mode 100644 index 66aec783d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_none.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_restarting_with_projection_type_none { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - private Guid instanceCorrelationId = Guid.NewGuid(); - private Guid queueId; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.None, queues, publisher); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - - // Stop components but don't handle component stopped - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - var stopReader = queues[0].Messages.OfType().First(); - queueId = stopReader.QueueId; - //clear queues for clearer testing - queues[0].Messages.Clear(); - } - - [Test] - public void should_not_start_reader_if_subcomponents_not_stopped() { - // None of the subcomponents stopped - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - } - - - [Test] - public void should_start_reader_if_subcomponents_stopped_before_starting_components_again() { - // Component stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - - // Start component - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - } - - [Test] - public void should_not_stop_reader_if_subcomponents_not_started_yet() { - var newInstanceCorrelationId = Guid.NewGuid(); - - // Stop components - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - - // Start components but don't handle component started - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(newInstanceCorrelationId)); - - // Stop components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(newInstanceCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - } - - [Test] - public void should_not_stop_reader_if_subcomponents_not_started() { - // Stop components - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - - // Stop components without starting - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_system.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_system.cs deleted file mode 100644 index 2d51ffed6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_restarting_with_projection_type_system.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_restarting_with_projection_type_system { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - private Guid instanceCorrelationId = Guid.NewGuid(); - private Guid queueId; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.System, queues, publisher); - - // Start components and handle started - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - instanceCorrelationId)); - - // Stop components but don't handle stopped - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - var stopCore = queues[0].Messages.OfType().First(); - queueId = stopCore.QueueId; - //clear queues for clearer testing - queues[0].Messages.Clear(); - } - - [Test] - public void should_not_start_if_subcomponents_not_stopped() { - // None of the subcomponents stopped - - // Start Components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_not_start_if_not_all_subcomponents_stopped() { - // Not all components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - - // Start Components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_start_if_subcomponents_stopped_before_starting_components_again() { - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StartCore).Count); - } - - [Test] - public void should_not_stop_if_all_subcomponents_not_started() { - var newInstanceCorrelationId = Guid.NewGuid(); - - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - queues[0].Messages.Clear(); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(newInstanceCorrelationId)); - - // Not all subcomponents started - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - newInstanceCorrelationId)); - - // Stop components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(newInstanceCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - - [Test] - public void should_not_stop_if_not_started() { - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - queues[0].Messages.Clear(); - - // Stop components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(Guid.NewGuid())); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - - [Test] - public void should_not_stop_if_correlation_id_is_different() { - var newInstanceCorrelationId = Guid.NewGuid(); - - // All components stopped - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(EventReaderCoreService.SubComponentName, - queueId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - queueId)); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(newInstanceCorrelationId)); - - // All components started - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - newInstanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - newInstanceCorrelationId)); - - queues[0].Messages.Clear(); - // Stop components with a different correlation id - var incorrectCorrelationId = Guid.NewGuid(); - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(incorrectCorrelationId)); - - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - Assert.AreEqual(0, queues[0].Messages.FindAll(x => x is ProjectionCoreServiceMessage.StopCore).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_all.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_all.cs deleted file mode 100644 index 3331319ea..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_all.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_starting_with_projection_type_all { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.All, queues, publisher); - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [Test] - public void should_publish_start_reader_messages() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - } - - [Test] - public void should_publish_start_core_messages() { - Assert.AreEqual(1, - queues[0].Messages.FindAll(x => x.GetType() == typeof(ProjectionCoreServiceMessage.StartCore)).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_none.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_none.cs deleted file mode 100644 index 8d8972a42..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_none.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_starting_with_projection_type_none { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.None, queues, publisher); - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [Test] - public void should_publish_start_reader_messages() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - } - - [Test] - public void should_not_publish_start_core_messages() { - Assert.AreEqual(0, - queues[0].Messages.FindAll(x => x.GetType() == typeof(ProjectionCoreServiceMessage.StartCore)).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_system.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_system.cs deleted file mode 100644 index 0198d4e0c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_starting_with_projection_type_system.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_starting_with_projection_type_system { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.System, queues, publisher); - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [Test] - public void should_publish_start_reader_messages() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StartReader).Count); - } - - [Test] - public void should_publish_start_core_messages() { - Assert.AreEqual(1, - queues[0].Messages.FindAll(x => x.GetType() == typeof(ProjectionCoreServiceMessage.StartCore)).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_all.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_all.cs deleted file mode 100644 index 90fcb5d30..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_all.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Linq; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_stopping_with_projection_type_all { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - private List stopCoreMessages = - new List(); - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - var instanceCorrelationId = Guid.NewGuid(); - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.All, queues, publisher); - - // Start all sub components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - - // All components started - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - instanceCorrelationId)); - - // Stop Components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - // Publish SubComponent stopped messages for the projection core service - stopCoreMessages = queues[0].Messages - .FindAll(x => x.GetType() == typeof(ProjectionCoreServiceMessage.StopCore)) - .Select(x => x as ProjectionCoreServiceMessage.StopCore) - .ToList(); - foreach (var msg in stopCoreMessages) - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - msg.QueueId)); - } - - [Test] - public void should_publish_stop_core_messages() { - Assert.AreEqual(1, stopCoreMessages.Count); - } - - [Test] - public void should_publish_stop_reader_messages_after_core_stopped() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_none.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_none.cs deleted file mode 100644 index 506f27861..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_none.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_stopping_with_projection_type_none { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - var instanceCorrelationId = Guid.NewGuid(); - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.None, queues, publisher); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - - // start sub components - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - - //force stop - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - } - - [Test] - public void should_publish_stop_reader_messages() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - } - - [Test] - public void should_not_publish_stop_core_messages() { - Assert.AreEqual(0, - queues[0].Messages.FindAll(x => x.GetType() == typeof(ProjectionCoreServiceMessage.StopCore)).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_system.cs b/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_system.cs deleted file mode 100644 index 0fa9f0d27..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_coordinator/when_stopping_with_projection_type_system.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Linq; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Options; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Tests.Fakes; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.core_coordinator { - [TestFixture] - public class when_stopping_with_projection_type_system { - private FakePublisher[] queues; - private FakePublisher publisher; - private ProjectionCoreCoordinator _coordinator; - - private List stopCoreMessages = - new List(); - - [SetUp] - public void Setup() { - queues = new List() {new FakePublisher()}.ToArray(); - publisher = new FakePublisher(); - - var instanceCorrelationId = Guid.NewGuid(); - _coordinator = - new ProjectionCoreCoordinator(ProjectionType.System, queues, publisher); - - // Start components - _coordinator.Handle(new ProjectionSubsystemMessage.StartComponents(instanceCorrelationId)); - - // Start all sub components - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(EventReaderCoreService.SubComponentName, - instanceCorrelationId)); - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStarted(ProjectionCoreService.SubComponentName, - instanceCorrelationId)); - - // Stop components - _coordinator.Handle(new ProjectionSubsystemMessage.StopComponents(instanceCorrelationId)); - - // Publish SubComponent stopped messages for the projection core service - stopCoreMessages = queues[0].Messages.OfType().ToList(); - foreach (var msg in stopCoreMessages) - _coordinator.Handle( - new ProjectionCoreServiceMessage.SubComponentStopped(ProjectionCoreService.SubComponentName, - msg.QueueId)); - } - - [Test] - public void should_publish_stop_core_messages() { - Assert.AreEqual(1, stopCoreMessages.Count); - } - - [Test] - public void should_publish_stop_reader_messages() { - Assert.AreEqual(1, queues[0].Messages.FindAll(x => x is ReaderCoreServiceMessage.StopReader).Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/FakeProjectionHandler.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/FakeProjectionHandler.cs deleted file mode 100644 index fd4a423f9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/FakeProjectionHandler.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public class FakeProjectionStateHandler : IProjectionStateHandler { - public int _initializeCalled = 0; - public int _initializeSharedCalled = 0; - public int _loadCalled = 0; - public int _eventsProcessed = 0; - public int _partitionCreatedProcessed = 0; - public string _loadedState = null; - public string _lastProcessedStreamId; - public string _lastProcessedEventType; - public Guid _lastProcessedEventId; - public long _lastProcessedSequencenumber; - public string _lastProcessedMetadata; - public string _lastProcessedData; - public string _lastPartition; - public const string _emit1Data = @"{""emit"":1}"; - public const string _emit2Data = @"{""emit"":2}"; - public const string _emit3Data = @"{""emit"":3}"; - public const string _emit1StreamId = "/emit1"; - public const string _emit2StreamId = "/emit2"; - public const string _emit1EventType = "emit1_event_type"; - public const string _emit2EventType = "emit2_event_type"; - - private readonly bool _failOnInitialize; - private readonly bool _failOnLoad; - private readonly bool _failOnProcessEvent; - private readonly bool _failOnGetPartition; - private readonly Action _configureBuilder; - private readonly IQuerySources _definition; - - public FakeProjectionStateHandler(string source, Action logger) { - _definition = source.ParseJson(); - } - - public FakeProjectionStateHandler( - bool failOnInitialize = false, bool failOnLoad = false, bool failOnProcessEvent = false, - bool failOnGetPartition = true, - Action configureBuilder = null) { - _failOnInitialize = failOnInitialize; - _failOnLoad = failOnLoad; - _failOnProcessEvent = failOnProcessEvent; - _failOnGetPartition = failOnGetPartition; - _configureBuilder = configureBuilder; - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - if (_configureBuilder != null) - _configureBuilder(builder); - else { - builder.FromAll(); - builder.AllEvents(); - builder.SetDefinesStateTransform(); - builder.SetOutputState(); - } - } - - public void Load(string state) { - if (_failOnLoad) - throw new Exception("LOAD_FAILED"); - _loadCalled++; - _loadedState = state; - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - if (_failOnInitialize) - throw new Exception("INITIALIZE_FAILED"); - _initializeCalled++; - _loadedState = ""; - } - - public void InitializeShared() { - if (_failOnInitialize) - throw new Exception("INITIALIZE_SHARED_FAILED"); - _initializeSharedCalled++; - _loadedState = ""; - } - - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - if (_failOnGetPartition) - throw new Exception("GetStatePartition FAILED"); - return "region-a"; - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - if (_failOnProcessEvent) - throw new Exception("PROCESS_EVENT_FAILED"); - _lastProcessedStreamId = data.EventStreamId; - _lastProcessedEventType = data.EventType; - _lastProcessedEventId = data.EventId; - _lastProcessedSequencenumber = data.EventSequenceNumber; - _lastProcessedMetadata = data.Metadata; - _lastProcessedData = data.Data; - _lastPartition = partition; - - _eventsProcessed++; - switch (data.EventType) { - case "skip_this_type": - newState = null; - emittedEvents = null; - return false; - case "handle_this_type": - _loadedState = newState = data.Data; - emittedEvents = null; - return true; - case "append": - _loadedState = newState = _loadedState + data.Data; - emittedEvents = null; - return true; - case "no_state_emit1_type": - _loadedState = newState = ""; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit1StreamId, Guid.NewGuid(), _emit1EventType, true, _emit1Data, null, eventPosition, - null)), - }; - return true; - case "emit1_type": - _loadedState = newState = data.Data; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit1StreamId, Guid.NewGuid(), _emit1EventType, true, _emit1Data, null, eventPosition, - null)), - }; - return true; - case "emit22_type": - _loadedState = newState = data.Data; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit2StreamId, Guid.NewGuid(), _emit2EventType, true, _emit1Data, null, eventPosition, - null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit2StreamId, Guid.NewGuid(), _emit2EventType, true, _emit2Data, null, eventPosition, - null)), - }; - return true; - case "emit212_type": - _loadedState = newState = data.Data; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit2StreamId, Guid.NewGuid(), _emit2EventType, true, _emit1Data, null, eventPosition, - null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit1StreamId, Guid.NewGuid(), _emit1EventType, true, _emit2Data, null, eventPosition, - null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit2StreamId, Guid.NewGuid(), _emit2EventType, true, _emit3Data, null, eventPosition, - null)), - }; - return true; - case "emit12_type": - _loadedState = newState = data.Data; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit1StreamId, Guid.NewGuid(), _emit1EventType, true, _emit1Data, null, eventPosition, - null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit2StreamId, Guid.NewGuid(), _emit2EventType, true, _emit2Data, null, eventPosition, - null)), - }; - return true; - case "just_emit": - newState = _loadedState; - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _emit1StreamId, Guid.NewGuid(), _emit1EventType, true, _emit1Data, null, eventPosition, - null)), - }; - return true; - default: - throw new NotSupportedException(); - } - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - _partitionCreatedProcessed++; - emittedEvents = null; - return true; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - return _loadedState; - } - - public void Dispose() { - } - - public IQuerySources GetSourceDefinition() { - return _definition ?? SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestCheckpointManagerMessageHandler.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestCheckpointManagerMessageHandler.cs deleted file mode 100644 index 09922253d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestCheckpointManagerMessageHandler.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public class TestCheckpointManagerMessageHandler : IProjectionCheckpointManager, IEmittedStreamContainer { - public readonly List HandledMessages = - new List(); - - public readonly List HandledRestartRequestedMessages = - new List(); - - public readonly List HandledFailedMessages = - new List(); - - public readonly List HandledWriteCompletedMessage = - new List(); - - public readonly List HandledStreamAwaitingMessage = - new List(); - - public void Handle(CoreProjectionProcessingMessage.ReadyForCheckpoint message) { - HandledMessages.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - HandledRestartRequestedMessages.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - HandledFailedMessages.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamAwaiting message) { - HandledStreamAwaitingMessage.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamWriteCompleted message) { - HandledWriteCompletedMessage.Add(message); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureUtils.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureUtils.cs deleted file mode 100644 index b77b26f3e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureUtils.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public static class TestFixtureUtils { - public static IEnumerable ToStream( - this IEnumerable self, string streamId) { - return self.Where(v => v.EventStreamId == streamId); - } - - public static List ToStream( - this List self, string streamId) { - return self.Where(v => v.EventStreamId == streamId).ToList(); - } - - public static IEnumerable OfEventType( - this IEnumerable self, string type) { - return self.SelectMany(v => v.Events).Where(v => v.EventType == type); - } - - public static IEnumerable ExceptOfEventType( - this IEnumerable self, string type) { - return self.SelectMany(v => v.Events).Where(v => v.EventType != type); - } - - public static List OfEventType( - this List self, string type) { - return self.SelectMany(v => v.Events).Where(v => v.EventType == type).ToList(); - } - - public static List WithEventType( - this List self, string type) { - return self.Where(v => v.Events.Any(m => m.EventType == type)).ToList(); - } - - public static IEnumerable OfTypes(this IEnumerable source) where T1 : T where T2 : T { - return source.OfType().Where(v => v is T1 || v is T2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjection.cs deleted file mode 100644 index d1ca7c49f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjection.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class TestFixtureWithCoreProjection : TestFixtureWithExistingEvents { - protected CoreProjection _coreProjection; - protected TestHandler _subscribeProjectionHandler; - protected TestHandler _writeEventHandler; - protected Guid _firstWriteCorrelationId; - protected FakeProjectionStateHandler _stateHandler; - protected int _checkpointHandledThreshold = 5; - protected int _checkpointUnhandledBytesThreshold = 10000; - protected Action _configureBuilderByQuerySource = null; - protected Guid _projectionCorrelationId; - private bool _createTempStreams = false; - protected ProjectionConfig _projectionConfig; - protected ProjectionVersion _version; - protected string _projectionName; - protected Guid _workerId; - - protected override void Given1() { - _version = new ProjectionVersion(1, 0, 0); - _projectionName = "projection"; - } - - [SetUp] - public void setup() { - _subscribeProjectionHandler = new TestHandler(); - _writeEventHandler = new TestHandler(); - _bus.Subscribe(_subscribeProjectionHandler); - _bus.Subscribe(_writeEventHandler); - - - _stateHandler = GivenProjectionStateHandler(); - _firstWriteCorrelationId = Guid.NewGuid(); - _workerId = Guid.NewGuid(); - var dispatcher = new ProjectionManagerMessageDispatcher(new Dictionary - {{_workerId, GetInputQueue()}}); - _projectionCorrelationId = Guid.NewGuid(); - _projectionConfig = GivenProjectionConfig(); - var projectionProcessingStrategy = GivenProjectionProcessingStrategy(); - _coreProjection = GivenCoreProjection(projectionProcessingStrategy); - _bus.Subscribe(_coreProjection); - _bus.Subscribe(_coreProjection); - _bus.Subscribe(_coreProjection); - _bus.Subscribe(_coreProjection); - _bus.Subscribe(_coreProjection); - _bus.Subscribe(new AdHocHandler(tick => tick.Action())); - PreWhen(); - When(); - } - - protected virtual CoreProjection - GivenCoreProjection(ProjectionProcessingStrategy projectionProcessingStrategy) { - return projectionProcessingStrategy.Create( - _projectionCorrelationId, - _bus, - _workerId, - SystemAccounts.System, - _bus, - _ioDispatcher, - _subscriptionDispatcher, - _timeProvider); - } - - protected virtual ProjectionProcessingStrategy GivenProjectionProcessingStrategy() { - return CreateProjectionProcessingStrategy(); - } - - protected ProjectionProcessingStrategy CreateProjectionProcessingStrategy() { - return new ContinuousProjectionProcessingStrategy( - _projectionName, _version, _stateHandler, _projectionConfig, _stateHandler.GetSourceDefinition(), null, - _subscriptionDispatcher, true); - } - - protected ProjectionProcessingStrategy CreateQueryProcessingStrategy() { - return new QueryProcessingStrategy( - _projectionName, _version, _stateHandler, _projectionConfig, _stateHandler.GetSourceDefinition(), null, - _subscriptionDispatcher, true); - } - - protected virtual ProjectionConfig GivenProjectionConfig() { - return new ProjectionConfig( - null, _checkpointHandledThreshold, _checkpointUnhandledBytesThreshold, GivenPendingEventsThreshold(), - GivenMaxWriteBatchLength(), GivenEmitEventEnabled(), GivenCheckpointsEnabled(), _createTempStreams, - GivenStopOnEof(), GivenTrackEmittedStreams(), GivenCheckpointAfterMs(), - GivenMaximumAllowedWritesInFlight(), null); - } - - protected virtual int GivenMaxWriteBatchLength() { - return 250; - } - - protected virtual int GivenPendingEventsThreshold() { - return 1000; - } - - protected virtual bool GivenStopOnEof() { - return false; - } - - protected virtual bool GivenCheckpointsEnabled() { - return true; - } - - protected virtual bool GivenTrackEmittedStreams() { - return true; - } - - protected virtual bool GivenEmitEventEnabled() { - return true; - } - - protected virtual int GivenCheckpointAfterMs() { - return 10000; - } - - protected virtual int GivenMaximumAllowedWritesInFlight() { - return 1; - } - - protected virtual FakeProjectionStateHandler GivenProjectionStateHandler() { - return new FakeProjectionStateHandler(configureBuilder: _configureBuilderByQuerySource); - } - - protected new virtual void PreWhen() { - } - - protected new abstract void When(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionLoaded.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionLoaded.cs deleted file mode 100644 index 88ef1670c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionLoaded.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class TestFixtureWithCoreProjectionLoaded : TestFixtureWithCoreProjection { - protected override void PreWhen() { - _coreProjection.LoadStopped(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionStarted.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionStarted.cs deleted file mode 100644 index 36806ed7f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithCoreProjectionStarted.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class TestFixtureWithCoreProjectionStarted : TestFixtureWithCoreProjection { - protected Guid _subscriptionId; - - protected override void PreWhen() { - _coreProjection.Start(); - var lastSubscribe = - _consumer.HandledMessages.OfType().LastOrDefault(); - _subscriptionId = lastSubscribe != null ? lastSubscribe.SubscriptionId : Guid.NewGuid(); - _bus.Publish(new EventReaderSubscriptionMessage.ReaderAssignedReader(_subscriptionId, Guid.NewGuid())); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithExistingEvents.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithExistingEvents.cs deleted file mode 100644 index 5341700a6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithExistingEvents.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class TestFixtureWithExistingEvents : EventStore.Core.Tests.Helpers.TestFixtureWithExistingEvents, - IHandle { - protected ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private bool _ticksAreHandledImmediately; - protected AwakeService AwakeService; - - protected override void Given1() { - base.Given1(); - _ticksAreHandledImmediately = false; - } - - [SetUp] - public void SetUp() { - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(_bus); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(this); - - AwakeService = new AwakeService(); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - _bus.Subscribe(new UnwrapEnvelopeHandler()); - } - - public void Handle(ProjectionCoreServiceMessage.CoreTick message) { - if (_ticksAreHandledImmediately) - message.Action(); - } - - protected void TicksAreHandledImmediately() { - _ticksAreHandledImmediately = true; - } - - protected ClientMessage.WriteEvents CreateWriteEvent( - string streamId, string eventType, string data, string metadata = null, bool isJson = true, - Guid? correlationId = null) { - return new ClientMessage.WriteEvents( - Guid.NewGuid(), correlationId ?? Guid.NewGuid(), GetInputQueue(), false, streamId, - ExpectedVersion.Any, new Event(Guid.NewGuid(), eventType, isJson, data, metadata), null); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithReadWriteDispatchers.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithReadWriteDispatchers.cs deleted file mode 100644 index 10217fef9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/TestFixtureWithReadWriteDispatchers.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class TestFixtureWithReadWriteDispatchers : - EventStore.Core.Tests.Helpers.TestFixtureWithReadWriteDispatchers { - protected ReaderSubscriptionDispatcher _subscriptionDispatcher; - - [SetUp] - public void SetUp() { - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(_bus); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/another_epoch/when_loading_an_existing_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/another_epoch/when_loading_an_existing_projection.cs deleted file mode 100644 index 2bce7a412..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/another_epoch/when_loading_an_existing_projection.cs +++ /dev/null @@ -1,39 +0,0 @@ -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.another_epoch { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_an_existing_projection : TestFixtureWithCoreProjectionStarted { - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - _version = new ProjectionVersion(1, 2, 2); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""v"":1, ""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""v"":1, ""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""v"":1, ""c"": 200, ""p"": 150}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""v"":1, ""c"": 300, ""p"": 250}", _testProjectionState); - } - - protected override void When() { - } - - - [Test] - public void should_subscribe_from_the_beginning() { - Assert.AreEqual(1, _subscribeProjectionHandler.HandledMessages.Count); - Assert.AreEqual(0, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.CommitPosition); - Assert.AreEqual(-1, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.PreparePosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/FakeCoreProjection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/FakeCoreProjection.cs deleted file mode 100644 index 91a5cf43d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/FakeCoreProjection.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Phases; -using EventStore.Projections.Core.Services.Processing.WorkItems; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - public class FakeCoreProjection : ICoreProjection, - ICoreProjectionForProcessingPhase, - IHandle { - public readonly List _checkpointCompletedMessages = - new List(); - - public readonly List _checkpointLoadedMessages = - new List(); - - public readonly List _prerecordedEventsLoadedMessages = - new List(); - - public void Handle(CoreProjectionProcessingMessage.CheckpointCompleted message) { - _checkpointCompletedMessages.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - _checkpointLoadedMessages.Add(message); - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - throw new System.NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - throw new System.NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - _prerecordedEventsLoadedMessages.Add(message); - } - - public void CompletePhase() { - CompletePhaseInvoked++; - } - - public void SetFaulted(string reason) { - throw new NotImplementedException(); - } - - public void SetFaulted(Exception ex) { - throw new NotImplementedException(); - } - - public void SetFaulting(string reason) { - throw new NotImplementedException(); - } - - public void SetCurrentCheckpointSuggestedWorkItem(CheckpointSuggestedWorkItem checkpointSuggestedWorkItem) { - throw new NotImplementedException(); - } - - public void EnsureTickPending() { - throw new NotImplementedException(); - } - - public CheckpointTag LastProcessedEventPosition { - get { throw new NotImplementedException(); } - } - - public int SubscribedInvoked { get; set; } - public int CompletePhaseInvoked { get; set; } - - public void Subscribed() { - SubscribedInvoked++; - } - - public void Handle(EventReaderSubscriptionMessage.ReaderAssignedReader message) { - throw new NotImplementedException(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/TestFixtureWithCoreProjectionCheckpointManager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/TestFixtureWithCoreProjectionCheckpointManager.cs deleted file mode 100644 index 13e7fb7e9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/TestFixtureWithCoreProjectionCheckpointManager.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - public abstract class TestFixtureWithCoreProjectionCheckpointManager : TestFixtureWithExistingEvents { - protected DefaultCheckpointManager _manager; - protected FakeCoreProjection _projection; - protected ProjectionConfig _config; - protected int _checkpointHandledThreshold; - protected int _checkpointUnhandledBytesThreshold; - protected int _pendingEventsThreshold; - protected int _maxWriteBatchLength; - protected bool _emitEventEnabled; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected int _checkpointAfterMs; - protected int _maximumAllowedWritesInFlight; - protected bool _producesResults; - protected bool _definesFold = true; - protected Guid _projectionCorrelationId; - private string _projectionCheckpointStreamId; - protected bool _createTempStreams; - protected bool _stopOnEof; - protected ProjectionNamesBuilder _namingBuilder; - protected CoreProjectionCheckpointWriter _checkpointWriter; - protected CoreProjectionCheckpointReader _checkpointReader; - protected string _projectionName; - protected ProjectionVersion _projectionVersion; - - [SetUp] - public void setup() { - Given(); - _namingBuilder = ProjectionNamesBuilder.CreateForTest("projection"); - _config = new ProjectionConfig(null, _checkpointHandledThreshold, _checkpointUnhandledBytesThreshold, - _pendingEventsThreshold, _maxWriteBatchLength, _emitEventEnabled, - _checkpointsEnabled, _createTempStreams, _stopOnEof, _trackEmittedStreams, _checkpointAfterMs, - _maximumAllowedWritesInFlight, null); - When(); - } - - protected new virtual void When() { - _projectionVersion = new ProjectionVersion(1, 0, 0); - _projectionName = "projection"; - _checkpointWriter = new CoreProjectionCheckpointWriter( - _namingBuilder.MakeCheckpointStreamName(), _ioDispatcher, _projectionVersion, _projectionName); - _checkpointReader = new CoreProjectionCheckpointReader( - GetInputQueue(), _projectionCorrelationId, _ioDispatcher, _projectionCheckpointStreamId, - _projectionVersion, _checkpointsEnabled); - _manager = GivenCheckpointManager(); - } - - protected virtual DefaultCheckpointManager GivenCheckpointManager() { - return new DefaultCheckpointManager( - _bus, _projectionCorrelationId, _projectionVersion, null, _ioDispatcher, _config, _projectionName, - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, - _checkpointWriter); - } - - protected new virtual void Given() { - _projectionCheckpointStreamId = "$projections-projection-checkpoint"; - _projectionCorrelationId = Guid.NewGuid(); - _projection = new FakeCoreProjection(); - _bus.Subscribe(_projection); - _bus.Subscribe(_projection); - _bus.Subscribe(_projection); - _bus.Subscribe(_projection); - _bus.Subscribe(_projection); - _bus.Subscribe(_projection); - - _bus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _checkpointHandledThreshold = 2; - _checkpointUnhandledBytesThreshold = 5; - _pendingEventsThreshold = 5; - _maxWriteBatchLength = 5; - _maximumAllowedWritesInFlight = 1; - _emitEventEnabled = true; - _checkpointsEnabled = true; - _producesResults = true; - _definesFold = true; - _createTempStreams = false; - _stopOnEof = false; - NoStream(_projectionCheckpointStreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/checkpoint_manager_with_partition.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/checkpoint_manager_with_partition.cs deleted file mode 100644 index 8a09e97b0..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/checkpoint_manager_with_partition.cs +++ /dev/null @@ -1,30 +0,0 @@ -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class checkpoint_manager_with_partition : - TestFixtureWithCoreProjectionCheckpointManager { - [Test] - public void when_loading_partition_state_for_a_partition() { - var checkpointMetadata = @"{ - ""$v"": ""1:-1:0:1"", - ""$s"": { - ""$ce-Evnt"": 0 - } - }"; - PartitionState state = new PartitionState("{\"foo\":1}", "{\"bar\":1}", CheckpointTag.Empty); - var serializedState = state.Serialize(); - var partition = "abc"; - ExistingEvent(_namingBuilder.MakePartitionCheckpointStreamName(partition), "$Checkpoint", - checkpointMetadata, serializedState); - _manager.BeginLoadPartitionStateAt(partition, CheckpointTag.Empty, state => { - Assert.AreEqual(serializedState, state.Serialize()); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/TestFixtureWithMultiStreamCheckpointManager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/TestFixtureWithMultiStreamCheckpointManager.cs deleted file mode 100644 index 3f9ace2db..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/TestFixtureWithMultiStreamCheckpointManager.cs +++ /dev/null @@ -1,22 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - public abstract class TestFixtureWithMultiStreamCheckpointManager : TestFixtureWithCoreProjectionCheckpointManager { - protected new string[] _streams; - - protected override void Given() { - base.Given(); - _projectionVersion = new ProjectionVersion(1, 0, 0); - _streams = new[] {"a", "b", "c"}; - } - - protected override DefaultCheckpointManager GivenCheckpointManager() { - return new MultiStreamMultiOutputCheckpointManager( - _bus, _projectionCorrelationId, _projectionVersion, null, _ioDispatcher, _config, _projectionName, - new MultiStreamPositionTagger(0, _streams), _namingBuilder, _checkpointsEnabled, true, true, - _checkpointWriter); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_prerecording_event_order.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_prerecording_event_order.cs deleted file mode 100644 index 6d9e87dd4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_prerecording_event_order.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_prerecording_event_order : TestFixtureWithMultiStreamCheckpointManager { - private ResolvedEvent _event1; - private ResolvedEvent _event2; - - protected override void Given() { - base.Given(); - _streams = new[] {"pa", "pb"}; - ExistingEvent("a", "test1", "{}", "{}"); - ExistingEvent("b", "test1", "{}", "{}"); - - ExistingEvent("pa", "$>", "1@a", "{$o:\"oa\"}"); - ExistingEvent("pb", "$>", "1@b", "{$o:\"ob\"}"); - - _event1 = new ResolvedEvent("pa", 1, "a", 1, true, new TFPos(200, 150), Guid.NewGuid(), "test1", true, "{}", - "{}", "{$o:\"oa\""); - _event2 = new ResolvedEvent("pb", 1, "b", 1, true, new TFPos(300, 250), Guid.NewGuid(), "test1", true, "{}", - "{}", "{$o:\"ob\""); - - NoOtherStreams(); - AllWritesSucceed(); - } - - protected override void When() { - base.When(); - Action noop = () => { }; - _manager.Initialize(); - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - - _manager.Start(CheckpointTag.FromStreamPositions(0, new Dictionary {{"pa", -1}, {"pb", -1}}), - null); - _manager.RecordEventOrder(_event1, - CheckpointTag.FromStreamPositions(0, new Dictionary {{"pa", 1}, {"pb", -1}}), - committed: noop); - _manager.RecordEventOrder(_event2, - CheckpointTag.FromStreamPositions(0, new Dictionary {{"pa", 1}, {"pb", 1}}), - committed: noop); - } - - [Test] - public void writes_correct_link_tos() { - var writeEvents = - _consumer.HandledMessages.OfType() - .SelectMany(v => v.Events) - .Where(v => v.EventType == SystemEventTypes.LinkTo) - .ToArray(); - Assert.AreEqual(2, writeEvents.Length); - Assert.AreEqual("1@pa", Helper.UTF8NoBom.GetString(writeEvents[0].Data)); - Assert.AreEqual("1@pb", Helper.UTF8NoBom.GetString(writeEvents[1].Data)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_enqueue_prerecorded_events_read_times_out.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_enqueue_prerecorded_events_read_times_out.cs deleted file mode 100644 index 4420c424b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_enqueue_prerecorded_events_read_times_out.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_and_enqueue_prerecorded_events_read_times_out : with_multi_stream_checkpoint_manager, - IHandle, - IHandle { - private bool _hasTimedOut; - private Guid _timeoutCorrelationId; - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private CoreProjectionProcessingMessage.PrerecordedEventsLoaded _eventsLoadedMessage; - - public override void When() { - _bus.Subscribe(this); - _bus.Subscribe(this); - - _checkpointManager.Initialize(); - var positions = new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}; - _checkpointManager.BeginLoadPrerecordedEvents(CheckpointTag.FromStreamPositions(0, positions)); - - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for pre recorded events loaded message"); - } - } - - public override void Handle(ClientMessage.ReadStreamEventsBackward message) { - if (!_hasTimedOut && message.EventStreamId == "a") { - _hasTimedOut = true; - _timeoutCorrelationId = message.CorrelationId; - return; - } - - base.Handle(message); - } - - public void Handle(TimerMessage.Schedule message) { - var delay = message.ReplyMessage as IODispatcherDelayedMessage; - if (delay != null && delay.MessageCorrelationId == _timeoutCorrelationId) { - message.Reply(); - } - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - _eventsLoadedMessage = message; - _mre.Set(); - } - - [Test] - public void should_send_prerecorded_events_message() { - Assert.IsNotNull(_eventsLoadedMessage); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_successfully.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_successfully.cs deleted file mode 100644 index 79c4c0a77..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_successfully.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_and_read_prerecorded_events_successfully : with_multi_stream_checkpoint_manager, - IHandle { - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private CoreProjectionProcessingMessage.PrerecordedEventsLoaded _eventsLoadedMessage; - - public override void When() { - _bus.Subscribe(this); - - _checkpointManager.Initialize(); - var positions = new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}; - _checkpointManager.BeginLoadPrerecordedEvents(CheckpointTag.FromStreamPositions(0, positions)); - - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for pre recorded events loaded message"); - } - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - _eventsLoadedMessage = message; - _mre.Set(); - } - - [Test] - public void should_send_prerecorded_events_message() { - Assert.IsNotNull(_eventsLoadedMessage); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_times_out.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_times_out.cs deleted file mode 100644 index 30578f243..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_and_read_prerecorded_events_times_out.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_and_read_prerecorded_events_times_out : with_multi_stream_checkpoint_manager, - IHandle, - IHandle { - private bool _hasTimedOut; - private Guid _timeoutCorrelationId; - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private CoreProjectionProcessingMessage.PrerecordedEventsLoaded _eventsLoadedMessage; - - public override void When() { - _bus.Subscribe(this); - _bus.Subscribe(this); - - _checkpointManager.Initialize(); - var positions = new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}; - _checkpointManager.BeginLoadPrerecordedEvents(CheckpointTag.FromStreamPositions(0, positions)); - - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for pre recorded events loaded message"); - } - } - - public override void Handle(ClientMessage.ReadStreamEventsBackward message) { - if (!_hasTimedOut) { - _hasTimedOut = true; - _timeoutCorrelationId = message.CorrelationId; - return; - } - - base.Handle(message); - } - - public void Handle(TimerMessage.Schedule message) { - var delay = message.ReplyMessage as IODispatcherDelayedMessage; - if (delay != null && delay.MessageCorrelationId == _timeoutCorrelationId) { - message.Reply(); - } - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - _eventsLoadedMessage = message; - _mre.Set(); - } - - [Test] - public void should_send_prerecorded_events_message() { - Assert.IsNotNull(_eventsLoadedMessage); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_after_the_last_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_after_the_last_checkpoint.cs deleted file mode 100644 index 6b9b01368..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_after_the_last_checkpoint.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_with_prerecorded_events_after_the_last_checkpoint : - TestFixtureWithMultiStreamCheckpointManager { - private readonly CheckpointTag _tag1 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 0}, {"b", 0}, {"c", 1}}); - - private readonly CheckpointTag _tag2 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 1}, {"b", 0}, {"c", 1}}); - - private readonly CheckpointTag _tag3 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}); - - protected override void Given() { - base.Given(); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", "{}"); - ExistingEvent("a", "StreamCreated", "", ""); - ExistingEvent("b", "StreamCreated", "", ""); - ExistingEvent("c", "StreamCreated", "", ""); - ExistingEvent("d", "StreamCreated", "", ""); - - ExistingEvent("a", "Event", "", @"{""data"":""a"""); - ExistingEvent("b", "Event", "bb", @"{""data"":""b"""); - ExistingEvent("c", "$>", "{$o:\"org\"}", @"1@d"); - ExistingEvent("d", "Event", "dd", @"{""data"":""d"""); - - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", "0@c"); - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 0, ""b"": 0, ""c"": 1}}", "1@c"); - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 1, ""b"": 0, ""c"": 1}}", "1@a"); - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 1, ""b"": 1, ""c"": 1}}", "1@b"); - } - - protected override void When() { - base.When(); - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - } - - [Test] - public void sends_correct_checkpoint_loaded_message() { - Assert.AreEqual(1, _projection._checkpointLoadedMessages.Count); - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 0}, {"b", 0}, {"c", 0}}), - _projection._checkpointLoadedMessages.Single().CheckpointTag); - Assert.AreEqual("{}", _projection._checkpointLoadedMessages.Single().CheckpointData); - } - - [Test] - public void sends_correct_preprecoded_events_loaded_message() { - Assert.AreEqual(1, _projection._prerecordedEventsLoadedMessages.Count); - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}), - _projection._prerecordedEventsLoadedMessages.Single().CheckpointTag); - } - - [Test] - public void sends_commited_event_received_messages_in_correct_order() { - var messages = HandledMessages.OfType().ToList(); - Assert.AreEqual(3, messages.Count); - - var message1 = messages[0]; - var message2 = messages[1]; - var message3 = messages[2]; - - Assert.AreEqual(_tag1, message1.CheckpointTag); - Assert.AreEqual(_tag2, message2.CheckpointTag); - Assert.AreEqual(_tag3, message3.CheckpointTag); - } - - [Test] - public void sends_correct_commited_event_received_messages() { - var messages = HandledMessages.OfType().ToList(); - Assert.AreEqual(3, messages.Count); - - var message1 = messages[0]; - var message2 = messages[1]; - var message3 = messages[2]; - - Assert.AreEqual(@"{""data"":""d""", message1.Data.Data); - Assert.AreEqual(@"{""data"":""a""", message2.Data.Data); - Assert.AreEqual(@"{""data"":""b""", message3.Data.Data); - - Assert.AreEqual(@"dd", message1.Data.Metadata); - Assert.IsNull(message2.Data.Metadata); - Assert.AreEqual(@"bb", message3.Data.Metadata); - - Assert.AreEqual("{$o:\"org\"}", message1.Data.PositionMetadata); - Assert.IsNull(message2.Data.PositionMetadata); - Assert.IsNull(message3.Data.PositionMetadata); - - Assert.AreEqual("Event", message1.Data.EventType); - Assert.AreEqual("Event", message2.Data.EventType); - Assert.AreEqual("Event", message3.Data.EventType); - - Assert.AreEqual("c", message1.Data.PositionStreamId); - Assert.AreEqual("a", message2.Data.PositionStreamId); - Assert.AreEqual("b", message3.Data.PositionStreamId); - - Assert.AreEqual("d", message1.Data.EventStreamId); - Assert.AreEqual("a", message2.Data.EventStreamId); - Assert.AreEqual("b", message3.Data.EventStreamId); - - Assert.AreEqual(_projectionCorrelationId, message1.SubscriptionId); - Assert.AreEqual(_projectionCorrelationId, message2.SubscriptionId); - Assert.AreEqual(_projectionCorrelationId, message3.SubscriptionId); - - Assert.AreEqual(true, message1.Data.ResolvedLinkTo); - Assert.AreEqual(false, message2.Data.ResolvedLinkTo); - Assert.AreEqual(false, message3.Data.ResolvedLinkTo); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_before_the_last_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_before_the_last_checkpoint.cs deleted file mode 100644 index ad0bf99e2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_before_the_last_checkpoint.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using NUnit.Framework; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_with_prerecorded_events_before_the_last_checkpoint : - TestFixtureWithMultiStreamCheckpointManager { - protected override void Given() { - base.Given(); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""s"": {""a"": 0, ""b"": 1, ""c"": 0}}", "{}"); - ExistingEvent("a", "StreamCreated", "", ""); - ExistingEvent("b", "StreamCreated", "", ""); - ExistingEvent("c", "StreamCreated", "", ""); - ExistingEvent("d", "StreamCreated", "", ""); - - ExistingEvent("a", "Event", "", @"{""data"":""a"""); - ExistingEvent("b", "Event", "bb", @"{""data"":""b"""); - ExistingEvent("c", "$>", "{$o:\"org\"}", @"1@d"); - ExistingEvent("d", "Event", "dd", @"{""data"":""d"""); - - // Lots of pre-recorded events before the checkpoint. - for (int i = 0; i < 1000; i++) { - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", "0@c"); - } - - // Pre-recorded event at checkpoint - ExistingEvent( - "$projections-projection-order", "$>", @"{""s"": {""a"": 0, ""b"": 1, ""c"": 0}}", "1@b"); - } - - protected override void When() { - base.When(); - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - } - - [Test] - public void stops_reading_prerecorded_events_after_found_checkpoint() { - Assert.AreEqual(1, - _consumer.HandledMessages.OfType() - .Count(_ => _.EventStreamId == "$projections-projection-order")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_in_past_epoch.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_in_past_epoch.cs deleted file mode 100644 index 1f0e281d7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/when_starting_with_prerecorded_events_in_past_epoch.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_with_prerecorded_events_in_past_epoch : TestFixtureWithMultiStreamCheckpointManager { - private readonly CheckpointTag _tag1 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 0}, {"b", 0}, {"c", 1}}); - - private readonly CheckpointTag _tag2 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 1}, {"b", 0}, {"c", 1}}); - - //private readonly CheckpointTag _tag3 =CheckpointTag.FromStreamPositions(new Dictionary {{"a", 1}, {"b", 1}, {"c", 1}}); - - protected override void Given() { - base.Given(); - _projectionVersion = new ProjectionVersion(1, 2, 2); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""v"":2, ""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", - "{}"); - ExistingEvent("a", "StreamCreated", "", ""); - ExistingEvent("b", "StreamCreated", "", ""); - ExistingEvent("c", "StreamCreated", "", ""); - - ExistingEvent("a", "Event", "", @"{""data"":""a"""); - ExistingEvent("b", "Event", "", @"{""data"":""b"""); - ExistingEvent("c", "Event", "", @"{""data"":""c"""); - - ExistingEvent("$projections-projection-order", "$>", @"{""v"":1, ""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", - "0@c"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":1, ""s"": {""a"": 0, ""b"": 0, ""c"": 1}}", - "1@c"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":1, ""s"": {""a"": 1, ""b"": 0, ""c"": 1}}", - "1@a"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":1, ""s"": {""a"": 1, ""b"": 1, ""c"": 1}}", - "1@b"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":2, ""s"": {""a"": 0, ""b"": 0, ""c"": 0}}", - "0@c"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":2, ""s"": {""a"": 0, ""b"": 0, ""c"": 1}}", - "1@c"); - ExistingEvent("$projections-projection-order", "$>", @"{""v"":2, ""s"": {""a"": 1, ""b"": 0, ""c"": 1}}", - "1@a"); - } - - protected override void When() { - base.When(); - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - } - - [Test] - public void sends_correct_checkpoint_loaded_message() { - Assert.AreEqual(1, _projection._checkpointLoadedMessages.Count); - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 0}, {"b", 0}, {"c", 0}}), - _projection._checkpointLoadedMessages.Single().CheckpointTag); - Assert.AreEqual("{}", _projection._checkpointLoadedMessages.Single().CheckpointData); - } - - [Test] - public void sends_correct_prerecorded_events_loaded_message() { - Assert.AreEqual(1, _projection._prerecordedEventsLoadedMessages.Count); - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 1}, {"b", 0}, {"c", 1}}), - _projection._prerecordedEventsLoadedMessages.Single().CheckpointTag); - } - - [Test] - public void sends_committed_event_received_messages_in_correct_order() { - var messages = HandledMessages.OfType().ToList(); - Assert.AreEqual(2, messages.Count); - - var message1 = messages[0]; - var message2 = messages[1]; - - Assert.AreEqual(_tag1, message1.CheckpointTag); - Assert.AreEqual(_tag2, message2.CheckpointTag); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/with_multi_stream_checkpoint_manager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/with_multi_stream_checkpoint_manager.cs deleted file mode 100644 index 931f4471e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/multi_stream/with_multi_stream_checkpoint_manager.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Helpers.IODispatcherTests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager.multi_stream { - public abstract class with_multi_stream_checkpoint_manager : IHandle { - protected readonly SynchronousScheduler _bus = new(); - protected readonly Guid _projectionId = Guid.NewGuid(); - protected readonly string[] _streams = new string[] {"a", "b", "c"}; - protected readonly string _projectionName = "test_projection"; - - protected IODispatcher _ioDispatcher; - protected ProjectionVersion _projectionVersion; - protected ProjectionConfig _projectionConfig; - protected PositionTagger _positionTagger; - protected ProjectionNamesBuilder _namingBuilder; - protected CoreProjectionCheckpointWriter _coreProjectionCheckpointWriter; - protected MultiStreamMultiOutputCheckpointManager _checkpointManager; - - private bool _hasRead; - - [OneTimeSetUp] - public void TestFixtureSetUp() { - _ioDispatcher = new IODispatcher(_bus, _bus, true); - _projectionVersion = new ProjectionVersion(3, 1, 2); - _projectionConfig = new ProjectionConfig(SystemAccounts.System, 10, 1000, 1000, 10, true, true, true, - false, - false, 5000, 10, null); - _positionTagger = new MultiStreamPositionTagger(3, _streams); - _positionTagger.AdjustTag(CheckpointTag.FromStreamPositions(3, - new Dictionary {{"a", 0}, {"b", 0}, {"c", 0}})); - _namingBuilder = ProjectionNamesBuilder.CreateForTest("projection"); - - IODispatcherTestHelpers.SubscribeIODispatcher(_ioDispatcher, _bus); - _bus.Subscribe(this); - - _coreProjectionCheckpointWriter = new CoreProjectionCheckpointWriter( - _namingBuilder.MakeCheckpointStreamName(), _ioDispatcher, - _projectionVersion, _projectionName); - - _checkpointManager = new MultiStreamMultiOutputCheckpointManager(_bus, _projectionId, _projectionVersion, - SystemAccounts.System, - _ioDispatcher, _projectionConfig, _projectionName, _positionTagger, _namingBuilder, true, true, false, - _coreProjectionCheckpointWriter); - - When(); - } - - public abstract void When(); - - public virtual void Handle(ClientMessage.ReadStreamEventsBackward message) { - if (message.EventStreamId == _namingBuilder.GetOrderStreamName()) - message.Envelope.ReplyWith(ReadOrderStream(message)); - if (message.EventStreamId == "a") - message.Envelope.ReplyWith(ReadTestStream(message)); - } - - public ClientMessage.ReadStreamEventsBackwardCompleted ReadOrderStream( - ClientMessage.ReadStreamEventsBackward message) { - ResolvedEvent[] events; - if (!_hasRead) { - var checkpoint = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"a", 5}, {"b", 5}, {"c", 5}}); - events = IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, "$>", - "10@a", checkpoint.ToJsonString(new ProjectionVersion(3, 0, 1))); - _hasRead = true; - } else { - events = new ResolvedEvent[0] { }; - } - - return new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId, message.EventStreamId, - message.FromEventNumber, - message.MaxCount, ReadStreamResult.Success, events, null, true, "", - message.FromEventNumber - events.Length, message.FromEventNumber, true, 10000); - } - - public ClientMessage.ReadStreamEventsBackwardCompleted ReadTestStream( - ClientMessage.ReadStreamEventsBackward message) { - var events = - IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, "testevent", "{ \"data\":1 }"); - return new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId, message.EventStreamId, - message.FromEventNumber, - message.MaxCount, ReadStreamResult.Success, events, null, true, "", message.FromEventNumber - 1, - message.FromEventNumber, true, 10000); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_checkpoint_has_been_completed_and_requesting_checkpoint_to_stop.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_checkpoint_has_been_completed_and_requesting_checkpoint_to_stop.cs deleted file mode 100644 index 75d7a8a37..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_checkpoint_has_been_completed_and_requesting_checkpoint_to_stop.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_checkpoint_has_been_completed_and_requesting_checkpoint_to_stop : - TestFixtureWithCoreProjectionCheckpointManager { - private Exception _exception; - - protected override void Given() { - AllWritesSucceed(); - base.Given(); - this._checkpointHandledThreshold = 2; //NOTE: does not play any role anymore here - } - - protected override void When() { - base.When(); - _exception = null; - try { - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); -// _manager.StateUpdated("", @"{""state"":""state1""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 11), 77.7f); -// _manager.StateUpdated("", @"{""state"":""state2""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 12), 77.8f); - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 12), 77.8f); - _manager.Stopping(); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void does_not_throw() { - Assert.IsNull(_exception); - } - - [Test] - public void two_checkpoints_are_completed() { - Assert.AreEqual(2, _projection._checkpointCompletedMessages.Count); - } - - - [Test] - public void only_one_checkpoint_has_been_written() { - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .ToStream("$projections-projection-checkpoint") - .Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_core_projection_checkpoint_manager_has_been_created.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_core_projection_checkpoint_manager_has_been_created.cs deleted file mode 100644 index 5f2a8b7e1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_core_projection_checkpoint_manager_has_been_created.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_a_core_projection_checkpoint_manager_has_been_created : TestFixtureWithCoreProjectionCheckpointManager { - [Test] - public void stopping_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopping(); }); - } - - [Test] - public void stopped_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopped(); }); - } - - [Test] - public void event_processed_throws_invalid_operation_exception() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - Assert.Throws(() => { - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void checkpoint_suggested_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void ready_for_checkpoint_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.Handle(new CoreProjectionProcessingMessage.ReadyForCheckpoint(null)); - }); - } - - [Test] - public void can_begin_load_state() { - _checkpointWriter.StartFrom(CheckpointTag.FromPosition(0, 0, -1), ExpectedVersion.NoStream); - } - - [Test] - public void can_be_started() { - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_default_checkpoint_manager_has_been_reinitialized.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_default_checkpoint_manager_has_been_reinitialized.cs deleted file mode 100644 index 58952fdb0..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_a_default_checkpoint_manager_has_been_reinitialized.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_default_checkpoint_manager_has_been_reinitialized : - TestFixtureWithCoreProjectionCheckpointManager { - //private Exception _exception; - - protected override void Given() { - AllWritesSucceed(); - base.Given(); - _checkpointHandledThreshold = 2; - } - - protected override void When() { - base.When(); - //_exception = null; - try { - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); -// _manager.StateUpdated("", @"{""state"":""state1""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 11), 77.7f); -// _manager.StateUpdated("", @"{""state"":""state2""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 12), 77.7f); - _manager.Initialize(); - _checkpointReader.Initialize(); - } catch (Exception) { - //_exception = ex; - } - } - - - [Test] - public void stopping_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopping(); }); - } - - [Test] - public void stopped_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopped(); }); - } - - [Test] - public void event_processed_throws_invalid_operation_exception() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - Assert.Throws(() => { - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void checkpoint_suggested_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void ready_for_checkpoint_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.Handle(new CoreProjectionProcessingMessage.ReadyForCheckpoint(null)); - }); - } - - [Test] - public void can_begin_load_state() { - _checkpointReader.BeginLoadState(); - } - - [Test] - public void can_be_started() { - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_beginning_to_load_state_the_core_projection_checkpoint_manager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_beginning_to_load_state_the_core_projection_checkpoint_manager.cs deleted file mode 100644 index 9b215a6c5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_beginning_to_load_state_the_core_projection_checkpoint_manager.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_beginning_to_load_state_the_core_projection_checkpoint_manager : - TestFixtureWithCoreProjectionCheckpointManager { - private Exception _exception; - - protected override void When() { - base.When(); - _exception = null; - try { - _checkpointReader.BeginLoadState(); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void it_can_be_invoked() { - Assert.IsNull(_exception); - } - - [Test] - public void start_throws_invalid_operation_exception() { - Assert.Throws(() => { _checkpointReader.BeginLoadState(); }); - } - - [Test] - public void stopping_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopping(); }); - } - - [Test] - public void stopped_throws_invalid_operation_exception() { - Assert.Throws(() => { _manager.Stopped(); }); - } - - [Test] - public void event_processed_throws_invalid_operation_exception() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - Assert.Throws(() => { - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void checkpoint_suggested_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void ready_for_checkpoint_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.Handle(new CoreProjectionProcessingMessage.ReadyForCheckpoint(null)); - }); - } - - [Test] - public void can_be_started() { - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); - } - - [Test] - public void cannot_be_started_from_incompatible_checkpoint_tag() { - //TODO: move to when loaded - Assert.Throws(() => { - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream1", 10), null); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_creating_a_default_checkpoint_manager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_creating_a_default_checkpoint_manager.cs deleted file mode 100644 index 3b76ef8e6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_creating_a_default_checkpoint_manager.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating_a_default_checkpoint_manager : TestFixtureWithCoreProjectionCheckpointManager { - private CoreProjectionCheckpointWriter _coreProjectionCheckpointWriter; - - protected override void When() { - // do not create - _coreProjectionCheckpointWriter = - new CoreProjectionCheckpointWriter( - _namingBuilder.MakeCheckpointStreamName(), _ioDispatcher, _projectionVersion, _projectionName); - _namingBuilder = ProjectionNamesBuilder.CreateForTest("projection"); - } - - [Test] - public void it_can_be_created() { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, - "projection", new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, - _producesResults, _definesFold, _coreProjectionCheckpointWriter); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - null, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, - "projection", new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, - _producesResults, _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void null_io_dispatcher_throws_argument_null_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, null, _config, "projection", - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void null_projection_config_throws_argument_null_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, null, - "projection", - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void null_projection_name_throws_argument_null_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, null, - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void null_position_tagger_throws_argument_null_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, - "projection", null, _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void empty_projection_checkpoint_stream_id_throws_argument_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, "", - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - - [Test] - public void empty_projection_name_throws_argument_exception() { - Assert.Throws(() => { - _manager = new DefaultCheckpointManager( - _bus, _projectionCorrelationId, new ProjectionVersion(1, 0, 0), null, _ioDispatcher, _config, "", - new StreamPositionTagger(0, "stream"), _namingBuilder, _checkpointsEnabled, _producesResults, - _definesFold, _coreProjectionCheckpointWriter); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_multiple_event_processed_received_the_core_projection_checkpoint_manager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_multiple_event_processed_received_the_core_projection_checkpoint_manager.cs deleted file mode 100644 index af51b88ba..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_multiple_event_processed_received_the_core_projection_checkpoint_manager.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_multiple_event_processed_received_the_core_projection_checkpoint_manager : - TestFixtureWithCoreProjectionCheckpointManager { - private Exception _exception; - - protected override void Given() { - AllWritesSucceed(); - base.Given(); - this._checkpointHandledThreshold = 2; - } - - protected override void When() { - base.When(); - _exception = null; - try { - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); -// _manager.StateUpdated("", @"{""state"":""state1""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 11), 77.7f); -// _manager.StateUpdated("", @"{""state"":""state2""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 12), 77.7f); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void messages_are_handled() { - Assert.IsNull(_exception); - } - - [Test] - public void accepts_stopping() { - _manager.Stopping(); - } - - [Test] - public void accepts_stopped() { - _manager.Stopped(); - } - - [Test] - public void accepts_event_processed() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 13), 77.7f); - } - - [Test] - public void event_processed_at_the_start_position_throws_invalid_operation_exception() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - Assert.Throws(() => { - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void accepts_checkpoint_suggested() { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 13), 77.7f); - } - - [Test] - public void checkpoint_suggested_at_the_start_position_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_starting_the_core_projection_checkpoint_manager.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_starting_the_core_projection_checkpoint_manager.cs deleted file mode 100644 index 997ad14f8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_manager/when_starting_the_core_projection_checkpoint_manager.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_the_core_projection_checkpoint_manager : TestFixtureWithCoreProjectionCheckpointManager { - private Exception _exception; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - } - - protected override void When() { - base.When(); - _exception = null; - try { - _checkpointReader.BeginLoadState(); - var checkpointLoaded = - _consumer.HandledMessages.OfType().First(); - _checkpointWriter.StartFrom(checkpointLoaded.CheckpointTag, checkpointLoaded.CheckpointEventNumber); - _manager.BeginLoadPrerecordedEvents(checkpointLoaded.CheckpointTag); - - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void it_can_be_started() { - Assert.IsNull(_exception); - } - - [Test] - public void start_throws_invalid_operation_exception() { - Assert.Throws(() => { - _manager.Start(CheckpointTag.FromStreamPosition(0, "stream", 10), null); - }); - } - - [Test] - public void accepts_stopping() { - _manager.Stopping(); - } - - [Test] - public void accepts_stopped() { - _manager.Stopped(); - } - - [Test] - public void accepts_event_processed() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 11), 77.7f); - } - - [Test] - public void event_processed_at_the_start_position_throws_invalid_operation_exception() { -// _manager.StateUpdated("", @"{""state"":""state""}"); - Assert.Throws(() => { - _manager.EventProcessed(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - }); - } - - [Test] - public void accepts_checkpoint_suggested() { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 11), 77.7f); - Assert.AreEqual(1, _projection._checkpointCompletedMessages.Count); - } - - [Test] - public void accepts_checkpoint_suggested_even_at_the_start_position_but_does_not_complete_it() { - _manager.CheckpointSuggested(CheckpointTag.FromStreamPosition(0, "stream", 10), 77.7f); - Assert.AreEqual(0, _projection._checkpointCompletedMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_suggested.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_suggested.cs deleted file mode 100644 index 9fa62c77f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/checkpoint_suggested.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public static class checkpoint_suggested { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_checkpoint_is_suggested : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _checkpointHandledThreshold = 10; - _checkpointUnhandledBytesThreshold = 41; - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.IncludeEvent("non-existing"); - }; - NoStream("$projections-projection-state"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - NoStream(FakeProjectionStateHandler._emit1StreamId); - AllWritesSucceed(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(140, 130), - new Dictionary {{"non-existing", -1}}), 55.5f, 0)); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - // projection checkpoint is written even though no events are passing the projection event filter - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_second_checkpoint_is_suggested : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _checkpointHandledThreshold = 10; - _checkpointUnhandledBytesThreshold = 41; - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.IncludeEvent("non-existing"); - }; - NoStream("$$$projections-projection-order"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$$$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - - NoStream("$$$projections-projection-checkpoint"); - NoStream("$projections-projection-checkpoint"); - AllWritesToSucceed("$$$projections-projection-checkpoint"); - - NoStream(FakeProjectionStateHandler._emit1StreamId); - AllWritesQueueUp(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(140, 130), - new Dictionary {{"non-existing", -1}}), 55.5f, 0)); - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(160, 150), - new Dictionary {{"non-existing", -1}}), 55.6f, 1)); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - // projection checkpoint is written even though no events are passing the projection event filter - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_second_checkpoint_is_suggested_and_write_succeeds : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _checkpointHandledThreshold = 10; - _checkpointUnhandledBytesThreshold = 41; - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.IncludeEvent("non-existing"); - }; - NoStream("$projections-projection-state"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - NoStream(FakeProjectionStateHandler._emit1StreamId); - AllWritesSucceed(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(140, 130), - new Dictionary {{"non-existing", -1}}), 55.5f, 0)); - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(160, 150), - new Dictionary {{"non-existing", -1}}), 55.6f, 1)); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - // projection checkpoint is written even though no events are passing the projection event filter - Assert.AreEqual( - 2, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/specification_with_multi_phase_core_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/specification_with_multi_phase_core_projection.cs deleted file mode 100644 index 2256306c1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/specification_with_multi_phase_core_projection.cs +++ /dev/null @@ -1,404 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using Serilog; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { - abstract class specification_with_multi_phase_core_projection : TestFixtureWithCoreProjection { - private FakeCheckpointManager _phase1checkpointManager; - private FakeCheckpointManager _phase2checkpointManager; - private IEmittedStreamsTracker _emittedStreamsTracker; - private FakeProjectionProcessingPhase _phase1; - private FakeProjectionProcessingPhase _phase2; - private IReaderStrategy _phase1readerStrategy; - private IReaderStrategy _phase2readerStrategy; - - class FakeProjectionProcessingStrategy : ProjectionProcessingStrategy { - private readonly FakeProjectionProcessingPhase _phase1; - private readonly FakeProjectionProcessingPhase _phase2; - - public FakeProjectionProcessingStrategy( - string name, ProjectionVersion projectionVersion, ILogger logger, FakeProjectionProcessingPhase phase1, - FakeProjectionProcessingPhase phase2) - : base(name, projectionVersion, logger) { - _phase1 = phase1; - _phase2 = phase2; - } - - protected override IQuerySources GetSourceDefinition() { - return new QuerySourcesDefinition { - AllStreams = true, - AllEvents = true, - ByStreams = true, - Options = new QuerySourcesDefinitionOptions() - }; - } - - public override bool GetStopOnEof() { - return true; - } - - public override bool GetUseCheckpoints() { - return false; - } - - public override bool GetRequiresRootPartition() { - return false; - } - - public override bool GetProducesRunningResults() { - return true; - } - - public override void EnrichStatistics(ProjectionStatistics info) { - } - - public override IProjectionProcessingPhase[] CreateProcessingPhases( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - PartitionStateCache partitionStateCache, - Action updateStatistics, - CoreProjection coreProjection, - ProjectionNamesBuilder namingBuilder, - ITimeProvider timeProvider, - IODispatcher ioDispatcher, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter) { - return new IProjectionProcessingPhase[] {_phase1, _phase2}; - } - } - - internal class FakeProjectionProcessingPhase : IProjectionProcessingPhase { - private readonly int _phase; - private readonly specification_with_multi_phase_core_projection _specification; - private readonly ICoreProjectionCheckpointManager _checkpointManager; - private readonly IEmittedStreamsTracker _emittedStreamsTracker; - private readonly IReaderStrategy _readerStrategy; - - private bool _initializedFromCheckpoint; - private CheckpointTag _initializedFromCheckpointAt; - private PhaseState _state; - private Guid _subscriptionId; - private int _subscribeInvoked; - - public FakeProjectionProcessingPhase(int phase, - specification_with_multi_phase_core_projection specification, - ICoreProjectionCheckpointManager checkpointManager, IReaderStrategy readerStrategy, - IEmittedStreamsTracker emittedStreamsTracker) { - _phase = phase; - _specification = specification; - _checkpointManager = checkpointManager; - _readerStrategy = readerStrategy; - _emittedStreamsTracker = emittedStreamsTracker; - } - - public void Dispose() { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionManagementMessage.GetState message) { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionManagementMessage.GetResult message) { - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - throw new NotImplementedException(); - } - - public CheckpointTag AdjustTag(CheckpointTag tag) { - return tag; - } - - public void InitializeFromCheckpoint(CheckpointTag checkpointTag) { - _initializedFromCheckpoint = true; - _initializedFromCheckpointAt = checkpointTag; - } - - public void SetProjectionState(PhaseState state) { - _state = state; - } - - public void ProcessEvent() { - ProcessEventInvoked++; - } - - public void Subscribe(CheckpointTag from, bool fromCheckpoint) { - _subscribeInvoked++; - _subscriptionId = Guid.NewGuid(); - _specification._coreProjection.Subscribed(); - } - - public void EnsureUnsubscribed() { - throw new NotImplementedException(); - } - - public CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromPhase(_phase, completed: false); - } - - public ICoreProjectionCheckpointManager CheckpointManager { - get { return _checkpointManager; } - } - - public IEmittedStreamsTracker EmittedStreamsTracker { - get { return _emittedStreamsTracker; } - } - - public IReaderStrategy ReaderStrategy { - get { return _readerStrategy; } - } - - public bool InitializedFromCheckpoint { - get { return _initializedFromCheckpoint; } - } - - public CheckpointTag InitializedFromCheckpointAt { - get { return _initializedFromCheckpointAt; } - } - - public PhaseState State { - get { return _state; } - } - - public Guid SubscriptionId { - get { return _subscriptionId; } - } - - public bool Unsubscribed_ { - get { return false; } - } - - public int ProcessEventInvoked { get; set; } - - public int SubscribeInvoked { - get { return _subscribeInvoked; } - set { _subscribeInvoked = value; } - } - - public void GetStatistics(ProjectionStatistics info) { - } - - public void Complete() { - _specification._coreProjection.CompletePhase(); - } - } - - internal class FakeCheckpointManager : ICoreProjectionCheckpointManager, IEmittedEventWriter { - private readonly IPublisher _publisher; - private readonly Guid _projectionCorrelationId; - - private bool _started; - private CheckpointTag _startedAt; - private CheckpointTag _lastEvent; - private float _progress; - private bool _stopped; - private bool _stopping; - private readonly List _emittedEvents = new List(); - - public FakeCheckpointManager(IPublisher publisher, Guid projectionCorrelationId) { - _publisher = publisher; - _projectionCorrelationId = projectionCorrelationId; - } - - public void Initialize() { - } - - public void Start(CheckpointTag checkpointTag, PartitionState rootPartitionState) { - _started = true; - _startedAt = checkpointTag; - _lastEvent = checkpointTag; - } - - public void Stopping() { - _stopping = true; - _publisher.Publish( - new CoreProjectionProcessingMessage.CheckpointCompleted(_projectionCorrelationId, _lastEvent)); - } - - public void Stopped() { - _stopped = true; - } - - public void GetStatistics(ProjectionStatistics info) { - } - - public void NewPartition(string partition, CheckpointTag eventCheckpointTag) { - throw new NotImplementedException(); - } - - public void EventsEmitted( - EmittedEventEnvelope[] scheduledWrites, Guid causedBy, string correlationId) { - EmittedEvents.AddRange(scheduledWrites); - } - - public void StateUpdated(string partition, PartitionState oldState, PartitionState newState) { - throw new NotImplementedException(); - } - - public void PartitionCompleted(string partition) { - } - - public void EventProcessed(CheckpointTag checkpointTag, float progress) { - _lastEvent = checkpointTag; - } - - public bool CheckpointSuggested(CheckpointTag checkpointTag, float progress) { - throw new NotImplementedException(); - } - - public void Progress(float progress) { - _progress = progress; - } - - public void BeginLoadState() { - _publisher.Publish( - new CoreProjectionProcessingMessage.CheckpointLoaded( - _projectionCorrelationId, CheckpointTag.FromPosition(0, 0, -1), "", 0)); - } - - public void BeginLoadPrerecordedEvents(CheckpointTag checkpointTag) { - _publisher.Publish( - new CoreProjectionProcessingMessage.PrerecordedEventsLoaded(_projectionCorrelationId, - checkpointTag)); - } - - public void BeginLoadPartitionStateAt(string statePartition, CheckpointTag requestedStateCheckpointTag, - Action loadCompleted) { - throw new NotImplementedException(); - } - - public void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, - Action committed) { - throw new NotImplementedException(); - } - - public CheckpointTag LastProcessedEventPosition { - get { return _lastEvent; } - } - - public bool Started { - get { return _started; } - } - - public CheckpointTag StartedAt { - get { return _startedAt; } - } - - public float Progress_ { - get { return _progress; } - } - - public bool Stopped_ { - get { return _stopped; } - } - - public bool Stopping_ { - get { return _stopping; } - } - - public List EmittedEvents { - get { return _emittedEvents; } - } - } - - protected class FakeReaderStrategy : IReaderStrategy { - private readonly int _phase; - - public FakeReaderStrategy(int phase) { - _phase = phase; - } - - public bool IsReadingOrderRepeatable { - get { throw new NotImplementedException(); } - } - - public EventFilter EventFilter { - get { throw new NotImplementedException(); } - } - - public PositionTagger PositionTagger { - get { return new TransactionFilePositionTagger(Phase); } - } - - public int Phase { - get { return _phase; } - } - - public IReaderSubscription CreateReaderSubscription( - IPublisher publisher, CheckpointTag fromCheckpointTag, Guid subscriptionId, - ReaderSubscriptionOptions readerSubscriptionOptions) { - throw new NotImplementedException(); - } - - public IEventReader CreatePausedEventReader( - Guid eventReaderId, IPublisher publisher, IODispatcher ioDispatcher, CheckpointTag checkpointTag, - bool stopOnEof, int? stopAfterNEvents) { - throw new NotImplementedException(); - } - } - - public class FakeEmittedStreamsTracker : IEmittedStreamsTracker { - public void Initialize() { - } - - public void TrackEmittedStream(EmittedEvent[] emittedEvents) { - } - } - - public FakeCheckpointManager Phase1CheckpointManager { - get { return _phase1checkpointManager; } - } - - public FakeCheckpointManager Phase2CheckpointManager { - get { return _phase2checkpointManager; } - } - - - public FakeProjectionProcessingPhase Phase1 { - get { return _phase1; } - } - - public FakeProjectionProcessingPhase Phase2 { - get { return _phase2; } - } - - protected override ProjectionProcessingStrategy GivenProjectionProcessingStrategy() { - _phase1checkpointManager = new FakeCheckpointManager(_bus, _projectionCorrelationId); - _phase2checkpointManager = new FakeCheckpointManager(_bus, _projectionCorrelationId); - _emittedStreamsTracker = new FakeEmittedStreamsTracker(); - _phase1readerStrategy = GivenPhase1ReaderStrategy(); - _phase2readerStrategy = GivenPhase2ReaderStrategy(); - _phase1 = new FakeProjectionProcessingPhase(0, this, Phase1CheckpointManager, _phase1readerStrategy, - _emittedStreamsTracker); - _phase2 = new FakeProjectionProcessingPhase(1, this, Phase2CheckpointManager, _phase2readerStrategy, - _emittedStreamsTracker); - return new FakeProjectionProcessingStrategy( - _projectionName, _version, Log.Logger, Phase1, Phase2); - } - - protected virtual FakeReaderStrategy GivenPhase2ReaderStrategy() { - return new FakeReaderStrategy(1); - } - - protected virtual FakeReaderStrategy GivenPhase1ReaderStrategy() { - return new FakeReaderStrategy(0); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_completing_phase1_of_a_multiphase_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_completing_phase1_of_a_multiphase_projection.cs deleted file mode 100644 index d69022d39..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_completing_phase1_of_a_multiphase_projection.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_completing_phase1_of_a_multiphase_projection : specification_with_multi_phase_core_projection { - protected override void When() { - _coreProjection.Start(); - Phase1.Complete(); - } - - [Test] - public void stops_phase1_checkpoint_manager() { - Assert.IsTrue(Phase1CheckpointManager.Stopped_); - } - - [Test] - public void initializes_phase2() { - Assert.IsTrue(Phase2.InitializedFromCheckpoint); - } - - [Test] - public void updates_checkpoint_tag_phase() { - Assert.AreEqual(1, _coreProjection.LastProcessedEventPosition.Phase); - } - - [Test] - public void publishes_subscribe_message() { - Assert.AreEqual(1, Phase2.SubscribeInvoked); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_creating_a_multi_phase_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_creating_a_multi_phase_projection.cs deleted file mode 100644 index 61dc603ca..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_creating_a_multi_phase_projection.cs +++ /dev/null @@ -1,18 +0,0 @@ -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_creating_a_multi_phase_projection : specification_with_multi_phase_core_projection { - protected override void When() { - } - - [Test] - public void it_is_created() { - } - } -} - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_a_multi_phase_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_a_multi_phase_projection.cs deleted file mode 100644 index e5109f151..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_a_multi_phase_projection.cs +++ /dev/null @@ -1,16 +0,0 @@ -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_starting_a_multi_phase_projection : specification_with_multi_phase_core_projection { - protected override void When() { - _coreProjection.Start(); - } - - [Test] - public void it_starts() { - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_phase2_without_a_reader_strategy.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_phase2_without_a_reader_strategy.cs deleted file mode 100644 index e7a19f937..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/multi_phase/when_starting_phase2_without_a_reader_strategy.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.multi_phase { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_starting_phase2_without_a_reader_strategy : specification_with_multi_phase_core_projection { - protected override FakeReaderStrategy GivenPhase2ReaderStrategy() { - return null; - } - - protected override void When() { - _coreProjection.Start(); - Phase1.Complete(); - } - - [Test] - public void initializes_phase2() { - Assert.IsTrue(Phase2.InitializedFromCheckpoint); - } - - [Test] - public void updates_checkpoint_tag_phase() { - Assert.AreEqual(1, _coreProjection.LastProcessedEventPosition.Phase); - } - - [Test] - public void starts_processing_phase2() { - Assert.AreEqual(1, Phase2.ProcessEventInvoked); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_non_started_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_non_started_checkpoint.cs deleted file mode 100644 index f00c9548d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_non_started_checkpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class the_non_started_checkpoint : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - } - - [Test] - public void prepare_throws_invalid_operation_exception() { - Assert.Throws(() => { - _checkpoint.Prepare(CheckpointTag.FromPosition(0, 200, 150)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_started_checkpoint_with_some_events_emitted.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_started_checkpoint_with_some_events_emitted.cs deleted file mode 100644 index b38b9cd25..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/the_started_checkpoint_with_some_events_emitted.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class the_started_checkpoint_with_some_events_emitted : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope(new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data2", null, CheckpointTag.FromPosition(0, 120, 110), - null)), - new EmittedEventEnvelope(new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data4", null, CheckpointTag.FromPosition(0, 120, 110), - null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope(new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 140, 130), - null)) - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope(new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 160, 150), - null)) - }); - } - - [Test] - public void requesting_checkpoints_with_position_before_the_last_known_throws_invalid_operation_exception() { - Assert.Throws(() => { - _checkpoint.Prepare(CheckpointTag.FromPosition(0, 140, 130)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_creating_a_projection_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_creating_a_projection_checkpoint.cs deleted file mode 100644 index 73af15ecd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_creating_a_projection_checkpoint.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests.Fakes; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture] - public class when_creating_a_projection_checkpoint { - private FakePublisher _fakePublisher; - private TestCheckpointManagerMessageHandler _readyHandler; - private IODispatcher _ioDispatcher; - - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _fakePublisher = new FakePublisher(); - _ioDispatcher = new IODispatcher(_fakePublisher, _fakePublisher, true); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new ProjectionCheckpoint( - null, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - }); - } - - [Test] - public void null_io_dispatcher_throws_argument_null_exception() { - Assert.Throws(() => { - new ProjectionCheckpoint( - _fakePublisher, null, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - }); - } - - [Test] - public void null_ready_handler_throws_argument_null_exception() { - Assert.Throws(() => { - new ProjectionCheckpoint( - _fakePublisher, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, null, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - }); - } - - [Test] - public void commit_position_less_than_or_equal_to_prepare_position_throws_argument_exception() { - Assert.Throws(() => { - new ProjectionCheckpoint( - _fakePublisher, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 101), new TransactionFilePositionTagger(0), 250, 1); - }); - } - - [Test] - public void it_can_be_created() { - new ProjectionCheckpoint( - _fakePublisher, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_before_from_position_the_projection_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_before_from_position_the_projection_checkpoint.cs deleted file mode 100644 index 7f15dc62b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_before_from_position_the_projection_checkpoint.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_emitting_events_before_from_position_the_projection_checkpoint : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private Exception _lastException; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - try { - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 40, 30), null)) - }); - } catch (Exception ex) { - _lastException = ex; - } - } - - [Test] - public void throws_invalid_operation_exception() { - Assert.Throws(() => { - if (_lastException != null) throw _lastException; - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_backward_order_to_the_same_stream_the_projection_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_backward_order_to_the_same_stream_the_projection_checkpoint.cs deleted file mode 100644 index 08e237ac2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_backward_order_to_the_same_stream_the_projection_checkpoint.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_emitting_events_in_backward_order_to_the_same_stream_the_projection_checkpoint : - TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private Exception _lastException; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - try { - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)) - }); - } catch (Exception ex) { - _lastException = ex; - } - } - - [Test] - public void throws_invalid_operation_exception() { - Assert.Throws(() => { - if (_lastException != null) throw _lastException; - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_correct_order_the_started_projection_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_correct_order_the_started_projection_checkpoint.cs deleted file mode 100644 index 0e57b508e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_in_correct_order_the_started_projection_checkpoint.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_emitting_events_in_correct_order_the_started_projection_checkpoint : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$stream1"); - AllWritesToSucceed("$$stream2"); - AllWritesToSucceed("$$stream3"); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type1", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream3", Guid.NewGuid(), "type2", true, "data3", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type3", true, "data4", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type4", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - OneWriteCompletes(); //stream2 - OneWriteCompletes(); //stream3 - } - - [Test] - public void should_publish_write_events() { - var writeEvents = - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata); - Assert.AreEqual(4, writeEvents.Count()); - } - - [Test] - public void should_publish_write_events_to_correct_streams() { - Assert.IsTrue( - _consumer.HandledMessages.OfType().Any(v => v.EventStreamId == "stream1")); - Assert.IsTrue( - _consumer.HandledMessages.OfType().Any(v => v.EventStreamId == "stream2")); - Assert.IsTrue( - _consumer.HandledMessages.OfType().Any(v => v.EventStreamId == "stream3")); - } - - [Test] - public void should_group_events_to_the_same_stream_caused_by_the_same_event() { - // this is important for the projection to be able to recover by CausedBy. Unless we commit all the events - // to the stream in a single transaction we can get into situation when only part of events CausedBy the same event - // are present in a stream - Assert.AreEqual( - 2, - _consumer.HandledMessages.OfType().Single(v => v.EventStreamId == "stream2") - .Events.Length); - } - - [Test] - public void should_not_write_a_second_group_until_the_first_write_completes() { - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 170, 160), null)) - }); - var writeRequests = - _consumer.HandledMessages.OfType().Where(v => v.EventStreamId == "stream1"); - var writeEvents = writeRequests.Single(); - writeEvents.Envelope.ReplyWith( - new ClientMessage.WriteEventsCompleted(writeEvents.CorrelationId, 0, 0, -1, -1)); - Assert.AreEqual(2, writeRequests.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_the_non_started_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_the_non_started_checkpoint.cs deleted file mode 100644 index e9e5d0058..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_the_non_started_checkpoint.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_emitting_events_the_non_started_checkpoint : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream3", Guid.NewGuid(), "type", true, "data3", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data4", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - } - - [Test] - public void does_not_publish_write_events() { - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_maximum_allowed_writes_in_flight_set.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_maximum_allowed_writes_in_flight_set.cs deleted file mode 100644 index 7e2637834..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_maximum_allowed_writes_in_flight_set.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System.Collections; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - - [TestFixture(typeof(LogFormat.V2), typeof(string), 1)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), 1)] - [TestFixture(typeof(LogFormat.V2), typeof(string), 2)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), 2)] - [TestFixture(typeof(LogFormat.V2), typeof(string), 3)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), 3)] - public class when_emitting_events_with_maximum_allowed_writes_in_flight_set : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - private int _maximumNumberOfAllowedWritesInFlight; - - public when_emitting_events_with_maximum_allowed_writes_in_flight_set( - int maximumNumberOfAllowedWritesInFlight) { - _maximumNumberOfAllowedWritesInFlight = maximumNumberOfAllowedWritesInFlight; - } - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$stream1"); - AllWritesToSucceed("$$stream2"); - AllWritesToSucceed("$$stream3"); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, - _maximumNumberOfAllowedWritesInFlight); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type1", true, "data1", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type2", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream3", Guid.NewGuid(), "type3", true, "data3", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - } - - [Test] - public void should_have_the_same_number_writes_in_flight_as_configured() { - var writeEvents = - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata); - Assert.AreEqual(_maximumNumberOfAllowedWritesInFlight, writeEvents.Count()); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_emitting_events_with_maximum_allowed_writes_in_flight_set_to_unlimited : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$stream1"); - AllWritesToSucceed("$$stream2"); - AllWritesToSucceed("$$stream3"); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, - AllowedWritesInFlight.Unbounded); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type1", true, "data1", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type2", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream3", Guid.NewGuid(), "type3", true, "data3", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - } - - [Test] - public void should_have_as_many_writes_in_flight_as_requested() { - var writeEvents = - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata); - Assert.AreEqual(3, writeEvents.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_null_streamId.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_null_streamId.cs deleted file mode 100644 index 05c222c69..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_emitting_events_with_null_streamId.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_emitting_events_with_null_streamId : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private Exception _lastException; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - try { - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - null, Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 40, 30), - null)) - }); - } catch (Exception ex) { - _lastException = ex; - } - } - - [Test] - public void throws_invalid_operation_exception() { - Assert.Throws(() => { - if (_lastException != null) throw _lastException; - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_handling_stream_awaiting_message.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_handling_stream_awaiting_message.cs deleted file mode 100644 index 79fea47ed..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_handling_stream_awaiting_message.cs +++ /dev/null @@ -1,46 +0,0 @@ -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.Replication; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_stream_awaiting_message : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - private FakeEnvelope _fakeEnvelope; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - - _fakeEnvelope = new FakeEnvelope(); - _checkpoint.Handle( - new CoreProjectionProcessingMessage.EmittedStreamAwaiting("awaiting_stream", _fakeEnvelope)); - } - - [Test] - public void broadcasts_write_completed_to_awaiting_streams() { - _checkpoint.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted("completed_stream")); - Assert.AreEqual(1, _fakeEnvelope.Replies.Count); - Assert.IsInstanceOf(_fakeEnvelope.Replies[0]); - } - - [Test] - public void does_not_broadcast_second_write_completed_to_awaiting_streams() { - _checkpoint.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted("completed_stream1")); - _checkpoint.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted("completed_stream2")); - Assert.AreEqual(1, _fakeEnvelope.Replies.Count); - Assert.IsInstanceOf(_fakeEnvelope.Replies[0]); - Assert.AreEqual("completed_stream1", - ((CoreProjectionProcessingMessage.EmittedStreamWriteCompleted)_fakeEnvelope.Replies[0]).StreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_after_all_writes_completed.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_after_all_writes_completed.cs deleted file mode 100644 index 2a01d9d07..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_after_all_writes_completed.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_requesting_checkpoint_after_all_writes_completed : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data4", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - var writes = _consumer.HandledMessages.OfType().ToArray(); - writes[0].Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted(writes[0].CorrelationId, 0, 0, -1, -1)); - writes[1].Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted(writes[1].CorrelationId, 0, 0, -1, -1)); - _checkpoint.Prepare(CheckpointTag.FromPosition(0, 200, 150)); - //TODO: test whether checkpoint does not allow positions before last emitted event caused by position - } - - [Test] - public void ready_for_checkpoint_immediately() { - Assert.AreEqual( - 1, _readyHandler.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_before_all_writes_completed.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_before_all_writes_completed.cs deleted file mode 100644 index bbda4da0e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_requesting_checkpoint_before_all_writes_completed.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_requesting_checkpoint_before_all_writes_completed : TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.Start(); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data4", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 160, 150), null)) - }); - _checkpoint.Prepare(CheckpointTag.FromPosition(0, 200, 150)); - } - - [Test] - public void not_ready_for_checkpoint_immediately() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void ready_for_checkpoint_after_all_writes_complete() { - var writes = _consumer.HandledMessages.OfType().ToArray(); - writes[0].Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted(writes[0].CorrelationId, 0, 0, -1, -1)); - writes[1].Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted(writes[1].CorrelationId, 0, 0, -1, -1)); - writes = _consumer.HandledMessages.OfType().ToArray(); - writes[2].Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted(writes[2].CorrelationId, 0, 0, -1, -1)); - - Assert.AreEqual(1, - _readyHandler.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_starting_the_projection_checkpoint_with_some_events_already_emitted.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_starting_the_projection_checkpoint_with_some_events_already_emitted.cs deleted file mode 100644 index 54e8a0a2f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_starting_the_projection_checkpoint_with_some_events_already_emitted.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_the_projection_checkpoint_with_some_events_already_emitted : - TestFixtureWithExistingEvents { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - NoStream("stream1"); - NoStream("stream2"); - NoStream("stream3"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 100, 50), new TransactionFilePositionTagger(0), 250, - AllowedWritesInFlight.Unbounded); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data2", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream3", Guid.NewGuid(), "type", true, "data3", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream2", Guid.NewGuid(), "type", true, "data4", null, - CheckpointTag.FromPosition(0, 120, 110), null)), - }); - _checkpoint.ValidateOrderAndEmitEvents( - new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "stream1", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 140, 130), null)) - }); - _checkpoint.Start(); - } - - [Test] - public void should_publish_write_events() { - Assert.AreEqual(3, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_the_projection_checkpoint_has_been_started.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_the_projection_checkpoint_has_been_started.cs deleted file mode 100644 index 739e643fb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint/when_the_projection_checkpoint_has_been_started.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint { - [TestFixture] - public class when_the_projection_checkpoint_has_been_started : TestFixtureWithReadWriteDispatchers { - private ProjectionCheckpoint _checkpoint; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _checkpoint = new ProjectionCheckpoint( - _bus, _ioDispatcher, new ProjectionVersion(1, 0, 0), null, _readyHandler, - CheckpointTag.FromPosition(0, 0, -1), new TransactionFilePositionTagger(0), 250, 1); - _checkpoint.Start(); - } - - [Test] - public void start_throws_invalid_operation_exception() { - Assert.Throws(() => { _checkpoint.Start(); }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_reads_successfully.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_reads_successfully.cs deleted file mode 100644 index 95cf21e53..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_reads_successfully.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_projection_reader_reads_successfully : with_projection_checkpoint_reader, - IHandle { - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private CoreProjectionProcessingMessage.CheckpointLoaded _checkpointLoaded; - - public override void When() { - _bus.Subscribe(this); - - _reader.Initialize(); - _reader.BeginLoadState(); - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for checkpoint to load"); - } - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - _checkpointLoaded = message; - _mre.Set(); - } - - [Test] - public void should_load_checkpoint() { - Assert.IsNotNull(_checkpointLoaded); - Assert.AreEqual(_checkpointLoaded.ProjectionId, _projectionId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_times_out_on_read.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_times_out_on_read.cs deleted file mode 100644 index fb40ee672..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/when_projection_reader_times_out_on_read.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers.IODispatcherTests; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_projection_reader_times_out_on_read : with_projection_checkpoint_reader, - IHandle, - IHandle { - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private CoreProjectionProcessingMessage.CheckpointLoaded _checkpointLoaded; - private bool _hasTimedOut; - private Guid _timeoutCorrelationId; - - public override void When() { - _bus.Subscribe(this); - _bus.Subscribe(this); - - _reader.Initialize(); - _reader.BeginLoadState(); - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for checkpoint to load"); - } - } - - public override void Handle(ClientMessage.ReadStreamEventsBackward message) { - if (!_hasTimedOut) { - _timeoutCorrelationId = message.CorrelationId; - _hasTimedOut = true; - return; - } - - var evnts = IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, - ProjectionEventTypes.ProjectionCheckpoint, "[]", - @"{ - ""$v"": ""1:-1:3:3"", - ""$c"": 269728, - ""$p"": 269728 - }"); - var reply = new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId, - message.EventStreamId, message.FromEventNumber, message.MaxCount, ReadStreamResult.Success, - evnts, null, true, "", 0, 0, true, 10000); - message.Envelope.ReplyWith(reply); - } - - public void Handle(TimerMessage.Schedule message) { - var delay = message.ReplyMessage as IODispatcherDelayedMessage; - if (delay != null && delay.MessageCorrelationId == _timeoutCorrelationId) { - message.Reply(); - } - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - _checkpointLoaded = message; - _mre.Set(); - } - - [Test] - public void should_load_checkpoint() { - Assert.IsNotNull(_checkpointLoaded); - Assert.AreEqual(_checkpointLoaded.ProjectionId, _projectionId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/with_projection_checkpoint_reader.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/with_projection_checkpoint_reader.cs deleted file mode 100644 index f6710c2b8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/projection_checkpoint_reader/with_projection_checkpoint_reader.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests.Helpers.IODispatcherTests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection.projection_checkpoint_reader { - public abstract class with_projection_checkpoint_reader : IHandle { - protected readonly string _projectionCheckpointStreamId = "projection-checkpoint-stream"; - protected readonly Guid _projectionId = Guid.NewGuid(); - - protected SynchronousScheduler _bus = new(); - protected IODispatcher _ioDispatcher; - protected ProjectionVersion _projectionVersion; - protected CoreProjectionCheckpointReader _reader; - - [OneTimeSetUp] - public void TestFixtureSetUp() { - _ioDispatcher = new IODispatcher(_bus, _bus, true); - IODispatcherTestHelpers.SubscribeIODispatcher(_ioDispatcher, _bus); - _bus.Subscribe(this); - _projectionVersion = new ProjectionVersion(1, 2, 3); - _reader = new CoreProjectionCheckpointReader(_bus, _projectionId, _ioDispatcher, - _projectionCheckpointStreamId, _projectionVersion, true); - When(); - } - - public abstract void When(); - - public virtual void Handle(ClientMessage.ReadStreamEventsBackward message) { - var evnts = IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, - ProjectionEventTypes.ProjectionCheckpoint, "[]", - @"{ - ""$v"": ""1:-1:3:3"", - ""$c"": 269728, - ""$p"": 269728 - }"); - var reply = new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId, - message.EventStreamId, message.FromEventNumber, message.MaxCount, ReadStreamResult.Success, - evnts, null, true, "", 0, 0, true, 10000); - message.Envelope.ReplyWith(reply); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_new_partitiion_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_new_partitiion_the_projection_should.cs deleted file mode 100644 index 5d74deb41..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_new_partitiion_the_projection_should.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating_a_new_partitiion_the_projection_should : TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetByStream(); - source.SetDefinesStateTransform(); - }; - TicksAreHandledImmediately(); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", -1, "account-01", -1, false, new TFPos(120, 110), _eventId, "handle_this_type", - false, "data", "metadata"), _subscriptionId, 0)); - } - - [Test] - public void passes_partition_created_notification_to_the_handler() { - Assert.AreEqual(1, _stateHandler._partitionCreatedProcessed); - Assert.Inconclusive(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_projection.cs deleted file mode 100644 index a542eb837..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_creating_a_projection.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Fakes; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture] - public class when_creating_a_projection { - [SetUp] - public void Setup() { - var fakePublisher = new FakePublisher(); - _ioDispatcher = new IODispatcher(fakePublisher, fakePublisher, true); - - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(new FakePublisher()); - } - - private readonly ProjectionConfig _defaultProjectionConfig = new ProjectionConfig( - null, 5, 10, 1000, 250, true, true, true, true, true, 10000, 1, null); - - private IODispatcher _ioDispatcher; - - - private ReaderSubscriptionDispatcher _subscriptionDispatcher; - - [Test] - public void - a_checkpoint_threshold_less_tan_checkpoint_handled_threshold_throws_argument_out_of_range_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - var projectionConfig = new ProjectionConfig(null, 10, 5, 1000, 250, true, true, false, false, - true, 10000, 1, null); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - projectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_negative_checkpoint_handled_interval_throws_argument_out_of_range_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - var projectionConfig = new ProjectionConfig(null, -1, 10, 1000, 250, true, true, false, false, - true, 10000, 1, null); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - projectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_io_dispatcher__throws_argument_null_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - null, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_name_throws_argument_null_excveption() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - null, - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_publisher_throws_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - null, - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_input_queue_throws_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - null, - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_run_as_does_not_throw_exception() { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - null, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - } - - [Test] - public void a_null_subscription_dispatcher__throws_argument_null_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - null, - new RealTimeProvider()); - }); - } - - [Test] - public void a_null_time_provider__throws_argument_null_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - null); - }); - } - - [Test] - public void a_zero_checkpoint_handled_threshold_throws_argument_out_of_range_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - var projectionConfig = new ProjectionConfig(null, 0, 10, 1000, 250, true, true, false, false, - true, 10000, 1, null); - new ContinuousProjectionProcessingStrategy( - "projection", - version, - projectionStateHandler, - projectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - - [Test] - public void an_empty_name_throws_argument_exception() { - Assert.Throws(() => { - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - var version = new ProjectionVersion(1, 0, 0); - new ContinuousProjectionProcessingStrategy( - "", - version, - projectionStateHandler, - _defaultProjectionConfig, - projectionStateHandler.GetSourceDefinition(), - null, - _subscriptionDispatcher, - true).Create( - Guid.NewGuid(), - new FakePublisher(), - Guid.NewGuid(), - SystemAccounts.System, - new FakePublisher(), - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_killing_a_projection_and_an_event_is_received.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_killing_a_projection_and_an_event_is_received.cs deleted file mode 100644 index b93727598..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_killing_a_projection_and_an_event_is_received.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_killing_a_projection_and_an_event_is_received : TestFixtureWithCoreProjectionStarted { - private Guid _lastEventIdBeforeKill; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //receive first event - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), Guid.NewGuid(), - "handle_this_type", false, "data1", "metadata"), _subscriptionId, 0)); - - //receive second event - _lastEventIdBeforeKill = Guid.NewGuid(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(140, 130), - _lastEventIdBeforeKill, - "handle_this_type", false, "data2", "metadata"), _subscriptionId, 1)); - - //kill the projection - _coreProjection.Kill(); - - //receive third event - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(160, 150), Guid.NewGuid(), - "handle_this_type", false, "data3", "metadata"), _subscriptionId, 2)); - } - - [Test] - public void event_received_after_kill_is_not_processed() { - Assert.AreEqual(2, _stateHandler._eventsProcessed); - Assert.AreEqual(_lastEventIdBeforeKill, _stateHandler._lastProcessedEventId); - Assert.AreEqual("data2", _stateHandler._lastProcessedData); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_a_new_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_a_new_projection.cs deleted file mode 100644 index 5bd39078b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_a_new_projection.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_loading_a_new_projection : TestFixtureWithCoreProjectionLoaded { - protected override void Given() { - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - } - - protected override void When() { - } - - [Test] - public void should_not_subscribe() { - Assert.AreEqual(0, _subscribeProjectionHandler.HandledMessages.Count); - } - - [Test] - public void should_not_initialize_projection_state_handler() { - Assert.AreEqual(0, _stateHandler._initializeCalled); - } - - [Test] - public void should_not_publish_started_message() { - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_an_existing_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_an_existing_projection.cs deleted file mode 100644 index 714a49c98..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_loading_an_existing_projection.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_loading_an_existing_projection : TestFixtureWithCoreProjectionLoaded { - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 200, ""p"": 150}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 300, ""p"": 250}", _testProjectionState); - } - - protected override void When() { - } - - - [Test] - public void should_not_subscribe() { - Assert.AreEqual(0, _subscribeProjectionHandler.HandledMessages.Count); - } - - [Test] - public void should_not_load_projection_state_handler() { - Assert.AreEqual(0, _stateHandler._loadCalled); - } - - [Test] - public void should_not_publish_started_message() { - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_should.cs deleted file mode 100644 index 1c854ab7f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_should.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_a_committed_event_the_projection_should : TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - - protected override void Given() { - TicksAreHandledImmediately(); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), _eventId, - "handle_this_type", false, "data", "metadata"), _subscriptionId, 0)); - } - - [Test] - public void update_state_snapshot_at_correct_position() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.OfEventType("Result").Count); - - var metedata = - _writeEventHandler.HandledMessages.OfEventType("Result")[0].Metadata - .ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - - Assert.AreEqual(120, metedata.Tag.CommitPosition); - Assert.AreEqual(110, metedata.Tag.PreparePosition); - } - - [Test] - public void pass_event_to_state_handler() { - Assert.AreEqual(1, _stateHandler._eventsProcessed); - Assert.AreEqual("/event_category/1", _stateHandler._lastProcessedStreamId); - Assert.AreEqual("handle_this_type", _stateHandler._lastProcessedEventType); - Assert.AreEqual(_eventId, _stateHandler._lastProcessedEventId); - //TODO: support sequence numbers here - Assert.AreEqual("metadata", _stateHandler._lastProcessedMetadata); - Assert.AreEqual("data", _stateHandler._lastProcessedData); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_by_custom_rule_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_by_custom_rule_should.cs deleted file mode 100644 index 56b3af48f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_by_custom_rule_should.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_a_committed_event_the_projection_with_partitioned_state_by_custom_rule_should : - TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetByCustomPartitions(); - source.SetDefinesStateTransform(); - source.SetOutputState(); - }; - TicksAreHandledImmediately(); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override FakeProjectionStateHandler GivenProjectionStateHandler() { - return new FakeProjectionStateHandler( - configureBuilder: _configureBuilderByQuerySource, failOnGetPartition: false); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", -1, "account-01", -1, false, new TFPos(120, 110), _eventId, - "handle_this_type", false, "data", "metadata"), _subscriptionId, 0)); - } - - [Test] - public void request_partition_state_from_the_correct_stream() { - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Count(v => v.EventStreamId == "$projections-projection-region-a-checkpoint")); - } - - [Test] - public void update_state_snapshot_is_written_to_the_correct_stream() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.OfEventType("Result").Count); - var message = _writeEventHandler.HandledMessages.WithEventType("Result")[0]; - Assert.AreEqual("$projections-projection-region-a-result", message.EventStreamId); - } - - [Test] - public void pass_partition_name_to_state_handler() { - Assert.AreEqual("region-a", _stateHandler._lastPartition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_should.cs deleted file mode 100644 index 7f242216a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_a_committed_event_the_projection_with_partitioned_state_should.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_a_committed_event_the_projection_with_partitioned_state_should : - TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetByStream(); - source.SetDefinesStateTransform(); - source.SetOutputState(); - }; - TicksAreHandledImmediately(); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", -1, "account-01", -1, false, new TFPos(120, 110), _eventId, - "handle_this_type", false, "data", "metadata"), _subscriptionId, 0)); - } - - [Test] - public void request_partition_state_from_the_correct_stream() { - // 1 - for load state - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Count(v => v.EventStreamId == "$projections-projection-account-01-checkpoint")); - } - - [Test] - public void update_state_snapshot_is_written_to_the_correct_stream() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(1, writeEvents.Count); - - var message = writeEvents[0]; - Assert.AreEqual("$projections-projection-account-01-result", message.EventStreamId); - } - - [Test] - public void update_state_snapshot_at_correct_position() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(1, writeEvents.Count); - - var metedata = writeEvents[0].Events[0].Metadata - .ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - - Assert.AreEqual(120, metedata.Tag.CommitPosition); - Assert.AreEqual(110, metedata.Tag.PreparePosition); - } - - [Test] - public void pass_event_to_state_handler() { - Assert.AreEqual(1, _stateHandler._eventsProcessed); - Assert.AreEqual("account-01", _stateHandler._lastProcessedStreamId); - Assert.AreEqual("handle_this_type", _stateHandler._lastProcessedEventType); - Assert.AreEqual(_eventId, _stateHandler._lastProcessedEventId); - //TODO: support sequence numbers here - Assert.AreEqual("metadata", _stateHandler._lastProcessedMetadata); - Assert.AreEqual("data", _stateHandler._lastProcessedData); - } - - [Test] - public void register_new_partition_state_stream() { - var writes = - _writeEventHandler.HandledMessages.Where(v => v.EventStreamId == "$projections-projection-partitions") - .ToArray(); - Assert.AreEqual(1, writes.Length); - var write = writes[0]; - - Assert.AreEqual(1, write.Events.Length); - - var @event = write.Events[0]; - - Assert.AreEqual("account-01", Helper.UTF8NoBom.GetString(@event.Data)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_event_the_projection_with_existing_partitioned_state_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_event_the_projection_with_existing_partitioned_state_should.cs deleted file mode 100644 index b229d7dfc..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_event_the_projection_with_existing_partitioned_state_should.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_committed_event_the_projection_with_existing_partitioned_state_should : - TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetByStream(); - }; - TicksAreHandledImmediately(); - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - ExistingEvent( - "$projections-projection-partitions", "PartitionCreated", - @"{""c"": 100, ""p"": 50}", "account-01"); - ExistingEvent( - "$projections-projection-account-01-result", "Result", - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", _testProjectionState); - AllWritesSucceed(); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 2, "account-01", 2, false, new TFPos(120, 110), _eventId, - "handle_this_type", false, "data1", "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 3, "account-01", 3, false, new TFPos(160, 150), _eventId, "append", false, - "$", "metadata"), - _subscriptionId, 1)); - } - - [Test] - public void register_new_partition_state_stream_only_once() { - var writes = - _writeEventHandler.HandledMessages.Where(v => v.EventStreamId == "$projections-projection-partitions") - .ToArray(); - Assert.AreEqual(0, writes.Length); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_with_partitioned_state_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_with_partitioned_state_should.cs deleted file mode 100644 index 8b2d1e19e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_with_partitioned_state_should.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_committed_events_the_projection_with_partitioned_state_should : - TestFixtureWithCoreProjectionStarted { - private Guid _eventId; - - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetByStream(); - source.SetDefinesFold(); - source.SetOutputState(); - }; - TicksAreHandledImmediately(); - NoOtherStreams(); - AllWritesSucceed(); - } - - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 1, "account-01", 1, false, new TFPos(120, 110), _eventId, - "handle_this_type", false, "data1", "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-02", 2, "account-02", 2, false, new TFPos(140, 130), _eventId, - "handle_this_type", false, "data2", "metadata"), _subscriptionId, 1)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 2, "account-01", 2, false, new TFPos(160, 150), _eventId, "append", false, - "$", "metadata"), - _subscriptionId, 2)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-02", 3, "account-02", 3, false, new TFPos(180, 170), _eventId, "append", false, - "$", "metadata"), - _subscriptionId, 3)); - } - - [Test] - public void request_partition_state_from_the_correct_stream() { - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Count(v => v.EventStreamId == "$projections-projection-account-01-checkpoint")); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Count(v => v.EventStreamId == "$projections-projection-account-02-checkpoint")); - } - - [Test] - public void update_state_snapshots_are_written_to_the_correct_stream() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(4, writeEvents.Count); - Assert.AreEqual("$projections-projection-account-01-result", writeEvents[0].EventStreamId); - Assert.AreEqual("$projections-projection-account-02-result", writeEvents[1].EventStreamId); - Assert.AreEqual("$projections-projection-account-01-result", writeEvents[2].EventStreamId); - Assert.AreEqual("$projections-projection-account-02-result", writeEvents[3].EventStreamId); - } - - [Test] - public void update_state_snapshots_are_correct() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(4, writeEvents.Count); - Assert.AreEqual("data1", Helper.UTF8NoBom.GetString(writeEvents[0].Events[0].Data)); - Assert.AreEqual("data2", Helper.UTF8NoBom.GetString(writeEvents[1].Events[0].Data)); - Assert.AreEqual("data1$", Helper.UTF8NoBom.GetString(writeEvents[2].Events[0].Data)); - Assert.AreEqual("data2$", Helper.UTF8NoBom.GetString(writeEvents[3].Events[0].Data)); - } - - [Test] - public void register_new_partition_state_stream_only_once() { - var writes = - _writeEventHandler.HandledMessages.Where(v => v.EventStreamId == "$projections-projection-partitions") - .ToArray(); - Assert.AreEqual(2, writes.Length); - - Assert.AreEqual(1, writes[0].Events.Length); - Assert.AreEqual("account-01", Helper.UTF8NoBom.GetString(writes[0].Events[0].Data)); - - Assert.AreEqual(1, writes[1].Events.Length); - Assert.AreEqual("account-02", Helper.UTF8NoBom.GetString(writes[1].Events[0].Data)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_without_when.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_without_when.cs deleted file mode 100644 index 4e39f233d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_receiving_committed_events_the_projection_without_when.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - public abstract class specification_with_query_without_when : TestFixtureWithCoreProjectionStarted { - protected Guid _eventId; - - protected override bool GivenCheckpointsEnabled() { - return false; - } - - protected override bool GivenEmitEventEnabled() { - return false; - } - - protected override bool GivenStopOnEof() { - return true; - } - - protected override int GivenPendingEventsThreshold() { - return 0; - } - - protected override ProjectionProcessingStrategy GivenProjectionProcessingStrategy() { - return CreateQueryProcessingStrategy(); - } - - protected override void Given() { - _checkpointHandledThreshold = 0; - _checkpointUnhandledBytesThreshold = 0; - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.NoWhen(); - }; - TicksAreHandledImmediately(); - NoOtherStreams(); - AllWritesSucceed(); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_committed_events_the_projection_without_when : specification_with_query_without_when { - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 1, "account-01", 1, false, new TFPos(120, 110), _eventId, "handle_this_type", - false, "data1", "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-02", 2, "account-02", 2, false, new TFPos(140, 130), _eventId, "handle_this_type", - false, "data2", "metadata"), _subscriptionId, 1)); - } - - [Test] - public void update_state_snapshots_are_written_to_the_correct_stream() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(2, writeEvents.Count); - Assert.AreEqual("$projections-projection-result", writeEvents[0].EventStreamId); - Assert.AreEqual("$projections-projection-result", writeEvents[1].EventStreamId); - Assert.AreEqual("data1", Encoding.UTF8.GetString(writeEvents[0].Events[0].Data)); - Assert.AreEqual("data2", Encoding.UTF8.GetString(writeEvents[1].Events[0].Data)); - } - } - - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_event_does_not_change_state_the_projection_without_when : specification_with_query_without_when { - protected override void When() { - //projection subscribes here - _eventId = Guid.NewGuid(); - _consumer.HandledMessages.Clear(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 1, "account-01", 1, false, new TFPos(120, 110), _eventId, "handle_this_type", - false, "data1", "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "account-01", 2, "account-01", 2, false, new TFPos(140, 130), _eventId, "handle_this_type", - false, "data1", "metadata"), _subscriptionId, 1)); - } - - [Test, Ignore("To be fixed")] - public void result_events_are_produced_for_each_received_event() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "Result")).ToList(); - Assert.AreEqual(2, writeEvents.Count); - Assert.AreEqual("$projections-projection-result", writeEvents[0].EventStreamId); - Assert.AreEqual("$projections-projection-result", writeEvents[1].EventStreamId); - Assert.AreEqual("data1", Encoding.UTF8.GetString(writeEvents[0].Events[0].Data)); - Assert.AreEqual("data1", Encoding.UTF8.GetString(writeEvents[1].Events[0].Data)); - } - - [Test] - public void no_result_removed_events_are_produced() { - var writeEvents = - _writeEventHandler.HandledMessages.Where(v => v.Events.Any(e => e.EventType == "ResultRemoved")) - .ToList(); - Assert.AreEqual(0, writeEvents.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection.cs deleted file mode 100644 index 85fdd664d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_a_new_projection : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - } - - protected override void When() { - } - - [Test] - public void should_subscribe_from_beginning() { - Assert.AreEqual(1, _subscribeProjectionHandler.HandledMessages.Count); - Assert.AreEqual(0, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.CommitPosition); - Assert.AreEqual(-1, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.PreparePosition); - } - - [Test] - public void should_publish_started_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var startedMessage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionCorrelationId, startedMessage.ProjectionId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection_and_an_event_is_received.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection_and_an_event_is_received.cs deleted file mode 100644 index d8e738798..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_new_projection_and_an_event_is_received.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_a_new_projection_and_an_event_is_received : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - } - - protected override void When() { - var eventId = Guid.NewGuid(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), eventId, - "handle_this_type", false, "data", "metadata"), _subscriptionId, 0)); - } - - [Test] - public void should_initialize_projection_state_handler() { - Assert.AreEqual(1, _stateHandler._initializeCalled); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_projection.cs deleted file mode 100644 index 66d2da16b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_a_projection.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture] - public class when_starting_a_projection { - private const string _projectionStateStream = "$projections-projection-result"; - private const string _projectionCheckpointStream = "$projections-projection-checkpoint"; - private CoreProjection _coreProjection; - private SynchronousScheduler _bus; - private TestHandler _listEventsHandler; - private IODispatcher _ioDispatcher; - private ReaderSubscriptionDispatcher _subscriptionDispatcher; - private ProjectionConfig _projectionConfig; - - [SetUp] - public void setup() { - _bus = new(); - _listEventsHandler = new TestHandler(); - _bus.Subscribe(_listEventsHandler); - _ioDispatcher = new IODispatcher(_bus, _bus, true); - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(_bus); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_ioDispatcher.BackwardReader); - _bus.Subscribe(_ioDispatcher.BackwardReader); - _bus.Subscribe(_ioDispatcher.ForwardReader); - _bus.Subscribe(_ioDispatcher.Writer); - _bus.Subscribe(_ioDispatcher); - _bus.Subscribe(_ioDispatcher); - IProjectionStateHandler projectionStateHandler = new FakeProjectionStateHandler(); - _projectionConfig = - new ProjectionConfig(null, 5, 10, 1000, 250, true, true, false, false, true, 10000, 1, null); - var version = new ProjectionVersion(1, 0, 0); - var projectionProcessingStrategy = new ContinuousProjectionProcessingStrategy( - "projection", version, projectionStateHandler, _projectionConfig, - projectionStateHandler.GetSourceDefinition(), null, _subscriptionDispatcher, true); - _coreProjection = projectionProcessingStrategy.Create( - Guid.NewGuid(), - _bus, - Guid.NewGuid(), - SystemAccounts.System, - _bus, - _ioDispatcher, - _subscriptionDispatcher, - new RealTimeProvider()); - _coreProjection.Start(); - } - - [Test] - public void should_request_state_snapshot() { - Assert.IsTrue(_listEventsHandler.HandledMessages.Count == 1); - } - - [Test] - public void should_request_state_snapshot_on_correct_stream() { - Assert.AreEqual(_projectionCheckpointStream, _listEventsHandler.HandledMessages[0].EventStreamId); - } - - [Test] - public async Task should_accept_no_event_stream_response() { - await _bus.DispatchAsync( - new ClientMessage.ReadStreamEventsBackwardCompleted( - _listEventsHandler.HandledMessages[0].CorrelationId, - _listEventsHandler.HandledMessages[0].EventStreamId, 100, 100, ReadStreamResult.NoStream, - new ResolvedEvent[0], null, false, string.Empty, -1, -1, true, 1000)); - } - - [Test] - public async Task should_accept_events_not_found_response() { - await _bus.DispatchAsync( - new ClientMessage.ReadStreamEventsBackwardCompleted( - _listEventsHandler.HandledMessages[0].CorrelationId, - _listEventsHandler.HandledMessages[0].EventStreamId, 100, 100, ReadStreamResult.Success, - new ResolvedEvent[0], null, false, string.Empty, -1, -1, false, 1000)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection.cs deleted file mode 100644 index 45a0e530a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_an_existing_projection : TestFixtureWithCoreProjectionStarted { - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 200, ""p"": 150}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", - @"{""c"": 300, ""p"": 250}", _testProjectionState); - } - - protected override void When() { - } - - - [Test] - public void should_subscribe_from_the_last_known_checkpoint_position() { - Assert.AreEqual(1, _subscribeProjectionHandler.HandledMessages.Count); - Assert.AreEqual(100, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.CommitPosition); - Assert.AreEqual(50, _subscribeProjectionHandler.HandledMessages[0].FromPosition.Position.PreparePosition); - } - - [Test] - public void should_publish_started_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var startedMessage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionCorrelationId, startedMessage.ProjectionId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_and_an_event_is_received.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_and_an_event_is_received.cs deleted file mode 100644 index 6c986303b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_and_an_event_is_received.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_an_existing_projection_and_an_event_is_received : TestFixtureWithCoreProjectionStarted { - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", - _testProjectionState); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 200, ""p"": 150}", - _testProjectionState); - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 300, ""p"": 250}", - _testProjectionState); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - } - - protected override void When() { - var eventId = Guid.NewGuid(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), eventId, - "append", false, "data", "metadata"), _subscriptionId, 0)); - } - - - [Test] - public void should_load_projection_state_handler() { - Assert.AreEqual(1, _stateHandler._loadCalled); - Assert.AreEqual(_testProjectionState + "data", _stateHandler._loadedState); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_emitted_event_and_state_snapshot.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_emitted_event_and_state_snapshot.cs deleted file mode 100644 index ea22c4384..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_emitted_event_and_state_snapshot.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_an_existing_projection_missing_last_emitted_event_and_state_snapshot : - TestFixtureWithCoreProjectionStarted { - private readonly Guid _causedByEventId = Guid.NewGuid(); - - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - - ExistingEvent( - FakeProjectionStateHandler._emit1StreamId, FakeProjectionStateHandler._emit1EventType, - @"{""c"": 120, ""p"": 110}", FakeProjectionStateHandler._emit1Data); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - _causedByEventId, "emit12_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void should_write_second_emitted_event_and_state_snapshot() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.OfEventType("Result").Count); - Assert.AreEqual( - 1, _writeEventHandler.HandledMessages.OfEventType(FakeProjectionStateHandler._emit2EventType).Count); - - Assert.IsTrue( - _writeEventHandler.HandledMessages.Any( - v => Helper.UTF8NoBom.GetString(v.Events[0].Data) == FakeProjectionStateHandler._emit2Data)); - Assert.IsTrue(_writeEventHandler.HandledMessages.Any(v => v.Events[0].EventType == "Result")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_state_snapshot.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_state_snapshot.cs deleted file mode 100644 index 22a87d44c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_starting_an_existing_projection_missing_last_state_snapshot.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_starting_an_existing_projection_missing_last_state_snapshot : TestFixtureWithCoreProjectionStarted { - private readonly Guid _causedByEventId = Guid.NewGuid(); - - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - FakeProjectionStateHandler._emit1StreamId, FakeProjectionStateHandler._emit1EventType, - @"{""c"": 120, ""p"": 110}", FakeProjectionStateHandler._emit1Data); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - _causedByEventId, "emit1_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void should_not_emit_events_but_write_the_new_state_snapshot() { - Assert.AreEqual(2, _writeEventHandler.HandledMessages.Count); - - var data = Helper.UTF8NoBom.GetString(_writeEventHandler.HandledMessages[1].Events[0].Data); - Assert.AreEqual("data", data); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_stopping_a_projection_with_existing_state_without_updating_the_state.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_stopping_a_projection_with_existing_state_without_updating_the_state.cs deleted file mode 100644 index 7205123d6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_stopping_a_projection_with_existing_state_without_updating_the_state.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_stopping_a_projection_with_existing_state_without_updating_the_state : - TestFixtureWithCoreProjectionStarted { - private string _testProjectionState = @"{""test"":1}"; - - protected override void Given() { - //write existing checkpoint - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", _testProjectionState); - - AllWritesQueueUp(); - } - - protected override void When() { - //force write of another checkpoint - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, CheckpointTag.FromPosition(0, 160, 150), 77.7f, 0)); - - _coreProjection.Stop(); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - AllWriteComplete(); - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void previous_state_is_saved_in_checkpoint_event() { - AllWriteComplete(); - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count( - v => v.Events.Any( - e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint - && Helper.UTF8NoBom.GetString(e.Data).Equals("[" + _testProjectionState + "]") - ) - ) - ); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_suspending_a_projection_and_an_event_is_received.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_suspending_a_projection_and_an_event_is_received.cs deleted file mode 100644 index 052d6701f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_suspending_a_projection_and_an_event_is_received.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_suspending_a_projection_and_an_event_is_received : TestFixtureWithCoreProjectionStarted { - private Guid _lastEventIdBeforeSuspension; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //receive first event - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), Guid.NewGuid(), - "handle_this_type", false, "data1", "metadata"), _subscriptionId, 0)); - - //receive second event - _lastEventIdBeforeSuspension = Guid.NewGuid(); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(140, 130), - _lastEventIdBeforeSuspension, - "handle_this_type", false, "data2", "metadata"), _subscriptionId, 1)); - - //suspend the projection - var suspended = _coreProjection.Suspend(); - Assert.True(suspended, "Projection was not suspended"); - - //receive third event - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(160, 150), Guid.NewGuid(), - "handle_this_type", false, "data3", "metadata"), _subscriptionId, 2)); - } - - [Test] - public void event_received_after_suspend_is_not_processed() { - Assert.AreEqual(2, _stateHandler._eventsProcessed); - Assert.AreEqual(_lastEventIdBeforeSuspension, _stateHandler._lastProcessedEventId); - Assert.AreEqual("data2", _stateHandler._lastProcessedData); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_checkpoint_is_stopped.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_checkpoint_is_stopped.cs deleted file mode 100644 index 46d99613b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_checkpoint_is_stopped.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_projection_with_pending_checkpoint_is_stopped : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _checkpointHandledThreshold = 2; - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - NoStream(FakeProjectionStateHandler._emit1StreamId); - AllWritesQueueUp(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data1", - "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(140, 130), - Guid.NewGuid(), "handle_this_type", false, "data2", - "metadata"), _subscriptionId, 1)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(160, 150), - Guid.NewGuid(), "handle_this_type", false, "data3", - "metadata"), _subscriptionId, 2)); - _bus.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, CheckpointTag.FromPosition(0, 160, 150), 77.7f, 3)); - _coreProjection.Stop(); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - AllWriteComplete(); - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_writes_is_stopped.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_writes_is_stopped.cs deleted file mode 100644 index 4954a810c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_projection_with_pending_writes_is_stopped.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_projection_with_pending_writes_is_stopped : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _checkpointHandledThreshold = 2; - NoStream("$projections-projection-result"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - NoStream("$projections-projection-checkpoint"); - NoStream(FakeProjectionStateHandler._emit1StreamId); - AllWritesQueueUp(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data1", - "metadata"), _subscriptionId, 0)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(140, 130), - Guid.NewGuid(), "handle_this_type", false, "data2", - "metadata"), _subscriptionId, 1)); - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(160, 150), - Guid.NewGuid(), "handle_this_type", false, "data3", - "metadata"), _subscriptionId, 2)); - _coreProjection.Stop(); - } - - [Test] - public void a_projection_checkpoint_event_is_published() { - AllWriteComplete(); - Assert.AreEqual( - 1, - _writeEventHandler.HandledMessages.Count(v => - v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint))); - } - - [Test] - public void other_events_are_not_written_after_the_checkpoint_write() { - AllWriteComplete(); - var index = - _writeEventHandler.HandledMessages.FindIndex( - v => v.Events.Any(e => e.EventType == ProjectionEventTypes.ProjectionCheckpoint)); - Assert.AreEqual(index + 1, _writeEventHandler.HandledMessages.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_an_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_an_event_the_projection_should.cs deleted file mode 100644 index caee5e969..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_an_event_the_projection_should.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_the_state_handler_does_emit_an_event_the_projection_should : TestFixtureWithCoreProjectionStarted { - private Guid _causingEventId; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _causingEventId = Guid.NewGuid(); - var committedEventReceived = - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - _causingEventId, "no_state_emit1_type", false, "data", - "metadata"), _subscriptionId, 0); - _bus.Publish(committedEventReceived); - } - - [Test] - public void write_the_emitted_event() { - Assert.IsTrue( - _writeEventHandler.HandledMessages.Any( - v => Helper.UTF8NoBom.GetString(v.Events[0].Data) == FakeProjectionStateHandler._emit1Data)); - } - - [Test] - public void set_a_caused_by_position_attributes() { - var metadata = _writeEventHandler.HandledMessages[0].Events[0].Metadata - .ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - Assert.AreEqual(120, metadata.Tag.CommitPosition); - Assert.AreEqual(110, metadata.Tag.PreparePosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_interleaved_events_into_the_same_stream_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_interleaved_events_into_the_same_stream_the_projection_should.cs deleted file mode 100644 index 8fab23960..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_interleaved_events_into_the_same_stream_the_projection_should.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_the_state_handler_does_emit_multiple_interleaved_events_into_the_same_stream_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-result", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - NoStream(FakeProjectionStateHandler._emit1StreamId); - NoStream(FakeProjectionStateHandler._emit2StreamId); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "emit212_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_subsequent_events_into_the_same_stream_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_subsequent_events_into_the_same_stream_the_projection_should.cs deleted file mode 100644 index 6d1f4ee8f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_emit_multiple_subsequent_events_into_the_same_stream_the_projection_should.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_the_state_handler_does_emit_multiple_subsequent_events_into_the_same_stream_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "emit22_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - - [Test] - public void write_events_in_a_single_transaction() { - Assert.IsTrue(_writeEventHandler.HandledMessages.Any(v => v.Events.Length == 2)); - } - - [Test] - public void write_all_the_emitted_events() { - Assert.AreEqual( - 2, _writeEventHandler.HandledMessages.Single(v => v.EventStreamId == "/emit2").Events.Length); - } - - [Test] - public void write_events_in_correct_order() { - Assert.AreEqual( - FakeProjectionStateHandler._emit1Data, - Helper.UTF8NoBom.GetString( - _writeEventHandler.HandledMessages.Single(v => v.EventStreamId == "/emit2").Events[0].Data)); - Assert.AreEqual( - FakeProjectionStateHandler._emit2Data, - Helper.UTF8NoBom.GetString( - _writeEventHandler.HandledMessages.Single(v => v.EventStreamId == "/emit2").Events[1].Data)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_not_process_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_not_process_event_the_projection_should.cs deleted file mode 100644 index c2dd561d3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_not_process_event_the_projection_should.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_state_handler_does_not_process_event_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - new TFPos(120, 110), - Guid.NewGuid(), "skip_this_type", false, new byte[0], new byte[0], null, null, - default(DateTime)), - _subscriptionId, 0)); - } - - [Test] - public void not_update_state_snapshot() { - Assert.AreEqual(0, _writeEventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_process_an_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_process_an_event_the_projection_should.cs deleted file mode 100644 index 61844130e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_does_process_an_event_the_projection_should.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_state_handler_does_process_an_event_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void write_the_new_state_snapshot() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.OfEventType("Result").Count); - - var data = Helper.UTF8NoBom.GetString(_writeEventHandler.HandledMessages.OfEventType("Result")[0].Data); - Assert.AreEqual("data", data); - } - - [Test] - public void emit_a_state_updated_event() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.OfEventType("Result").Count); - - var @event = _writeEventHandler.HandledMessages.OfEventType("Result")[0]; - Assert.AreEqual("Result", @event.EventType); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_load_state_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_load_state_the_projection_should.cs deleted file mode 100644 index 49d7d2944..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_load_state_the_projection_should.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_the_state_handler_fails_to_load_state_the_projection_should : TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - } - - protected override FakeProjectionStateHandler GivenProjectionStateHandler() { - return new FakeProjectionStateHandler(failOnLoad: true); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void should_publish_faulted_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void not_emit_a_state_updated_event() { - Assert.AreEqual(0, _writeEventHandler.HandledMessages.OfEventType("StateUpdate").Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_process_an_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_process_an_event_the_projection_should.cs deleted file mode 100644 index 71eac929e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_fails_to_process_an_event_the_projection_should.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_state_handler_fails_to_process_an_event_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - ExistingEvent( - "$projections-projection-result", "Result", @"{""c"": 100, ""p"": 50}", "{}"); - ExistingEvent( - "$projections-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""c"": 100, ""p"": 50}", "{}"); - NoStream("$projections-projection-order"); - AllWritesToSucceed("$projections-projection-order"); - } - - protected override FakeProjectionStateHandler GivenProjectionStateHandler() { - return new FakeProjectionStateHandler(failOnProcessEvent: true); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void should_publish_faulted_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void not_emit_a_state_updated_event() { - Assert.AreEqual(0, _writeEventHandler.HandledMessages.OfEventType("Result").Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_with_configured_state_stream_does_process_an_event_the_projection_should.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_with_configured_state_stream_does_process_an_event_the_projection_should.cs deleted file mode 100644 index 9d2d8f7ea..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_the_state_handler_with_configured_state_stream_does_process_an_event_the_projection_should.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_state_handler_with_configured_state_stream_does_process_an_event_the_projection_should : - TestFixtureWithCoreProjectionStarted { - protected override void Given() { - _configureBuilderByQuerySource = source => { - source.FromAll(); - source.AllEvents(); - source.SetResultStreamNameOption("state-stream"); - source.SetDefinesStateTransform(); - source.SetOutputState(); - }; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override void When() { - //projection subscribes here - _bus.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "/event_category/1", -1, "/event_category/1", -1, false, new TFPos(120, 110), - Guid.NewGuid(), "handle_this_type", false, "data", - "metadata"), _subscriptionId, 0)); - } - - [Test] - public void write_the_new_state_snapshot() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.ToStream("state-stream").Count); - - var message = _writeEventHandler.HandledMessages.ToStream("state-stream")[0]; - var data = Helper.UTF8NoBom.GetString(message.Events[0].Data); - Assert.AreEqual("data", data); - Assert.AreEqual("state-stream", message.EventStreamId); - } - - [Test] - public void emit_a_state_updated_event() { - Assert.AreEqual(1, _writeEventHandler.HandledMessages.ToStream("state-stream").Count); - - var @event = _writeEventHandler.HandledMessages.ToStream("state-stream")[0].Events[0]; - Assert.AreEqual("Result", @event.EventType); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_writing_projection_persisted_state_races_with_stream_deletion.cs b/src/EventStore.Projections.Core.Tests/Services/core_projection/when_writing_projection_persisted_state_races_with_stream_deletion.cs deleted file mode 100644 index 3e9734b85..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_projection/when_writing_projection_persisted_state_races_with_stream_deletion.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Tests.Services.projections_manager; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_projection { - /** - * tests whether race condition exists or not; currently deleting a projection involves following operations - * 1. Deleting projection "sub-streams" (checkpoint, emitted, etc. streams) - * 2. Writing new projection persisted state to $projection- stream - * - * steps 1 and 2 are independent and gives rise to race condition : - * * if step 2 completes after step 1, multiple ProjectionManagement.Internal.Deleted events will be published - * * in addition, if step 2 completes shortly after step 1, WrongExpectedVersion will be encountered - */ - - public static class when_writing_projection_persisted_state_races_with_stream_deletion { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_projection_persisted_state_write_races_with_projections_substream_deletion : TestFixtureWithProjectionCoreAndManagementServices { - private const string _projectionName = "my-projection"; - - protected override void Given() { - base.Given(); - NoOtherStreams(); - AllWritesSucceed(); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "native:" + typeof(FakeProjection).AssemblyQualifiedName, - @"", enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - yield return - new ProjectionManagementMessage.Command.Disable(_bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return new ProjectionManagementMessage.Command.Delete(new NoopEnvelope(), _projectionName, ProjectionManagementMessage.RunAs.System, - true, false, false); - } - - [Test] - public void should_publish_single_projection_deleted_event() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_service/when_a_subscribed_projection_handler_throws.cs b/src/EventStore.Projections.Core.Tests/Services/core_service/when_a_subscribed_projection_handler_throws.cs deleted file mode 100644 index 8ce40e677..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_service/when_a_subscribed_projection_handler_throws.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Tests.Services.core_service { - [TestFixture] - public class when_a_subscribed_projection_handler_throws : TestFixtureWithProjectionCoreService { - [SetUp] - public new void Setup() { - var readerStrategy = new FakeReaderStrategy(); - var projectionCorrelationId = Guid.NewGuid(); - _readerService.Handle( - new ReaderSubscriptionManagement.Subscribe( - projectionCorrelationId, CheckpointTag.FromPosition(0, 0, 0), readerStrategy, - new ReaderSubscriptionOptions(1000, 2000, 10000, false, stopAfterNEvents: null, true))); - _readerService.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - readerStrategy.EventReaderId, new TFPos(20, 10), "throws", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - [Test] - public void projection_is_notified_that_it_is_to_fault() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/core_service/when_unsubscribing_a_subscribed_projection.cs b/src/EventStore.Projections.Core.Tests/Services/core_service/when_unsubscribing_a_subscribed_projection.cs deleted file mode 100644 index 4f1a8f819..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/core_service/when_unsubscribing_a_subscribed_projection.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.core_service { - [TestFixture] - public class when_unsubscribing_a_subscribed_projection : TestFixtureWithProjectionCoreService { - private TestCoreProjection _committedeventHandler; - private Guid _projectionCorrelationId; - - //private TestCoreProjection _committedeventHandler2; - private Guid _projectionCorrelationId2; - - [SetUp] - public new void Setup() { - _committedeventHandler = new TestCoreProjection(); - //_committedeventHandler2 = new TestCoreProjection(); - _projectionCorrelationId = Guid.NewGuid(); - _projectionCorrelationId2 = Guid.NewGuid(); - _readerService.Handle( - new ReaderSubscriptionManagement.Subscribe( - _projectionCorrelationId, CheckpointTag.FromPosition(0, 0, 0), CreateReaderStrategy(), - new ReaderSubscriptionOptions(1000, 2000, 10000, false, stopAfterNEvents: null, enableContentTypeValidation: true))); - _readerService.Handle( - new ReaderSubscriptionManagement.Subscribe( - _projectionCorrelationId2, CheckpointTag.FromPosition(0, 0, 0), CreateReaderStrategy(), - new ReaderSubscriptionOptions(1000, 2000, 10000, false, stopAfterNEvents: null, enableContentTypeValidation: true))); - // when - _readerService.Handle(new ReaderSubscriptionManagement.Unsubscribe(_projectionCorrelationId)); - } - - [Test] - public void committed_events_are_no_longer_distributed_to_the_projection() { - _readerService.Handle( - new ReaderSubscriptionMessage.CommittedEventDistributed(_projectionCorrelationId, CreateEvent())); - Assert.AreEqual(0, _committedeventHandler.HandledMessages.Count); - } - - [Test] - public void the_projection_cannot_be_resumed() { - Assert.Throws(() => { - _readerService.Handle(new ReaderSubscriptionManagement.Resume(_projectionCorrelationId)); - _readerService.Handle( - new ReaderSubscriptionMessage.CommittedEventDistributed(_projectionCorrelationId, CreateEvent())); - Assert.AreEqual(0, _committedeventHandler.HandledMessages.Count); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/a_checkpoint_requested_on_a_non_started_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/a_checkpoint_requested_on_a_non_started_stream.cs deleted file mode 100644 index d1525b84d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/a_checkpoint_requested_on_a_non_started_stream.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture] - public class a_checkpoint_requested_on_a_non_started_stream : TestFixtureWithReadWriteDispatchers { - private EmittedStream _stream; - - private TestCheckpointManagerMessageHandler _readyHandler; - private Exception _caughtException; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - try { - _stream.Checkpoint(); - } catch (Exception ex) { - _caughtException = ex; - } - } - - [Test] - public void throws_invalid_operation_exception() { - Assert.Throws(() => { - if (_caughtException != null) throw _caughtException; - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs deleted file mode 100644 index e5481c606..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream.another_epoch { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - ExistingEvent("test_stream", "type", @"{""v"": 1, ""c"": 100, ""p"": 50}", "data"); - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 2, 2), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 0, -1), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void requests_restart_if_different_smaller_tag() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 50), CheckpointTag.FromPosition(0, 40, 20)) - }); - Assert.AreEqual( - 0, - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .Count()); - Assert.AreEqual(1, _readyHandler.HandledRestartRequestedMessages.Count()); - } - - [Test] - public void publishes_all_events_even_with_smaller_tag() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 40, 20), null) - }); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .Count()); - } - - [Test] - public void requests_restart_even_if_expected_tag_is_the_same_but_epoch() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), CheckpointTag.FromPosition(0, 100, 50)) - }); - Assert.AreEqual( - 0, - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .Count()); - Assert.AreEqual(1, _readyHandler.HandledRestartRequestedMessages.Count()); - } - - [Test] - public void metadata_include_correct_version() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - var metaData = - _consumer.HandledMessages.OfType() - .OfEventType("type") - .Single() - .Metadata.ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - Assert.AreEqual(new ProjectionVersion(1, 2, 2), metaData.Version); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_at_the_same_position.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_at_the_same_position.cs deleted file mode 100644 index d78e490e8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_at_the_same_position.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream.another_epoch { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_emits_with_previously_written_events_at_the_same_position : core_projection.TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private long _1; - private long _2; - private long _3; - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$test_stream"); - //NOTE: it is possible for a batch of events to be partially written if it contains links - ExistingEvent("test_stream", "type1", @"{""v"": 1, ""c"": 100, ""p"": 50}", "data"); - ExistingEvent("test_stream", "type2", @"{""v"": 1, ""c"": 100, ""p"": 50}", "data"); - NoOtherStreams(); - } - - private EmittedEvent[] CreateEventBatch() { - return new EmittedEvent[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type1", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _1 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type2", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _2 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type3", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _3 = v) - }; - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 2, 2), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 100, 50), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents(CreateEventBatch()); - OneWriteCompletes(); - } - - [Test] - public void truncates_existing_stream_at_correct_position() { - var writes = - HandledMessages.OfType() - .OfEventType(SystemEventTypes.StreamMetadata) - .ToArray(); - Assert.AreEqual(1, writes.Length); - HelperExtensions.AssertJson(new {___tb = 2}, writes[0].Data.ParseJson()); - } - - [Test] - public void publishes_all_events() { - var writtenEvents = - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .ToArray(); - Assert.AreEqual(3, writtenEvents.Length); - Assert.AreEqual("type1", writtenEvents[0].EventType); - Assert.AreEqual("type2", writtenEvents[1].EventType); - Assert.AreEqual("type3", writtenEvents[2].EventType); - } - - [Test] - public void updates_stream_metadata() { - var writes = - HandledMessages.OfType() - .OfEventType(SystemEventTypes.StreamMetadata) - .ToArray(); - Assert.AreEqual(1, writes.Length); - } - - [Test] - public void reports_correct_event_numbers() { - Assert.AreEqual(2, _1); - Assert.AreEqual(3, _2); - Assert.AreEqual(4, _3); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_in_different_epochs.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_in_different_epochs.cs deleted file mode 100644 index b8d610d98..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_epoch/when_handling_emits_with_previously_written_events_in_different_epochs.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream.another_epoch { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_emits_with_previously_written_events_in_different_epochs : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private long _1; - private long _2; - private long _3; - - protected override void Given() { - AllWritesQueueUp(); - //NOTE: it is possible for a batch of events to be partially written if it contains links - ExistingEvent("test_stream", "type1", @"{""v"": 1, ""c"": 100, ""p"": 50}", "data"); - ExistingEvent("test_stream", "type1", @"{""v"": 2, ""c"": 100, ""p"": 50}", "data"); - } - - private EmittedEvent[] CreateEventBatch() { - return new EmittedEvent[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type1", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _1 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type2", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _2 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type3", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _3 = v) - }; - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 2, 2), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 20, 10), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents(CreateEventBatch()); - OneWriteCompletes(); - } - - [Test] - public void publishes_all_events() { - var writtenEvents = - _consumer.HandledMessages.OfType().SelectMany(v => v.Events).ToArray(); - Assert.AreEqual(2, writtenEvents.Length); - Assert.AreEqual("type2", writtenEvents[0].EventType); - Assert.AreEqual("type3", writtenEvents[1].EventType); - } - - [Test] - public void updates_stream_metadata() { - var writes = - HandledMessages.OfType() - .OfEventType(SystemEventTypes.StreamMetadata) - .ToArray(); - Assert.AreEqual(0, writes.Length); - } - - - [Test] - public void reports_correct_event_numbers() { - Assert.AreEqual(1, _1); - Assert.AreEqual(2, _2); - Assert.AreEqual(3, _3); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_projection/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_projection/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs deleted file mode 100644 index 2bb9c5756..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/another_projection/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream.another_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - ExistingEvent("test_stream", "type", @"{""v"": ""2:3:4"", ""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 2, 2), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 0, -1), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void fails_the_projection() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 50), CheckpointTag.FromPosition(0, 40, 20)) - }); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(1, _readyHandler.HandledFailedMessages.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_completes_before_a_timeout_in_recovery.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_completes_before_a_timeout_in_recovery.cs deleted file mode 100644 index 9962fdb0e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_completes_before_a_timeout_in_recovery.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_read_completes_before_a_timeout_in_recovery : TestFixtureWithExistingEvents { - private const string TestStreamId = "test_stream"; - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private List timerMessages = new(); - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent(TestStreamId, "type", @"{""c"": 100, ""p"": 50}", "data"); - ReadsBackwardQueuesUp(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _bus.Subscribe(new AdHocHandler(msg => timerMessages.Add(msg))); - - _stream = new EmittedStream( - TestStreamId, - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - TestStreamId, Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - CompleteOneReadBackwards(); - } - - [Test] - public void should_not_retry_the_read_upon_the_read_timing_out() { - var timerMessage = timerMessages.FirstOrDefault(); - Assert.NotNull(timerMessage, - $"Expected a {nameof(TimerMessage.Schedule)} to have been published, but none were received"); - timerMessage.Reply(); - - var readEventsBackwards = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == TestStreamId); - - Assert.AreEqual(1, readEventsBackwards.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_times_out_in_recovery.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_times_out_in_recovery.cs deleted file mode 100644 index f2cd33937..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_a_read_times_out_in_recovery.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_read_times_out_in_recovery : TestFixtureWithExistingEvents { - private const string TestStreamId = "test_stream"; - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private List timerMessages = new(); - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent(TestStreamId, "type", @"{""c"": 100, ""p"": 50}", "data"); - ReadsBackwardQueuesUp(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _bus.Subscribe(new AdHocHandler(msg => timerMessages.Add(msg))); - - _stream = new EmittedStream( - TestStreamId, - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - TestStreamId, Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - } - - [Test] - public void should_retry_the_read_upon_the_read_timing_out() { - var timerMessage = timerMessages.FirstOrDefault(); - Assert.NotNull(timerMessage, - $"Expected a {nameof(TimerMessage.Schedule)} to have been published, but none were received"); - - timerMessage.Reply(); - - var readEventsBackwards = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == TestStreamId).ToArray(); - Assert.AreEqual(2, readEventsBackwards.Length); - Assert.AreEqual(readEventsBackwards[0].FromEventNumber, readEventsBackwards[1].FromEventNumber); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested.cs deleted file mode 100644 index 3f39e8fd6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture] - public class when_checkpoint_requested : TestFixtureWithReadWriteDispatchers { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - _stream.Start(); - _stream.Checkpoint(); - } - - [Test] - public void emit_events_throws_invalid_operation_exception() { - Assert.Throws(() => { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test", Guid.NewGuid(), "type2", true, "data2", null, CheckpointTag.FromPosition(0, -1, -1), - null) - }); - }); - } - - [Test] - public void checkpoint_throws_invalid_operation_exception() { - Assert.Throws(() => { _stream.Checkpoint(); }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_but_disabled.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_but_disabled.cs deleted file mode 100644 index 8ba1d8857..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_but_disabled.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture] - public class when_checkpoint_requested_but_disabled : TestFixtureWithReadWriteDispatchers { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private Exception _exception; - - [SetUp] - public void setup() { - _exception = null; - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler, - noCheckpoints: true); - _stream.Start(); - try { - _stream.Checkpoint(); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void invalid_operation_exceptioon_is_thrown() { - Assert.IsNotNull(_exception); - Assert.IsInstanceOf(_exception); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_all_writes_already_completed.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_all_writes_already_completed.cs deleted file mode 100644 index ba2d2fa99..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_all_writes_already_completed.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_checkpoint_requested_with_all_writes_already_completed : core_projection.TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void Setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 10, 5), null) - }); - var msg = _consumer.HandledMessages.OfType().First(); - _bus.Publish(new ClientMessage.WriteEventsCompleted(msg.CorrelationId, 0, 0, -1, -1)); - _stream.Checkpoint(); - } - - [Test] - public void publishes_ready_for_checkpoint() { - Assert.IsTrue( - _readyHandler.HandledMessages.ContainsSingle()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_pending_writes.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_pending_writes.cs deleted file mode 100644 index eabf38c11..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_checkpoint_requested_with_pending_writes.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_checkpoint_requested_with_pending_writes : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 100, 50), - null) - }); - _stream.Checkpoint(); - } - - [Test] - public void does_not_publish_ready_for_checkpoint_immediately() { - Assert.AreEqual( - 0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_ready_for_checkpoint_on_handling_last_write_events_completed() { - var msg = _consumer.HandledMessages.OfType().First(); - _bus.Publish(new ClientMessage.WriteEventsCompleted(msg.CorrelationId, 0, 0, -1, -1)); - Assert.AreEqual( - 1, _readyHandler.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_creating_an_emitted_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_creating_an_emitted_stream.cs deleted file mode 100644 index 0d4770d8e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_creating_an_emitted_stream.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using EventStore.Core.Helpers; -using EventStore.Core.Messaging; -using EventStore.Core.Tests.Fakes; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture] - public class when_creating_an_emitted_stream { - private FakePublisher _fakePublisher; - private IODispatcher _ioDispatcher; - - - [SetUp] - public void setup() { - _fakePublisher = new FakePublisher(); - _ioDispatcher = new IODispatcher(_fakePublisher, _fakePublisher, true); - } - - [Test] - public void null_stream_id_throws_argument_null_exception() { - Assert.Throws(() => { - new EmittedStream( - null, - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, - _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void null_writer_configuration_throws_argument_null_exception() { - Assert.Throws(() => { - new EmittedStream( - null, null, new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, - _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void empty_stream_id_throws_argument_exception() { - Assert.Throws(() => { - new EmittedStream( - "", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, - _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void null_from_throws_argument_exception() { - Assert.Throws(() => { - new EmittedStream( - "", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), null, _fakePublisher, _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), null, _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void null_io_dispatcher_throws_argument_null_exception() { - Assert.Throws(() => { - new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, null, - new TestCheckpointManagerMessageHandler()); - }); - } - - [Test] - public void null_ready_handler_throws_argumenbt_null_exception() { - Assert.Throws(() => { - new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), - new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, - _ioDispatcher, null); - }); - } - - [Test] - public void it_can_be_created() { - new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _fakePublisher, - _ioDispatcher, - new TestCheckpointManagerMessageHandler()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_a_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_a_timeout.cs deleted file mode 100644 index 0d840aba1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_a_timeout.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using System.Collections.Generic; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream.another_epoch { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_a_timeout : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent("test_stream", "type1", @"{""v"": 1, ""c"": 100, ""p"": 50}", "data"); - ExistingEvent("test_stream", "type1", @"{""v"": 2, ""c"": 100, ""p"": 50}", "data"); - } - - private EmittedEvent[] CreateEventBatch() { - return new EmittedEvent[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type1", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - null), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type2", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - null), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type3", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - null) - }; - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 2, 2), new TransactionFilePositionTagger(0), CheckpointTag.Empty, - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents(CreateEventBatch()); - - CompleteWriteWithResult(OperationResult.CommitTimeout); - } - - [Test] - public void should_retry_the_write_with_the_same_events() { - var current = _consumer.HandledMessages.OfType().Last(); - while (_consumer.HandledMessages.Last().GetType() == - typeof(EventStore.Core.Services.TimerService.TimerMessage.Schedule)) { - var message = - _consumer.HandledMessages.Last() as EventStore.Core.Services.TimerService.TimerMessage.Schedule; - message.Envelope.ReplyWith(message.ReplyMessage); - - CompleteWriteWithResult(OperationResult.CommitTimeout); - - var last = _consumer.HandledMessages.OfType().Last(); - - Assert.AreEqual(current.EventStreamId, last.EventStreamId); - Assert.AreEqual(current.Events, last.Events); - - current = last; - } - - Assert.AreEqual(1, - _readyHandler.HandledFailedMessages.OfType().Count(), - "Should fail the projection after exhausting all the write retries"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_not_started_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_not_started_stream.cs deleted file mode 100644 index 77247db33..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_not_started_stream.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_the_not_started_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - base.Given(); - NoStream("test"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 200, 150), - null) - }); - } - - [Test] - public void does_not_publish_write_events() { - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_write_events_when_started() { - _stream.Start(); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_started_in_recovery_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_started_in_recovery_stream.cs deleted file mode 100644 index 3eb5ec0dd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_the_started_in_recovery_stream.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_the_started_in_recovery_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void throws_if_position_is_prior_to_from_position() { - Assert.Throws(() => { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 20, 10), null) - }); - }); - } - - [Test] - public void does_not_publish_already_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 50), null) - }); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_not_yet_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void does_not_reply_with_write_completed_message() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - Assert.AreEqual(0, _readyHandler.HandledWriteCompletedMessage.Count); - } - - [Test] - public void reply_with_write_completed_message_when_write_completes() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - OneWriteCompletes(); - Assert.IsTrue(_readyHandler.HandledWriteCompletedMessage.Any(v => v.StreamId == "test_stream")); - // more than one is ok - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_to_the_nonexisting_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_to_the_nonexisting_stream.cs deleted file mode 100644 index 61a79fe4e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_to_the_nonexisting_stream.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_to_the_nonexisting_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$test_stream"); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void throws_if_position_is_prior_to_from_position() { - Assert.Throws(() => { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 20, 10), null) - }); - }); - } - - [Test] - public void publishes_already_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 50), null) - }); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .Count()); - } - - [Test] - public void publishes_not_yet_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .Count()); - } - - [Test] - public void does_not_reply_with_write_completed_message() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - Assert.AreEqual(0, _readyHandler.HandledWriteCompletedMessage.Count); - } - - [Test] - public void reply_with_write_completed_message_when_write_completes() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - OneWriteCompletes(); - Assert.IsTrue(_readyHandler.HandledWriteCompletedMessage.Any(v => v.StreamId == "test_stream")); - // more than one is ok - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_caused_by_and_correlation_id.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_caused_by_and_correlation_id.cs deleted file mode 100644 index dcbbf0510..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_caused_by_and_correlation_id.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_caused_by_and_correlation_id : core_projection.TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private EmittedDataEvent _emittedDataEvent; - private Guid _causedBy; - private string _correlationId; - - protected override void Given() { - AllWritesQueueUp(); - AllWritesToSucceed("$$test_stream"); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _causedBy = Guid.NewGuid(); - _correlationId = "correlation_id"; - - _emittedDataEvent = new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 200, 150), - null); - - _emittedDataEvent.SetCausedBy(_causedBy); - _emittedDataEvent.SetCorrelationId(_correlationId); - - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents(new[] {_emittedDataEvent}); - } - - - [Test] - public void publishes_write_events() { - var writeEvents = - _consumer.HandledMessages.OfType() - .ExceptOfEventType(SystemEventTypes.StreamMetadata) - .ToArray(); - Assert.AreEqual(1, writeEvents.Length); - var writeEvent = writeEvents.Single(); - Assert.NotNull(writeEvent.Metadata); - var metadata = Helper.UTF8NoBom.GetString(writeEvent.Metadata); - HelperExtensions.AssertJson( - new {___causedBy = _causedBy, ___correlationId = _correlationId}, metadata.ParseJson()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_committed_callback.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_committed_callback.cs deleted file mode 100644 index be8d092c2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_committed_callback.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_committed_callback : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - AllWritesSucceed(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 0, -1), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void completes_already_published_events() { - var invoked = false; - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), - (CheckpointTag)null, v => invoked = true) - }); - Assert.IsTrue(invoked); - } - - [Test] - public void completes_not_yet_published_events() { - var invoked = false; - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 200, 150), - (CheckpointTag)null, v => invoked = true) - }); - Assert.IsTrue(invoked); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs deleted file mode 100644 index 570b567fa..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_an_emit_with_expected_tag_the_started_in_recovery_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 0, -1), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void does_not_publish_already_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 50), CheckpointTag.FromPosition(0, 40, 20)) - }); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_not_yet_published_events_if_expected_tag_is_the_same() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), CheckpointTag.FromPosition(0, 100, 50)) - }); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void does_not_publish_not_yet_published_events_if_expected_tag_is_before_last_event_tag() { - //TODO: is it corrupted dB case? - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), CheckpointTag.FromPosition(0, 40, 20)) - }); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void correct_stream_id_is_set_on_write_events_message() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), CheckpointTag.FromPosition(0, 100, 50)) - }); - Assert.AreEqual( - "test_stream", _consumer.HandledMessages.OfType().Single().EventStreamId); - } - - [Test] - public void metadata_include_commit_and_prepare_positions() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), CheckpointTag.FromPosition(0, 100, 50)) - }); - var metaData = - _consumer.HandledMessages.OfType().Single().Events[0].Metadata - .ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - Assert.AreEqual(200, metaData.Tag.CommitPosition); - Assert.AreEqual(150, metaData.Tag.PreparePosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_extra_metadata.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_extra_metadata.cs deleted file mode 100644 index 7d344fb78..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_extra_metadata.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using Newtonsoft.Json.Linq; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_extra_metadata : core_projection.TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", - new ExtraMetaData(new Dictionary {{"a", "1"}, {"b", "{}"}}), - CheckpointTag.FromPosition(0, 200, 150), null) - }); - } - - [Test] - public void publishes_not_yet_published_events() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void combines_checkpoint_tag_with_extra_metadata() { - var writeEvent = _consumer.HandledMessages.OfType().Single(); - - Assert.AreEqual(1, writeEvent.Events.Length); - var @event = writeEvent.Events[0]; - var metadata = Helper.UTF8NoBom.GetString(@event.Metadata).ParseJson(); - - HelperExtensions.AssertJson(new {a = 1, b = new { }}, metadata); - var checkpoint = @event.Metadata.ParseCheckpointTagJson(); - Assert.AreEqual(CheckpointTag.FromPosition(0, 200, 150), checkpoint); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_not_ready_event.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_not_ready_event.cs deleted file mode 100644 index 370c1c0eb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_not_ready_event.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_not_ready_event : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 0, -1), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void replies_with_await_message() { - _stream.EmitEvents( - new[] { - new EmittedLinkTo( - "test_stream", Guid.NewGuid(), "other_stream", CheckpointTag.FromPosition(0, 1100, 1000), null) - }); - Assert.AreEqual(1, _readyHandler.HandledStreamAwaitingMessage.Count); - Assert.AreEqual("test_stream", _readyHandler.HandledStreamAwaitingMessage[0].StreamId); - } - - [Test] - public void processes_write_on_write_completed_if_ready() { - var linkTo = new EmittedLinkTo( - "test_stream", Guid.NewGuid(), "other_stream", CheckpointTag.FromPosition(0, 1100, 1000), null); - _stream.EmitEvents(new[] {linkTo}); - linkTo.SetTargetEventNumber(1); - _stream.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted("other_stream")); - - Assert.AreEqual(1, _readyHandler.HandledStreamAwaitingMessage.Count); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .OfEventType(SystemEventTypes.LinkTo) - .Count()); - } - - [Test] - public void replies_with_await_message_on_write_completed_if_not_yet_ready() { - var linkTo = new EmittedLinkTo( - "test_stream", Guid.NewGuid(), "other_stream", CheckpointTag.FromPosition(0, 1100, 1000), null); - _stream.EmitEvents(new[] {linkTo}); - _stream.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted("one_more_stream")); - - Assert.AreEqual(2, _readyHandler.HandledStreamAwaitingMessage.Count); - Assert.AreEqual("test_stream", _readyHandler.HandledStreamAwaitingMessage[0].StreamId); - Assert.AreEqual("test_stream", _readyHandler.HandledStreamAwaitingMessage[1].StreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_stream_metadata.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_stream_metadata.cs deleted file mode 100644 index 77506949f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_stream_metadata.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_stream_metadata_to_empty_stream : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private EmittedStream.WriterConfiguration.StreamMetadata _streamMetadata; - private EmittedStream.WriterConfiguration _writerConfiguration; - - protected override void Given() { - AllWritesQueueUp(); - NoStream("test_stream"); - _streamMetadata = new EmittedStream.WriterConfiguration.StreamMetadata(maxCount: 10); - _writerConfiguration = new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - _streamMetadata, null, maxWriteBatchLength: 50); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", _writerConfiguration, new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - } - - [Test] - public void publishes_write_stream_metadata() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().ToStream("$$test_stream").Count()); - } - - [Test] - public void does_not_write_stream_metadata_second_time() { - OneWriteCompletes(); - OneWriteCompletes(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 400, 350), null) - }); - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().ToStream("$$test_stream").Count()); - } - - [Test] - public void publishes_write_emitted_event_on_write_stream_metadata_completed() { - OneWriteCompletes(); - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().ToStream("test_stream").Count()); - } - - [Test] - public void does_not_reply_with_write_completed_message() { - Assert.AreEqual(0, _readyHandler.HandledWriteCompletedMessage.Count); - } - - [Test] - public void reply_with_write_completed_message_when_write_completes() { - OneWriteCompletes(); - OneWriteCompletes(); - Assert.IsTrue(_readyHandler.HandledWriteCompletedMessage.Any(v => v.StreamId == "test_stream")); - // more than one is ok - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_write_as_configured.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_write_as_configured.cs deleted file mode 100644 index 57480cdc2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_an_emit_with_write_as_configured.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_an_emit_with_write_as_configured : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private ClaimsPrincipal _writeAs; - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _writeAs = new ClaimsPrincipal(new ClaimsIdentity(new []{new Claim(ClaimTypes.Role, "test-user") },"ES-Test")); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), _writeAs, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - } - - [Test] - public void publishes_not_yet_published_events() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_write_event_with_correct_user_account() { - var writeEvent = _consumer.HandledMessages.OfType().Single(); - - Assert.AreSame(_writeAs, writeEvent.User); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_in_invalid_order.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_in_invalid_order.cs deleted file mode 100644 index a7e13ff46..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_in_invalid_order.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_emits_in_invalid_order : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - ExistingEvent("test_stream", "type", @"{""c"": 100, ""p"": 50}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 40, 30), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 100, 90), null) - }); - } - - [Test] - public void throws_if_position_is_prior_to_the_last_event_position() { - Assert.Throws(() => { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 80, 70), null) - }); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events.cs deleted file mode 100644 index 528c41e5f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_emits_with_previously_written_events : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - AllWritesQueueUp(); - ExistingEvent("test_stream", "type1", @"{""c"": 100, ""p"": 50}", "data"); - ExistingEvent("test_stream", "type2", @"{""c"": 200, ""p"": 150}", "data"); - ExistingEvent("test_stream", "type3", @"{""c"": 300, ""p"": 250}", "data"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 100, 50), _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - } - - [Test] - public void does_not_publish_already_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type2", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type3", true, "data", null, - CheckpointTag.FromPosition(0, 300, 250), null) - }); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void does_not_fail_the_projection_if_events_are_skipped() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type3", true, "data", null, - CheckpointTag.FromPosition(0, 300, 250), null) - }); - Assert.AreEqual(0, _readyHandler.HandledFailedMessages.Count); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void fails_the_projection_if_events_are_at_different_positions() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type3", true, "data", null, - CheckpointTag.FromPosition(0, 250, 220), null) - }); - Assert.AreEqual(1, _readyHandler.HandledFailedMessages.Count); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_not_yet_published_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 400, 350), null) - }); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void replies_with_write_completed_message_for_existing_events() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type2", true, "data", null, - CheckpointTag.FromPosition(0, 200, 150), null) - }); - Assert.AreEqual(1, _readyHandler.HandledWriteCompletedMessage.Count); - } - - [Test] - public void retrieves_event_number_for_previously_written_events() { - long eventNumber = -1; - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type2", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 200, 150), - (CheckpointTag)null, v => eventNumber = v) - }); - Assert.AreEqual(1, eventNumber); - } - - [Test] - public void reply_with_write_completed_message_when_write_completes() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type", true, "data", null, - CheckpointTag.FromPosition(0, 400, 350), null) - }); - OneWriteCompletes(); - Assert.IsTrue(_readyHandler.HandledWriteCompletedMessage.Any(v => v.StreamId == "test_stream")); - // more than one is ok - } - - [Test] - public void reports_event_number_for_new_events() { - long eventNumber = -1; - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 400, 350), - (CheckpointTag)null, v => eventNumber = v) - }); - OneWriteCompletes(); - Assert.AreEqual(3, eventNumber); - } - - [Test] - public void does_not_fail_if_link_event_target_does_not_exist() { - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "$>", true, "0@foobar", null, - CheckpointTag.FromPosition(0, 150, 100), null) - }); - Assert.AreEqual(0, _readyHandler.HandledFailedMessages.Count); - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events_at_the_same_position.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events_at_the_same_position.cs deleted file mode 100644 index 6c0981afd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_handling_emits_with_previously_written_events_at_the_same_position.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_emits_with_previously_written_events_at_the_same_position : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - private long _1; - private long _2; - private long _3; - - protected override void Given() { - AllWritesQueueUp(); - //NOTE: it is possible for a batch of events to be partially written if it contains links - ExistingEvent("test_stream", "type1", @"{""c"": 100, ""p"": 50}", "data"); - ExistingEvent("test_stream", "type2", @"{""c"": 100, ""p"": 50}", "data"); - } - - private EmittedEvent[] CreateEventBatch() { - return new EmittedEvent[] { - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type1", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _1 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type2", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _2 = v), - new EmittedDataEvent( - (string)"test_stream", Guid.NewGuid(), (string)"type3", (bool)true, - (string)"data", (ExtraMetaData)null, CheckpointTag.FromPosition(0, 100, 50), (CheckpointTag)null, - v => _3 = v) - }; - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test_stream", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, maxWriteBatchLength: 50), - new ProjectionVersion(1, 0, 0), new TransactionFilePositionTagger(0), - CheckpointTag.FromPosition(0, 20, 10), - _bus, _ioDispatcher, _readyHandler); - _stream.Start(); - _stream.EmitEvents(CreateEventBatch()); - OneWriteCompletes(); - } - - [Test] - public void publishes_not_yet_written_events_only() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var writeMessage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(1, writeMessage.Events.Length); - Assert.AreEqual("type3", writeMessage.Events[0].EventType); - } - - [Test] - public void reports_correct_event_numbers() { - Assert.AreEqual(0, _1); - Assert.AreEqual(1, _2); - Assert.AreEqual(2, _3); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started.cs deleted file mode 100644 index ba89c2a1a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture] - public class when_the_stream_is_started : TestFixtureWithReadWriteDispatchers { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - ; - _stream.Start(); - } - - [Test] - public void start_throws_invalid_operation_exception() { - Assert.Throws(() => { _stream.Start(); }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started_with_already_emitted_events.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started_with_already_emitted_events.cs deleted file mode 100644 index ba480241b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_stream/when_the_stream_is_started_with_already_emitted_events.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_stream_is_started_with_already_emitted_events : TestFixtureWithExistingEvents { - private EmittedStream _stream; - private TestCheckpointManagerMessageHandler _readyHandler; - - protected override void Given() { - base.Given(); - NoStream("test"); - } - - [SetUp] - public void setup() { - _readyHandler = new TestCheckpointManagerMessageHandler(); - ; - _stream = new EmittedStream( - "test", - new EmittedStream.WriterConfiguration(new EmittedStreamsWriter(_ioDispatcher), - new EmittedStream.WriterConfiguration.StreamMetadata(), null, 50), new ProjectionVersion(1, 0, 0), - new TransactionFilePositionTagger(0), CheckpointTag.FromPosition(0, 0, -1), _bus, _ioDispatcher, - _readyHandler); - _stream.EmitEvents( - new[] { - new EmittedDataEvent( - "test", Guid.NewGuid(), "type", true, "data", null, CheckpointTag.FromPosition(0, 100, 50), - null) - }); - _stream.Start(); - } - - [Test] - public void publishes_write_events() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_checkpoint_read_times_out.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_checkpoint_read_times_out.cs deleted file mode 100644 index 38b612b16..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_checkpoint_read_times_out.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_checkpoint_read_times_out : with_emitted_stream_deleter, - IHandle { - protected Action _onDeleteStreamCompleted; - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private List _deleteMessages = new List(); - private bool _hasTimerTimedOut; - - private Guid _timedOutCorrelationId; - - public override void When() { - _bus.Subscribe(this); - _onDeleteStreamCompleted = () => { _mre.Set(); }; - - _deleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - } - - public override void Handle(ClientMessage.ReadStreamEventsBackward message) { - if (message.CorrelationId == _timedOutCorrelationId) { - return; - } else { - base.Handle(message); - } - } - - public override void Handle(ClientMessage.DeleteStream message) { - _deleteMessages.Add(message); - message.Envelope.ReplyWith(new ClientMessage.DeleteStreamCompleted( - message.CorrelationId, OperationResult.Success, String.Empty)); - } - - public void Handle(TimerMessage.Schedule message) { - if (!_hasTimerTimedOut) { - var delay = message.ReplyMessage as IODispatcherDelayedMessage; - if (delay != null) { - _timedOutCorrelationId = delay.MessageCorrelationId.Value; - _hasTimerTimedOut = true; - message.Reply(); - } - } - } - - [Test] - public void should_have_deleted_the_tracked_emitted_stream() { - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for event to be deleted"); - } - - Assert.AreEqual(_testStreamName, _deleteMessages[0].EventStreamId); - Assert.AreEqual(_checkpointName, _deleteMessages[1].EventStreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_delete_stream_succeeds.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_delete_stream_succeeds.cs deleted file mode 100644 index 42b4dd8b7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_delete_stream_succeeds.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_delete_stream_succeeds : with_emitted_stream_deleter { - protected Action _onDeleteStreamCompleted; - private readonly ManualResetEventSlim _mre = new ManualResetEventSlim(); - private readonly List _deleteMessages = new List(); - - public override void When() { - _onDeleteStreamCompleted = () => { _mre.Set(); }; - - _deleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - } - - public override void Handle(ClientMessage.DeleteStream message) { - _deleteMessages.Add(message); - message.Envelope.ReplyWith(new ClientMessage.DeleteStreamCompleted( - message.CorrelationId, OperationResult.Success, String.Empty)); - } - - [Test] - public void should_have_deleted_the_tracked_emitted_stream() { - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for event to be deleted"); - } - - Assert.AreEqual(_testStreamName, _deleteMessages[0].EventStreamId); - Assert.AreEqual(_checkpointName, _deleteMessages[1].EventStreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_emitted_streams_read_times_out.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_emitted_streams_read_times_out.cs deleted file mode 100644 index 1de61a6c4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/when_emitted_streams_read_times_out.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_emitted_streams_read_times_out : with_emitted_stream_deleter, - IHandle { - protected Action _onDeleteStreamCompleted; - private ManualResetEventSlim _mre = new ManualResetEventSlim(); - private List _deleteMessages = new List(); - private bool _hasTimedOut; - - private Guid _timedOutCorrelationId; - - public override void When() { - _bus.Subscribe(this); - _onDeleteStreamCompleted = () => { _mre.Set(); }; - - _deleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - } - - public override void Handle(ClientMessage.ReadStreamEventsForward message) { - if (!_hasTimedOut) { - _hasTimedOut = true; - _timedOutCorrelationId = message.CorrelationId; - return; - } else { - base.Handle(message); - } - } - - public override void Handle(ClientMessage.DeleteStream message) { - _deleteMessages.Add(message); - message.Envelope.ReplyWith(new ClientMessage.DeleteStreamCompleted( - message.CorrelationId, OperationResult.Success, String.Empty)); - } - - public void Handle(TimerMessage.Schedule message) { - var delay = message.ReplyMessage as IODispatcherDelayedMessage; - if (delay != null && delay.MessageCorrelationId.Value == _timedOutCorrelationId) { - message.Reply(); - } - } - - [Test] - public void should_have_deleted_the_tracked_emitted_stream() { - if (!_mre.Wait(10000)) { - Assert.Fail("Timed out waiting for event to be deleted"); - } - - Assert.AreEqual(_testStreamName, _deleteMessages[0].EventStreamId); - Assert.AreEqual(_checkpointName, _deleteMessages[1].EventStreamId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_an_existing_emitted_streams_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_an_existing_emitted_streams_stream.cs deleted file mode 100644 index 98904c344..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_an_existing_emitted_streams_stream.cs +++ /dev/null @@ -1,82 +0,0 @@ -using EventStore.ClientAPI; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_an_existing_emitted_streams_stream : SpecificationWithEmittedStreamsTrackerAndDeleter { - protected Action _onDeleteStreamCompleted; - protected ManualResetEvent _resetEvent = new ManualResetEvent(false); - private string _testStreamName = "test_stream"; - private ManualResetEvent _eventAppeared = new ManualResetEvent(false); - private EventStore.ClientAPI.SystemData.UserCredentials _credentials; - - protected override async Task Given() { - _credentials = new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit"); - _onDeleteStreamCompleted = () => { _resetEvent.Set(); }; - - await base.Given(); - var sub = await _conn.SubscribeToStreamAsync(_projectionNamesBuilder.GetEmittedStreamsName(), true, (s, evnt) => { - _eventAppeared.Set(); - return Task.CompletedTask; - }, userCredentials: _credentials); - - _emittedStreamsTracker.TrackEmittedStream(new EmittedEvent[] { - new EmittedDataEvent( - _testStreamName, Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null), - }); - - if (!_eventAppeared.WaitOne(TimeSpan.FromSeconds(5))) { - Assert.Fail("Timed out waiting for emitted stream event"); - } - - sub.Unsubscribe(); - - var emittedStreamResult = - await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 1, false, - _credentials); - Assert.AreEqual(1, emittedStreamResult.Events.Length); - Assert.AreEqual(SliceReadStatus.Success, emittedStreamResult.Status); - } - - protected override Task When() { - _emittedStreamsDeleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - if (!_resetEvent.WaitOne(TimeSpan.FromSeconds(10))) { - throw new Exception("Timed out waiting callback."); - } - - return Task.CompletedTask; - } - - [Test] - public async Task should_have_deleted_the_tracked_emitted_stream() { - var result = await _conn.ReadStreamEventsForwardAsync(_testStreamName, 0, 1, false, - new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - - - [Test] - public async Task should_have_deleted_the_checkpoint_stream() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsCheckpointName(), - 0, 1, false, new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - - [Test] - public async Task should_have_deleted_the_emitted_streams_stream() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 1, - false, new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_emitted_stream_deleter.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_emitted_stream_deleter.cs deleted file mode 100644 index 75724447b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_emitted_stream_deleter.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Helpers.IODispatcherTests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - public abstract class with_emitted_stream_deleter : IHandle, - IHandle, - IHandle { - protected SynchronousScheduler _bus = new(); - protected IODispatcher _ioDispatcher; - protected EmittedStreamsDeleter _deleter; - protected ProjectionNamesBuilder _projectionNamesBuilder; - protected string _projectionName = "test_projection"; - protected string _checkpointName; - protected string _testStreamName = "test_stream"; - private bool _hasReadForward; - - [OneTimeSetUp] - protected virtual void SetUp() { - _ioDispatcher = new IODispatcher(_bus, _bus, true); - _projectionNamesBuilder = ProjectionNamesBuilder.CreateForTest(_projectionName); - _checkpointName = _projectionNamesBuilder.GetEmittedStreamsCheckpointName(); - - _deleter = new EmittedStreamsDeleter(_ioDispatcher, - _projectionNamesBuilder.GetEmittedStreamsName(), - _checkpointName); - - IODispatcherTestHelpers.SubscribeIODispatcher(_ioDispatcher, _bus); - - _bus.Subscribe(this); - _bus.Subscribe(this); - _bus.Subscribe(this); - - When(); - } - - public abstract void When(); - - public virtual void Handle(ClientMessage.ReadStreamEventsBackward message) { - var events = IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, - ProjectionEventTypes.ProjectionCheckpoint, "0"); - var reply = new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId, - message.EventStreamId, message.FromEventNumber, message.MaxCount, - ReadStreamResult.Success, events, null, false, String.Empty, 0, message.FromEventNumber, true, 1000); - - message.Envelope.ReplyWith(reply); - } - - public virtual void Handle(ClientMessage.ReadStreamEventsForward message) { - ClientMessage.ReadStreamEventsForwardCompleted reply; - - if (!_hasReadForward) { - _hasReadForward = true; - var events = IODispatcherTestHelpers.CreateResolvedEvent(message.EventStreamId, - ProjectionEventTypes.ProjectionCheckpoint, _testStreamName); - reply = new ClientMessage.ReadStreamEventsForwardCompleted(message.CorrelationId, message.EventStreamId, - message.FromEventNumber, message.MaxCount, - ReadStreamResult.Success, events, null, false, String.Empty, message.FromEventNumber + 1, - message.FromEventNumber, true, 1000); - } else { - reply = new ClientMessage.ReadStreamEventsForwardCompleted(message.CorrelationId, message.EventStreamId, - message.FromEventNumber, message.MaxCount, - ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, String.Empty, - message.FromEventNumber, message.FromEventNumber, true, 1000); - } - - message.Envelope.ReplyWith(reply); - } - - public abstract void Handle(ClientMessage.DeleteStream message); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_multiple_tracked_streams.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_multiple_tracked_streams.cs deleted file mode 100644 index e11168899..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_multiple_tracked_streams.cs +++ /dev/null @@ -1,89 +0,0 @@ -using EventStore.ClientAPI; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_multiple_tracked_streams : SpecificationWithEmittedStreamsTrackerAndDeleter { - protected Action _onDeleteStreamCompleted; - protected ManualResetEvent _resetEvent = new ManualResetEvent(false); - protected CountdownEvent _eventAppeared; - private int _numberOfTrackedEvents = 200; - private string _testStreamFormat = "test_stream_{0}"; - private EventStore.ClientAPI.SystemData.UserCredentials _credentials; - - protected override async Task Given() { - _credentials = new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit"); - _eventAppeared = new CountdownEvent(_numberOfTrackedEvents); - _onDeleteStreamCompleted = () => { _resetEvent.Set(); }; - await base.Given(); - - var sub = await _conn.SubscribeToStreamAsync(_projectionNamesBuilder.GetEmittedStreamsName(), true, (s, evnt) => { - _eventAppeared.Signal(); - return Task.CompletedTask; - }, userCredentials: _credentials); - - for (int i = 0; i < _numberOfTrackedEvents; i++) { - await _conn.AppendToStreamAsync(String.Format(_testStreamFormat, i), ExpectedVersion.Any, - new EventData(Guid.NewGuid(), "type1", true, Helper.UTF8NoBom.GetBytes("data"), null)); - _emittedStreamsTracker.TrackEmittedStream(new EmittedEvent[] { - new EmittedDataEvent( - String.Format(_testStreamFormat, i), Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null), - }); - } - - if (!_eventAppeared.Wait(TimeSpan.FromSeconds(10))) { - Assert.Fail("Timed out waiting for emitted streams"); - } - - var emittedStreamResult = - await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, - _numberOfTrackedEvents, false, _credentials); - Assert.AreEqual(_numberOfTrackedEvents, emittedStreamResult.Events.Length); - Assert.AreEqual(SliceReadStatus.Success, emittedStreamResult.Status); - } - - protected override Task When() { - _emittedStreamsDeleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - if (!_resetEvent.WaitOne(TimeSpan.FromSeconds(10))) { - throw new Exception("Timed out waiting callback."); - } - - return Task.CompletedTask; - } - - [Test] - public async Task should_have_deleted_the_tracked_emitted_streams() { - for (int i = 0; i < _numberOfTrackedEvents; i++) { - var result = await _conn.ReadStreamEventsForwardAsync(String.Format(_testStreamFormat, i), 0, 1, false, - new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - } - - - [Test] - public async Task should_have_deleted_the_checkpoint_stream() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsCheckpointName(), - 0, 1, false, new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - - [Test] - public async Task should_have_deleted_the_emitted_streams_stream() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 1, - false, new EventStore.ClientAPI.SystemData.UserCredentials("admin", "changeit")); - Assert.AreEqual(SliceReadStatus.StreamNotFound, result.Status); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_no_emitted_streams_stream.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_no_emitted_streams_stream.cs deleted file mode 100644 index f64350381..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_deleter/when_deleting/with_no_emitted_streams_stream.cs +++ /dev/null @@ -1,33 +0,0 @@ -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_deleter.when_deleting { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_no_emitted_streams_stream : SpecificationWithEmittedStreamsTrackerAndDeleter { - protected Action _onDeleteStreamCompleted; - protected ManualResetEvent _resetEvent = new ManualResetEvent(false); - - protected override Task Given() { - _onDeleteStreamCompleted = () => { _resetEvent.Set(); }; - return base.Given(); - } - - protected override Task When() { - _emittedStreamsDeleter.DeleteEmittedStreams(_onDeleteStreamCompleted); - return Task.CompletedTask; - } - - [Test] - public void should_have_called_completed() { - if (!_resetEvent.WaitOne(TimeSpan.FromSeconds(10))) { - throw new Exception("Timed out waiting callback."); - } - - ; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_disabled.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_disabled.cs deleted file mode 100644 index 3541b184f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_disabled.cs +++ /dev/null @@ -1,50 +0,0 @@ -using EventStore.ClientAPI.SystemData; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_tracker.when_tracking { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_tracking_disabled : SpecificationWithEmittedStreamsTrackerAndDeleter { - private CountdownEvent _eventAppeared = new CountdownEvent(1); - private UserCredentials _credentials = new UserCredentials("admin", "changeit"); - - protected override TimeSpan Timeout { get; } = TimeSpan.FromSeconds(10); - - protected override Task Given() { - _trackEmittedStreams = false; - return base.Given(); - } - - protected override async Task When() { - var sub = await _conn.SubscribeToStreamAsync(_projectionNamesBuilder.GetEmittedStreamsName(), true, (s, evnt) => { - _eventAppeared.Signal(); - return Task.CompletedTask; - }, userCredentials: _credentials); - - _emittedStreamsTracker.TrackEmittedStream(new EmittedEvent[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null, null) - }); - - _eventAppeared.Wait(TimeSpan.FromSeconds(5)); - sub.Unsubscribe(); - } - - [Test] - public async Task should_write_a_stream_tracked_event() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 200, - false, _credentials); - Assert.AreEqual(0, result.Events.Length); - Assert.AreEqual(1, _eventAppeared.CurrentCount); //no event appeared should get through - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled.cs deleted file mode 100644 index dcecb54c3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled.cs +++ /dev/null @@ -1,45 +0,0 @@ -using EventStore.ClientAPI.Common.Utils; -using EventStore.ClientAPI.SystemData; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_streams_tracker.when_tracking { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_tracking_enabled : SpecificationWithEmittedStreamsTrackerAndDeleter { - private CountdownEvent _eventAppeared = new CountdownEvent(1); - private UserCredentials _credentials = new UserCredentials("admin", "changeit"); - - protected override async Task When() { - var sub = await _conn.SubscribeToStreamAsync(_projectionNamesBuilder.GetEmittedStreamsName(), true, (s, evnt) => { - _eventAppeared.Signal(); - return Task.CompletedTask; - }, userCredentials: _credentials); - - _emittedStreamsTracker.TrackEmittedStream(new EmittedEvent[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null, null) - }); - - _eventAppeared.Wait(TimeSpan.FromSeconds(5)); - sub.Unsubscribe(); - } - - [Test] - public async Task should_write_a_stream_tracked_event() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 200, - false, _credentials); - Assert.AreEqual(1, result.Events.Length); - Assert.AreEqual("test_stream", Helper.UTF8NoBom.GetString(result.Events[0].Event.Data)); - Assert.AreEqual(0, _eventAppeared.CurrentCount); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled_with_duplicate_event_streams.cs b/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled_with_duplicate_event_streams.cs deleted file mode 100644 index 149089370..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/emitted_streams_tracker/when_tracking/with_tracking_enabled_with_duplicate_event_streams.cs +++ /dev/null @@ -1,50 +0,0 @@ -using EventStore.ClientAPI.Common.Utils; -using EventStore.ClientAPI.SystemData; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.emitted_stream_manager.when_tracking { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_tracking_enabled_with_duplicate_event_streams : SpecificationWithEmittedStreamsTrackerAndDeleter { - private CountdownEvent _eventAppeared = new CountdownEvent(2); - private UserCredentials _credentials = new UserCredentials("admin", "changeit"); - - protected override TimeSpan Timeout { get; } = TimeSpan.FromSeconds(10); - - protected override async Task When() { - var sub = await _conn.SubscribeToStreamAsync(_projectionNamesBuilder.GetEmittedStreamsName(), true, (s, evnt) => { - _eventAppeared.Signal(); - return Task.CompletedTask; - }, userCredentials: _credentials); - - _emittedStreamsTracker.TrackEmittedStream(new EmittedEvent[] { - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null, null), - new EmittedDataEvent( - "test_stream", Guid.NewGuid(), "type1", true, - "data", null, CheckpointTag.FromPosition(0, 100, 50), null, null) - }); - - _eventAppeared.Wait(TimeSpan.FromSeconds(5)); - sub.Unsubscribe(); - } - - [Test] - public async Task should_at_best_attempt_to_track_a_unique_list_of_streams() { - var result = await _conn.ReadStreamEventsForwardAsync(_projectionNamesBuilder.GetEmittedStreamsName(), 0, 200, - false, _credentials); - Assert.AreEqual(1, result.Events.Length); - Assert.AreEqual("test_stream", Helper.UTF8NoBom.GetString(result.Events[0].Event.Data)); - Assert.AreEqual(1, _eventAppeared.CurrentCount); //only 1 event appeared should get through - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/TestFixtureWithEventFilter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/TestFixtureWithEventFilter.cs deleted file mode 100644 index 469fd5b3e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/TestFixtureWithEventFilter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - public class TestFixtureWithEventFilter { - protected SourceDefinitionBuilder _builder; - protected EventFilter _ef; - protected Exception _exception; - - [SetUp] - public void Setup() { - _builder = new SourceDefinitionBuilder(); - Given(); - When(); - } - - protected virtual void Given() { - } - - protected virtual void When() { - _ef = null; - try { - var sources = _builder.Build(); - _ef = - ReaderStrategy.Create("test", 0, sources, new RealTimeProvider(), stopOnEof: false, runAs: null) - .EventFilter; - } catch (Exception ex) { - _exception = ex; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/empty_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/empty_event_filter.cs deleted file mode 100644 index 0915327b9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/empty_event_filter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class empty_event_filter : TestFixtureWithEventFilter { - [Test] - public void cannot_be_built() { - Assert.IsAssignableFrom(typeof(InvalidOperationException), _exception); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_event_filter.cs deleted file mode 100644 index ca7e265c9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_event_filter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using EventStore.ClientAPI.Common; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class include_everything_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromAll(); - _builder.AllEvents(); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void does_not_pass_categorized_event() { - Assert.IsFalse(_ef.Passes(true, "$ce-stream", "event")); - } - - [Test] - public void passes_uncategorized_event() { - Assert.IsTrue(_ef.Passes(false, "stream", "event")); - } - - [Test] - public void passes_stream_deleted_event() { - Assert.IsTrue(_ef.Passes(false, "stream", SystemEventTypes.StreamMetadata, isStreamDeletedEvent: true)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_handling_deleted_notifications_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_handling_deleted_notifications_event_filter.cs deleted file mode 100644 index 2814ee998..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/include_everything_handling_deleted_notifications_event_filter.cs +++ /dev/null @@ -1,34 +0,0 @@ -using EventStore.ClientAPI.Common; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class include_everything_handling_deleted_notifications_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromAll(); - _builder.AllEvents(); - _builder.SetHandlesStreamDeletedNotifications(); - _builder.SetByStream(); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void does_not_pass_categorized_event() { - Assert.IsFalse(_ef.Passes(true, "$ce-stream", "event")); - } - - [Test] - public void passes_uncategorized_event() { - Assert.IsTrue(_ef.Passes(false, "stream", "event")); - } - - [Test] - public void does_not_pass_stream_deleted_event() { - Assert.IsFalse(_ef.Passes(false, "stream", SystemEventTypes.StreamMetadata, isStreamDeletedEvent: true)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/just_all_events_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/just_all_events_event_filter.cs deleted file mode 100644 index 366a35786..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/just_all_events_event_filter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class just_all_events_event_filter : TestFixtureWithEventFilter { - [Test] - public void cannot_be_built() { - Assert.IsAssignableFrom(typeof(InvalidOperationException), _exception); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/just_from_all_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/just_from_all_event_filter.cs deleted file mode 100644 index f32a19633..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/just_from_all_event_filter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class just_from_all_event_filter : TestFixtureWithEventFilter { - [Test] - public void cannot_be_built() { - Assert.IsAssignableFrom(typeof(InvalidOperationException), _exception); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_category_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_category_event_filter.cs deleted file mode 100644 index c71958e4c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_category_event_filter.cs +++ /dev/null @@ -1,31 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_category_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromCategory("category"); - _builder.AllEvents(); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void passes_event_with_correct_category() { - Assert.IsTrue(_ef.Passes(true, "$ce-category", "event")); - } - - [Test] - public void does_not_pass_event_with_incorrect_category() { - Assert.IsFalse(_ef.Passes(true, "$ce-another", "event")); - } - - [Test] - public void does_not_pass_uncategorized_event() { - Assert.IsFalse(_ef.Passes(false, "stream", "event")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_event_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_event_event_filter.cs deleted file mode 100644 index 7140e3a5f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_event_event_filter.cs +++ /dev/null @@ -1,36 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_event_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromAll(); - _builder.IncludeEvent("event"); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void does_not_pass_categorized_event_with_correct_event_name() { - Assert.IsFalse(_ef.Passes(true, "stream", "event")); - } - - [Test] - public void does_not_pass_categorized_event_with_incorrect_event_name() { - Assert.IsFalse(_ef.Passes(true, "stream", "incorrect_event")); - } - - [Test] - public void passes_uncategorized_event_with_correct_event_name() { - Assert.IsTrue(_ef.Passes(false, "stream", "event")); - } - - [Test] - public void does_not_pass_uncategorized_event_with_incorrect_event_name() { - Assert.IsFalse(_ef.Passes(true, "stream", "incorrect_event")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_events_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_events_event_filter.cs deleted file mode 100644 index 51a0f9bf7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_events_event_filter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_events_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromAll(); - _builder.IncludeEvent("eventOne"); - _builder.IncludeEvent("eventTwo"); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void should_allow_non_linked_events() { - Assert.IsTrue(_ef.Passes(false, "stream", "eventOne")); - } - - [Test] - public void should_allow_events_from_event_type_stream() { - Assert.IsTrue(_ef.Passes(true, "$et-eventOne", "eventOne")); - } - - [Test] - public void should_not_allow_events_from_event_type_stream_that_is_not_included() { - Assert.IsFalse(_ef.Passes(true, "$et-eventThree", "eventThree")); - } - - [Test] - public void should_not_allow_events_from_system_streams() { - Assert.IsFalse(_ef.Passes(false, "$ct-test", "eventOne")); - } - - [Test] - public void should_not_allow_linked_events_from_system_streams() { - Assert.IsFalse(_ef.Passes(true, "$ct-test", "eventOne")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_and_category_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_and_category_event_filter.cs deleted file mode 100644 index 701dc9f71..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_and_category_event_filter.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_stream_and_category_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromCategory("category"); - _builder.FromStream("/test"); - _builder.AllEvents(); - } - - [Test] - public void cannot_be_built() { - Assert.IsAssignableFrom(typeof(InvalidOperationException), _exception); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_event_filter.cs deleted file mode 100644 index b93582382..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_stream_event_filter.cs +++ /dev/null @@ -1,39 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_stream_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromStream("/test"); - _builder.AllEvents(); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void passes_categorized_event_with_correct_stream_id() { - //NOTE: this is possible if you read from $ce-account stream - // this is not the same as reading an account category as you can see at - // least StreamCreate even there - Assert.IsTrue(_ef.Passes(true, "/test", "event")); - } - - [Test] - public void does_not_pass_categorized_event_with_incorrect_stream_id() { - Assert.IsFalse(_ef.Passes(true, "incorrect_stream", "event")); - } - - [Test] - public void passes_uncategorized_event_with_correct_stream_id() { - Assert.IsTrue(_ef.Passes(false, "/test", "event")); - } - - [Test] - public void does_not_pass_uncategorized_event_with_incorrect_stream_id() { - Assert.IsFalse(_ef.Passes(true, "incorrect_stream", "event")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_streams_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_streams_event_filter.cs deleted file mode 100644 index d7ac114af..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_filter/specific_streams_event_filter.cs +++ /dev/null @@ -1,40 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_filter { - [TestFixture] - public class specific_streams_event_filter : TestFixtureWithEventFilter { - protected override void Given() { - _builder.FromStream("a"); - _builder.FromStream("b"); - _builder.AllEvents(); - } - - [Test] - public void can_be_built() { - Assert.IsNotNull(_ef); - } - - [Test] - public void passes_categorized_event_with_correct_stream_id() { - //NOTE: this is possible if you read from $ce-account stream - // this is not the same as reading an account category as you can see at - // least StreamCreate even there - Assert.IsTrue(_ef.Passes(true, "a", "event")); - } - - [Test] - public void does_not_pass_categorized_event_with_incorrect_stream_id() { - Assert.IsFalse(_ef.Passes(true, "incorrect_stream", "event")); - } - - [Test] - public void passes_uncategorized_event_with_correct_stream_id() { - Assert.IsTrue(_ef.Passes(false, "b", "event")); - } - - [Test] - public void does_not_pass_uncategorized_event_with_incorrect_stream_id() { - Assert.IsFalse(_ef.Passes(true, "incorrect_stream", "event")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_position.cs b/src/EventStore.Projections.Core.Tests/Services/event_position.cs deleted file mode 100644 index 5410af1e2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_position.cs +++ /dev/null @@ -1,52 +0,0 @@ -using EventStore.Core.Data; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services { -#pragma warning disable 1718 // allow a == a comparison - [TestFixture] - public class event_position { - private readonly TFPos _aa = new TFPos(10, 9); - private readonly TFPos _b1 = new TFPos(20, 15); - private readonly TFPos _b2 = new TFPos(20, 17); - private readonly TFPos _cc = new TFPos(30, 29); - private readonly TFPos _d1 = new TFPos(40, 35); - private readonly TFPos _d2 = new TFPos(40, 36); - - [Test] - public void equal_equals() { - Assert.IsTrue(_aa.Equals(_aa)); - } - - [Test] - public void equal_operator() { - Assert.IsTrue(_b1 == _b1); - } - - [Test] - public void less_operator() { - Assert.IsTrue(_aa < _b1); - Assert.IsTrue(_b1 < _b2); - } - - [Test] - public void less_or_equal_operator() { - Assert.IsTrue(_aa <= _b1); - Assert.IsTrue(_b1 <= _b2); - Assert.IsTrue(_b2 <= _b2); - } - - [Test] - public void greater_operator() { - Assert.IsTrue(_d1 > _cc); - Assert.IsTrue(_d2 > _d1); - } - - [Test] - public void greater_or_equal_operator() { - Assert.IsTrue(_d1 >= _cc); - Assert.IsTrue(_d2 >= _d1); - Assert.IsTrue(_b2 >= _b2); - } - } -#pragma warning restore 1718 -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/TestFixtureWithEventReaderService.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/TestFixtureWithEventReaderService.cs deleted file mode 100644 index 7f21645dd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/TestFixtureWithEventReaderService.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader { - public class TestFixtureWithEventReaderService : core_projection.TestFixtureWithExistingEvents { - protected EventReaderCoreService _readerService; - - protected override void Given1() { - base.Given1(); - EnableReadAll(); - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, _timeProvider); - } - - [SetUp] - public void Setup() { - _bus.Subscribe(_consumer); - - ICheckpoint writerCheckpoint = new InMemoryCheckpoint(1000); - _readerService = new EventReaderCoreService( - GetInputQueue(), _ioDispatcher, 10, writerCheckpoint, runHeadingReader: GivenHeadingReaderRunning(), - faultOutOfOrderProjections: true); - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(GetInputQueue()); - - - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - _bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - _bus.Subscribe(_readerService); - - GivenAdditionalServices(); - - _bus.Publish(new ReaderCoreServiceMessage.StartReader(Guid.NewGuid())); - - WhenLoop(); - } - - protected virtual bool GivenHeadingReaderRunning() { - return false; - } - - protected virtual void GivenAdditionalServices() { - } - - protected Guid GetReaderId() { - var readerAssignedMessage = - _consumer.HandledMessages.OfType().LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - var reader = readerAssignedMessage.ReaderId; - return reader; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_including_links.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_including_links.cs deleted file mode 100644 index b403eae56..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_including_links.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.all_streams_with_links_event_reader { - namespace when_including_links { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_reading : TestFixtureWithEventReaderService { - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - - protected override bool GivenHeadingReaderRunning() { - return false; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - ExistingEvent("test-stream", "$>", "{}", "{Data: 1}"); - ExistingEvent("test-stream", "$>", "{}", "{Data: 2}"); - ExistingEvent("test-stream", "$>", "{}", "{Data: 3}"); - - ExistingEvent("test-stream", "eventType", "{}", "{Data: 4}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 5}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 6}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 7}"); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - ByStreams = true, - AllStreams = true, - AllEvents = true, - Options = new QuerySourcesDefinitionOptions { - IncludeLinks = true - } - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: true, - runAs: null); - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: true, - stopAfterNEvents: null, - enableContentTypeValidation: true); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromPosition(0, 0, 0); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - } - - [Test] - public void returns_linked_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(7, receivedEvents.Length); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_not_including_links.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_not_including_links.cs deleted file mode 100644 index 1de699fcb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/all_streams_with_links_event_reader/when_not_including_links.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.all_streams_with_links_event_reader { - namespace when_not_including_links { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_reading : TestFixtureWithEventReaderService { - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - - protected override bool GivenHeadingReaderRunning() { - return false; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - ExistingEvent("test-stream", "$>", "{}", "{Data: 1}"); - ExistingEvent("test-stream", "$>", "{}", "{Data: 2}"); - ExistingEvent("test-stream", "$>", "{}", "{Data: 3}"); - - ExistingEvent("test-stream", "eventType", "{}", "{Data: 4}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 5}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 6}"); - ExistingEvent("test-stream", "eventType", "{}", "{Data: 7}"); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - ByStreams = true, - AllStreams = true, - AllEvents = true, - Options = new QuerySourcesDefinitionOptions { - IncludeLinks = false - } - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: true, - runAs: null); - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: true, - stopAfterNEvents: null, - enableContentTypeValidation: true); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromPosition(0, 0, 0); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - } - - [Test] - public void returns_non_linked_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(4, receivedEvents.Length); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/EventByTypeIndexEventReaderTestFixture.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/EventByTypeIndexEventReaderTestFixture.cs deleted file mode 100644 index f4a8f6f80..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/EventByTypeIndexEventReaderTestFixture.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Tests.Services.core_projection; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -public abstract class EventByTypeIndexEventReaderTestFixture : TestFixtureWithExistingEvents { - public Guid CompleteForwardStreamRead(string streamId, Guid corrId, params ResolvedEvent[] events) { - var lastEventNumber = events != null && events.Length > 0 ? events.Last().Event.EventNumber : 0; - var message = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == streamId); - message.Envelope.ReplyWith( - new ClientMessage.ReadStreamEventsForwardCompleted( - corrId == Guid.Empty ? message.CorrelationId : corrId, streamId, 0, 100, ReadStreamResult.Success, - events, null, false, "", lastEventNumber + 1, lastEventNumber, true, 200)); - return message.CorrelationId; - } - - public Guid CompleteForwardAllStreamRead(Guid corrId, params ResolvedEvent[] events) { - var message = _consumer.HandledMessages.OfType().Last(); - message.Envelope.ReplyWith( - new ClientMessage.ReadAllEventsForwardCompleted( - corrId == Guid.Empty ? message.CorrelationId : corrId, ReadAllResult.Success, - "", events, null, false, 100, new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - return message.CorrelationId; - } - - public Guid CompleteBackwardStreamRead(string streamId, Guid corrId, params ResolvedEvent[] events) { - var lastEventNumber = events != null && events.Length > 0 ? events.Last().Event.EventNumber : 0; - var message = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == streamId); - message.Envelope.ReplyWith( - new ClientMessage.ReadStreamEventsBackwardCompleted( - corrId == Guid.Empty ? message.CorrelationId : corrId, streamId, 0, 100, ReadStreamResult.Success, - new ResolvedEvent[] { }, null, false, "", lastEventNumber + 1, lastEventNumber, true, 200)); - return message.CorrelationId; - } - - public Guid TimeoutRead(string streamId, Guid corrId) { - var timeoutMessage = _consumer.HandledMessages - .OfType().Last(x => - ((ProjectionManagementMessage.Internal.ReadTimeout)x.ReplyMessage).StreamId == streamId); - var correlationId = ((ProjectionManagementMessage.Internal.ReadTimeout)timeoutMessage.ReplyMessage) - .CorrelationId; - correlationId = corrId == Guid.Empty ? correlationId : corrId; - timeoutMessage.Envelope.ReplyWith( - new ProjectionManagementMessage.Internal.ReadTimeout(corrId == Guid.Empty ? correlationId : corrId, - streamId)); - return correlationId; - } - - protected static string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_checkpoint_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_checkpoint_read_timeout_occurs.cs deleted file mode 100644 index f4ec281cc..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_checkpoint_read_timeout_occurs.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Common.Utils; -using NUnit.Framework; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.EventByType; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_event_reader { - [Category("test")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_index_based_checkpoint_read_timeout_occurs : EventByTypeIndexEventReaderTestFixture { - private EventByTypeIndexEventReader _eventReader; - private Guid _distributionCorrelationId; - private Guid _checkpointStreamCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - var fromPositions = new Dictionary(); - fromPositions.Add("$et-eventTypeOne", 0); - fromPositions.Add("$et-eventTypeTwo", 0); - _eventReader = new EventByTypeIndexEventReader(_bus, _distributionCorrelationId, - null, new[] {"eventTypeOne", "eventTypeTwo"}, - false, new TFPos(0, 0), - fromPositions, true, - _fakeTimeProvider, - stopOnEof: true); - - _eventReader.Resume(); - - _checkpointStreamCorrelationId = TimeoutRead("$et", Guid.Empty); - - CompleteForwardStreamRead("$et-eventTypeOne", Guid.Empty, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("0@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(50, 50))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("1@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(150, 150))))) - }); - - CompleteForwardStreamRead("$et-eventTypeTwo", Guid.Empty, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("2@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(100, 100))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("3@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(200, 200))))) - }); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_checkpoint_read() { - var checkpointReads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "$et"); - - Assert.AreEqual(checkpointReads.First().CorrelationId, _checkpointStreamCorrelationId); - Assert.AreEqual(1, checkpointReads.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_completes_before_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_completes_before_timeout.cs deleted file mode 100644 index 1633438b3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_completes_before_timeout.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_event_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_index_based_read_completes_before_timeout : EventByTypeIndexEventReaderTestFixture { - private EventByTypeIndexEventReader _eventReader; - private Guid _distributionCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - var fromPositions = new Dictionary(); - fromPositions.Add("$et-eventTypeOne", 0); - fromPositions.Add("$et-eventTypeTwo", 0); - _eventReader = new EventByTypeIndexEventReader(_bus, _distributionCorrelationId, - null, new string[] {"eventTypeOne", "eventTypeTwo"}, - false, new TFPos(-1, -1), - fromPositions, true, - _fakeTimeProvider, - stopOnEof: true); - - _eventReader.Resume(); - - var correlationId = CompleteForwardStreamRead("$et-eventTypeOne", Guid.Empty, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("0@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(50, 50))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("1@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(150, 150))))) - }); - - TimeoutRead("$et-eventTypeOne", correlationId); - - correlationId = CompleteForwardStreamRead("$et-eventTypeTwo", Guid.Empty, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("2@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(100, 100))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("3@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(200, 200))))) - }); - - TimeoutRead("$et-eventTypeTwo", correlationId); - } - - [Test] - public void should_deliver_events() { - Assert.AreEqual(3, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_timeout_occurs.cs deleted file mode 100644 index 5e24ede9e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_index_based_read_timeout_occurs.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_event_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_index_based_read_timeout_occurs : EventByTypeIndexEventReaderTestFixture { - private EventByTypeIndexEventReader _eventReader; - private Guid _distributionCorrelationId; - private Guid _eventTypeOneStreamReadCorrelationId; - private Guid _eventTypeTwoStreamReadCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - var fromPositions = new Dictionary(); - fromPositions.Add("$et-eventTypeOne", 0); - fromPositions.Add("$et-eventTypeTwo", 0); - _eventReader = new EventByTypeIndexEventReader(_bus, _distributionCorrelationId, - null, new string[] {"eventTypeOne", "eventTypeTwo"}, - false, new TFPos(0, 0), - fromPositions, true, - _fakeTimeProvider, - stopOnEof: true); - - _eventReader.Resume(); - - _eventTypeOneStreamReadCorrelationId = TimeoutRead("$et-eventTypeOne", Guid.Empty); - - CompleteForwardStreamRead("$et-eventTypeOne", _eventTypeOneStreamReadCorrelationId, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("0@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(50, 50))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "$et-eventTypeOne", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("1@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(150, 150))))) - }); - - _eventTypeTwoStreamReadCorrelationId = TimeoutRead("$et-eventTypeTwo", Guid.Empty); - - CompleteForwardStreamRead("$et-eventTypeTwo", _eventTypeTwoStreamReadCorrelationId, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "$>", Helper.UTF8NoBom.GetBytes("2@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(100, 100))))), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "$et-eventTypeTwo", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "$>", Helper.UTF8NoBom.GetBytes("3@test-stream"), - Helper.UTF8NoBom.GetBytes(TFPosToMetadata(new TFPos(200, 200))))) - }); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_read_for_the_timed_out_reads() { - var eventTypeOneStreamReads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "$et-eventTypeOne"); - - Assert.AreEqual(eventTypeOneStreamReads.First().CorrelationId, _eventTypeOneStreamReadCorrelationId); - Assert.AreEqual(1, eventTypeOneStreamReads.Skip(1).Count()); - - var eventTypeTwoStreamReads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "$et-eventTypeTwo"); - - Assert.AreEqual(eventTypeTwoStreamReads.First().CorrelationId, _eventTypeTwoStreamReadCorrelationId); - Assert.AreEqual(1, eventTypeTwoStreamReads.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_completes_before_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_completes_before_timeout.cs deleted file mode 100644 index f6cddafe8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_completes_before_timeout.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_event_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_tf_based_read_completes_before_timeout : EventByTypeIndexEventReaderTestFixture { - private EventByTypeIndexEventReader _eventReader; - private Guid _distributionCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - var fromPositions = new Dictionary(); - fromPositions.Add("$et-eventTypeOne", 0); - fromPositions.Add("$et-eventTypeTwo", 0); - _eventReader = new EventByTypeIndexEventReader(_bus, _distributionCorrelationId, - null, new string[] {"eventTypeOne", "eventTypeTwo"}, - false, new TFPos(0, 0), - fromPositions, true, - _fakeTimeProvider, - stopOnEof: true); - - _eventReader.Resume(); - - CompleteForwardStreamRead("$et-eventTypeOne", Guid.Empty); - CompleteForwardStreamRead("$et-eventTypeTwo", Guid.Empty); - CompleteBackwardStreamRead("$et", Guid.Empty); - - var correlationId = CompleteForwardAllStreamRead(Guid.Empty, new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "test_stream", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "eventTypeOne", new byte[] {1}, new byte[] {2}), 100), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "test_stream", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "eventTypeTwo", new byte[] {1}, new byte[] {2}), 200), - }); - - TimeoutRead("$all", correlationId); - } - - [Test] - public void should_deliver_events() { - Assert.AreEqual(2, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_timeout_occurs.cs deleted file mode 100644 index ce2858aed..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_event_reader/when_tf_based_read_timeout_occurs.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_event_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_tf_based_read_timeout_occurs : EventByTypeIndexEventReaderTestFixture { - private EventByTypeIndexEventReader _eventReader; - private Guid _distributionCorrelationId; - private Guid _readAllEventsForwardCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - var fromPositions = new Dictionary(); - fromPositions.Add("$et-eventTypeOne", 0); - fromPositions.Add("$et-eventTypeTwo", 0); - _eventReader = new EventByTypeIndexEventReader(_bus, _distributionCorrelationId, - null, new string[] {"eventTypeOne", "eventTypeTwo"}, - false, new TFPos(0, 0), - fromPositions, true, - _fakeTimeProvider, - stopOnEof: true); - - _eventReader.Resume(); - - CompleteForwardStreamRead("$et-eventTypeOne", Guid.Empty); - CompleteForwardStreamRead("$et-eventTypeTwo", Guid.Empty); - CompleteBackwardStreamRead("$et", Guid.Empty); - - _readAllEventsForwardCorrelationId = TimeoutRead("$all", Guid.Empty); - - CompleteForwardAllStreamRead(_readAllEventsForwardCorrelationId, new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "test_stream", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "eventTypeOne", new byte[] {1}, new byte[] {2}), 100), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "test_stream", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "eventTypeTwo", new byte[] {1}, new byte[] {2}), 200), - }); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_read_for_the_timed_out_reads() { - var readAllEventsForwardMessages = _consumer.HandledMessages.OfType(); - - Assert.AreEqual(readAllEventsForwardMessages.First().CorrelationId, _readAllEventsForwardCorrelationId); - Assert.AreEqual(1, readAllEventsForwardMessages.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/index_checkpoint.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/index_checkpoint.cs deleted file mode 100644 index d959658b5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/index_checkpoint.cs +++ /dev/null @@ -1,170 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_reader.catching_up { - namespace index_checkpoint { - abstract class with_some_indexed_events : TestFixtureWithEventReaderService { - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - protected TFPos _tfPos1; - protected TFPos _tfPos2; - protected TFPos _tfPos3; - - protected override bool GivenHeadingReaderRunning() { - // make sure it does not produce read-all-forward messages - return false; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - _tfPos1 = ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - _tfPos2 = ExistingEvent("test-stream", "type2", "{}", "{Data: 2}"); - - GivenInitialIndexState(); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - AllStreams = true, - Events = new[] {"type1", "type2"}, - Options = new QuerySourcesDefinitionOptions { } - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: false, - runAs: null); - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: false, - stopAfterNEvents: null, - enableContentTypeValidation: true); - } - - protected abstract void GivenInitialIndexState(); - - protected string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - [Test] - public void returns_events_in_original_order() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.That( - (from e in receivedEvents - orderby e.Data.EventSequenceNumber - select e.Data.EventSequenceNumber) - .SequenceEqual(from e in receivedEvents - select e.Data.EventSequenceNumber), - "Incorrect event order received"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_index_checkpoint_is_written_while_idle : with_some_indexed_events { - protected override void GivenInitialIndexState() { - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - - - // NOTE: do not configure $et and $et-type2 to delay ReadCompleted on this stream - // ExistingEvent("$et-type2", "$>", TFPosToMetadata(_tfPos2), "1@test-stream"); - // NoStream("$et"); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(0, -1), new Dictionary {{"type1", -1}, {"type2", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - //DisableTimer(); - yield return CreateWriteEvent("test-stream", "type1", "{Data: 3}", "{}"); - _tfPos3 = _all.Last(v => v.Value.EventStreamId == "test-stream").Key; - - yield return - CreateWriteEvent("$et-type1", "$>", "2@test-stream", TFPosToMetadata(_tfPos3), isJson: false); - - yield return CreateWriteEvent("$et-type2", "$>", "1@test-stream", TFPosToMetadata(_tfPos2)); - - yield return CreateWriteEvent("$et", ProjectionEventTypes.PartitionCheckpoint, TFPosToMetadata(_tfPos2), - TFPosToMetadata(_tfPos2)); - - // we are still in index-based reading mode - Assert.IsEmpty(_consumer.HandledMessages.OfType()); - - // simulate late response to the read request in this particular order - yield return - _consumer.HandledMessages.OfType() - .Single(v => v.EventStreamId == "$et"); - - /*yield return - _consumer.HandledMessages.OfType() - .Single(v => v.EventStreamId == "$et-type2"); - EnableTimer();*/ - } - - [Test] - public void returns_all_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(3, receivedEvents.Length); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_the_index_checkpoint_is_read_last : with_some_indexed_events { - protected override void GivenInitialIndexState() { - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - ExistingEvent("$et-type2", "$>", TFPosToMetadata(_tfPos2), "1@test-stream"); - - - // NOTE: do not configure $et to delay ReadCompleted on this stream - // NoStream("$et"); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(0, -1), new Dictionary {{"type1", -1}, {"type2", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - } - - [Test] - public void stays_in_index_based_reading_mode() { - Assert.IsEmpty(_consumer.HandledMessages.OfType()); - } - - [Test] - public void returns_just_first_event_which_is_safe_to_return() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - //NOTE: - // the first event is safe to read as we know the next event in another stream - // the second event is not safe as there is no more events in the first stream and checkpoint is not yet available - Assert.AreEqual(1, receivedEvents.Length); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_one_event_type_has_been_never_emitted.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_one_event_type_has_been_never_emitted.cs deleted file mode 100644 index e9f4e1139..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_one_event_type_has_been_never_emitted.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_reader.catching_up { - namespace when_one_event_type_has_been_never_emitted { - abstract class with_one_event_type_has_been_never_emitted : TestFixtureWithEventReaderService { - protected const int TailLength = 10; - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - protected TFPos _tfPos1; - protected TFPos _tfPos2; - protected TFPos _tfPos3; - protected TFPos[] _tfPos; - - protected override bool GivenHeadingReaderRunning() { - return true; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - _tfPos = new TFPos[TailLength]; - _tfPos1 = ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - _tfPos2 = ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - _tfPos3 = ExistingEvent("test-stream", "type1", "{}", "{Data: 3}"); - - for (var i = 0; i < TailLength; i++) { - _tfPos[i] = ExistingEvent("test-stream", "type1", "{}", "{Data: " + i + "}"); - } - - GivenInitialIndexState(); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - AllStreams = true, - Events = new[] {"type1", "type2"}, - Options = new QuerySourcesDefinitionOptions { } - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: false, - runAs: null); - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: false, - stopAfterNEvents: null, - enableContentTypeValidation: true); - } - - protected abstract void GivenInitialIndexState(); - - protected string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - [Test] - public void returns_all_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(TailLength + 3, receivedEvents.Length); - } - - [Test] - public void returns_events_in_original_order() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.That( - (from e in receivedEvents - orderby e.Data.EventSequenceNumber - select e.Data.EventSequenceNumber) - .SequenceEqual(from e in receivedEvents - select e.Data.EventSequenceNumber), - "Incorrect event order received"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_index_checkpoint_multiple_events_behind : with_one_event_type_has_been_never_emitted { - protected override void GivenInitialIndexState() { - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos2), "1@test-stream"); - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos3), "2@test-stream"); - - for (var i = 0; i < TailLength; i++) - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos[i]), (i + 3) + "@test-stream"); - - NoStream("$et-type2"); - ExistingEvent("$et", ProjectionEventTypes.PartitionCheckpoint, TFPosToMetadata(_tfPos3), - TFPosToMetadata(_tfPos3)); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(0, -1), new Dictionary {{"type1", -1}, {"type2", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_reordering_happens_in_event_by_type_index.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_reordering_happens_in_event_by_type_index.cs deleted file mode 100644 index 676308aa8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_by_type_index_reader/catching_up/when_reordering_happens_in_event_by_type_index.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_by_type_index_reader.catching_up { - namespace when_reordering_happens_in_event_by_type_index { - abstract class ReadingReorderedEventsInTheIndexTestFixture : TestFixtureWithEventReaderService { - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - protected TFPos _tfPos1; - protected TFPos _tfPos2; - protected TFPos _tfPos3; - - protected override bool GivenHeadingReaderRunning() { - return true; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - - _tfPos1 = ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - _tfPos2 = ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - _tfPos3 = ExistingEvent("test-stream", "type2", "{}", "{Data: 3}"); - - GivenInitialIndexState(); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - AllStreams = true, - Events = new[] {"type1", "type2"}, - Options = new QuerySourcesDefinitionOptions { } - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: false, - runAs: null); - - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: false, - stopAfterNEvents: null, - enableContentTypeValidation: true); - } - - protected abstract void GivenInitialIndexState(); - - protected string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - [Test] - public void returns_all_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(3, receivedEvents.Length); - } - - [Test] - public void returns_events_in_original_order() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.That( - new long[] {0, 1, 2}.SequenceEqual(from e in receivedEvents - select e.Data.EventSequenceNumber), - "Incorrect event order received"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_starting_with_empty_index : ReadingReorderedEventsInTheIndexTestFixture { - protected override void GivenInitialIndexState() { - NoStream("$et-type1"); - NoStream("$et-type2"); - NoStream("$et"); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(0, -1), new Dictionary {{"type1", -1}, {"type2", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - - // simulate index-by-type system projection - yield return - new ClientMessage.WriteEvents( - Guid.NewGuid(), Guid.NewGuid(), new NoopEnvelope(), false, "$et-type1", ExpectedVersion.Any, - new Event(Guid.NewGuid(), "$>", false, "0@test-stream", TFPosToMetadata(_tfPos1)), user: null); - - // simulate index-by-type system projection (the second event write is delayed - awaiting for ACK from the previous write) - yield return - new ClientMessage.WriteEvents( - Guid.NewGuid(), Guid.NewGuid(), new NoopEnvelope(), false, "$et-type2", ExpectedVersion.Any, - new Event(Guid.NewGuid(), "$>", false, "2@test-stream", TFPosToMetadata(_tfPos3)), user: null); - - // simulate index-by-type system projection (ACK received - writing the next event) - yield return - new ClientMessage.WriteEvents( - Guid.NewGuid(), Guid.NewGuid(), new NoopEnvelope(), false, "$et-type1", ExpectedVersion.Any, - new Event(Guid.NewGuid(), "$>", false, "1@test-stream", TFPosToMetadata(_tfPos2)), user: null); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_starting_with_partially_built_index : ReadingReorderedEventsInTheIndexTestFixture { - protected override void GivenInitialIndexState() { - // simulate index-by-type system projection - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - - // simulate index-by-type system projection (the second event write is delayed - awaiting for ACK from the previous write) - ExistingEvent("$et-type2", "$>", TFPosToMetadata(_tfPos3), "2@test-stream"); - - NoStream("$et"); - } - - protected override IEnumerable When() { - var fromZeroPosition = CheckpointTag.FromEventTypeIndexPositions( - 0, new TFPos(0, -1), new Dictionary {{"type1", -1}, {"type2", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - - // simulate index-by-type system projection (ACK received - writing the next event) - yield return - new ClientMessage.WriteEvents( - Guid.NewGuid(), Guid.NewGuid(), new NoopEnvelope(), false, "$et-type1", ExpectedVersion.Any, - new Event(Guid.NewGuid(), "$>", false, "1@test-stream", TFPosToMetadata(_tfPos2)), user: null); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_reader_core_service/when_handling_subscribe_requests.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/event_reader_core_service/when_handling_subscribe_requests.cs deleted file mode 100644 index cade0936d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/event_reader_core_service/when_handling_subscribe_requests.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.event_reader_core_service; -[TestFixture(typeof(LogFormat.V2), typeof(string))] -[TestFixture(typeof(LogFormat.V3), typeof(uint))] -public class when_handling_subscribe_requests :TestFixtureWithEventReaderService { - private readonly ReaderSubscriptionOptions _defaultOptions = new (1000, 10, 1000, false, null, false); - [Test] - public void should_publish_subscription_failed_if_the_reader_is_not_running() { - EventReaderSubscriptionMessage.Failed failedMessage = null; - var subscriptionId = Guid.NewGuid(); - _readerService.Handle(new ReaderCoreServiceMessage.StopReader(Guid.Empty)); - _subscriptionDispatcher.PublishSubscribe( - new ReaderSubscriptionManagement.Subscribe(subscriptionId, CheckpointTag.Empty, - new FakeReaderStrategy(), _defaultOptions), - new AdHocHandlerStruct(m => failedMessage = m, null), - scheduleTimeout: false); - _queue.Process(); - - Assert.NotNull(failedMessage, $"Expected {nameof(ReaderSubscriptionDispatcher)} to publish a {nameof(EventReaderSubscriptionMessage.Failed)} message"); - Assert.AreEqual(subscriptionId, failedMessage.SubscriptionId); - Assert.AreEqual($"{nameof(EventReaderCoreService)} is stopped", failedMessage.Reason); - } - - [Test] - public void should_publish_subscription_failed_if_creating_the_reader_fails() { - EventReaderSubscriptionMessage.Failed failedMessage = null; - var subscriptionId = Guid.NewGuid(); - _subscriptionDispatcher.PublishSubscribe( - new ReaderSubscriptionManagement.Subscribe(subscriptionId, CheckpointTag.Empty, - FakeReaderStrategyThatThrows.ThrowOnCreateReaderSubscription(), _defaultOptions), - new AdHocHandlerStruct(m => failedMessage = m, null), - scheduleTimeout: false); - _queue.Process(); - - Assert.NotNull(failedMessage, $"Expected {nameof(ReaderSubscriptionDispatcher)} to publish a {nameof(EventReaderSubscriptionMessage.Failed)} message"); - Assert.AreEqual(subscriptionId, failedMessage.SubscriptionId); - Assert.True(failedMessage.Reason.Contains(nameof(FakeReaderStrategyThatThrows))); - } - - [Test] - public void should_publish_subscription_failed_if_creating_the_paused_event_reader_fails() { - EventReaderSubscriptionMessage.Failed failedMessage = null; - var subscriptionId = Guid.NewGuid(); - _subscriptionDispatcher.PublishSubscribe( - new ReaderSubscriptionManagement.Subscribe(subscriptionId, CheckpointTag.Empty, - FakeReaderStrategyThatThrows.ThrowOnCreatePausedReader(), _defaultOptions), - new AdHocHandlerStruct(m => failedMessage = m, null), - scheduleTimeout: false); - _queue.Process(); - - Assert.NotNull(failedMessage, $"Expected {nameof(ReaderSubscriptionDispatcher)} to publish a {nameof(EventReaderSubscriptionMessage.Failed)} message"); - Assert.AreEqual(subscriptionId, failedMessage.SubscriptionId); - Assert.True(failedMessage.Reason.Contains(nameof(FakeReaderSubscriptionThatThrows))); - } - - private class FakeReaderStrategyThatThrows :IReaderStrategy { - private readonly bool _throwOnCreateSubscription; - private readonly bool _throwOnCreatePausedReader; - - private FakeReaderStrategyThatThrows(bool throwOnCreateSubscription, bool throwOnCreatePausedReader) { - _throwOnCreateSubscription = throwOnCreateSubscription; - _throwOnCreatePausedReader = throwOnCreatePausedReader; - } - - public static FakeReaderStrategyThatThrows ThrowOnCreateReaderSubscription() => new(true, false); - public static FakeReaderStrategyThatThrows ThrowOnCreatePausedReader() => new(false, true); - - public bool IsReadingOrderRepeatable { get; } - public EventFilter EventFilter { get; } - public PositionTagger PositionTagger { get; } - - public IReaderSubscription CreateReaderSubscription(IPublisher publisher, CheckpointTag fromCheckpointTag, Guid subscriptionId, - ReaderSubscriptionOptions readerSubscriptionOptions) { - if (_throwOnCreateSubscription) - throw new ArgumentException(nameof(FakeReaderStrategyThatThrows)); - if (_throwOnCreatePausedReader) - return new FakeReaderSubscriptionThatThrows(); - return new FakeReaderSubscription(); - } - - public IEventReader CreatePausedEventReader(Guid eventReaderId, IPublisher publisher, IODispatcher ioDispatcher, - CheckpointTag checkpointTag, bool stopOnEof, int? stopAfterNEvents) { - throw new NotImplementedException(); - } - } - - private class FakeReaderSubscriptionThatThrows : IReaderSubscription { - public void Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderStarting message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderEof message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionEof message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderNotAuthorized message) { - throw new NotImplementedException(); - } - - public void Handle(ReaderSubscriptionMessage.ReportProgress message) { - throw new NotImplementedException(); - } - - public string Tag { get; } - public Guid SubscriptionId { get; } - public IEventReader CreatePausedEventReader(IPublisher publisher, IODispatcher ioDispatcher, Guid forkedEventReaderId) { - throw new ArgumentException(nameof(FakeReaderSubscriptionThatThrows)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/FakeReaderSubscription.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/FakeReaderSubscription.cs deleted file mode 100644 index 00cf0e31c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/FakeReaderSubscription.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - public class FakeReaderSubscription : IReaderSubscription { - private readonly IPublisher _publisher; - private readonly Guid _subscriptionId; - - public FakeReaderSubscription() { - _subscriptionId = Guid.NewGuid(); - } - - public FakeReaderSubscription(IPublisher publisher, Guid subscriptionId) { - _publisher = publisher; - _subscriptionId = subscriptionId; - } - private readonly List _receivedEvents = - new List(); - - private readonly List _receivedIdleNotifications = - new List(); - - private readonly List _receivedStartingNotifications = - new List(); - - private readonly List _receivedEofNotifications = - new List(); - - private readonly List _receivedPartitionEofNotifications = - new List(); - - private readonly List - _receivedPartitionDeletedNotifications = - new List(); - - private readonly List _receivedNotAuthorizedNotifications = - new List(); - - public void Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - if (message.Data != null && message.Data.PositionStreamId == "throws") { - throw new Exception("Bad Handler"); - } - - _receivedEvents.Add(message); - _publisher?.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived - .FromCommittedEventDistributed(message, - CheckpointTag.Empty, "", _subscriptionId, 0)); - } - - public List ReceivedEvents { - get { return _receivedEvents; } - } - - public List ReceivedIdleNotifications { - get { return _receivedIdleNotifications; } - } - - public List ReceivedStartingNotifications { - get { return _receivedStartingNotifications; } - } - - public List ReceivedEofNotifications { - get { return _receivedEofNotifications; } - } - - public List ReceivedPartitionEofNotifications { - get { return _receivedPartitionEofNotifications; } - } - - public List ReceivedPartitionDeletedNotifications { - get { return _receivedPartitionDeletedNotifications; } - } - - public List ReceivedNotAuthorizedNotifications { - get { return _receivedNotAuthorizedNotifications; } - } - - public void Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - _receivedIdleNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderStarting message) { - _receivedStartingNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderEof message) { - _receivedEofNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionEof message) { - _receivedPartitionEofNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - _receivedPartitionDeletedNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderNotAuthorized message) { - _receivedNotAuthorizedNotifications.Add(message); - } - - public void Handle(ReaderSubscriptionMessage.Faulted message) { - //ignore - } - - public void Handle(ReaderSubscriptionMessage.ReportProgress message) { - //ignore - } - - public string Tag { - get { return "FakeReaderSubscription"; } - } - - public Guid SubscriptionId { - get { return Guid.Empty; } - } - - private FakeEventReader _eventReader; - - public FakeEventReader EventReader { - get { return _eventReader; } - } - - public IEventReader CreatePausedEventReader( - IPublisher publisher, IODispatcher ioDispatcher, Guid forkedEventReaderId) { - _eventReader = new FakeEventReader(forkedEventReaderId); - return _eventReader; - } - } - - public class FakeEventReader : IEventReader { - public Guid EventReaderId { get; private set; } - - public FakeEventReader(Guid eventReaderId) { - EventReaderId = eventReaderId; - } - - public void Dispose() { - } - - public void Pause() { - } - - public void Resume() { - } - - public void SendNotAuthorized() { - } - } - - public class FakeReaderStrategy : IReaderStrategy { - public EventFilter EventFilter { get; set; } - public bool IsReadingOrderRepeatable { get; set; } - public PositionTagger PositionTagger { get; set; } - private FakeReaderSubscription _subscription; - - public Guid EventReaderId { - get { return _subscription.EventReader.EventReaderId; } - } - - public IEventReader CreatePausedEventReader(Guid eventReaderId, IPublisher publisher, IODispatcher ioDispatcher, - CheckpointTag checkpointTag, bool stopOnEof, int? stopAfterNEvents) { - throw new NotImplementedException(); - } - - public IReaderSubscription CreateReaderSubscription(IPublisher publisher, CheckpointTag fromCheckpointTag, - Guid subscriptionId, ReaderSubscriptionOptions readerSubscriptionOptions) { - _subscription = new FakeReaderSubscription(publisher, subscriptionId); - return _subscription; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_heading_event_reader_has_been_created.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_heading_event_reader_has_been_created.cs deleted file mode 100644 index d131f20e5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_heading_event_reader_has_been_created.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_heading_event_reader_has_been_created : TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void it_has_been_created() { - Assert.IsNull(_exception, ((object)_exception ?? "").ToString()); - } - - [Test] - public void stop_throws_invalid_operation_exception() { - Assert.Throws(() => { _point.Stop(); }); - } - - [Test] - public void try_subscribe_throws_invalid_operation_exception() { - Assert.Throws(() => { - _point.TrySubscribe(Guid.NewGuid(), new FakeReaderSubscription(), 10); - }); - } - - [Test] - public void usubscribe_throws_invalid_operation_exception() { - Assert.Throws(() => { _point.Unsubscribe(Guid.NewGuid()); }); - } - - [Test] - public void handle_throws_invalid_operation_exception() { - Assert.Throws(() => { - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), "type", false, - new byte[0], new byte[0])); - }); - } - - [Test] - public void can_be_started() { - var eventReaderId = Guid.NewGuid(); - _point.Start( - eventReaderId, - new TransactionFileEventReader(_bus, eventReaderId, null, new TFPos(0, -1), new RealTimeProvider())); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_starting_a_heading_event_reader.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_starting_a_heading_event_reader.cs deleted file mode 100644 index a13aa3d66..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_starting_a_heading_event_reader.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_starting_a_heading_event_reader : TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - private Guid _distibutionPointCorrelationId; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - - Assume.That(_exception == null); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - } - - [Test] - public void transaction_file_reader_publishes_read_events_from_tf() { - Assert.IsTrue(_consumer.HandledMessages.OfType().Any()); - } - - [Test] - public void can_handle_events() { - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - [Test] - public void can_be_stopped() { - _point.Stop(); - } - - - [Test] - public void cannot_suibscribe_even_from_reader_zero_position() { - var subscribed = _point.TrySubscribe(Guid.NewGuid(), new FakeReaderSubscription(), -1); - Assert.AreEqual(false, subscribed); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_handles_an_event.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_handles_an_event.cs deleted file mode 100644 index 0c32e4563..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_handles_an_event.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_handles_an_event : TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - private Guid _distibutionPointCorrelationId; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - - Assume.That(_exception == null); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - [Test] - public void can_handle_next_event() { - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 12, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - //TODO: SW1 -/* - [Test] - public void can_handle_special_update_position_event() - { - _point.Handle( - new ProjectionCoreServiceMessage.CommittedEventDistributed( - _distibutionPointCorrelationId, new EventPosition(long.MinValue, 30), "stream", 12, false, null)); - } -*/ - - [Test] - public void cannot_handle_previous_event() { - Assert.Throws(() => { - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(5, 0), "stream", 8, false, Guid.NewGuid(), "type", - false, new byte[0], new byte[0])); - }); - } - - [Test] - public void a_projection_can_be_subscribed_after_event_position() { - var subscribed = _point.TrySubscribe(Guid.NewGuid(), new FakeReaderSubscription(), 30); - Assert.AreEqual(true, subscribed); - } - - [Test] - public void a_projection_cannot_be_subscribed_at_earlier_position() { - var subscribed = _point.TrySubscribe(Guid.NewGuid(), new FakeReaderSubscription(), 10); - Assert.AreEqual(false, subscribed); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_subscribes_a_projection.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_subscribes_a_projection.cs deleted file mode 100644 index 1adfab489..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_subscribes_a_projection.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_subscribes_a_projection : TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - private Guid _distibutionPointCorrelationId; - private FakeReaderSubscription _subscription; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - - Assume.That(_exception == null); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _subscription = new FakeReaderSubscription(); - _projectionSubscriptionId = Guid.NewGuid(); - _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - } - - - [Test] - public void projection_receives_at_least_one_cached_event_before_the_subscription_position() { - Assert.AreEqual(true, _subscription.ReceivedEvents.Any(v => v.Data.Position.PreparePosition <= 30)); - } - - [Test] - public void projection_receives_all_the_previously_handled_events_after_the_subscription_position() { - Assert.AreEqual(true, _subscription.ReceivedEvents.Any(v => v.Data.Position.PreparePosition == 30)); - } - - [Test] - public void it_can_be_unsubscribed() { - _point.Unsubscribe(_projectionSubscriptionId); - } - - [Test] - public void no_other_projection_can_subscribe_with_the_same_projection_id() { - Assert.Throws(() => { - _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_unsubscribes_a_projection.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_unsubscribes_a_projection.cs deleted file mode 100644 index 3c0aad195..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_unsubscribes_a_projection.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_unsubscribes_a_projection : TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - private Guid _distibutionPointCorrelationId; - private FakeReaderSubscription _subscription; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - - Assume.That(_exception == null); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _subscription = new FakeReaderSubscription(); - _projectionSubscriptionId = Guid.NewGuid(); - var subscribed = _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - Assert.IsTrue(subscribed); // ensure we really unsubscribing.. even if it is tested elsewhere - _point.Unsubscribe(_projectionSubscriptionId); - } - - - [Test] - public void projection_does_not_receive_any_events_after_unsubscribing() { - var count = _subscription.ReceivedEvents.Count; - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(60, 50), "stream", 12, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - Assert.AreEqual(count, _subscription.ReceivedEvents.Count); - } - - [Test] - public void it_cannot_be_unsubscribed_twice() { - Assert.Throws(() => { _point.Unsubscribe(_projectionSubscriptionId); }); - } - - [Test] - public void projection_can_resubscribe_with() { - var subscribed = _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - Assert.AreEqual(true, subscribed); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_cached_event_and_throws.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_cached_event_and_throws.cs deleted file mode 100644 index 8a5c99933..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_cached_event_and_throws.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_with_a_subscribed_projection_handles_a_cached_event_and_throws : - TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Guid _distibutionPointCorrelationId; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - _point = new HeadingEventReader(10, _bus); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "throws", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "throws", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _projectionSubscriptionId = Guid.NewGuid(); - _point.TrySubscribe(_projectionSubscriptionId, new FakeReaderSubscription(), 30); - } - - - [Test] - public void projection_is_notified_that_it_is_to_fault() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_live_event_and_throws.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_live_event_and_throws.cs deleted file mode 100644 index 16bcde23c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_a_live_event_and_throws.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_with_a_subscribed_projection_handles_a_live_event_and_throws : - TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Guid _distibutionPointCorrelationId; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - _point = new HeadingEventReader(10, _bus); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _projectionSubscriptionId = Guid.NewGuid(); - _point.TrySubscribe(_projectionSubscriptionId, new FakeReaderSubscription(), 30); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(60, 50), "throws", 12, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - [Test] - public void projection_is_notified_that_it_is_to_fault() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_event.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_event.cs deleted file mode 100644 index f2f633b6a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_event.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_with_a_subscribed_projection_handles_an_event : - TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - private Exception _exception; - private Guid _distibutionPointCorrelationId; - private FakeReaderSubscription _subscription; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - _exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception ex) { - _exception = ex; - } - - Assume.That(_exception == null); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - _subscription = new FakeReaderSubscription(); - _projectionSubscriptionId = Guid.NewGuid(); - _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(60, 50), "stream", 12, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0])); - } - - - [Test] - public void projection_receives_events_after_the_subscription_point() { - Assert.AreEqual(50, _subscription.ReceivedEvents.Last().Data.Position.PreparePosition); - } - - [Test] - public void it_can_be_unsubscribed() { - _point.Unsubscribe(_projectionSubscriptionId); - } - - [Test] - public void no_other_projection_can_subscribe_with_the_same_projection_id() { - Assert.Throws(() => { - _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_idle_notification.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_idle_notification.cs deleted file mode 100644 index c55fc3cb2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/heading_event_reader/when_the_heading_event_reader_with_a_subscribed_projection_handles_an_idle_notification.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection; -using NUnit.Framework; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader { - [TestFixture] - public class when_the_heading_event_reader_with_a_subscribed_projection_handles_an_idle_notification : - TestFixtureWithReadWriteDispatchers { - private HeadingEventReader _point; - - //private Exception _exception; - private Guid _distibutionPointCorrelationId; - private FakeReaderSubscription _subscription; - private Guid _projectionSubscriptionId; - - [SetUp] - public void setup() { - //_exception = null; - try { - _point = new HeadingEventReader(10, _bus); - } catch (Exception) { - //_exception = ex; - } - - _distibutionPointCorrelationId = Guid.NewGuid(); - _point.Start( - _distibutionPointCorrelationId, - new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(0, -1), - new RealTimeProvider())); - DateTime timestamp = DateTime.UtcNow; - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(20, 10), "stream", 10, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0], timestamp)); - _point.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _distibutionPointCorrelationId, new TFPos(40, 30), "stream", 11, false, Guid.NewGuid(), - "type", false, new byte[0], new byte[0], timestamp.AddMilliseconds(1))); - _subscription = new FakeReaderSubscription(); - _projectionSubscriptionId = Guid.NewGuid(); - _point.TrySubscribe(_projectionSubscriptionId, _subscription, 30); - _point.Handle( - new ReaderSubscriptionMessage.EventReaderIdle( - _distibutionPointCorrelationId, timestamp.AddMilliseconds(1100))); - } - - - [Test] - public void projection_receives_events_after_the_subscription_point() { - Assert.AreEqual(1, _subscription.ReceivedIdleNotifications.Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/reordering.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/reordering.cs deleted file mode 100644 index b2fc5fd79..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/reordering.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - namespace reordering { - abstract class with_multi_stream_reader : TestFixtureWithEventReaderService { - protected Guid _subscriptionId; - private QuerySourcesDefinition _sourceDefinition; - protected IReaderStrategy _readerStrategy; - protected ReaderSubscriptionOptions _readerSubscriptionOptions; - - protected override bool GivenHeadingReaderRunning() { - return true; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - ExistingEvent("stream-a", "type1", "{}", "{\"Data\": 1}"); - ExistingEvent("stream-b", "type1", "{}", "{\"Data\": 2}"); - - GivenOtherEvents(); - - _subscriptionId = Guid.NewGuid(); - _sourceDefinition = new QuerySourcesDefinition { - Streams = new[] {"stream-a", "stream-b"}, - AllEvents = true, - Options = new QuerySourcesDefinitionOptions {ReorderEvents = true, ProcessingLag = 100} - }; - _readerStrategy = ReaderStrategy.Create( - "test", - 0, - _sourceDefinition, - _timeProvider, - stopOnEof: false, - runAs: null); - - _readerSubscriptionOptions = new ReaderSubscriptionOptions( - checkpointUnhandledBytesThreshold: 10000, checkpointProcessedEventsThreshold: 100, - checkpointAfterMs: 10000, stopOnEof: false, - stopAfterNEvents: null, - enableContentTypeValidation: false); - } - - protected abstract void GivenOtherEvents(); - - protected string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - [Test] - public void returns_all_events() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.AreEqual(5, receivedEvents.Length); - } - - [Test] - public void returns_events_in_original_order() { - var receivedEvents = - _consumer.HandledMessages.OfType().ToArray(); - - Assert.That( - (from e in receivedEvents - orderby e.Data.Position.PreparePosition - select e.Data.Position.PreparePosition).SequenceEqual( - from e in receivedEvents - select e.Data.Position.PreparePosition), "Incorrect event order received"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_event_commit_is_delayed : with_multi_stream_reader { - protected override void GivenOtherEvents() { - } - - protected override IEnumerable When() { - var fromZeroPosition = - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream-a", -1}, {"stream-b", -1}}); - yield return - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, fromZeroPosition, _readerStrategy, _readerSubscriptionOptions); - - - var correlationId = Guid.NewGuid(); - yield return - new ClientMessage.TransactionStart( - Guid.NewGuid(), correlationId, GetInputQueue(), true, "stream-a", 0, null); - - var transactionId = - _consumer.HandledMessages.OfType() - .Single(m => m.CorrelationId == correlationId) - .TransactionId; - - correlationId = Guid.NewGuid(); - yield return - new ClientMessage.TransactionWrite( - Guid.NewGuid(), correlationId, GetInputQueue(), true, transactionId, - new[] {new Event(Guid.NewGuid(), "type1", true, "{Data: 3, Transacted=true}", "{}")}, null); - - correlationId = Guid.NewGuid(); - yield return - new ClientMessage.WriteEvents( - Guid.NewGuid(), correlationId, GetInputQueue(), true, "stream-b", 0, - new[] {new Event(Guid.NewGuid(), "type1", true, "{Data: 4}", "{}")}, null); - - correlationId = Guid.NewGuid(); - yield return - new ClientMessage.TransactionWrite( - Guid.NewGuid(), correlationId, GetInputQueue(), true, transactionId, - new[] {new Event(Guid.NewGuid(), "type1", true, "{Data: 5, Transacted=true}", "{}")}, null); - - correlationId = Guid.NewGuid(); - yield return - new ClientMessage.TransactionCommit( - Guid.NewGuid(), correlationId, GetInputQueue(), true, transactionId, null); - - yield return Yield; - - _timeProvider.AddToUtcTime(TimeSpan.FromMilliseconds(300)); - - yield return Yield; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_creating.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_creating.cs deleted file mode 100644 index 3694aa401..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_creating.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating : TestFixtureWithExistingEvents { - private string[] _abStreams; - private Dictionary _ab12Tag; - private new RealTimeProvider _timeProvider; - - [SetUp] - public void setup() { - _timeProvider = new RealTimeProvider(); - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - } - - [Test] - public void it_can_be_created() { - new MultiStreamEventReader( - _ioDispatcher, _bus, Guid.NewGuid(), null, 0, _abStreams, _ab12Tag, false, _timeProvider); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new MultiStreamEventReader( - _ioDispatcher, null, Guid.NewGuid(), null, 0, _abStreams, _ab12Tag, false, _timeProvider); - }); - } - - [Test] - public void empty_event_reader_id_throws_argument_exception() { - Assert.Throws(() => { - new MultiStreamEventReader( - _ioDispatcher, _bus, Guid.Empty, null, 0, _abStreams, _ab12Tag, false, _timeProvider); - }); - } - - [Test] - public void null_streams_throws_argument_null_exception() { - Assert.Throws(() => { - new MultiStreamEventReader( - _ioDispatcher, _bus, Guid.NewGuid(), null, 0, null, _ab12Tag, false, _timeProvider); - }); - } - - [Test] - public void null_time_provider_throws_argument_null_exception() { - Assert.Throws(() => { - new MultiStreamEventReader(_ioDispatcher, _bus, Guid.NewGuid(), null, 0, _abStreams, _ab12Tag, false, - null); - }); - } - - [Test] - public void empty_streams_throws_argument_exception() { - Assert.Throws(() => { - new MultiStreamEventReader( - _ioDispatcher, _bus, Guid.NewGuid(), null, 0, new string[0], _ab12Tag, false, _timeProvider); - }); - } - - [Test] - public void invalid_from_tag_throws_argument_exception() { - Assert.Throws(() => { - new MultiStreamEventReader( - _ioDispatcher, _bus, Guid.NewGuid(), null, 0, _abStreams, - new Dictionary {{"a", 1}, {"c", 2}}, false, _timeProvider); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_deleted_streams.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_deleted_streams.cs deleted file mode 100644 index 53d667964..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_deleted_streams.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_deleted_streams : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private string[] _streamNames; - private Dictionary _streamPositions; - private Guid _distibutionPointCorrelationId; - private long _fromSequenceNumber = 10; - - protected override void Given() { - TicksAreHandledImmediately(); - _streamNames = new[] {"stream1", "stream2"}; - _streamPositions = new Dictionary {{"stream1", 10}, {"stream2", _fromSequenceNumber}}; - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _streamNames, _streamPositions, false, - new RealTimeProvider()); - - _edp.Resume(); - } - - private void HandleEvents(string stream, long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, stream, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(string stream, long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(stream, eventNumbers.ToArray()); - } - - private void HandleDeletedStream(string stream, long sequenceNumber, ReadStreamResult result) { - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, sequenceNumber, 100, result, new ResolvedEvent[] { }, null, false, "", -1, - sequenceNumber, true, 200) - ); - } - - [Test] - public void when_no_stream_and_sequence_num_equal_to_minus_one_should_not_publish_partition_deleted_message() { - HandleDeletedStream(_streamNames[0], -1, ReadStreamResult.NoStream); - //trigger event delivery: - HandleEvents(_streamNames[1], _fromSequenceNumber, _fromSequenceNumber); - - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void when_no_stream_and_sequence_num_equal_to_zero_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamNames[0], 0, ReadStreamResult.NoStream); - //trigger event delivery: - HandleEvents(_streamNames[1], _fromSequenceNumber, _fromSequenceNumber); - - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamNames[0], - _consumer.HandledMessages.OfType().First() - .Partition); - } - - [Test] - public void when_no_stream_and_sequence_num_greater_than_zero_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamNames[0], 100, ReadStreamResult.NoStream); - //trigger event delivery: - HandleEvents(_streamNames[1], _fromSequenceNumber, _fromSequenceNumber); - - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamNames[0], - _consumer.HandledMessages.OfType().First() - .Partition); - } - - [Test] - public void when_stream_deleted_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamNames[0], 0, ReadStreamResult.StreamDeleted); - //trigger event delivery: - HandleEvents(_streamNames[1], _fromSequenceNumber, _fromSequenceNumber); - - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamNames[0], - _consumer.HandledMessages.OfType().First() - .Partition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_eof_for_all_streams_and_idle_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_eof_for_all_streams_and_idle_eof.cs deleted file mode 100644 index fc8e260cf..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_eof_for_all_streams_and_idle_eof.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.MultiStream; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_eof_for_all_streams_and_idle_eof : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - _fakeTimeProvider); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - }, null, false, "", 2, 1, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _secondEventId, 100, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 2, - 1, true, 400)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 3, - 2, true, 400)); - _fakeTimeProvider.AddToUtcTime(TimeSpan.FromMilliseconds(500)); - correlationId = ((ClientMessage.ReadStreamEventsForward)(_consumer.HandledMessages - .OfType().Last().ReplyWithMessage)).CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 2, - 1, true, 600)); - } - - [Test] - public void publishes_event_distribution_idle_messages() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - var first = _consumer.HandledMessages.OfType().First(); - var second = _consumer.HandledMessages.OfType().Skip(1).First(); - - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - Assert.AreEqual(second.CorrelationId, _distibutionPointCorrelationId); - - Assert.AreEqual(TimeSpan.FromMilliseconds(500), second.IdleTimestampUtc - first.IdleTimestampUtc); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed.cs deleted file mode 100644 index 31895ce8b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _secondEventId, 100, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 4, false, 200)); - } - - [Test] - public void cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void does_not_publish_committed_event_received_messages() { - Assert.AreEqual( - 0, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - // do not publish new read requests until we consume already available events - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Last(v => v.EventStreamId == "a") - .FromEventNumber); - } - - [Test] - public void cannot_handle_repeated_read_events_completed() { - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - Assert.Throws(() => { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | - PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 3, 4, false, 100)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_and_no_stream.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_and_no_stream.cs deleted file mode 100644 index bb5fda8c4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_and_no_stream.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_and_no_stream : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 0}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _secondEventId, 100, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0], null, false, "", - -1, ExpectedVersion.NoStream, true, 200)); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(3, _consumer.HandledMessages.OfType().Count()); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "a")); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "b")); - Assert.AreEqual( - 3, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "a") - .FromEventNumber); - Assert.AreEqual( - 0, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "b") - .FromEventNumber); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - var third = - _consumer.HandledMessages.OfType() - .Skip(2) - .First(); - - Assert.IsNull(third.Data); - Assert.AreEqual(100, third.SafeTransactionFileReaderJoinPosition); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.AreEqual("event_type2", second.Data.EventType); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual(3, second.Data.Data[0]); - Assert.AreEqual(4, second.Data.Metadata[0]); - Assert.AreEqual("a", first.Data.EventStreamId); - Assert.AreEqual("a", second.Data.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); - Assert.AreEqual(100, second.Data.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); - Assert.AreEqual(-1, second.Data.Position.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(100, second.SafeTransactionFileReaderJoinPosition); - } - - - [Test] - public void publishes_subscribe_awake() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void can_handle_following_read_events_completed() { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 250, Guid.NewGuid(), Guid.NewGuid(), 250, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 4, 3, true, 300)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams.cs deleted file mode 100644 index 41f6480b4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams.cs +++ /dev/null @@ -1,208 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_for_all_streams : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private Guid _thirdEventId; - private Guid _fourthEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _thirdEventId = Guid.NewGuid(); - _fourthEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _thirdEventId, 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), _fourthEventId, 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - } - - [Test] - public void cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.AreEqual("event_type1", second.Data.EventType); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_thirdEventId, second.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual(1, second.Data.Data[0]); - Assert.AreEqual(2, second.Data.Metadata[0]); - Assert.AreEqual("a", first.Data.EventStreamId); - Assert.AreEqual("b", second.Data.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); - Assert.AreEqual(100, second.Data.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); - Assert.AreEqual(-1, second.Data.Position.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(100, second.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(3, _consumer.HandledMessages.OfType().Count()); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "a")); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "b")); - Assert.AreEqual( - 3, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "a") - .FromEventNumber); - Assert.AreEqual( - 2, // still first read request - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "b") - .FromEventNumber); - } - - [Test] - public void cannot_handle_repeated_read_events_completed() { - Assert.Throws(() => { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | - PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 11, 10, true, 100)); - }); - } - - [Test] - public void can_handle_following_read_events_completed() { - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 250, Guid.NewGuid(), Guid.NewGuid(), 250, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 4, 4, false, 300)); - } - - [Test] - public void publishes_committed_event_received_messages_in_correct_order() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType() - .Skip(0) - .First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - var third = - _consumer.HandledMessages.OfType() - .Skip(2) - .First(); - - Assert.AreEqual(first.Data.EventId, _firstEventId); - Assert.AreEqual(second.Data.EventId, _thirdEventId); - Assert.AreEqual(third.Data.EventId, _secondEventId); - - Assert.IsTrue(first.Data.IsJson); - Assert.IsFalse(second.Data.IsJson); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_after_pause_requested.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_after_pause_requested.cs deleted file mode 100644 index c821de3b5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_after_pause_requested.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_for_all_streams_after_pause_requested : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private Guid _thirdEventId; - private Guid _fourthEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _thirdEventId = Guid.NewGuid(); - _fourthEventId = Guid.NewGuid(); - _edp.Pause(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _thirdEventId, 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), _fourthEventId, 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - } - - [Test] - public void can_be_resumed() { - _edp.Resume(); - } - - [Test] - public void cannot_be_paused() { - Assert.Throws(() => { _edp.Pause(); }); - } - - [Test] - public void publishes_correct_number_of_committed_event_received_messages() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void cannot_handle_following_read_events_completed() { - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - Assert.Throws(() => { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 250, Guid.NewGuid(), Guid.NewGuid(), 250, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | - PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 4, 4, false, 300)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_and_eofs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_and_eofs.cs deleted file mode 100644 index 93e096a4a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_and_eofs.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_for_all_streams_and_eofs : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private Guid _thirdEventId; - private Guid _fourthEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _thirdEventId = Guid.NewGuid(); - _fourthEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _thirdEventId, 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), _fourthEventId, 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0], null, false, "", 3, - 2, true, 400)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0], null, false, "", 4, - 3, true, 400)); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 6, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var fifth = - _consumer.HandledMessages.OfType() - .Skip(4) - .First(); - var sixth = - _consumer.HandledMessages.OfType() - .Skip(5) - .First(); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.IsNull(fifth.Data); - Assert.IsNull(sixth.Data); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual("a", first.Data.EventStreamId); - Assert.IsNull(fifth.Data); -// Assert.IsNullOrEmpty("", fifth.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); -// Assert.AreEqual(0, fifth.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); -// Assert.AreEqual(0, fifth.Position.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); -// Assert.AreEqual(200, fifth.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(400, sixth.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(4, _consumer.HandledMessages.OfType().Count()); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "a")); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "b")); - Assert.AreEqual( - 3, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "a") - .FromEventNumber); - Assert.AreEqual( - 4, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "b") - .FromEventNumber); - } - - [Test] - public void publishes_subscribe_awake() { - Assert.AreEqual(4, _consumer.HandledMessages.OfType().Count()); - } - - - [Test] - public void publishes_committed_event_received_messages_in_correct_order() { - Assert.AreEqual( - 6, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType() - .Skip(0) - .First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - var third = - _consumer.HandledMessages.OfType() - .Skip(2) - .First(); - var fourth = - _consumer.HandledMessages.OfType() - .Skip(3) - .First(); - var fifth = - _consumer.HandledMessages.OfType() - .Skip(4) - .First(); - var sixth = - _consumer.HandledMessages.OfType() - .Skip(5) - .First(); - - Assert.AreEqual(first.Data.EventId, _firstEventId); - Assert.AreEqual(second.Data.EventId, _thirdEventId); - Assert.AreEqual(third.Data.EventId, _secondEventId); - Assert.AreEqual(fourth.Data.EventId, _fourthEventId); - Assert.IsNull(fifth.Data); - Assert.IsNull(sixth.Data); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_then_pause_requested_then_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_then_pause_requested_then_eof.cs deleted file mode 100644 index 0a38de15c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_read_completed_for_all_streams_then_pause_requested_then_eof.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_for_all_streams_then_pause_requested_then_eof : - TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private Guid _thirdEventId; - private Guid _fourthEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _thirdEventId = Guid.NewGuid(); - _fourthEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _secondEventId, 100, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _thirdEventId, 150, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), _fourthEventId, 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - _edp.Pause(); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 3, - 2, true, 400)); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(3, _consumer.HandledMessages.OfType().Count()); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "a")); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "b")); - Assert.AreEqual( - 3, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "a") - .FromEventNumber); - Assert.AreEqual( - 2, - _consumer.HandledMessages.OfType() - .Last(m => m.EventStreamId == "b") - .FromEventNumber); - } - - [Test] - public void does_not_publish_schedule() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Where(x => - x.ReplyMessage.GetType() != typeof(ProjectionManagementMessage.Internal.ReadTimeout)).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs deleted file mode 100644 index 101942cc3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private int _fromSequenceNumber; - private string[] _streamNames; - private Dictionary _streamPositions; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - _fromSequenceNumber = 10; - _streamNames = new[] {"stream1", "stream2"}; - _streamPositions = new Dictionary {{"stream1", _fromSequenceNumber}, {"stream2", 100}}; - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _streamNames, _streamPositions, false, - new RealTimeProvider()); - - _edp.Resume(); - } - - private void HandleEvents(string stream, long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, stream, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(string stream, long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(stream, eventNumbers.ToArray()); - } - - [Test] - public void allows_first_event_to_be_equal_to_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber; - - Assert.DoesNotThrow(() => { - HandleEvents(_streamNames[0], eventSequenceNumber, eventSequenceNumber); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - }); - } - - [Test] - public void should_not_allow_first_event_to_be_greater_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber + 5; - - HandleEvents(_streamNames[0], eventSequenceNumber, eventSequenceNumber); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - - Assert.AreEqual(1, HandledMessages.OfType().Count()); - } - - [Test] - public void should_not_allow_first_event_to_be_less_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber - 1; - - HandleEvents(_streamNames[0], eventSequenceNumber, eventSequenceNumber); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - - Assert.AreEqual(1, HandledMessages.OfType().Count()); - } - - [Test] - public void events_after_first_event_should_not_be_in_sequence() { - //_fromSequenceNumber+2 has been omitted - HandleEvents(_streamNames[0], - new long[] { - _fromSequenceNumber, _fromSequenceNumber + 1, _fromSequenceNumber + 3, _fromSequenceNumber + 4 - }); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - - Assert.AreEqual(2, HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs deleted file mode 100644 index 38c40fb4f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private int _fromSequenceNumber; - private string[] _streamNames; - private Dictionary _streamPositions; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - _fromSequenceNumber = 0; - _streamNames = new[] {"stream1", "stream2"}; - _streamPositions = new Dictionary {{"stream1", _fromSequenceNumber}, {"stream2", 100}}; - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _streamNames, _streamPositions, false, - new RealTimeProvider()); - - _edp.Resume(); - } - - private void HandleEvents(string stream, long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, stream, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(string stream, long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(stream, eventNumbers.ToArray()); - } - - [Test] - public void allows_first_event_to_be_equal_to_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber; - - Assert.DoesNotThrow(() => { - HandleEvents(_streamNames[0], eventSequenceNumber, eventSequenceNumber); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - }); - } - - [Test] - public void allows_first_event_to_be_greater_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber + 5; - - Assert.DoesNotThrow(() => { - HandleEvents(_streamNames[0], eventSequenceNumber, eventSequenceNumber); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - }); - } - - [Test] - public void events_after_first_event_should_not_be_in_sequence() { - //_fromSequenceNumber+2 has been omitted - HandleEvents(_streamNames[0], - new long[] { - _fromSequenceNumber, _fromSequenceNumber + 1, _fromSequenceNumber + 3, _fromSequenceNumber + 4 - }); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - - Assert.AreEqual(2, HandledMessages.OfType().Count()); - } - - [Test] - public void events_fault_message_for_out_of_sequence_events_should_be() { - //_fromSequenceNumber+2 has been omitted - HandleEvents(_streamNames[0], - new long[] { - _fromSequenceNumber, _fromSequenceNumber + 1, _fromSequenceNumber + 3, _fromSequenceNumber + 4 - }); - //to trigger event delivery: - HandleEvents(_streamNames[1], 100, 101); - - Assert.IsTrue(HandledMessages.OfType().First().Reason - .Contains(" was expected in the stream ")); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_has_been_created.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_has_been_created.cs deleted file mode 100644 index 4282aa1b0..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_has_been_created.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_has_been_created : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - } - - [Test] - public void it_can_be_resumed() { - _edp.Resume(); - } - - [Test] - public void it_cannot_be_paused() { - Assert.Throws(() => { _edp.Pause(); }); - } - - [Test] - public void handle_read_events_completed_throws() { - Assert.Throws(() => { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0], - null, false, "", -1, 4, true, 100)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_onetime_reader_handles_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_onetime_reader_handles_eof.cs deleted file mode 100644 index 7f6b7f735..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_onetime_reader_handles_eof.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_onetime_reader_handles_eof : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - _fakeTimeProvider, stopOnEof: true); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - }, null, false, "", 2, 1, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), _secondEventId, 100, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - }, null, false, "", 3, 2, true, 200)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 2, - 1, true, 400)); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, "", 3, - 2, true, 400)); - } - - [Test] - public void publishes_eof_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var first = _consumer.HandledMessages.OfType().First(); - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - } - - [Test] - public void does_not_publish_read_messages_anymore() { - Assert.AreEqual(4, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_completes_before_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_completes_before_timeout.cs deleted file mode 100644 index d00233eb1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_completes_before_timeout.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_completes_before_timeout : TestFixtureWithExistingEvents { - private MultiStreamEventReader _eventReader; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _eventReader = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _eventReader.Resume(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "a")); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "b")); - } - - [Test] - public void should_deliver_events() { - Assert.AreEqual(3, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_for_one_stream_completes_but_times_out_for_another.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_for_one_stream_completes_but_times_out_for_another.cs deleted file mode 100644 index 586df670b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_for_one_stream_completes_but_times_out_for_another.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_for_one_stream_completes_but_times_out_for_another : TestFixtureWithExistingEvents { - private MultiStreamEventReader _eventReader; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - _distibutionPointCorrelationId = Guid.NewGuid(); - _eventReader = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _eventReader.Resume(); - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - //timeout follows - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "a")); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - //timeout follows - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "b")); - correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _consumer.HandledMessages.Clear(); - //timeout before read completes - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "a")); - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 300, Guid.NewGuid(), Guid.NewGuid(), 300, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type1", new byte[] {4}, new byte[] {6})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 4, 400, Guid.NewGuid(), Guid.NewGuid(), 400, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {6}, new byte[] {8})) - }, null, false, "", 3, 2, true, 200)); - } - - [Test] - public void should_not_deliver_events_from_last_read() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_timeout_occurs.cs deleted file mode 100644 index 7f4de33e3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_read_timeout_occurs.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_timeout_occurs : TestFixtureWithExistingEvents { - private MultiStreamEventReader _eventReader; - private Guid _distibutionPointCorrelationId; - private Guid _streamReadACorrelationId; - private Guid _streamReadBCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _eventReader = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - _eventReader.Resume(); - _streamReadACorrelationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "a").CorrelationId; - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(_streamReadACorrelationId, "a")); - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _streamReadACorrelationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 3, 2, true, 200)); - _streamReadBCorrelationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == "b").CorrelationId; - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(_streamReadBCorrelationId, "b")); - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _streamReadBCorrelationId, "b", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 3, 200, Guid.NewGuid(), Guid.NewGuid(), 200, 0, "b", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 4, 3, true, 200)); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_read_for_the_timed_out_reads() { - var streamAReads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "a"); - - Assert.AreEqual(streamAReads.First().CorrelationId, _streamReadACorrelationId); - Assert.AreEqual(1, streamAReads.Skip(1).Count()); - - var streamBReads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "b"); - - Assert.AreEqual(streamBReads.First().CorrelationId, _streamReadBCorrelationId); - Assert.AreEqual(1, streamBReads.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_resuming.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_resuming.cs deleted file mode 100644 index ccd1eeb12..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/multi_stream_reader/when_resuming.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.multi_stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_resuming : TestFixtureWithExistingEvents { - private MultiStreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - - private string[] _abStreams; - private Dictionary _ab12Tag; - - [SetUp] - public new void When() { - _ab12Tag = new Dictionary {{"a", 1}, {"b", 2}}; - _abStreams = new[] {"a", "b"}; - - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new MultiStreamEventReader( - _ioDispatcher, _bus, _distibutionPointCorrelationId, null, 0, _abStreams, _ab12Tag, false, - new RealTimeProvider()); - - _edp.Resume(); - } - - [Test] - public void it_cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void it_cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void it_publishes_read_events_from_beginning() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "a")); - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(m => m.EventStreamId == "b")); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single(m => m.EventStreamId == "a") - .FromEventNumber); - Assert.AreEqual( - 2, - _consumer.HandledMessages.OfType() - .Single(m => m.EventStreamId == "b") - .FromEventNumber); - } - - [Test] - public void can_handle_read_events_completed() { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "a", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0]), 0) - }, null, false, "", 2, 4, false, 100)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/reader_subscription_dispatcher.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/reader_subscription_dispatcher.cs deleted file mode 100644 index 167d293dd..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/reader_subscription_dispatcher.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using EventStore.Projections.Core.Tests.Services.event_reader.heading_event_reader; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader; - -[TestFixture(typeof(LogFormat.V2), typeof(string))] -[TestFixture(typeof(LogFormat.V3), typeof(uint))] -public class reader_subscription_dispatcher : TestFixtureWithEventReaderService { - private ReaderSubscriptionOptions _defaultOptions = new(1000, null, 1000, false, null, false); - private FakeReaderStrategy _readerStrategy; - private FakeSubscriptionHandler _handler; - private Guid _subscriptionId; - protected override void Given() { - base.Given(); - _readerStrategy = new FakeReaderStrategy(); - _subscriptionId = Guid.NewGuid(); - _handler = new FakeSubscriptionHandler(_subscriptionId); - } - - [Test] - public void should_publish_subscribe_timeout_if_schedule_timeout_is_true() { - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - _handler, scheduleTimeout: true); - - _queue.Process(); - Assert.True(HandledMessages.ContainsSingle()); - Assert.True(HandledMessages.Where(m => m is TimerMessage.Schedule).Any(m => - ((TimerMessage.Schedule)m).ReplyMessage is EventReaderSubscriptionMessage.SubscribeTimeout)); - _timeProvider.AddToUtcTime(TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout * 2)); - _queue.Process(); - - Assert.True(_handler.HandledMessages.Any(m => m is EventReaderSubscriptionMessage.SubscribeTimeout)); - } - - [Test] - public void should_not_publish_subscribe_timeout_if_schedule_timeout_is_false() { - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - _handler, scheduleTimeout: false); - - _queue.Process(); - Assert.True(HandledMessages.ContainsSingle()); - Assert.False(HandledMessages.Where(m => m is TimerMessage.Schedule).Any(m => - ((TimerMessage.Schedule)m).ReplyMessage is EventReaderSubscriptionMessage.SubscribeTimeout)); - } - - [Test] - public void should_publish_subscription_messages_to_subscribed_handler() { - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - _handler, scheduleTimeout: false); - - _queue.Process(); - var assignedReaderMessage = - _handler.HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(assignedReaderMessage, "Expected ReaderAssignedReader message to have been published"); - - _readerService.Handle(new ReaderSubscriptionMessage.CommittedEventDistributed( - assignedReaderMessage.ReaderId, - CreateFakeEvent(), CheckpointTag.Empty)); - _queue.Process(); - var commitedEventReceived = _handler.HandledMessages - .OfType() - .SingleOrDefault(); - Assert.NotNull(commitedEventReceived); - } - - [Test] - public void should_not_send_subscription_messages_to_cancelled_handlers() { - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - _handler, scheduleTimeout: false); - - _queue.Process(); - var assignedReaderMessage = - _handler.HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(assignedReaderMessage, "Expected ReaderAssignedReader message to have been published"); - - _subscriptionDispatcher.Cancel(_subscriptionId); - - _readerService.Handle(new ReaderSubscriptionMessage.CommittedEventDistributed( - assignedReaderMessage.ReaderId, - CreateFakeEvent(), CheckpointTag.Empty)); - _queue.Process(); - - Assert.IsEmpty(_handler.HandledMessages.OfType()); - } - - [Test] - public void should_send_subscription_messages_to_handler_that_has_subscribed_without_publishing() { - _subscriptionDispatcher.Subscribed(_subscriptionId, _handler); - - _readerService.Handle(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions)); - - _queue.Process(); - Assert.IsNotEmpty(_handler.HandledMessages - .OfType()); - } - - - [Test] - public void multiple_handlers_should_only_receive_messages_for_their_subscription() { - var secondSubscription = Guid.NewGuid(); - var secondHandler = new FakeSubscriptionHandler(secondSubscription); - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - _handler, scheduleTimeout: false); - _subscriptionDispatcher.PublishSubscribe(new ReaderSubscriptionManagement.Subscribe( - secondSubscription, CheckpointTag.Empty, _readerStrategy, _defaultOptions), - secondHandler, scheduleTimeout: false); - - _queue.Process(); - Assert.True(_handler.HandledMessages.All(x => x.SubscriptionId == _subscriptionId)); - Assert.True(secondHandler.HandledMessages.All(x => x.SubscriptionId == secondSubscription)); - Assert.AreEqual(1, _handler.HandledMessages.Count(x => x is EventReaderSubscriptionMessage.ReaderAssignedReader)); - Assert.AreEqual(1, secondHandler.HandledMessages.Count(x => x is EventReaderSubscriptionMessage.ReaderAssignedReader)); - } - - private ResolvedEvent CreateFakeEvent() => new( - "test-stream", 0, "test-stream", 0, false, new TFPos(100, 100), - Guid.NewGuid(), "test-event", isJson: true, - "{\"foo\":\"bar\"}", "{}"); - - private class FakeSubscriptionHandler : IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - public Guid SubscriptionId { get; } - - public FakeSubscriptionHandler(Guid subscriptionId) { - SubscriptionId = subscriptionId; - } - - public List HandledMessages = new(); - public void Handle(EventReaderSubscriptionMessage.ProgressChanged message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.SubscriptionStarted message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.NotAuthorized message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.EofReached message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.CheckpointSuggested message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.ReaderAssignedReader message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.Failed message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.SubscribeTimeout message) => HandledMessages.Add(message); - public void Handle(EventReaderSubscriptionMessage.CommittedEventReceived message) => - HandledMessages.Add(message); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_creating_stream_event_reader.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_creating_stream_event_reader.cs deleted file mode 100644 index 62e3bcb19..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_creating_stream_event_reader.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_creating_stream_event_reader : TestFixtureWithExistingEvents { - [Test] - public void it_can_be_created() { - new StreamEventReader(_bus, Guid.NewGuid(), null, "stream", 0, new RealTimeProvider(), false, - produceStreamDeletes: false); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new StreamEventReader(null, Guid.NewGuid(), null, "stream", 0, new RealTimeProvider(), false, - produceStreamDeletes: false); - }); - } - - [Test] - public void empty_event_reader_id_throws_argument_exception() { - Assert.Throws(() => { - new StreamEventReader(_bus, Guid.Empty, null, "stream", 0, new RealTimeProvider(), false, - produceStreamDeletes: false); - }); - } - - [Test] - public void null_stream_name_throws_argument_null_exception() { - Assert.Throws(() => { - new StreamEventReader(_bus, Guid.NewGuid(), null, null, 0, new RealTimeProvider(), false, - produceStreamDeletes: false); - }); - } - - [Test] - public void empty_stream_name_throws_argument_exception() { - Assert.Throws(() => { - new StreamEventReader(_bus, Guid.NewGuid(), null, "", 0, new RealTimeProvider(), false, - produceStreamDeletes: false); - }); - } - - [Test] - public void negative_event_sequence_number_throws_argument_exception() { - Assert.Throws(() => { - new StreamEventReader(_bus, Guid.NewGuid(), null, "", -1, new RealTimeProvider(), false, - produceStreamDeletes: false); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_deleted_streams.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_deleted_streams.cs deleted file mode 100644 index 2b9b035a3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_deleted_streams.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_deleted_streams : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private string _streamName; - private Guid _distibutionPointCorrelationId; - private long _fromSequenceNumber = 10; - private FakeTimeProvider _fakeTimeProvider; - - protected override void Given() { - TicksAreHandledImmediately(); - _streamName = "stream1"; - _fromSequenceNumber = 10; - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, _streamName, _fromSequenceNumber, - _fakeTimeProvider, false, produceStreamDeletes: false); - _edp.Resume(); - } - - private void HandleEvents(string stream, long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, stream, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(string stream, long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(stream, eventNumbers.ToArray()); - } - - private void HandleDeletedStream(string stream, long sequenceNumber, ReadStreamResult result) { - var correlationId = _consumer.HandledMessages.OfType() - .Last(x => x.EventStreamId == stream).CorrelationId; - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, stream, sequenceNumber, 100, result, new ResolvedEvent[] { }, null, false, "", -1, - sequenceNumber, true, 200) - ); - } - - [Test] - public void when_no_stream_and_sequence_num_equal_to_minus_one_should_not_publish_partition_deleted_message() { - HandleDeletedStream(_streamName, -1, ReadStreamResult.NoStream); - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void when_no_stream_and_sequence_num_equal_to_zero_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamName, 0, ReadStreamResult.NoStream); - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamName, - _consumer.HandledMessages.OfType().First() - .Partition); - } - - [Test] - public void when_no_stream_and_sequence_num_greater_than_zero_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamName, 100, ReadStreamResult.NoStream); - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamName, - _consumer.HandledMessages.OfType().First() - .Partition); - } - - [Test] - public void when_stream_deleted_should_publish_partition_deleted_message() { - HandleDeletedStream(_streamName, 0, ReadStreamResult.StreamDeleted); - Assert.AreEqual(1, - _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual(_streamName, - _consumer.HandledMessages.OfType().First() - .Partition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_eof_and_idle_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_eof_and_idle_eof.cs deleted file mode 100644 index c7ad6ba88..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_eof_and_idle_eof.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.SingleStream; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_eof_and_idle_eof : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - - //private Guid _publishWithCorrelationId; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private FakeTimeProvider _fakeTimeProvider; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, _fakeTimeProvider, - false, - produceStreamDeletes: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new ResolvedEvent[] { }, null, false, "", 12, 11, true, 400)); - _fakeTimeProvider.AddToUtcTime(TimeSpan.FromMilliseconds(500)); - correlationId = ((ClientMessage.ReadStreamEventsForward)(_consumer.HandledMessages - .OfType().Last().ReplyWithMessage)).CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new ResolvedEvent[] { }, null, false, "", 12, 11, true, 400)); - } - - [Test] - public void publishes_event_distribution_idle_messages() { - Assert.AreEqual( - 2, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - Assert.AreEqual(second.CorrelationId, _distibutionPointCorrelationId); - - Assert.AreEqual(TimeSpan.FromMilliseconds(500), second.IdleTimestampUtc - first.IdleTimestampUtc); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_no_stream.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_no_stream.cs deleted file mode 100644 index 7e8dab941..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_no_stream.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_no_stream : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 0, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, - ReadStreamResult.NoStream, new ResolvedEvent[0], null, false, "", -1, ExpectedVersion.NoStream, - true, 200)); - } - - [Test] - public void cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - "stream", - _consumer.HandledMessages.OfType().Last().EventStreamId); - Assert.AreEqual( - 0, _consumer.HandledMessages.OfType().Last().FromEventNumber); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().Single(); - Assert.IsNull(first.Data); - Assert.AreEqual(200, first.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void publishes_subscribe_awake() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_and_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_and_eof.cs deleted file mode 100644 index e38b7b8e2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_and_eof.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_and_eof : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0] - , null, false, "", 12, 11, true, 400)); - } - - [Test] - public void cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - var third = - _consumer.HandledMessages.OfType() - .Skip(2) - .First(); - Assert.IsNull(third.Data); - Assert.AreEqual(400, third.SafeTransactionFileReaderJoinPosition); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.AreEqual("event_type2", second.Data.EventType); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual(3, second.Data.Data[0]); - Assert.AreEqual(4, second.Data.Metadata[0]); - Assert.AreEqual("stream", first.Data.EventStreamId); - Assert.AreEqual("stream", second.Data.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); - Assert.AreEqual(100, second.Data.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); - Assert.AreEqual(-1, second.Data.Position.CommitPosition); - Assert.AreEqual(50, first.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(100, second.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(-1, first.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(-1, second.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(100, second.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void publishes_subscribe_awake() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_stream_event_reader.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_stream_event_reader.cs deleted file mode 100644 index e0f4ad5f4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_stream_event_reader.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_stream_event_reader : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - } - - [Test] - public void cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 2, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.AreEqual("event_type2", second.Data.EventType); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual(3, second.Data.Data[0]); - Assert.AreEqual(4, second.Data.Metadata[0]); - Assert.AreEqual("stream", first.Data.EventStreamId); - Assert.AreEqual("stream", second.Data.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); - Assert.AreEqual(100, second.Data.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); - Assert.AreEqual(-1, second.Data.Position.CommitPosition); - Assert.AreEqual(50, first.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(100, second.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(-1, first.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(-1, second.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(100, second.SafeTransactionFileReaderJoinPosition); - Assert.IsFalse(first.Data.IsJson); - Assert.IsTrue(second.Data.IsJson); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - "stream", - _consumer.HandledMessages.OfType().Last().EventStreamId); - Assert.AreEqual( - 12, _consumer.HandledMessages.OfType().Last().FromEventNumber); - } - - [Test] - public void cannot_handle_repeated_read_events_completed() { - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 11, 10, true, 100)); - Assert.AreEqual(1, HandledMessages.OfType().Count()); - } - - [Test] - public void can_handle_following_read_events_completed() { - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 12, 250, Guid.NewGuid(), Guid.NewGuid(), 250, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0])) - }, null, false, "", 13, 11, true, 300)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_then_pause_then_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_then_pause_then_eof.cs deleted file mode 100644 index 234d50498..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_read_completed_then_pause_then_eof.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_read_completed_then_pause_then_eof : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - _edp.Pause(); - correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, new ResolvedEvent[0] - , null, false, "", 12, 11, true, 400)); - } - - [Test] - public void can_be_resumed() { - _edp.Resume(); - } - - [Test] - public void cannot_be_paused() { - Assert.Throws(() => { _edp.Pause(); }); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 3, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - var third = - _consumer.HandledMessages.OfType() - .Skip(2) - .First(); - Assert.IsNull(third.Data); - Assert.AreEqual(400, third.SafeTransactionFileReaderJoinPosition); - - Assert.AreEqual("event_type1", first.Data.EventType); - Assert.AreEqual("event_type2", second.Data.EventType); - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - Assert.AreEqual(1, first.Data.Data[0]); - Assert.AreEqual(2, first.Data.Metadata[0]); - Assert.AreEqual(3, second.Data.Data[0]); - Assert.AreEqual(4, second.Data.Metadata[0]); - Assert.AreEqual("stream", first.Data.EventStreamId); - Assert.AreEqual("stream", second.Data.EventStreamId); - Assert.AreEqual(50, first.Data.Position.PreparePosition); - Assert.AreEqual(100, second.Data.Position.PreparePosition); - Assert.AreEqual(-1, first.Data.Position.CommitPosition); - Assert.AreEqual(-1, second.Data.Position.CommitPosition); - Assert.AreEqual(50, first.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(100, second.Data.EventOrLinkTargetPosition.PreparePosition); - Assert.AreEqual(-1, first.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(-1, second.Data.EventOrLinkTargetPosition.CommitPosition); - Assert.AreEqual(50, first.SafeTransactionFileReaderJoinPosition); - Assert.AreEqual(100, second.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void does_not_publish_schedule() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Where(x => - x.ReplyMessage.GetType() != typeof(ProjectionManagementMessage.Internal.ReadTimeout)).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_soft_deleted_stream_with_a_single_event_event_reader.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_soft_deleted_stream_with_a_single_event_event_reader.cs deleted file mode 100644 index 94e2ffc09..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_soft_deleted_stream_with_a_single_event_event_reader.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.SingleStream; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_soft_deleted_stream_with_a_single_event_event_reader : TestFixtureWithExistingEvents { - private StreamEventReader _streamEventReader; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private string _streamId = Guid.NewGuid().ToString(); - - protected override void Given() { - TicksAreHandledImmediately(); - - _distibutionPointCorrelationId = Guid.NewGuid(); - _streamEventReader = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, _streamId, 0, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _streamEventReader.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - } - - [SetUp] - public new void When() { - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _streamEventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, _streamId, 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, _streamId, ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, _streamId, ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd | - PrepareFlags.IsJson, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - } - - [Test] - public void should_handle_the_2_events() { - Assert.AreEqual(2, - _consumer.HandledMessages.OfType().Count()); - - var first = _consumer.HandledMessages.OfType().First(); - Assert.AreEqual(first.Data.EventId, _firstEventId, - String.Format("Expected the first event to be {0}, but got {1}", _firstEventId, first.Data.EventId)); - var second = _consumer.HandledMessages.OfType().Skip(1) - .First(); - Assert.AreEqual(second.Data.EventId, _secondEventId, - String.Format("Expected the second event to be {0}, but got {1}", _secondEventId, second.Data.EventId)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs deleted file mode 100644 index c9ddbcb62..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_streams_with_deleted_events_and_reader_starting_after_event_zero : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private int _fromSequenceNumber; - const string _streamName = "stream"; - - protected override void Given() { - TicksAreHandledImmediately(); - _fromSequenceNumber = 10; - } - - [SetUp] - public new void When() { - _edp = new StreamEventReader(_bus, Guid.NewGuid(), null, _streamName, _fromSequenceNumber, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - } - - private void HandleEvents(long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, _streamName, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, _streamName, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(eventNumbers.ToArray()); - } - - [Test] - public void allows_first_event_to_be_equal_to_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber; - - Assert.DoesNotThrow(() => { HandleEvents(eventSequenceNumber, eventSequenceNumber); }); - } - - [Test] - public void should_not_allow_first_event_to_be_greater_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber + 5; - - HandleEvents(eventSequenceNumber, eventSequenceNumber); - - Assert.AreEqual(1, HandledMessages.OfType().Count()); - } - - [Test] - public void should_not_allow_first_event_to_be_less_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber - 1; - - HandleEvents(eventSequenceNumber, eventSequenceNumber); - - Assert.AreEqual(1, HandledMessages.OfType().Count()); - } - - [Test] - public void events_after_second_event_should_not_be_in_sequence() { - //_fromSequenceNumber+2 has been omitted - HandleEvents(new long[] - {_fromSequenceNumber, _fromSequenceNumber + 1, _fromSequenceNumber + 3, _fromSequenceNumber + 4}); - - Assert.AreEqual(2, HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs deleted file mode 100644 index 1e82fcd19..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_handling_streams_with_deleted_events_and_reader_starting_at_event_zero : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private int _fromSequenceNumber; - const string _streamName = "stream"; - - protected override void Given() { - TicksAreHandledImmediately(); - _fromSequenceNumber = 0; - } - - [SetUp] - public new void When() { - _edp = new StreamEventReader(_bus, Guid.NewGuid(), null, _streamName, _fromSequenceNumber, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - } - - private void HandleEvents(long[] eventNumbers) { - string eventType = "event_type"; - List events = new List(); - - foreach (long eventNumber in eventNumbers) { - events.Add( - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - eventNumber, 50 * (eventNumber + 1), Guid.NewGuid(), Guid.NewGuid(), 50 * (eventNumber + 1), - 0, _streamName, ExpectedVersion.Any, DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - eventType, new byte[] {0}, new byte[] {0} - ) - ) - ); - } - - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - - long start, end; - if (eventNumbers.Length > 0) { - start = eventNumbers[0]; - end = eventNumbers[eventNumbers.Length - 1]; - } else { - start = _fromSequenceNumber; - end = _fromSequenceNumber; - } - - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, _streamName, start, 100, ReadStreamResult.Success, events.ToArray(), null, false, "", - start + 1, end, true, 200) - ); - } - - private void HandleEvents(long start, long end) { - List eventNumbers = new List(); - for (long i = start; i <= end; i++) eventNumbers.Add(i); - HandleEvents(eventNumbers.ToArray()); - } - - [Test] - public void allows_first_event_to_be_equal_to_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber; - - Assert.DoesNotThrow(() => { HandleEvents(eventSequenceNumber, eventSequenceNumber); }); - } - - [Test] - public void allows_first_event_to_be_greater_than_sequence_number() { - long eventSequenceNumber = _fromSequenceNumber + 5; - - Assert.DoesNotThrow(() => { HandleEvents(eventSequenceNumber, eventSequenceNumber); }); - } - - [Test] - public void events_after_second_event_should_not_be_in_sequence() { - //_fromSequenceNumber+2 has been omitted - HandleEvents(new long[] - {_fromSequenceNumber, _fromSequenceNumber + 1, _fromSequenceNumber + 3, _fromSequenceNumber + 4}); - - Assert.AreEqual(2, HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_onetime_reader_handles_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_onetime_reader_handles_eof.cs deleted file mode 100644 index 2ffeaaa1f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_onetime_reader_handles_eof.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_onetime_reader_handles_eof : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - - //private Guid _publishWithCorrelationId; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - private FakeTimeProvider _fakeTimeProvider; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - //_publishWithCorrelationId = Guid.NewGuid(); - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, _fakeTimeProvider, - resolveLinkTos: false, stopOnEof: true, produceStreamDeletes: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), _firstEventId, 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), _secondEventId, 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, new ResolvedEvent[] { }, null, false, - "", 12, 11, true, 400)); - } - - [Test] - public void publishes_eof_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var first = _consumer.HandledMessages.OfType().First(); - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - } - - [Test] - public void does_not_publish_read_messages_anymore() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_paused_then_handling_no_stream.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_paused_then_handling_no_stream.cs deleted file mode 100644 index 4cacb6e41..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_paused_then_handling_no_stream.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_paused_then_handling_no_stream : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 0, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - _edp.Pause(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.NoStream, new ResolvedEvent[0] - , null, false, "", -1, ExpectedVersion.NoStream, true, 200)); - } - - [Test] - public void can_be_resumed() { - _edp.Resume(); - } - - [Test] - public void cannot_be_paused() { - Assert.Throws(() => { _edp.Pause(); }); - } - - [Test] - public void publishes_read_events_from_beginning_with_correct_next_event_number() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - "stream", - _consumer.HandledMessages.OfType().Last().EventStreamId); - Assert.AreEqual( - 0, _consumer.HandledMessages.OfType().Last().FromEventNumber); - } - - [Test] - public void publishes_correct_committed_event_received_messages() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().Single(); - Assert.IsNull(first.Data); - Assert.AreEqual(200, first.SafeTransactionFileReaderJoinPosition); - } - - [Test] - public void does_not_publish_schedule() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Where(x => - x.ReplyMessage.GetType() != typeof(ProjectionManagementMessage.Internal.ReadTimeout)).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_completes_before_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_completes_before_timeout.cs deleted file mode 100644 index a8c59642b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_completes_before_timeout.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_completes_before_timeout : TestFixtureWithExistingEvents { - private StreamEventReader _eventReader; - private Guid _distributionCorrelationId; - private FakeTimeProvider _fakeTimeProvider; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _eventReader = new StreamEventReader(_bus, _distributionCorrelationId, null, "stream", 10, - _fakeTimeProvider, - resolveLinkTos: false, stopOnEof: true, produceStreamDeletes: false); - _eventReader.Resume(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - correlationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "stream")); - } - - [Test] - public void should_deliver_events() { - Assert.AreEqual(2, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_timeout_occurs.cs deleted file mode 100644 index 54f2bfd0f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_read_timeout_occurs.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_timeout_occurs : TestFixtureWithExistingEvents { - private StreamEventReader _eventReader; - private Guid _distributionCorrelationId; - private FakeTimeProvider _fakeTimeProvider; - private Guid _readCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _eventReader = new StreamEventReader(_bus, _distributionCorrelationId, null, "stream", 10, - _fakeTimeProvider, - resolveLinkTos: false, stopOnEof: true, produceStreamDeletes: false); - _eventReader.Resume(); - _readCorrelationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(_readCorrelationId, "stream")); - _eventReader.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _readCorrelationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 10, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2})), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 11, 100, Guid.NewGuid(), Guid.NewGuid(), 100, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type2", new byte[] {3}, new byte[] {4})) - }, null, false, "", 12, 11, true, 200)); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_read_for_the_timed_out_reads() { - var reads = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == "stream"); - - Assert.AreEqual(reads.First().CorrelationId, _readCorrelationId); - Assert.AreEqual(1, reads.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_resuming_stream_event_reader.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_resuming_stream_event_reader.cs deleted file mode 100644 index 1c8888a64..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_resuming_stream_event_reader.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_resuming_stream_event_reader : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - private Guid _distibutionPointCorrelationId; - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 10, - new RealTimeProvider(), false, - produceStreamDeletes: false); - _edp.Resume(); - } - - [Test] - public void it_cannot_be_resumed() { - Assert.Throws(() => { _edp.Resume(); }); - } - - [Test] - public void it_cannot_be_paused() { - _edp.Pause(); - } - - [Test] - public void it_publishes_read_events_from_beginning() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - "stream", - _consumer.HandledMessages.OfType().Single().EventStreamId); - Assert.AreEqual( - 10, _consumer.HandledMessages.OfType().Single().FromEventNumber); - } - - [Test] - public void can_handle_read_events_completed() { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "stream", 100, 100, ReadStreamResult.Success, - new[] { - ResolvedEvent.ForUnresolvedEvent(new EventRecord( - 10, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "stream", ExpectedVersion.Any, - DateTime.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type", new byte[0], new byte[0]), 0) - }, null, false, "", 11, 10, true, 100)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_stream_event_reader_has_been_created.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_stream_event_reader_has_been_created.cs deleted file mode 100644 index 6b27f9c61..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/stream_reader/when_stream_event_reader_has_been_created.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using EventStore.Core.Messages; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.stream_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_stream_event_reader_has_been_created : TestFixtureWithExistingEvents { - private StreamEventReader _edp; - - //private Guid _publishWithCorrelationId; - private Guid _distibutionPointCorrelationId; - - [SetUp] - public new void When() { - //_publishWithCorrelationId = Guid.NewGuid(); - _distibutionPointCorrelationId = Guid.NewGuid(); - _edp = new StreamEventReader(_bus, _distibutionPointCorrelationId, null, "stream", 0, - new RealTimeProvider(), false, - produceStreamDeletes: false); - } - - [Test] - public void it_can_be_resumed() { - _edp.Resume(); - } - - [Test] - public void it_cannot_be_paused() { - Assert.Throws(() => { _edp.Pause(); }); - } - - [Test] - public void handle_read_events_completed_throws() { - Assert.Throws(() => { - _edp.Handle( - new ClientMessage.ReadStreamEventsForwardCompleted( - _distibutionPointCorrelationId, "stream", 100, 100, ReadStreamResult.Success, - new ResolvedEvent[0], null, false, "", -1, 4, true, 100)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_eof_and_idle_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_eof_and_idle_eof.cs deleted file mode 100644 index 61b9c90eb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_eof_and_idle_eof.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.AllStream; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_eof_and_idle_eof : TestFixtureWithExistingEvents { - private TransactionFileEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 200), - }, null, false, 100, - new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - correlationId = _consumer.HandledMessages.OfType().Last().CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new EventStore.Core.Data.ResolvedEvent[0], null, false, 100, new TFPos(), new TFPos(), new TFPos(), - 500)); - _fakeTimeProvider.AddToUtcTime(TimeSpan.FromMilliseconds(500)); - correlationId = ((ClientMessage.ReadAllEventsForward)(_consumer.HandledMessages - .OfType().Last().ReplyWithMessage)).CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new EventStore.Core.Data.ResolvedEvent[0], null, false, 100, new TFPos(), new TFPos(), new TFPos(), - 500)); - } - - [Test] - public void publishes_event_distribution_idle_messages() { - Assert.AreEqual( - 2, _consumer.HandledMessages.OfType().Count()); - var first = - _consumer.HandledMessages.OfType().First(); - var second = - _consumer.HandledMessages.OfType() - .Skip(1) - .First(); - - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - Assert.AreEqual(second.CorrelationId, _distibutionPointCorrelationId); - - Assert.AreEqual(TimeSpan.FromMilliseconds(500), second.IdleTimestampUtc - first.IdleTimestampUtc); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_hard_deleted.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_hard_deleted.cs deleted file mode 100644 index ef6508aa1..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_hard_deleted.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_stream_hard_deleted : TestFixtureWithExistingEvents { - private TransactionFileEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - SystemEventTypes.StreamDeleted, new byte[] {1}, new byte[] {2}), 200), - }, null, false, 100, - new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - } - - [Test] - public void publishes_event_reader_partition_deleted_messages() { - var deleteds = - _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, deleteds.Count()); - Assert.AreEqual("a", deleteds[0].Partition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_soft_deleted.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_soft_deleted.cs deleted file mode 100644 index 58ff88cbb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_handling_stream_soft_deleted.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using ResolvedEvent = EventStore.Core.Data.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_stream_soft_deleted : TestFixtureWithExistingEvents { - private TransactionFileEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new[] { - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "$$a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - SystemEventTypes.StreamMetadata, - new StreamMetadata(truncateBefore: EventNumber.DeletedStream).ToJsonBytes(), - new byte[] {2}), 200), - }, null, false, 100, new TFPos(200, 150), new TFPos(500, -1), - new TFPos(100, 50), 500)); - } - - [Test] - public void publishes_event_reader_partition_deleted_messages() { - var deleteds = - _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, deleteds.Count()); - Assert.AreEqual("a", deleteds[0].Partition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_onetime_reader_handles_eof.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_onetime_reader_handles_eof.cs deleted file mode 100644 index 7993d6cae..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_onetime_reader_handles_eof.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_onetime_reader_handles_eof : TestFixtureWithExistingEvents { - private TransactionFileEventReader _edp; - private Guid _distibutionPointCorrelationId; - private Guid _firstEventId; - private Guid _secondEventId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distibutionPointCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _edp = new TransactionFileEventReader(_bus, _distibutionPointCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false, stopOnEof: true); - _edp.Resume(); - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), _firstEventId, 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), _secondEventId, 150, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 200), - }, null, false, 100, new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - correlationId = _consumer.HandledMessages.OfType().Last().CorrelationId; - _edp.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new EventStore.Core.Data.ResolvedEvent[0], null, false, 100, new TFPos(), new TFPos(), new TFPos(), - 500)); - } - - [Test] - public void publishes_eof_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var first = _consumer.HandledMessages.OfType().First(); - Assert.AreEqual(first.CorrelationId, _distibutionPointCorrelationId); - } - - [Test] - public void does_not_publish_read_messages_anymore() { - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_completes_before_timeout.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_completes_before_timeout.cs deleted file mode 100644 index 824c5bea9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_completes_before_timeout.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_completes_before_timeout : TestFixtureWithExistingEvents { - private TransactionFileEventReader _eventReader; - private Guid _distributionCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _eventReader = new TransactionFileEventReader(_bus, _distributionCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false, stopOnEof: true); - _eventReader.Resume(); - var correlationId = _consumer.HandledMessages.OfType().Last() - .CorrelationId; - _eventReader.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - correlationId, ReadAllResult.Success, null, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 200), - }, null, false, 100, new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, "$all")); - } - - [Test] - public void should_deliver_events() { - Assert.AreEqual(2, - _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_timeout_occurs.cs b/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_timeout_occurs.cs deleted file mode 100644 index c82fa11d3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reader/transaction_file_reader/when_read_timeout_occurs.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reader.transaction_file_reader { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_read_timeout_occurs : TestFixtureWithExistingEvents { - private TransactionFileEventReader _eventReader; - private Guid _distributionCorrelationId; - private Guid _readAllEventsForwardCorrelationId; - - protected override void Given() { - TicksAreHandledImmediately(); - } - - private FakeTimeProvider _fakeTimeProvider; - - [SetUp] - public new void When() { - _distributionCorrelationId = Guid.NewGuid(); - _fakeTimeProvider = new FakeTimeProvider(); - _eventReader = new TransactionFileEventReader(_bus, _distributionCorrelationId, null, new TFPos(100, 50), - _fakeTimeProvider, - deliverEndOfTFPosition: false, stopOnEof: true); - _eventReader.Resume(); - _readAllEventsForwardCorrelationId = _consumer.HandledMessages.OfType() - .Last().CorrelationId; - _eventReader.Handle( - new ProjectionManagementMessage.Internal.ReadTimeout(_readAllEventsForwardCorrelationId, "$all")); - _eventReader.Handle( - new ClientMessage.ReadAllEventsForwardCompleted( - _readAllEventsForwardCorrelationId, ReadAllResult.Success, null, - new[] { - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 1, 50, Guid.NewGuid(), Guid.NewGuid(), 50, 0, "a", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 100), - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent( - new EventRecord( - 2, 150, Guid.NewGuid(), Guid.NewGuid(), 150, 0, "b", ExpectedVersion.Any, - _fakeTimeProvider.UtcNow, - PrepareFlags.SingleWrite | PrepareFlags.TransactionBegin | PrepareFlags.TransactionEnd, - "event_type1", new byte[] {1}, new byte[] {2}), 200), - }, null, false, 100, new TFPos(200, 150), new TFPos(500, -1), new TFPos(100, 50), 500)); - } - - [Test] - public void should_not_deliver_events() { - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void should_attempt_another_read_for_the_timed_out_reads() { - var readAllEventsForwardMessages = _consumer.HandledMessages.OfType(); - - Assert.AreEqual(readAllEventsForwardMessages.First().CorrelationId, _readAllEventsForwardCorrelationId); - Assert.AreEqual(1, readAllEventsForwardMessages.Skip(1).Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/TestFixtureWithEventReorderingProjectionSubscription.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/TestFixtureWithEventReorderingProjectionSubscription.cs deleted file mode 100644 index d1ecad895..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/TestFixtureWithEventReorderingProjectionSubscription.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using EventStore.Projections.Core.Tests.Services.projection_subscription; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - public abstract class TestFixtureWithEventReorderingProjectionSubscription : TestFixtureWithProjectionSubscription { - protected int _timeBetweenEvents; - protected int _processingLagMs; - - protected override void Given() { - _timeBetweenEvents = 1100; - _processingLagMs = 500; - base.Given(); - _source = builder => { - builder.FromStream("a"); - builder.FromStream("b"); - builder.AllEvents(); - builder.SetReorderEvents(true); - builder.SetProcessingLag(1000); // ms - }; - } - - protected override IReaderSubscription CreateProjectionSubscription() { - return new EventReorderingReaderSubscription(_bus, - _projectionCorrelationId, - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"a", ExpectedVersion.NoStream}, {"b", ExpectedVersion.NoStream}}), - _readerStrategy, - _timeProvider, - _checkpointUnhandledBytesThreshold, _checkpointProcessedEventsThreshold, _checkpointAfterMs, - _processingLagMs, - false, - null, - false); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_creating_projection_subscription.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_creating_projection_subscription.cs deleted file mode 100644 index 80a288f34..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_creating_projection_subscription.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Fakes; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_creating_projection_subscription { - [Test] - public void it_can_be_created() { - new EventReorderingReaderSubscription( - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - new FakeTimeProvider(), - 1000, - 2000, - 10000, - 500, - false, - null, - false); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new EventReorderingReaderSubscription( - null, - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - new FakeTimeProvider(), - 1000, - 2000, - 10000, - 500, - false, - null, - false); - }); - } - - [Test] - public void null_describe_source_throws_argument_null_exception() { - Assert.Throws(() => { - new EventReorderingReaderSubscription( - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - null, - new FakeTimeProvider(), - 1000, - 2000, - 10000, - 500, - false, - null, - false); - }); - } - - [Test] - public void null_time_provider_throws_argument_null_exception() { - Assert.Throws(() => { - new EventReorderingReaderSubscription( - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - null, - 1000, - 2000, - 10000, - 500, - false, - null, - false); - }); - } - - private IReaderStrategy CreateReaderStrategy() { - var result = new SourceDefinitionBuilder(); - result.FromAll(); - result.AllEvents(); - return ReaderStrategy.Create( - "test", - 0, - result.Build(), - new RealTimeProvider(), - stopOnEof: false, - runAs: null); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_a_second_event_after_the_delay.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_a_second_event_after_the_delay.cs deleted file mode 100644 index 951f0d370..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_a_second_event_after_the_delay.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_handling_a_second_event_after_the_delay : TestFixtureWithEventReorderingProjectionSubscription { - private Guid _firstEventId; - private DateTime _firstEventTimestamp; -#pragma warning disable 108,114 - private int _timeBetweenEvents; -#pragma warning restore 108,114 - - protected override void When() { - _firstEventId = Guid.NewGuid(); - _firstEventTimestamp = DateTime.UtcNow; - _timeBetweenEvents = 1100; - - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "a", 1, false, _firstEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 250), "a", 2, false, Guid.NewGuid(), "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp.AddMilliseconds(_timeBetweenEvents))); - } - - [Test] - public void no_events_are_passed_to_downstream_handler_immediately() { - Assert.AreEqual(1, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_event_after_the_delay_and_reordering_is_required.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_event_after_the_delay_and_reordering_is_required.cs deleted file mode 100644 index 485452a32..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_event_after_the_delay_and_reordering_is_required.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_handling_an_event_after_the_delay_and_reordering_is_required : - TestFixtureWithEventReorderingProjectionSubscription { - private Guid _firstEventId; - private DateTime _firstEventTimestamp; - private Guid _secondEventId; - - protected override void When() { - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _firstEventTimestamp = DateTime.UtcNow; - - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "a", 1, false, _secondEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 100), "b", 1, false, _firstEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp.AddMilliseconds(1))); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(310, 305), "a", 2, false, Guid.NewGuid(), "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp.AddMilliseconds(_timeBetweenEvents))); - } - - [Test] - public void first_two_events_are_reordered() { - Assert.AreEqual(2, _eventHandler.HandledMessages.Count); - var first = _eventHandler.HandledMessages[0]; - var second = _eventHandler.HandledMessages[1]; - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_idle_notification_and_reordering_is_required.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_idle_notification_and_reordering_is_required.cs deleted file mode 100644 index 66f55e4e4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_an_idle_notification_and_reordering_is_required.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_handling_an_idle_notification_and_reordering_is_required : - TestFixtureWithEventReorderingProjectionSubscription { - private Guid _firstEventId; - private DateTime _firstEventTimestamp; - private Guid _secondEventId; - - protected override void When() { - _firstEventId = Guid.NewGuid(); - _secondEventId = Guid.NewGuid(); - _firstEventTimestamp = DateTime.UtcNow; - - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "a", 1, false, _secondEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 100), "b", 1, false, _firstEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp.AddMilliseconds(1))); - _subscription.Handle( - new ReaderSubscriptionMessage.EventReaderIdle( - Guid.NewGuid(), _firstEventTimestamp.AddMilliseconds(_timeBetweenEvents))); - } - - [Test] - public void events_are_reordered() { - Assert.AreEqual(2, _eventHandler.HandledMessages.Count); - var first = _eventHandler.HandledMessages[0]; - var second = _eventHandler.HandledMessages[1]; - Assert.AreEqual(_firstEventId, first.Data.EventId); - Assert.AreEqual(_secondEventId, second.Data.EventId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_committed_event_passing_the_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_committed_event_passing_the_filter.cs deleted file mode 100644 index 40b4eb654..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_committed_event_passing_the_filter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class - when_handling_committed_event_passing_the_filter : TestFixtureWithEventReorderingProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "a", 1, false, Guid.NewGuid(), "bad-event-type", false, - new byte[0], new byte[0])); - } - - [Test] - public void event_is_not_passed_to_downstream_handler_immediately() { - Assert.AreEqual(0, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_duplicate_events.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_duplicate_events.cs deleted file mode 100644 index 347057036..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_duplicate_events.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_handling_duplicate_events : TestFixtureWithEventReorderingProjectionSubscription { - private DateTime _timestamp; - - protected override void When() { - _timestamp = DateTime.UtcNow; - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(200, 150), "a", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(100, 50), "a", 0, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp.AddMilliseconds(1))); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(200, 150), "a", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp.AddMilliseconds(1))); - _subscription.Handle( - new ReaderSubscriptionMessage.EventReaderIdle( - _projectionCorrelationId, _timestamp.AddMilliseconds(1100))); - } - - [Test] - public void duplicates_are_not_passed_to_downstream_handler() { - Assert.AreEqual(2, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_two_subsequent_events.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_two_subsequent_events.cs deleted file mode 100644 index 1b3d75ec4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_handling_two_subsequent_events.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_handling_two_subsequent_events : TestFixtureWithEventReorderingProjectionSubscription { - private Guid _firstEventId; - private DateTime _firstEventTimestamp; -#pragma warning disable 108,114 - private int _timeBetweenEvents; -#pragma warning restore 108,114 - - protected override void When() { - _firstEventId = Guid.NewGuid(); - _firstEventTimestamp = DateTime.UtcNow; - _timeBetweenEvents = 1; - - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "a", 1, false, _firstEventId, "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 250), "a", 2, false, Guid.NewGuid(), "bad-event-type", false, - new byte[0], new byte[0], _firstEventTimestamp.AddMilliseconds(_timeBetweenEvents))); - } - - [Test] - public void no_events_are_passed_to_downstream_handler_immediately() { - Assert.AreEqual(0, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs deleted file mode 100644 index 8acdd967e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/event_reordering_projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.event_reordering_projection_subscription { - [TestFixture] - public class when_receiving_multiple_events_not_passing_event_filter : - TestFixtureWithEventReorderingProjectionSubscription { - private DateTime _timestamp; - - protected override void Given() { - base.Given(); - _source = builder => { - builder.FromStream("a"); - builder.FromStream("b"); - builder.IncludeEvent("specific-event"); - builder.SetReorderEvents(true); - builder.SetProcessingLag(1000); // ms - }; - } - - protected override void When() { - _timestamp = DateTime.UtcNow; - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(200, 150), "a", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(2000, 950), "a", 2, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp.AddMilliseconds(1))); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _projectionCorrelationId, new TFPos(2100, 2050), "b", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0], _timestamp.AddMilliseconds(1))); - _subscription.Handle( - new ReaderSubscriptionMessage.EventReaderIdle( - _projectionCorrelationId, _timestamp.AddMilliseconds(1100))); - } - - [Test] - public void checkpoint_suggested_message_is_published_once_for_interval() { - Assert.AreEqual(1, _checkpointHandler.HandledMessages.Count); - Assert.AreEqual(2, _checkpointHandler.HandledMessages[0].CheckpointTag.Streams["a"]); - Assert.AreEqual(1, _checkpointHandler.HandledMessages[0].CheckpointTag.Streams["b"]); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/feed_reader/TestFixtureWithFeedReaderService.cs b/src/EventStore.Projections.Core.Tests/Services/feed_reader/TestFixtureWithFeedReaderService.cs deleted file mode 100644 index 44131d356..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/feed_reader/TestFixtureWithFeedReaderService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using EventStore.Projections.Core.EventReaders.Feeds; -using EventStore.Projections.Core.Tests.Services.event_reader; - -namespace EventStore.Projections.Core.Tests.Services.feed_reader { - public abstract class TestFixtureWithFeedReaderService : TestFixtureWithEventReaderService { - protected FeedReaderService _feedReaderService; - - protected override void Given1() { - base.Given1(); - EnableReadAll(); - } - - protected override void GivenAdditionalServices() { - _feedReaderService = new FeedReaderService(_subscriptionDispatcher, _timeProvider); - _bus.Subscribe(_feedReaderService); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader.cs b/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader.cs deleted file mode 100644 index 8685e994f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader.cs +++ /dev/null @@ -1,350 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.EventReaders.Feeds; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.feed_reader { - namespace feed_reader { - [TestFixture] - public class when_creating { - private IPublisher _bus; - - private ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private QuerySourcesDefinition _testQueryDefinition; - - [SetUp] - public void SetUp() { - _bus = new SynchronousScheduler(); - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(_bus); - _testQueryDefinition = new QuerySourcesDefinition {AllStreams = true, AllEvents = true}; - } - - [Test] - public void it_can_be_created() { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, - CheckpointTag.FromPosition(0, 0, -1), 10, Guid.NewGuid(), new NoopEnvelope(), - new RealTimeProvider()); - } - - [Test] - public void null_subscription_dispatcher_throws_argument_null_exception() { - Assert.Throws(() => { - new FeedReader( - null, SystemAccounts.System, _testQueryDefinition, CheckpointTag.FromPosition(0, 0, -1), 10, - Guid.NewGuid(), new NoopEnvelope(), new RealTimeProvider()); - }); - } - - [Test] - public void null_user_account_is_allowed() { - new FeedReader( - _subscriptionDispatcher, null, _testQueryDefinition, CheckpointTag.FromPosition(0, 0, -1), 10, - Guid.NewGuid(), new NoopEnvelope(), new RealTimeProvider()); - } - - [Test] - public void null_query_definition_throws_argument_null_exception() { - Assert.Throws(() => { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, null, CheckpointTag.FromPosition(0, 0, -1), - 10, Guid.NewGuid(), - new NoopEnvelope(), new RealTimeProvider()); - }); - } - - [Test] - public void null_from_position_throws_argument_null_exception() { - Assert.Throws(() => { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, null, 10, - Guid.NewGuid(), - new NoopEnvelope(), new RealTimeProvider()); - }); - } - - [Test] - public void null_envelope_throws_argument_null_exception() { - Assert.Throws(() => { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, - CheckpointTag.FromPosition(0, 0, -1), 10, Guid.NewGuid(), null, new RealTimeProvider()); - }); - } - - [Test] - public void zero_max_events_throws_argument_exception() { - Assert.Throws(() => { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, - CheckpointTag.FromPosition(0, 0, -1), 0, Guid.NewGuid(), new NoopEnvelope(), - new RealTimeProvider()); - }); - } - - [Test] - public void negative_max_events_throws_argument_exception() { - Assert.Throws(() => { - new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, - CheckpointTag.FromPosition(0, 0, -1), -1, Guid.NewGuid(), new NoopEnvelope(), - new RealTimeProvider()); - }); - } - } - - public abstract class FeedReaderSpecification { - protected SynchronousScheduler _bus; - - protected ReaderSubscriptionDispatcher _subscriptionDispatcher; - - protected QuerySourcesDefinition _testQueryDefinition; - protected TestHandler _consumer; - protected FeedReader _feedReader; - - [SetUp] - public void SetUp() { - _bus = new(); - _consumer = new TestHandler(); - _bus.Subscribe(_consumer); - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(_bus); - _testQueryDefinition = GivenQuerySource(); - _feedReader = new FeedReader( - _subscriptionDispatcher, SystemAccounts.System, _testQueryDefinition, GivenFromPosition(), 10, - Guid.NewGuid(), _bus, new RealTimeProvider()); - Given(); - When(); - } - - protected virtual void Given() { - } - - protected abstract void When(); - - protected virtual CheckpointTag GivenFromPosition() { - return CheckpointTag.FromPosition(0, 0, -1); - } - - protected abstract QuerySourcesDefinition GivenQuerySource(); - } - - [TestFixture] - public class when_starting : FeedReaderSpecification { - protected override QuerySourcesDefinition GivenQuerySource() { - return new QuerySourcesDefinition {AllStreams = true, AllEvents = true}; - } - - protected override void When() { - _feedReader.Start(); - } - - [Test] - public void publishes_subscribe_message() { - var subscribe = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, subscribe.Length); - } - - [Test] - public void subscribes_to_a_finite_number_of_events() { - var subscribe = _consumer.HandledMessages.OfType().Single(); - Assert.NotNull(subscribe.Options); - Assert.NotNull(subscribe.Options.StopAfterNEvents); - Assert.Less(0, subscribe.Options.StopAfterNEvents); - Assert.IsTrue(subscribe.Options.StopOnEof); - } - } - - [TestFixture] - public class when_handling_committed_events : FeedReaderSpecification { - private Guid _subscriptionId; - private int _number; - - protected override QuerySourcesDefinition GivenQuerySource() { - return new QuerySourcesDefinition {AllStreams = true, AllEvents = true}; - } - - protected override void Given() { - base.Given(); - _feedReader.Start(); - var subscribe = _consumer.HandledMessages.OfType().Single(); - _subscriptionId = subscribe.SubscriptionId; - _number = 0; - } - - protected override void When() { - for (var i = 0; i < 100; i++) { - _feedReader.Handle( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "stream", i, "stream", i, false, new TFPos(i * 100, i * 100 - 50), - new TFPos(i * 100, i * 100 - 50), Guid.NewGuid(), "type", false, new byte[0], - new byte[0], - new byte[0], null, DateTime.UtcNow), _subscriptionId, _number++)); - } - } - - [Test] - public void does_not_publish_feed_page_message() { - var feedPageMessages = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(0, feedPageMessages.Length); - } - } - - [TestFixture] - public class when_handling_eof_message : FeedReaderSpecification { - private Guid _subscriptionId; - private int _number; - private int _maxN; - - protected override QuerySourcesDefinition GivenQuerySource() { - return new QuerySourcesDefinition {AllStreams = true, AllEvents = true}; - } - - protected override void Given() { - base.Given(); - _feedReader.Start(); - var subscribe = _consumer.HandledMessages.OfType().Single(); - _subscriptionId = subscribe.SubscriptionId; - _maxN = (int)subscribe.Options.StopAfterNEvents; - _number = 0; - for (var i = 0; i < _maxN; i++) { - _feedReader.Handle( - EventReaderSubscriptionMessage.CommittedEventReceived.Sample( - new ResolvedEvent( - "stream", i, "stream", i, false, new TFPos(i * 100, i * 100 - 50), - new TFPos(i * 100, i * 100 - 50), Guid.NewGuid(), "type", false, new byte[0], - new byte[0], - new byte[0], null, DateTime.UtcNow), _subscriptionId, _number++)); - } - } - - protected override void When() { - _feedReader.Handle( - new EventReaderSubscriptionMessage.EofReached( - _subscriptionId, CheckpointTag.FromPosition(0, _maxN * 100, _maxN * 100 - 50), _number++)); - } - - [Test] - public void publishes_feed_page_message() { - var feedPageMessages = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, feedPageMessages.Length); - } - - [Test] - public void publishes_feed_page_with_all_received_events() { - var feedPageMessage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_maxN, feedPageMessage.Events.Length); - } - - [Test] - public void publishes_feed_page_with_events_in_correct_order() { - var feedPageMessage = _consumer.HandledMessages.OfType().Single(); - for (var i = 0; i < feedPageMessage.Events.Length - 1; i++) { - var first = feedPageMessage.Events[i]; - var second = feedPageMessage.Events[i + 1]; - - Assert.That(first.ReaderPosition < second.ReaderPosition); - Assert.That(first.ResolvedEvent.Position < second.ResolvedEvent.Position); - } - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_reading_existing_events : TestFixtureWithFeedReaderService { - private QuerySourcesDefinition _querySourcesDefinition; - private CheckpointTag _fromPosition; - private int _maxEvents; - - protected override void Given() { - base.Given(); - ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - ExistingEvent("test-stream", "type2", "{}", "{Data: 3}"); - - _querySourcesDefinition = new QuerySourcesDefinition - {Streams = new[] {"test-stream"}, AllEvents = true}; - _fromPosition = CheckpointTag.FromStreamPosition(0, "test-stream", -1); - _maxEvents = 2; - } - - protected override IEnumerable When() { - yield return - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), GetInputQueue(), SystemAccounts.System, - _querySourcesDefinition, _fromPosition, _maxEvents); - } - - [Test] - public void publishes_feed_page_message() { - var feedPage = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, feedPage.Length); - } - - [Test] - public void returns_correct_last_reader_position() { - var feedPage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(CheckpointTag.FromStreamPosition(0, "test-stream", 1), feedPage.LastReaderPosition); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_reading_existing_events_by_parts : TestFixtureWithFeedReaderService { - private QuerySourcesDefinition _querySourcesDefinition; - private CheckpointTag _fromPosition; - private int _maxEvents; - - protected override void Given() { - base.Given(); - ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - ExistingEvent("test-stream", "type2", "{}", "{Data: 3}"); - - _querySourcesDefinition = new QuerySourcesDefinition - {Streams = new[] {"test-stream"}, AllEvents = true}; - _fromPosition = CheckpointTag.FromStreamPosition(0, "test-stream", -1); - _maxEvents = 2; - } - - protected override IEnumerable When() { - yield return - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), GetInputQueue(), SystemAccounts.System, - _querySourcesDefinition, _fromPosition, _maxEvents); - var feedPage = _consumer.HandledMessages.OfType().Single(); - yield return - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), GetInputQueue(), SystemAccounts.System, - _querySourcesDefinition, feedPage.LastReaderPosition, _maxEvents); - } - - [Test] - public void publishes_feed_page_message() { - var feedPage = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(2, feedPage.Length); - } - - [Test] - public void returns_correct_last_reader_position() { - var feedPage = _consumer.HandledMessages.OfType().Last(); - Assert.AreEqual(CheckpointTag.FromStreamPosition(0, "test-stream", 2), feedPage.LastReaderPosition); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader_by_event_indexes.cs b/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader_by_event_indexes.cs deleted file mode 100644 index 2638205ef..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/feed_reader/feed_reader_by_event_indexes.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.feed_reader { - namespace feed_reader_by_event_indexes { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_reading_the_first_event : TestFixtureWithFeedReaderService { - private QuerySourcesDefinition _querySourcesDefinition; - private CheckpointTag _fromPosition; - private int _maxEvents; - - private TFPos _tfPos1; - //private TFPos _tfPos2; - //private TFPos _tfPos3; - - protected override void Given() { - base.Given(); - _tfPos1 = ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - //_tfPos2 = ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - //_tfPos3 = ExistingEvent("test-stream", "type2", "{}", "{Data: 3}"); - - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - NoStream("$et-type2"); - NoStream("$et"); - //NOTE: the following events should be late written - //ExistingEvent("$et-type2", "$>", "", "2@test-stream"); - //ExistingEvent("$et-type1", "$>", "", "1@test-stream"); - - _querySourcesDefinition = new QuerySourcesDefinition { - AllStreams = true, - Events = new[] {"type1", "type2"}, - Options = new QuerySourcesDefinitionOptions { } - }; - _fromPosition = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(0, -1), - new Dictionary {{"type1", -1}, {"type2", -1}}); - _maxEvents = 1; // reading the first event - } - - private string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - protected override IEnumerable When() { - yield return - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), GetInputQueue(), SystemAccounts.System, - _querySourcesDefinition, _fromPosition, _maxEvents); - } - - [Test] - public void publishes_feed_page_message() { - var feedPage = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, feedPage.Length); - } - - [Test] - public void returns_correct_last_reader_position() { - var feedPage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual( - CheckpointTag.FromEventTypeIndexPositions(0, _tfPos1, - new Dictionary {{"type1", 0}, {"type2", -1}}), feedPage.LastReaderPosition); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_reading_the_reordered_events_from_the_same_stream : TestFixtureWithFeedReaderService { - private QuerySourcesDefinition _querySourcesDefinition; - private CheckpointTag _fromPosition; - private int _maxEvents; - private TFPos _tfPos1; - private TFPos _tfPos2; - private TFPos _tfPos3; - - protected override void Given() { - base.Given(); - _tfPos1 = ExistingEvent("test-stream", "type1", "{}", "{Data: 1}"); - _tfPos2 = ExistingEvent("test-stream", "type1", "{}", "{Data: 2}"); - _tfPos3 = ExistingEvent("test-stream", "type2", "{}", "{Data: 3}"); - - // writes reordered due to batching or timeouts in system projection - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos1), "0@test-stream"); - ExistingEvent("$et-type2", "$>", TFPosToMetadata(_tfPos3), "2@test-stream"); - ExistingEvent("$et-type1", "$>", TFPosToMetadata(_tfPos2), "1@test-stream"); - NoStream("$et"); - _querySourcesDefinition = new QuerySourcesDefinition { - AllStreams = true, - Events = new[] {"type1", "type2"}, - Options = new QuerySourcesDefinitionOptions { } - }; - _fromPosition = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(0, -1), - new Dictionary {{"type1", -1}, {"type2", -1}}); - _maxEvents = 3; - } - - private string TFPosToMetadata(TFPos tfPos) { - return string.Format(@"{{""$c"":{0},""$p"":{1}}}", tfPos.CommitPosition, tfPos.PreparePosition); - } - - protected override IEnumerable When() { - yield return - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), GetInputQueue(), SystemAccounts.System, - _querySourcesDefinition, _fromPosition, _maxEvents); - } - - [Test] - public void publishes_feed_page_message() { - var feedPage = _consumer.HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, feedPage.Length); - } - - [Test] - public void returns_correct_last_reader_position() { - var feedPage = _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual( - CheckpointTag.FromEventTypeIndexPositions(0, _tfPos3, - new Dictionary {{"type1", 1}, {"type2", 0}}), feedPage.LastReaderPosition); - } - - [Test] - public void returns_correct_event_sequence() { - var feedPage = _consumer.HandledMessages.OfType().Single(); - Assert.That( - new long[] {0, 1, 2}.SequenceEqual( - feedPage.Events.Select(e => e.ResolvedEvent.EventSequenceNumber).OrderBy(v => v))); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/grpc_service/ServerFeaturesTests.cs b/src/EventStore.Projections.Core.Tests/Services/grpc_service/ServerFeaturesTests.cs deleted file mode 100644 index 5e2d21803..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/grpc_service/ServerFeaturesTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using EventStore.Client; -using EventStore.Client.ServerFeatures; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Tests.ClientAPI.projectionsManager; -using Google.Protobuf.Reflection; -using Grpc.Net.Client; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.grpc_service { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class ServerFeaturesTests: SpecificationWithNodeAndProjectionsManager { - private List _supportedEndPoints = new (); - private List _expectedEndPoints = new (); - - public override Task Given() { - _expectedEndPoints.AddRange(GetEndPoints(Client.Projections.Projections.Descriptor)); - var createEndPoint = _expectedEndPoints.FirstOrDefault(ep => ep.MethodName.Contains("create")); - createEndPoint?.Features.Add("track_emitted_streams"); - - return Task.CompletedTask; - } - - public override async Task When() { - - using var channel = GrpcChannel.ForAddress( - new Uri($"https://{_node.HttpEndPoint}"), - new GrpcChannelOptions { - HttpHandler = _node.HttpMessageHandler - }); - var client = new ServerFeatures.ServerFeaturesClient(channel); - - var resp = await client.GetSupportedMethodsAsync(new Empty()); - _supportedEndPoints = resp.Methods.Where(x => x.ServiceName.Contains("projections")).ToList(); - } - - private SupportedMethod[] GetEndPoints(ServiceDescriptor desc) => - desc.Methods.Select(x => new SupportedMethod { - MethodName = x.Name.ToLower(), - ServiceName = x.Service.FullName.ToLower() - }).ToArray(); - - [Test] - public void should_receive_expected_endpoints() { - CollectionAssert.AreEquivalent(_expectedEndPoints, _supportedEndPoints); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_correlation_id.cs b/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_correlation_id.cs deleted file mode 100644 index 5ac032d8b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_correlation_id.cs +++ /dev/null @@ -1,311 +0,0 @@ -using System; -using System.Text; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Standard; -using Newtonsoft.Json.Linq; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.handlers { - public static class categorize_events_by_correlation_id { - [TestFixture] - public class when_handling_simple_event { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - private DateTime _dateTime; - - [SetUp] - public void when() { - _handler = new ByCorrelationId("", Console.WriteLine); - _handler.Initialize(); - _dateTime = DateTime.UtcNow; - var dataBytes = Encoding.ASCII.GetBytes("{}"); - var metadataBytes = Encoding.ASCII.GetBytes("{\"$correlationId\":\"testing1\"}"); - - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), new TFPos(200, 150), - Guid.NewGuid(), - "event_type", true, dataBytes, metadataBytes, null, null, _dateTime), out _state, - out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$bc-testing1", @event.StreamId); - Assert.AreEqual("10@cat1-stream1", @event.Data); - - string eventTimestampJson = null; - var extraMetadata = @event.ExtraMetaData(); - foreach (var kvp in extraMetadata) { - if (kvp.Key.Equals("$eventTimestamp")) { - eventTimestampJson = kvp.Value; - } - } - - Assert.NotNull(eventTimestampJson); - Assert.AreEqual("\"" + _dateTime.ToString("yyyy-MM-ddTHH:mm:ss.ffffffZ") + "\"", eventTimestampJson); - } - } - - [TestFixture] - public class when_handling_link_to_event { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - private DateTime _dateTime; - private Guid _eventId; - - [SetUp] - public void when() { - _handler = new ByCorrelationId("", Console.WriteLine); - _handler.Initialize(); - _dateTime = DateTime.UtcNow; - string sharedState; - - var dataBytes = Encoding.ASCII.GetBytes("10@cat1-stream1"); - var metadataBytes = - Encoding.ASCII.GetBytes("{\"$correlationId\":\"testing2\", \"$whatever\":\"hello\"}"); - var myEvent = new ResolvedEvent("cat2-stream2", 20, "cat2-stream2", 20, true, new TFPos(200, 150), - new TFPos(200, 150), Guid.NewGuid(), "$>", true, dataBytes, metadataBytes, null, null, _dateTime); - - _eventId = myEvent.EventId; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - myEvent, out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$bc-testing2", @event.StreamId); - Assert.AreEqual("10@cat1-stream1", @event.Data); - - string eventTimestampJson = null; - string linkJson = null; - var extraMetadata = @event.ExtraMetaData(); - foreach (var kvp in extraMetadata) { - switch (kvp.Key) { - case "$eventTimestamp": - eventTimestampJson = kvp.Value; - break; - case "$link": - linkJson = kvp.Value; - break; - } - } - - Assert.NotNull(eventTimestampJson); - Assert.AreEqual("\"" + _dateTime.ToString("yyyy-MM-ddTHH:mm:ss.ffffffZ") + "\"", eventTimestampJson); - - //the link's metadata should be copied to $link.metadata and id to $link.eventId - Assert.NotNull(linkJson); - var link = JObject.Parse(linkJson); - Assert.AreEqual(link.GetValue("eventId").ToObject(), _eventId.ToString()); - - var linkMetadata = (JObject)link.GetValue("metadata"); - Assert.AreEqual(linkMetadata.GetValue("$correlationId").ToObject(), "testing2"); - Assert.AreEqual(linkMetadata.GetValue("$whatever").ToObject(), "hello"); - } - } - - [TestFixture] - public class when_handling_non_json_event { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new ByCorrelationId("", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), Guid.NewGuid(), - "event_type", false, "non_json_data", "non_json_metadata"), out _state, out sharedState, - out _emittedEvents); - } - - [Test] - public void result_is_false() { - Assert.IsFalse(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void does_not_emit_link() { - Assert.IsNull(_emittedEvents); - } - } - - [TestFixture] - public class when_handling_json_event_with_no_correlation_id { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new ByCorrelationId("", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), Guid.NewGuid(), - "event_type", true, "{}", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_false() { - Assert.IsFalse(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void does_not_emit_link() { - Assert.IsNull(_emittedEvents); - } - } - - [TestFixture] - public class when_handling_json_event_with_non_json_metadata { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new ByCorrelationId("", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), Guid.NewGuid(), - "event_type", true, "{}", "non_json_metadata"), out _state, out sharedState, - out _emittedEvents); - } - - [Test] - public void result_is_false() { - Assert.IsFalse(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void does_not_emit_link() { - Assert.IsNull(_emittedEvents); - } - } - - [TestFixture] - public class with_custom_valid_correlation_id_property { - private ByCorrelationId _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - private string source = "{\"correlationIdProperty\":\"$myCorrelationId\"}"; - - [SetUp] - public void when() { - _handler = new ByCorrelationId(source, Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), Guid.NewGuid(), - "event_type", true, "{}", "{\"$myCorrelationId\":\"testing1\"}"), out _state, out sharedState, - out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$bc-testing1", @event.StreamId); - Assert.AreEqual("10@cat1-stream1", @event.Data); - } - } - - [TestFixture] - public class with_custom_invalid_correlation_id_property { - private string source = "{\"thisisnotvalid\":\"$myCorrelationId\"}"; - - [SetUp] - public void when() { - } - - [Test] - public void should_throw_invalid_operation_exception() { - Assert.Throws(() => { new ByCorrelationId(source, Console.WriteLine); }); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_stream_path.cs b/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_stream_path.cs deleted file mode 100644 index 29d1f5bf6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/handlers/categorize_events_by_stream_path.cs +++ /dev/null @@ -1,226 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Standard; -using NUnit.Framework; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Tests.Services.handlers { - public static class categorize_events_by_stream_path { - [TestFixture] - public class when_handling_simple_event { - private CategorizeEventsByStreamPath _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new CategorizeEventsByStreamPath("-", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat1-stream1", 10, "cat1-stream1", 10, false, new TFPos(200, 150), Guid.NewGuid(), - "event_type", true, "{}", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$ce-cat1", @event.StreamId); - Assert.AreEqual("10@cat1-stream1", @event.Data); - } - } - - [TestFixture] - public class when_handling_link_to_event { - private CategorizeEventsByStreamPath _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new CategorizeEventsByStreamPath("-", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat2-stream2", 20, "cat2-stream2", 20, true, new TFPos(200, 150), Guid.NewGuid(), - "$>", true, "10@cat1-stream1", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$ce-cat2", @event.StreamId); - Assert.AreEqual("10@cat1-stream1", @event.Data); - } - } - - [TestFixture] - public class when_handling_normal_stream_metadata_event { - private CategorizeEventsByStreamPath _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new CategorizeEventsByStreamPath("-", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "$$cat3-stream3", 20, "$$cat3-stream3", 20, true, new TFPos(200, 150), Guid.NewGuid(), - "$metadata", true, "{}", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void does_not_emit_events() { - Assert.IsNull(_emittedEvents); - } - } - -[TestFixture] - public class when_handling_soft_deleted_stream_metadata_event { - private CategorizeEventsByStreamPath _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new CategorizeEventsByStreamPath("-", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "$$cat4-stream4", 20, "$$cat4-stream4", 20, true, new TFPos(200, 150), Guid.NewGuid(), - "$metadata", true, "{ \"$tb\": "+long.MaxValue+" }", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$ce-cat4", @event.StreamId); - Assert.AreEqual("20@$$cat4-stream4", @event.Data); - var metadata = new Dictionary(); - foreach(var kvp in @event.ExtraMetaData()){ - metadata[kvp.Key] = kvp.Value; - } - Assert.NotNull(metadata["$o"]); - Assert.AreEqual("\"cat4-stream4\"", metadata["$o"]); - Assert.NotNull(metadata["$deleted"]); - Assert.AreEqual("-1", metadata["$deleted"]); - } - } - -[TestFixture] - public class when_handling_hard_deleted_stream_event { - private CategorizeEventsByStreamPath _handler; - private string _state; - private EmittedEventEnvelope[] _emittedEvents; - private bool _result; - - [SetUp] - public void when() { - _handler = new CategorizeEventsByStreamPath("-", Console.WriteLine); - _handler.Initialize(); - string sharedState; - _result = _handler.ProcessEvent( - "", CheckpointTag.FromPosition(0, 200, 150), null, - new ResolvedEvent( - "cat5-stream5", 20, "cat5-stream5", 20, true, new TFPos(200, 150), Guid.NewGuid(), - "$streamDeleted", true, "{}", "{}"), out _state, out sharedState, out _emittedEvents); - } - - [Test] - public void result_is_true() { - Assert.IsTrue(_result); - } - - [Test] - public void state_stays_null() { - Assert.IsNull(_state); - } - - [Test] - public void emits_correct_link() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - Assert.AreEqual("$>", @event.EventType); - Assert.AreEqual("$ce-cat5", @event.StreamId); - Assert.AreEqual("20@cat5-stream5", @event.Data); - - var metadata = new Dictionary(); - foreach(var kvp in @event.ExtraMetaData()){ - metadata[kvp.Key] = kvp.Value; - } - Assert.NotNull(metadata["$o"]); - Assert.AreEqual("\"cat5-stream5\"", metadata["$o"]); - Assert.NotNull(metadata["$deleted"]); - Assert.AreEqual("-1", metadata["$deleted"]); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/http_service/authorization_tests.cs b/src/EventStore.Projections.Core.Tests/Services/http_service/authorization_tests.cs deleted file mode 100644 index c5672e7e4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/http_service/authorization_tests.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading.Tasks; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Tests.ClientAPI.Cluster; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.Transport.Http { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class Authorization : specification_with_standard_projections_runnning { - private Dictionary _httpClients = new Dictionary(); - private TimeSpan _timeout = TimeSpan.FromSeconds(10); - private int _leaderId; - - private HttpClient CreateHttpClient(string username, string password) { - var client = new HttpClient(new HttpClientHandler { - AllowAutoRedirect = false - }) { - Timeout = _timeout - }; - if (!string.IsNullOrEmpty(username)) { - client.DefaultRequestHeaders.Authorization = - new AuthenticationHeaderValue( - "Basic", System.Convert.ToBase64String( - System.Text.Encoding.ASCII.GetBytes( - $"{username}:{password}"))); - } - - return client; - } - - private async Task SendRequest(HttpClient client, HttpMethod method, string url, string body, string contentType) { - using var request = new HttpRequestMessage {Method = method, RequestUri = new Uri(url)}; - - if (body != null) { - var bodyBytes = Helper.UTF8NoBom.GetBytes(body); - var stream = new MemoryStream(bodyBytes); - var content = new StreamContent(stream); - content.Headers.ContentLength = bodyBytes.Length; - if (contentType != null) - content.Headers.ContentType = new MediaTypeHeaderValue(contentType); - request.Content = content; - } - - var result = await client.SendAsync(request); - return (int)result.StatusCode; - } - - private HttpMethod GetHttpMethod(string method) { - switch (method) { - case "GET": - return HttpMethod.Get; - case "POST": - return HttpMethod.Post; - case "PUT": - return HttpMethod.Put; - case "DELETE": - return HttpMethod.Delete; - default: - throw new Exception("Unknown Http Method"); - } - } - - private int GetAuthLevel(string userAuthorizationLevel) { - switch (userAuthorizationLevel) { - case "None": - return 0; - case "User": - return 1; - case "Ops": - return 2; - case "Admin": - return 3; - default: - throw new Exception("Unknown authorization level"); - } - } - public async Task CreateUser(string username, string password) { - for (int trial = 1; trial <= 5; trial++) { - try { - var dataStr = string.Format("{{loginName: '{0}', fullName: '{1}', password: '{2}', groups: []}}", username, username, password); - var data = Helper.UTF8NoBom.GetBytes(dataStr); - var stream = new MemoryStream(data); - var content = new StreamContent(stream); - content.Headers.Add("Content-Type", "application/json"); - - var res = await _httpClients["Admin"].PostAsync( - string.Format("http://{0}/users/", _nodes[_leaderId].HttpEndPoint), - content - ); - res.EnsureSuccessStatusCode(); - break; - } catch (HttpRequestException) { - if (trial == 5) { - throw new Exception(string.Format("Error creating user: {0}", username)); - } - await Task.Delay(1000); - } - } - } - - protected override async Task Given() { - await base.Given(); - //find the leader node - for (int i = 0; i < _nodes.Length; i++) { - if (_nodes[i].NodeState == EventStore.Core.Data.VNodeState.Leader) { - _leaderId = i; - break; - } - } - - _httpClients["Admin"] = CreateHttpClient("admin", "changeit"); - _httpClients["Ops"] = CreateHttpClient("ops", "changeit"); - await CreateUser("user", "changeit"); - _httpClients["User"] = CreateHttpClient("user", "changeit"); - _httpClients["None"] = CreateHttpClient(null, null); - } - - [OneTimeTearDown] - public override Task TestFixtureTearDown() { - foreach (var kvp in _httpClients) { - kvp.Value.Dispose(); - } - return base.TestFixtureTearDown(); - } - //just using Ignore not being honored for Combinatorial tests in the dotnet test runner - //[Test, Combinatorial, Ignore("Invalid URl templates, retained for future refactoring")] - public async Task authorization_tests( - [Values( - "None", - "User", - "Ops", - "Admin" - )] string userAuthorizationLevel, - [Values( - "/web/es/js/projections/{*remaining_path};GET;None", - "/web/es/js/projections/v8/Prelude/{*remaining_path};GET;None", - "/web/projections;GET;None", - "/projections;GET;User", - "/projections/any;GET;User", - "/projections/all-non-transient;GET;User", - "/projections/transient;GET;User", - "/projections/onetime;GET;User", - "/projections/continuous;GET;User", - "/projections/transient?name=name&type=type&enabled={enabled};POST;User", /* /projections/transient?name={name}&type={type}&enabled={enabled} */ - "/projections/onetime?name=name&type=type&enabled={enabled}&checkpoints={checkpoints}&emit={emit}&trackemittedstreams={trackemittedstreams};POST;Ops", /* /projections/onetime?name={name}&type={type}&enabled={enabled}&checkpoints={checkpoints}&emit={emit}&trackemittedstreams={trackemittedstreams} */ - "/projections/continuous?name=name&type=type&enabled={enabled}&emit={emit}&trackemittedstreams={trackemittedstreams};POST;Ops", /* /projections/continuous?name={name}&type={type}&enabled={enabled}&emit={emit}&trackemittedstreams={trackemittedstreams} */ - "/projection/name/query?config={config};GET;User", /* /projection/{name}/query?config={config} */ - "/projection/name/query?type={type}&emit={emit};PUT;User", /* /projection/{name}/query?type={type}&emit={emit} */ - "/projection/name;GET;User", /* /projection/{name} */ - "/projection/name?deleteStateStream={deleteStateStream}&deleteCheckpointStream={deleteCheckpointStream}&deleteEmittedStreams={deleteEmittedStreams};DELETE;Ops", /* /projection/{name}?deleteStateStream={deleteStateStream}&deleteCheckpointStream={deleteCheckpointStream}&deleteEmittedStreams={deleteEmittedStreams} */ - "/projection/name/statistics;GET;User", /* projection/{name}/statistics */ - "/projections/read-events;POST;User", - "/projection/{name}/state?partition={partition};GET;User", - "/projection/{name}/result?partition={partition};GET;User", - "/projection/{name}/command/disable?enableRunAs={enableRunAs};POST;User", - "/projection/{name}/command/enable?enableRunAs={enableRunAs};POST;User", - "/projection/{name}/command/reset?enableRunAs={enableRunAs};POST;User", - "/projection/{name}/command/abort?enableRunAs={enableRunAs};POST;User", - "/projection/{name}/config;GET;Ops", - "/projection/{name}/config;PUT;Ops" - /*"/sys/subsystems;GET;Ops"*/ /* this endpoint has been commented since this controller is not registered when using a MiniNode */ - )] string httpEndpointDetails - ) { - /*use the leader node endpoint to avoid any redirects*/ - var nodeEndpoint = _nodes[_leaderId].HttpEndPoint; - var httpEndpointTokens = httpEndpointDetails.Split(';'); - var endpointUrl = httpEndpointTokens[0]; - var httpMethod = GetHttpMethod(httpEndpointTokens[1]); - var requiredMinAuthorizationLevel = httpEndpointTokens[2]; - - var url = $"http://{nodeEndpoint}{endpointUrl}"; - var body = GetData(httpMethod, endpointUrl); - var contentType = httpMethod == HttpMethod.Post || httpMethod == HttpMethod.Put || httpMethod == HttpMethod.Delete ? "application/json" : null; - var statusCode = await SendRequest(_httpClients[userAuthorizationLevel], httpMethod, url, body, contentType); - - if (GetAuthLevel(userAuthorizationLevel) >= GetAuthLevel(requiredMinAuthorizationLevel)) { - Assert.AreNotEqual(401, statusCode); - } else { - Assert.AreEqual(401, statusCode); - } - } - - private string GetData(HttpMethod httpMethod, string url) { - if (httpMethod == HttpMethod.Post || httpMethod == HttpMethod.Put || httpMethod == HttpMethod.Delete) { - return "{}"; - } else { - return null; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/mixed_checkpoint_tags.cs b/src/EventStore.Projections.Core.Tests/Services/mixed_checkpoint_tags.cs deleted file mode 100644 index d8054f166..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/mixed_checkpoint_tags.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services { - [TestFixture] - public class mixed_checkpoint_tags { - private readonly CheckpointTag _a = CheckpointTag.FromStreamPosition(0, "stream1", 9); - private readonly CheckpointTag _b = CheckpointTag.FromStreamPosition(0, "stream2", 15); - private readonly CheckpointTag _c = CheckpointTag.FromPosition(0, 50, 29); - - [Test] - public void are_not_equal() { - Assert.AreNotEqual(_a, _b); - Assert.AreNotEqual(_a, _c); - Assert.AreNotEqual(_b, _c); - - Assert.IsTrue(_a != _b); - Assert.IsTrue(_a != _c); - Assert.IsTrue(_b != _c); - } - - [Test] - public void cannot_be_compared() { - Assert.IsTrue(throws(() => _a > _b)); - Assert.IsTrue(throws(() => _a >= _b)); - Assert.IsTrue(throws(() => _a > _c)); - Assert.IsTrue(throws(() => _a >= _c)); - Assert.IsTrue(throws(() => _b > _c)); - Assert.IsTrue(throws(() => _b >= _c)); - Assert.IsTrue(throws(() => _a < _b)); - Assert.IsTrue(throws(() => _a <= _b)); - Assert.IsTrue(throws(() => _a < _c)); - Assert.IsTrue(throws(() => _a <= _c)); - Assert.IsTrue(throws(() => _b < _c)); - Assert.IsTrue(throws(() => _b <= _c)); - } - - private bool throws(Func func) { - try { - func(); - return false; - } catch (Exception) { - return true; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/not_started_event_distribution_point_should.cs b/src/EventStore.Projections.Core.Tests/Services/not_started_event_distribution_point_should.cs deleted file mode 100644 index 8b1378917..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/not_started_event_distribution_point_should.cs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state/partition_state.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state/partition_state.cs deleted file mode 100644 index 0707964ad..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state/partition_state.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state { - public static class partition_state { - [TestFixture] - public class when_creating { - [Test] - public void throws_argument_null_exception_if_state_is_null() { - Assert.Throws(() => { - new PartitionState(null, "result", CheckpointTag.FromPosition(0, 100, 50)); - }); - } - - [Test] - public void throws_argument_null_exception_if_caused_by_is_null() { - Assert.Throws(() => { new PartitionState("state", "result", null); }); - } - - [Test] - public void can_be_created() { - new PartitionState("state", "result", CheckpointTag.FromPosition(0, 100, 50)); - } - } - - [TestFixture] - public class can_be_deserialized_from_serialized_form { - [Test] - public void simple_object() { - AssertCorrect(@""); - AssertCorrect(@"{""a"":""b""}"); - AssertCorrect(@"{""a"":""b"",""c"":1}"); - AssertCorrect(@"{""z"":null,""a"":""b"",""c"":1}"); - } - - [Test] - public void complex_object() { - AssertCorrect(@"{""a"":""b"",""c"":[1,2,3]}"); - AssertCorrect(@"{""a"":""b"",""c"":{""a"":""b""}}"); - AssertCorrect(@"{""a"":""b"",""c"":[{},[],null]}"); - } - - [Test] - public void array() { - AssertCorrect(@"[]"); - AssertCorrect(@"[""one"",""two""]"); - AssertCorrect(@"[{""data"":{}}]"); - } - - [Test] - public void dates() { - foreach(var info in TimeZoneInfo.GetSystemTimeZones()) - AssertCorrect($@"[""{DateTimeOffset.UtcNow.ToOffset(info.BaseUtcOffset):yyyy-MM-ddThh:mm:sszzz}""]"); - } - - [Test] - public void null_deserialization() { - var deserialized = PartitionState.Deserialize(null, CheckpointTag.FromPosition(0, 100, 50)); - Assert.AreEqual("", deserialized.State); - Assert.IsNull(deserialized.Result); - } - - private void AssertCorrect(string state, string result = null) { - var partitionState = new PartitionState(state, result, CheckpointTag.FromPosition(0, 100, 50)); - var serialized = partitionState.Serialize(); - var deserialized = PartitionState.Deserialize(serialized, CheckpointTag.FromPosition(0, 100, 50)); - - Assert.AreEqual(partitionState.State, deserialized.State); - Assert.AreEqual(partitionState.Result, deserialized.Result); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state.cs deleted file mode 100644 index 4010a9cf9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_caching_a_parition_state { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag; - - [SetUp] - public void when() { - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag = CheckpointTag.FromPosition(0, 1000, 900); - _cache.CachePartitionState( - "partition", new PartitionState("data", null, _cachedAtCheckpointTag)); - } - - [Test] - public void the_state_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { - var state = _cache.GetLockedPartitionState("partition"); - Assert.AreEqual("data", state.State); - }); - } - - [Test] - public void the_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - - [Test] - public void the_state_can_be_retrieved_as_unlocked_and_relocked_at_later_position() { - var state = _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(0, 1500, 1400)); - Assert.AreEqual("data", state.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state_as_locked.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state_as_locked.cs deleted file mode 100644 index bf1c38136..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_caching_a_parition_state_as_locked.cs +++ /dev/null @@ -1,38 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_caching_a_parition_state_as_locked { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag; - - [SetUp] - public void when() { - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag = CheckpointTag.FromPosition(0, 1000, 900); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, _cachedAtCheckpointTag), - _cachedAtCheckpointTag); - } - - [Test] - public void the_state_can_be_retrieved_as_locked() { - var state = _cache.GetLockedPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - - [Test] - public void the_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - - [Test] - public void the_state_can_be_retrieved_as_unlocked_and_relocked_at_later_position() { - var state = _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(0, 1500, 1400)); - Assert.AreEqual("data", state.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_earlier_position.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_earlier_position.cs deleted file mode 100644 index 6ce6be7d4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_earlier_position.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_relocking_the_state_at_earlier_position { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag; - - [SetUp] - public void given() { - //given - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag = CheckpointTag.FromPosition(0, 1000, 900); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, _cachedAtCheckpointTag), - _cachedAtCheckpointTag); - } - - [Test] - public void thorws_invalid_operation_exception() { - Assert.Throws(() => { - _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(0, 500, 400)); - }); - } - - [Test] - public void the_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_later_position.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_later_position.cs deleted file mode 100644 index 9425d3811..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_later_position.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_relocking_the_state_at_later_position { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag; - private PartitionState _relockedData; - - [SetUp] - public void given() { - //given - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag = CheckpointTag.FromPosition(0, 1000, 900); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, _cachedAtCheckpointTag), - _cachedAtCheckpointTag); - _relockedData = _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(0, 2000, 1900)); - } - - [Test] - public void returns_correct_cached_data() { - Assert.AreEqual("data", _relockedData.State); - } - - [Test] - public void relocked_state_can_be_retrieved_as_locked() { - var state = _cache.GetLockedPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - - [Test] - public void cannot_be_relocked_at_the_previous_position() { - Assert.Throws(() => { - _cache.TryGetAndLockPartitionState("partition", _cachedAtCheckpointTag); - }); - } - - [Test] - public void the_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_the_same_position.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_the_same_position.cs deleted file mode 100644 index e5d525328..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_relocking_the_state_at_the_same_position.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_relocking_the_state_at_the_same_position { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag; - - [SetUp] - public void given() { - //given - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag = CheckpointTag.FromPosition(0, 1000, 900); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, _cachedAtCheckpointTag), - _cachedAtCheckpointTag); - } - - [Test] - public void thorws_invalid_operation_exception_if_not_allowed() { - Assert.Throws(() => { - _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(0, 1000, 900)); - }); - } - - [Test] - public void the_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition"); - Assert.AreEqual("data", state.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_created.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_created.cs deleted file mode 100644 index 83e566ae7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_created.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_the_partition_state_cache_has_been_created { - private PartitionStateCache _cache; - private Exception _exception; - - [SetUp] - public void when() { - try { - _cache = new PartitionStateCache(); - } catch (Exception ex) { - _exception = ex; - } - } - - [Test] - public void it_has_been_created() { - Assert.IsNotNull(_cache, ((object)_exception ?? "").ToString()); - } - - [Test] - public void state_can_be_cached() { - CheckpointTag at = CheckpointTag.FromPosition(0, 100, 90); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, at), at); - } - - [Test] - public void no_items_are_cached() { - Assert.AreEqual(0, _cache.CachedItemCount); - } - - [Test] - public void random_item_cannot_be_retrieved_as_locked() { - Assert.IsNull( - _cache.TryGetAndLockPartitionState( - "random", CheckpointTag.FromPosition(0, 200, 190)), - "Cache should be empty"); - } - - [Test] - public void random_item_cannot_be_retrieved() { - Assert.IsNull(_cache.TryGetPartitionState("random"), "Cache should be empty"); - } - - [Test] - public void root_partition_state_cannot_be_retrieved() { - Assert.IsNull( - _cache.TryGetAndLockPartitionState( - "", CheckpointTag.FromPosition(0, 200, 190)), - "Cache should be empty"); - } - - [Test] - public void unlock_succeeds() { - _cache.Unlock(CheckpointTag.FromPosition(0, 300, 290)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_reinitialized.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_reinitialized.cs deleted file mode 100644 index 6d59659e9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_the_partition_state_cache_has_been_reinitialized.cs +++ /dev/null @@ -1,74 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_the_partition_state_cache_has_been_reinitialized { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag1; - private CheckpointTag _cachedAtCheckpointTag2; - private CheckpointTag _cachedAtCheckpointTag3; - - [SetUp] - public void setup() { - //given - _cache = new PartitionStateCache(10); - _cachedAtCheckpointTag1 = CheckpointTag.FromPosition(0, 1000, 900); - for (var i = 0; i < 15; i++) { - CheckpointTag at = CheckpointTag.FromPosition(0, 1000 + (i * 100), 1000 + (i * 100) - 50); - _cache.CacheAndLockPartitionState("partition1", new PartitionState("data1", null, at), at); - } - - _cachedAtCheckpointTag2 = CheckpointTag.FromPosition(0, 20100, 20050); - _cachedAtCheckpointTag3 = CheckpointTag.FromPosition(0, 20200, 20150); - _cache.CacheAndLockPartitionState( - "partition1", new PartitionState("data1", null, _cachedAtCheckpointTag1), _cachedAtCheckpointTag1); - _cache.CacheAndLockPartitionState( - "partition2", new PartitionState("data2", null, _cachedAtCheckpointTag2), _cachedAtCheckpointTag2); - _cache.CacheAndLockPartitionState( - "partition3", new PartitionState("data3", null, _cachedAtCheckpointTag3), _cachedAtCheckpointTag3); - _cache.Unlock(_cachedAtCheckpointTag2); - // when - _cache.Initialize(); - } - - [Test] - public void state_can_be_cached() { - CheckpointTag at = CheckpointTag.FromPosition(0, 100, 90); - _cache.CacheAndLockPartitionState("partition", new PartitionState("data", null, at), at); - } - - [Test] - public void no_items_are_cached() { - Assert.AreEqual(0, _cache.CachedItemCount); - } - - [Test] - public void random_item_cannot_be_retrieved_as_locked() { - Assert.IsNull( - _cache.TryGetAndLockPartitionState( - "random", CheckpointTag.FromPosition(0, 200, 190)), - "Cache should be empty"); - } - - [Test] - public void random_item_cannot_be_retrieved() { - Assert.IsNull(_cache.TryGetPartitionState("random"), "Cache should be empty"); - } - - [Test] - public void root_partition_state_cannot_be_retrieved() { - Assert.IsNull( - _cache.TryGetAndLockPartitionState( - "", CheckpointTag.FromPosition(0, 200, 190)), - "Cache should be empty"); - } - - [Test] - public void unlock_succeeds() { - _cache.Unlock(CheckpointTag.FromPosition(0, 300, 290)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_an_overflowed_cache.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_an_overflowed_cache.cs deleted file mode 100644 index 96bc087d5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_an_overflowed_cache.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_unlocking_an_overflowed_cache { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag1; - private CheckpointTag _cachedAtCheckpointTag2; - private CheckpointTag _cachedAtCheckpointTag3; - - [SetUp] - public void setup() { - //given - _cache = new PartitionStateCache(10); - _cachedAtCheckpointTag1 = CheckpointTag.FromPosition(0, 1000, 900); - for (var i = 0; i < 15; i++) { - CheckpointTag at = CheckpointTag.FromPosition(0, 1000 + (i * 100), 1000 + (i * 100) - 50); - _cache.CacheAndLockPartitionState("partition1", new PartitionState("data1", null, at), at); - } - - _cachedAtCheckpointTag2 = CheckpointTag.FromPosition(0, 20100, 20050); - _cachedAtCheckpointTag3 = CheckpointTag.FromPosition(0, 20200, 20150); - _cache.CacheAndLockPartitionState( - "partition1", new PartitionState("data1", null, _cachedAtCheckpointTag1), _cachedAtCheckpointTag1); - _cache.CacheAndLockPartitionState( - "partition2", new PartitionState("data2", null, _cachedAtCheckpointTag2), _cachedAtCheckpointTag2); - _cache.CacheAndLockPartitionState( - "partition3", new PartitionState("data3", null, _cachedAtCheckpointTag3), _cachedAtCheckpointTag3); - // when - _cache.Unlock(_cachedAtCheckpointTag2); - } - - [Test] - public void partitions_locked_before_the_unlock_position_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { _cache.GetLockedPartitionState("partition1"); }); - } - - [Test] - public void - the_first_partition_locked_before_the_unlock_position_cannot_be_retrieved_and_relocked_at_later_position() { - var data = _cache.TryGetAndLockPartitionState( - "partition1", CheckpointTag.FromPosition(0, 25000, 24000)); - Assert.AreEqual("data1", data.State); - } - - [Test] - public void partitions_locked_at_the_unlock_position_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { _cache.GetLockedPartitionState("partition2"); }); - } - - [Test] - public void the_still_cached_unlocked_state_can_be_retrieved() { - var state = _cache.TryGetPartitionState("partition2"); - Assert.AreEqual("data2", state.State); - } - - [Test] - public void partitions_locked_at_the_unlock_position_can_be_retrieved_and_relocked_at_later_position() { - var data = _cache.TryGetAndLockPartitionState( - "partition2", CheckpointTag.FromPosition(0, 25000, 24000)); - Assert.AreEqual("data2", data.State); - } - - [Test] - public void partitions_locked_after_the_unlock_position_can_be_retrieved_as_locked() { - var data = _cache.GetLockedPartitionState("partition3"); - Assert.AreEqual("data3", data.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_and_forgetting_part_of_cached_states.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_and_forgetting_part_of_cached_states.cs deleted file mode 100644 index 13f016e4b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_and_forgetting_part_of_cached_states.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_unlocking_and_forgetting_part_of_cached_states { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag1; - private CheckpointTag _cachedAtCheckpointTag2; - private CheckpointTag _cachedAtCheckpointTag3; - - [SetUp] - public void setup() { - //given - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag1 = CheckpointTag.FromPosition(0, 1000, 900); - _cachedAtCheckpointTag2 = CheckpointTag.FromPosition(0, 1200, 1100); - _cachedAtCheckpointTag3 = CheckpointTag.FromPosition(0, 1400, 1300); - _cache.CacheAndLockPartitionState( - "partition1", new PartitionState("data1", null, _cachedAtCheckpointTag1), _cachedAtCheckpointTag1); - _cache.CacheAndLockPartitionState( - "partition2", new PartitionState("data2", null, _cachedAtCheckpointTag2), _cachedAtCheckpointTag2); - _cache.CacheAndLockPartitionState( - "partition3", new PartitionState("data3", null, _cachedAtCheckpointTag3), _cachedAtCheckpointTag3); - // when - _cache.Unlock(_cachedAtCheckpointTag2, forgetUnlocked: true); - } - - [Test] - public void partitions_locked_before_the_unlock_position_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { _cache.GetLockedPartitionState("partition1"); }); - } - - [Test] - public void partitions_locked_before_the_unlock_position_cannot_be_retrieved_and_relocked_at_later_position() { - var data = _cache.TryGetAndLockPartitionState("partition1", CheckpointTag.FromPosition(0, 1600, 1500)); - Assert.IsNull(data); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_part_of_cached_states.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_part_of_cached_states.cs deleted file mode 100644 index 4b4d06c82..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_cache/when_unlocking_part_of_cached_states.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_cache { - [TestFixture] - public class when_unlocking_part_of_cached_states { - private PartitionStateCache _cache; - private CheckpointTag _cachedAtCheckpointTag1; - private CheckpointTag _cachedAtCheckpointTag2; - private CheckpointTag _cachedAtCheckpointTag3; - - [SetUp] - public void setup() { - //given - _cache = new PartitionStateCache(); - _cachedAtCheckpointTag1 = CheckpointTag.FromPosition(0, 1000, 900); - _cachedAtCheckpointTag2 = CheckpointTag.FromPosition(0, 1200, 1100); - _cachedAtCheckpointTag3 = CheckpointTag.FromPosition(0, 1400, 1300); - _cache.CacheAndLockPartitionState( - "partition1", new PartitionState("data1", null, _cachedAtCheckpointTag1), _cachedAtCheckpointTag1); - _cache.CacheAndLockPartitionState( - "partition2", new PartitionState("data2", null, _cachedAtCheckpointTag2), _cachedAtCheckpointTag2); - _cache.CacheAndLockPartitionState( - "partition3", new PartitionState("data3", null, _cachedAtCheckpointTag3), _cachedAtCheckpointTag3); - // when - _cache.Unlock(_cachedAtCheckpointTag2); - } - - [Test] - public void partitions_locked_before_the_unlock_position_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { _cache.GetLockedPartitionState("partition1"); }); - } - - [Test] - public void partitions_locked_before_the_unlock_position_can_be_retrieved_and_relocked_at_later_position() { - var data = _cache.TryGetAndLockPartitionState( - "partition1", CheckpointTag.FromPosition(0, 1600, 1500)); - Assert.AreEqual("data1", data.State); - } - - - [Test] - public void partitions_locked_at_the_unlock_position_cannot_be_retrieved_as_locked() { - Assert.Throws(() => { _cache.GetLockedPartitionState("partition2"); }); - } - - [Test] - public void partitions_locked_at_the_unlock_position_cannot_be_retrieved_as_relocked_at_later_position() { - var data = _cache.TryGetAndLockPartitionState( - "partition2", CheckpointTag.FromPosition(0, 1600, 1500)); - Assert.AreEqual("data2", data.State); - } - - [Test] - public void partitions_locked_after_the_unlock_position_can_be_retrieved_as_locked() { - var data = _cache.GetLockedPartitionState("partition3"); - Assert.AreEqual("data3", data.State); - } - - [Test] - public void no_other_partition_states_can_be_locked_before_the_unlock_position() { - Assert.Throws(() => { - CheckpointTag at = CheckpointTag.FromPosition(0, 1040, 1030); - _cache.CacheAndLockPartitionState("partition4", new PartitionState("data4", null, at), at); - }); - } - - [Test] - public void cached_partition_states_cannot_be_locked_before_the_unlock_position() { - Assert.Throws(() => { - _cache.TryGetAndLockPartitionState( - "partition1", CheckpointTag.FromPosition(0, 1040, 1030)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/FakeEventWriter.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/FakeEventWriter.cs deleted file mode 100644 index 0f8b5da53..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/FakeEventWriter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - class FakeEventWriter : IEventWriter { - private readonly List _writes = new List(); - - public List Writes { - get { return _writes; } - } - - public void ValidateOrderAndEmitEvents(EmittedEventEnvelope[] events) { - Writes.Add(events.Select(v => v.Event).ToArray()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_created.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_created.cs deleted file mode 100644 index e715181ec..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_created.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - [TestFixture] - public class when_created { - private PartitionStateUpdateManager _updateManager; - - [SetUp] - public void setup() { - _updateManager = new PartitionStateUpdateManager(ProjectionNamesBuilder.CreateForTest("projection")); - } - - [Test] - public void handles_state_updated() { - _updateManager.StateUpdated("partition", - new PartitionState("state", null, CheckpointTag.FromPosition(0, 100, 50)), - CheckpointTag.FromPosition(0, 200, 150)); - } - - [Test] - public void emit_events_does_not_write_any_events() { - _updateManager.EmitEvents(new FakeEventWriter()); - } - - class FakeEventWriter : IEventWriter { - public void ValidateOrderAndEmitEvents(EmittedEventEnvelope[] events) { - Assert.Fail("Should not write any events"); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_creating.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_creating.cs deleted file mode 100644 index 8d798cc3e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_creating.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - [TestFixture] - public class when_creating { - [Test] - public void no_exceptions_are_thrown() { - new PartitionStateUpdateManager(ProjectionNamesBuilder.CreateForTest("projection")); - } - - [Test] - public void null_naming_builder_throws_argument_null_exception() { - Assert.Throws(() => { new PartitionStateUpdateManager(null); }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated.cs deleted file mode 100644 index 52aab7600..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Text; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - [TestFixture] - public class when_state_updated { - private PartitionStateUpdateManager _updateManager; - private CheckpointTag _zero = CheckpointTag.FromPosition(0, 100, 50); - private CheckpointTag _one = CheckpointTag.FromPosition(0, 200, 150); - private CheckpointTag _two = CheckpointTag.FromPosition(0, 300, 250); - - [SetUp] - public void setup() { - _updateManager = new PartitionStateUpdateManager(ProjectionNamesBuilder.CreateForTest("projection")); - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _one), _zero); - } - - [Test] - public void handles_state_updated_for_the_same_partition() { - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _two), _one); - } - - [Test] - public void handles_state_updated_for_another_partition() { - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _two), _one); - } - - [Test] - public void emit_events_writes_single_state_updated_event() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - Assert.AreEqual(1, eventWriter.Writes.Count); - Assert.AreEqual(1, eventWriter.Writes[0].Length); - } - - [Test] - public void emit_events_writes_correct_state_data() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual("[{\"state\":1}]", @event.Data); - } - - [Test] - public void emit_events_writes_event_with_correct_caused_by_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual(_one, @event.CausedByTag); - } - - [Test] - public void emit_events_writes_event_with_correct_expected_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual(_zero, @event.ExpectedTag); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated_twice.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated_twice.cs deleted file mode 100644 index 041db1e1e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_state_updated_twice.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Text; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - [TestFixture] - public class when_state_updated_twice { - private PartitionStateUpdateManager _updateManager; - private CheckpointTag _zero = CheckpointTag.FromPosition(0, 100, 50); - private CheckpointTag _one = CheckpointTag.FromPosition(0, 200, 150); - private CheckpointTag _two = CheckpointTag.FromPosition(0, 300, 250); - private CheckpointTag _three = CheckpointTag.FromPosition(0, 400, 350); - - [SetUp] - public void setup() { - _updateManager = new PartitionStateUpdateManager(ProjectionNamesBuilder.CreateForTest("projection")); - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _one), _zero); - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":2}", null, _two), _one); - } - - [Test] - public void handles_state_updated_for_the_same_partition() { - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _three), _two); - } - - [Test] - public void handles_state_updated_for_another_partition() { - _updateManager.StateUpdated("partition", new PartitionState("{\"state\":1}", null, _three), _two); - } - - [Test] - public void emit_events_writes_single_state_updated_event() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - Assert.AreEqual(1, eventWriter.Writes.Count); - Assert.AreEqual(1, eventWriter.Writes[0].Length); - } - - [Test] - public void emit_events_writes_correct_state_data() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual("[{\"state\":2}]", @event.Data); - } - - [Test] - public void emit_events_writes_event_with_correct_caused_by_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual(_two, @event.CausedByTag); - } - - [Test] - public void emit_events_writes_event_with_correct_expected_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - EmittedEvent @event = eventWriter.Writes[0][0]; - Assert.AreEqual(_zero, @event.ExpectedTag); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_two_states_were_updated.cs b/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_two_states_were_updated.cs deleted file mode 100644 index 897467924..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/partition_state_update_manager/when_two_states_were_updated.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Linq; -using System.Text; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.partition_state_update_manager { - [TestFixture] - public class when_two_states_were_updated { - private PartitionStateUpdateManager _updateManager; - private readonly CheckpointTag _zero = CheckpointTag.FromPosition(0, 100, 50); - private readonly CheckpointTag _one = CheckpointTag.FromPosition(0, 200, 150); - private readonly CheckpointTag _two = CheckpointTag.FromPosition(0, 300, 250); - private readonly CheckpointTag _three = CheckpointTag.FromPosition(0, 400, 350); - - [SetUp] - public void setup() { - _updateManager = new PartitionStateUpdateManager(ProjectionNamesBuilder.CreateForTest("projection")); - _updateManager.StateUpdated("partition1", new PartitionState("{\"state\":1}", null, _one), _zero); - _updateManager.StateUpdated("partition2", new PartitionState("{\"state\":2}", null, _two), _zero); - } - - [Test] - public void handles_state_updated_for_the_same_partition() { - _updateManager.StateUpdated("partition1", new PartitionState("{\"state\":0}", null, _three), _two); - } - - [Test] - public void handles_state_updated_for_another_partition() { - _updateManager.StateUpdated("partition3", new PartitionState("{\"state\":0}", null, _three), _two); - } - - [Test] - public void emit_events_writes_both_state_updated_event() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - Assert.AreEqual(2, (eventWriter.Writes.SelectMany(write => write)).Count()); - } - - [Test] - public void emit_events_writes_to_correct_streams() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - var events = eventWriter.Writes.SelectMany(write => write).ToArray(); - Assert.IsTrue(events.Any((v => "$projections-projection-partition1-checkpoint" == v.StreamId))); - Assert.IsTrue(events.Any((v => "$projections-projection-partition2-checkpoint" == v.StreamId))); - } - - [Test] - public void emit_events_writes_correct_state_data() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - var events = eventWriter.Writes.SelectMany(write => write).ToArray(); - var event1 = events.Single(v => "$projections-projection-partition1-checkpoint" == v.StreamId); - var event2 = events.Single(v => "$projections-projection-partition2-checkpoint" == v.StreamId); - - Assert.AreEqual("[{\"state\":1}]", event1.Data); - Assert.AreEqual("[{\"state\":2}]", event2.Data); - } - - [Test] - public void emit_events_writes_event_with_correct_caused_by_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - var events = eventWriter.Writes.SelectMany(write => write).ToArray(); - var event1 = events.Single(v => "$projections-projection-partition1-checkpoint" == v.StreamId); - var event2 = events.Single(v => "$projections-projection-partition2-checkpoint" == v.StreamId); - Assert.AreEqual(_one, event1.CausedByTag); - Assert.AreEqual(_two, event2.CausedByTag); - } - - [Test] - public void emit_events_writes_event_with_correct_expected_tag() { - var eventWriter = new FakeEventWriter(); - _updateManager.EmitEvents(eventWriter); - var events = eventWriter.Writes.SelectMany(write => write).ToArray(); - var event1 = events.Single(v => "$projections-projection-partition1-checkpoint" == v.StreamId); - var event2 = events.Single(v => "$projections-projection-partition2-checkpoint" == v.StreamId); - Assert.AreEqual(_zero, event1.ExpectedTag); - Assert.AreEqual(_zero, event2.ExpectedTag); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/paused_at_event_distribution_point.cs b/src/EventStore.Projections.Core.Tests/Services/paused_at_event_distribution_point.cs deleted file mode 100644 index 8b1378917..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/paused_at_event_distribution_point.cs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/event_by_type_index_position_tagger.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/event_by_type_index_position_tagger.cs deleted file mode 100644 index 535431cba..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/event_by_type_index_position_tagger.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.event_by_type_index_position_tagger { - [TestFixture] - public class event_by_type_index_position_tagger { - private ReaderSubscriptionMessage.CommittedEventDistributed _zeroEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _firstEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _secondEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _thirdEvent; - - [SetUp] - public void setup() { - _zeroEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(-1, 120), new TFPos(20, 10), "$et-type1", 0, "stream1", 0, true, - Guid.NewGuid(), "type1", true, Helper.UTF8NoBom.GetBytes("{}"), new byte[0], null, 10f); - - _firstEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(-1, 130), new TFPos(30, 20), "$et-type2", 0, "stream1", 1, true, - Guid.NewGuid(), "type2", true, Helper.UTF8NoBom.GetBytes("{}"), new byte[0], null, 20f); - - _secondEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(-1, 140), new TFPos(50, 40), "$et-type1", 1, "stream2", 0, false, - Guid.NewGuid(), "type1", true, Helper.UTF8NoBom.GetBytes("{}"), new byte[0], null, 30f); - - _thirdEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(-1, 150), new TFPos(70, 60), "$et-type2", 1, "stream2", 1, false, - Guid.NewGuid(), "type2", true, Helper.UTF8NoBom.GetBytes("{}"), new byte[0], null, 40f); - } - - [Test] - public void can_be_created() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - new PositionTracker(t); - } - - [Test] - public void is_message_after_checkpoint_tag_after_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(10, 5), - new Dictionary {{"type1", 0}, {"type2", -1}}), _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_tf_only_after_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(10, 5), - new Dictionary {{"type1", 0}, {"type2", 0}}), _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_before_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(40, 35), - new Dictionary {{"type1", 2}, {"type2", 2}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_tf_only_before_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(40, 35), - new Dictionary {{"type1", 0}, {"type2", 0}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_equal_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(30, 20), - new Dictionary {{"type1", 0}, {"type2", 0}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_tf_only_equal_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(30, 20), - new Dictionary {{"type1", -1}, {"type2", -1}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_incompatible_streams_case() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(30, 20), - new Dictionary {{"type1", -1}, {"type3", -1}}), - _firstEvent); - Assert.IsFalse(result); - } - - - [Test] - public void null_streams_throws_argument_null_exception() { - Assert.Throws(() => { new EventByTypeIndexPositionTagger(0, null); }); - } - - [Test] - public void empty_streams_throws_argument_exception() { - Assert.Throws(() => { new EventByTypeIndexPositionTagger(0, new string[] { }); }); - } - - [Test] - public void position_checkpoint_tag_is_incompatible() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromPosition(0, 1000, 500))); - } - - [Test] - public void streams_checkpoint_tag_is_incompatible() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - Assert.IsFalse( - t.IsCompatible( - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"$et-type1", 100}, {"$et-type2", 150}}))); - } - - [Test] - public void another_events_checkpoint_tag_is_compatible() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - Assert.IsFalse( - t.IsCompatible( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 100}, {"type3", 150}}))); - } - - [Test] - public void the_same_events_checkpoint_tag_is_compatible() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - Assert.IsTrue( - t.IsCompatible( - CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 100}, {"type2", 150}}))); - } - - [Test] - public void adjust_compatible_tag_returns_the_same_tag() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var tag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 1}, {"type2", 2}}); - Assert.AreEqual(tag, t.AdjustTag(tag)); - } - - [Test] - public void can_adjust_tf_position_tag() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var tag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 1}, {"type2", 2}}); - var original = CheckpointTag.FromPosition(0, 100, 50); - Assert.AreEqual(tag, t.AdjustTag(original)); - } - - [Test] - public void zero_position_tag_is_before_first_event_possible() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var zero = t.MakeZeroCheckpointTag(); - - var zeroFromEvent = t.MakeCheckpointTag(zero, _zeroEvent); - - Assert.IsTrue(zeroFromEvent > zero); - } - - [Test] - public void can_update_by_tf_event_if_with_prior_index_position() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var linkEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(180, 170), "$et-type2", 1, false, Guid.NewGuid(), "$>", false, - Helper.UTF8NoBom.GetBytes("0@stream2"), new byte[0]); - var tag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(70, 60), - new Dictionary {{"type1", 2}, {"type2", 2}}); - var updated = t.MakeCheckpointTag(tag, linkEvent); - Assert.AreEqual(new TFPos(180, 170), updated.Position); - Assert.AreEqual(2, updated.Streams["type1"]); - Assert.AreEqual(2, updated.Streams["type2"]); - } - - [Test] - public void cannot_update_by_prior_tf_position() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var linkEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(180, 170), "$et-type2", 1, false, Guid.NewGuid(), "$>", false, - Helper.UTF8NoBom.GetBytes("0@stream2"), new byte[0]); - var tag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(270, 260), - new Dictionary {{"type1", 2}, {"type2", 2}}); - Assert.Throws(() => { t.MakeCheckpointTag(tag, linkEvent); }); - } - - [Test] - public void produced_checkpoint_tags_are_correctly_ordered() { - var t = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var zero = t.MakeZeroCheckpointTag(); - - var zeroEvent = t.MakeCheckpointTag(zero, _zeroEvent); - var zeroEvent2 = t.MakeCheckpointTag(zeroEvent, _zeroEvent); - var first = t.MakeCheckpointTag(zeroEvent2, _firstEvent); - var second = t.MakeCheckpointTag(first, _secondEvent); - var second2 = t.MakeCheckpointTag(zeroEvent, _secondEvent); - var third = t.MakeCheckpointTag(second, _thirdEvent); - - Assert.IsTrue(zeroEvent > zero); - Assert.IsTrue(first > zero); - Assert.IsTrue(second > first); - - Assert.AreEqual(zeroEvent2, zeroEvent); - Assert.AreEqual(second, second2); // strong order (by tf) - Assert.IsTrue(second2 > zeroEvent); - Assert.IsTrue(second2 > first); - - Assert.IsTrue(third > second); - Assert.IsTrue(third > first); - Assert.IsTrue(third > zeroEvent); - Assert.IsTrue(third > zero); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_creating_event_by_type_index_position_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_creating_event_by_type_index_position_tracker.cs deleted file mode 100644 index 28f08e802..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_creating_event_by_type_index_position_tracker.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.event_by_type_index_position_tagger { - [TestFixture] - public class when_creating_event_by_type_index_position_tracker { - private EventByTypeIndexPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void when() { - _tagger = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - _positionTracker = new PositionTracker(_tagger); - } - - [Test] - public void it_can_be_updated_with_correct_event_types() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 10}, {"type2", 20}}); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void it_cannot_be_updated_with_other_event_types() { - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 10}, {"type3", 20}}); - Assert.Throws(() => { _positionTracker.UpdateByCheckpointTagInitial(newTag); }); - } - - [Test] - public void it_cannot_be_updated_forward() { - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 10}, {"type2", 20}}); - Assert.Throws(() => { _positionTracker.UpdateByCheckpointTagForward(newTag); }); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 10}, {"type2", 20}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_from_a_tag.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_from_a_tag.cs deleted file mode 100644 index f99f14c87..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_from_a_tag.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.event_by_type_index_position_tagger { - [TestFixture] - public class when_updating_event_by_type_index_position_tracker_from_a_tag { - private EventByTypeIndexPositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - var tracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(10, 5), - new Dictionary {{"type1", 1}, {"type2", 2}}); - - tracker.UpdateByCheckpointTagInitial(newTag); - _tag = tracker.LastTag; - _tagger = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tag); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(1, _positionTracker.LastTag.Streams["type1"]); - Assert.AreEqual(2, _positionTracker.LastTag.Streams["type2"]); - } - - [Test] - public void tf_stream_position_is_updated() { - Assert.AreEqual(new TFPos(10, 5), _positionTracker.LastTag.Position); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_to_zero.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_to_zero.cs deleted file mode 100644 index d570a169c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_event_by_type_index_position_tracker_to_zero.cs +++ /dev/null @@ -1,39 +0,0 @@ -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.event_by_type_index_position_tagger { - [TestFixture] - public class when_updating_event_by_type_index_position_tracker_to_zero { - private EventByTypeIndexPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - _tagger = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void streams_are_set_up() { - Assert.Contains("type1", _positionTracker.LastTag.Streams.Keys); - Assert.Contains("type2", _positionTracker.LastTag.Streams.Keys); - } - - [Test] - public void stream_position_is_minus_one() { - Assert.AreEqual(ExpectedVersion.NoStream, _positionTracker.LastTag.Streams["type1"]); - Assert.AreEqual(ExpectedVersion.NoStream, _positionTracker.LastTag.Streams["type2"]); - } - - [Test] - public void tf_position_is_zero() { - Assert.AreEqual(new TFPos(0, -1), _positionTracker.LastTag.Position); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_postion_event_by_type_index_position_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_postion_event_by_type_index_position_tracker.cs deleted file mode 100644 index 5f95be692..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/event_by_type_index_position_tagger/when_updating_postion_event_by_type_index_position_tracker.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.event_by_type_index_position_tagger { - [TestFixture] - public class when_updating_postion_event_by_type_index_position_tracker { - private EventByTypeIndexPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - _tagger = new EventByTypeIndexPositionTagger(0, new[] {"type1", "type2"}); - _positionTracker = new PositionTracker(_tagger); - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(10, 5), - new Dictionary {{"type1", 1}, {"type2", 2}}); - var newTag2 = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(20, 15), - new Dictionary {{"type1", 1}, {"type2", 3}}); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag2); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(1, _positionTracker.LastTag.Streams["type1"]); - Assert.AreEqual(3, _positionTracker.LastTag.Streams["type2"]); - } - - [Test] - public void tf_position_is_updated() { - Assert.AreEqual(new TFPos(20, 15), _positionTracker.LastTag.Position); - } - - [Test] - public void cannot_update_to_the_same_position() { - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(20, 15), - new Dictionary {{"type1", 1}, {"type2", 3}}); - Assert.Throws(() => { _positionTracker.UpdateByCheckpointTagForward(newTag); }); - } - - [Test] - public void can_update_to_the_same_index_position_but_tf() { - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(30, 25), - new Dictionary {{"type1", 1}, {"type2", 3}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - } - - [Test] - public void it_cannot_be_updated_with_other_stream() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(30, 25), - new Dictionary {{"type1", 1}, {"type3", 3}}); - Assert.Throws(() => { _positionTracker.UpdateByCheckpointTagForward(newTag); }); - } - - //TODO: write tests on updating with incompatible snapshot loaded - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/multistream_position_tagger.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/multistream_position_tagger.cs deleted file mode 100644 index 12d78efaa..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/multistream_position_tagger.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.multistream_position_tagger { - [TestFixture] - public class multistream_position_tagger { - private ReaderSubscriptionMessage.CommittedEventDistributed _zeroEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _firstEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _secondEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _thirdEvent; - - [SetUp] - public void setup() { - _zeroEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(10, 0), "stream1", 0, false, Guid.NewGuid(), "StreamCreated", false, - new byte[0], new byte[0]); - _firstEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(30, 20), "stream1", 1, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - _secondEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(50, 40), "stream2", 0, false, Guid.NewGuid(), "StreamCreated", false, - new byte[0], new byte[0]); - _thirdEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(70, 60), "stream2", 1, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - } - - [Test] - public void can_be_created() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - new PositionTracker(t); - } - - [Test] - public void is_message_after_checkpoint_tag_after_case() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 0}, {"stream2", 0}}), - _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_before_case() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 2}, {"stream2", 2}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_equal_case() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 1}}), - _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_incompatible_streams_case() { - var t = new MultiStreamPositionTagger(0, new[] {"stream-other", "stream2"}); - var result = - t.IsMessageAfterCheckpointTag( - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream-other", 0}, {"stream2", 0}}), - _firstEvent); - Assert.IsFalse(result); - } - - - [Test] - public void null_streams_throws_argument_null_exception() { - Assert.Throws(() => { new MultiStreamPositionTagger(0, null); }); - } - - [Test] - public void empty_streams_throws_argument_exception() { - Assert.Throws(() => { new MultiStreamPositionTagger(0, new string[] { }); }); - } - - [Test] - public void position_checkpoint_tag_is_incompatible() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromPosition(0, 1000, 500))); - } - - [Test] - public void another_streams_checkpoint_tag_is_incompatible() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - Assert.IsFalse( - t.IsCompatible( - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream2", 100}, {"stream3", 150}}))); - } - - [Test] - public void the_same_stream_checkpoint_tag_is_compatible() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - Assert.IsTrue( - t.IsCompatible( - CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 100}, {"stream2", 150}}))); - } - - [Test] - public void adjust_compatible_tag_returns_the_same_tag() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var tag = CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 1}, {"stream2", 2}}); - Assert.AreEqual(tag, t.AdjustTag(tag)); - } - - [Test] - public void can_adjust_stream_position_tag() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var tag = CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 1}, {"stream2", -1}}); - var original = CheckpointTag.FromStreamPosition(0, "stream1", 1); - Assert.AreEqual(tag, t.AdjustTag(original)); - } - - [Test] - public void zero_position_tag_is_before_first_event_possible() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var zero = t.MakeZeroCheckpointTag(); - - var zeroFromEvent = t.MakeCheckpointTag(zero, _zeroEvent); - - Assert.IsTrue(zeroFromEvent > zero); - } - - [Test] - public void produced_checkpoint_tags_are_correctly_ordered() { - var t = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var zero = t.MakeZeroCheckpointTag(); - - var zeroEvent = t.MakeCheckpointTag(zero, _zeroEvent); - var zeroEvent2 = t.MakeCheckpointTag(zeroEvent, _zeroEvent); - var first = t.MakeCheckpointTag(zeroEvent2, _firstEvent); - var second = t.MakeCheckpointTag(first, _secondEvent); - var second2 = t.MakeCheckpointTag(zeroEvent, _secondEvent); - var third = t.MakeCheckpointTag(second, _thirdEvent); - - Assert.IsTrue(zeroEvent > zero); - Assert.IsTrue(first > zero); - Assert.IsTrue(second > first); - - Assert.AreEqual(zeroEvent2, zeroEvent); - Assert.AreNotEqual(second, second2); - Assert.IsTrue(second2 > zeroEvent); - Assert.Throws(() => TestHelper.Consume(second2 > first)); - - Assert.IsTrue(third > second); - Assert.IsTrue(third > first); - Assert.IsTrue(third > zeroEvent); - Assert.IsTrue(third > zero); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_creating_multistream_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_creating_multistream_postion_tracker.cs deleted file mode 100644 index f9f3be255..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_creating_multistream_postion_tracker.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.multistream_position_tagger { - [TestFixture] - public class when_creating_multistream_postion_tracker { - private MultiStreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void when() { - _tagger = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - _positionTracker = new PositionTracker(_tagger); - } - - [Test] - public void it_can_be_updated_with_correct_streams() { - // even not initialized (UpdateToZero can be removed) - var newTag = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 10}, {"stream2", 20}}); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void it_cannot_be_updated_with_other_streams() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 10}, {"stream3", 20}}); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - }); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 10}, {"stream2", 20}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPositions(0, - new Dictionary {{"stream1", 10}, {"stream2", 20}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_from_a_tag.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_from_a_tag.cs deleted file mode 100644 index f7e93f969..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_from_a_tag.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.multistream_position_tagger { - [TestFixture] - public class when_updating_multistream_postion_tracker_from_a_tag { - private MultiStreamPositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - var tracker = new PositionTracker(tagger); - - var newTag = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 2}}); - tracker.UpdateByCheckpointTagInitial(newTag); - _tag = tracker.LastTag; - _tagger = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tag); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(1, _positionTracker.LastTag.Streams["stream1"]); - Assert.AreEqual(2, _positionTracker.LastTag.Streams["stream2"]); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_to_zero.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_to_zero.cs deleted file mode 100644 index 0d64f7d79..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_multistream_postion_tracker_to_zero.cs +++ /dev/null @@ -1,34 +0,0 @@ -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.multistream_position_tagger { - [TestFixture] - public class when_updating_multistream_postion_tracker_to_zero { - private MultiStreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - _tagger = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void streams_are_set_up() { - Assert.Contains("stream1", _positionTracker.LastTag.Streams.Keys); - Assert.Contains("stream2", _positionTracker.LastTag.Streams.Keys); - } - - [Test] - public void stream_position_is_minus_one() { - Assert.AreEqual(ExpectedVersion.NoStream, _positionTracker.LastTag.Streams["stream1"]); - Assert.AreEqual(ExpectedVersion.NoStream, _positionTracker.LastTag.Streams["stream2"]); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_postion_multistream_position_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_postion_multistream_position_tracker.cs deleted file mode 100644 index 3abd4dce8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/multistream_position_tagger/when_updating_postion_multistream_position_tracker.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.multistream_position_tagger { - [TestFixture] - public class when_updating_postion_multistream_position_tracker { - private MultiStreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - _tagger = new MultiStreamPositionTagger(0, new[] {"stream1", "stream2"}); - _positionTracker = new PositionTracker(_tagger); - var newTag = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 2}}); - var newTag2 = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 3}}); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag2); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(1, _positionTracker.LastTag.Streams["stream1"]); - Assert.AreEqual(3, _positionTracker.LastTag.Streams["stream2"]); - } - - - [Test] - public void cannot_update_to_the_same_postion() { - Assert.Throws(() => { - var newTag = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 3}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_cannot_be_updated_with_other_stream() { - Assert.Throws(() => { - // even not initialized (UpdateToZero can be removed) - var newTag = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 3}, {"stream3", 2}}); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - //TODO: write tests on updating with incompatible snapshot loaded - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/prepare_position_tagger.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/prepare_position_tagger.cs deleted file mode 100644 index e919f8a68..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/prepare_position_tagger.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.prepare_position_tagger { - [TestFixture] - public class prepare_position_tagger { - private ReaderSubscriptionMessage.CommittedEventDistributed _zeroEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _firstEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _secondEvent; - - [SetUp] - public void setup() { - _zeroEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(10, 0), "stream", 0, false, Guid.NewGuid(), "StreamCreated", false, - new byte[0], new byte[0]); - _firstEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(0, 20), "stream", 1, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - _secondEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(50, 40), "stream", 2, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - } - - [Test] - public void can_be_created() { - new PreparePositionTagger(0); - } - - [Test] - public void is_message_after_checkpoint_tag_after_case() { - var t = new PreparePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPreparePosition(0, 10), _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_before_case() { - var t = new PreparePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPreparePosition(0, 40), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_equal_case() { - var t = new PreparePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPreparePosition(0, 20), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void prepare_position_checkpoint_tag_is_compatible() { - var t = new PreparePositionTagger(0); - Assert.IsTrue(t.IsCompatible(CheckpointTag.FromPreparePosition(0, 500))); - } - - [Test] - public void tf_position_checkpoint_tag_is_incompatible() { - var t = new PreparePositionTagger(0); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromPosition(0, 510, 500))); - } - - [Test] - public void stream_checkpoint_tag_is_incompatible() { - var t = new PreparePositionTagger(0); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromStreamPosition(0, "stream2", 100))); - } - - [Test] - public void zero_position_tag_is_before_first_event_possible() { - var t = new PreparePositionTagger(0); - var zero = t.MakeZeroCheckpointTag(); - - var zeroFromEvent = t.MakeCheckpointTag(zero, _zeroEvent); - - Assert.IsTrue(zeroFromEvent > zero); - } - - [Test] - public void produced_checkpoint_tags_are_correctly_ordered() { - var t = new PreparePositionTagger(0); - var zero = t.MakeZeroCheckpointTag(); - - var zeroEvent = t.MakeCheckpointTag(zero, _zeroEvent); - var zeroEvent2 = t.MakeCheckpointTag(zeroEvent, _zeroEvent); - var first = t.MakeCheckpointTag(zeroEvent2, _firstEvent); - var second = t.MakeCheckpointTag(first, _secondEvent); - var second2 = t.MakeCheckpointTag(zero, _secondEvent); - - Assert.IsTrue(zeroEvent > zero); - Assert.IsTrue(first > zero); - Assert.IsTrue(second > first); - - Assert.AreEqual(zeroEvent2, zeroEvent); - Assert.AreEqual(second, second2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_creating_prepare_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_creating_prepare_postion_tracker.cs deleted file mode 100644 index 7fbed1242..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_creating_prepare_postion_tracker.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.prepare_position_tagger { - [TestFixture] - public class when_creating_prepare_postion_tracker { - private PositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void when() { - _tagger = new PreparePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - } - - [Test] - public void it_can_be_updated() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_reinitializing_prepapre_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_reinitializing_prepapre_postion_tracker.cs deleted file mode 100644 index 35a7158e5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_reinitializing_prepapre_postion_tracker.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.prepare_position_tagger { - [TestFixture] - public class when_reinitializing_prepapre_postion_tracker { - private PositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new PreparePositionTagger(0); - var positionTracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromPreparePosition(0, 50); - positionTracker.UpdateByCheckpointTagInitial(newTag); - _tag = positionTracker.LastTag; - _tagger = new PreparePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - _positionTracker.UpdateByCheckpointTagInitial(_tag); - // when - - - _positionTracker.Initialize(); - } - - [Test] - public void it_can_be_updated() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_postion_tagger_from_a_tag.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_postion_tagger_from_a_tag.cs deleted file mode 100644 index 42d4f4213..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_postion_tagger_from_a_tag.cs +++ /dev/null @@ -1,35 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.prepare_position_tagger { - [TestFixture] - public class when_updating_postion_tagger_from_a_tag { - private PositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new PreparePositionTagger(0); - var positionTracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromPreparePosition(0, 50); - positionTracker.UpdateByCheckpointTagInitial(newTag); - _tag = positionTracker.LastTag; - _tagger = new PreparePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tag); - } - - [Test] - public void position_is_updated() { - Assert.AreEqual(50, _positionTracker.LastTag.PreparePosition); - Assert.IsNull(_positionTracker.LastTag.CommitPosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_prepare_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_prepare_postion_tracker.cs deleted file mode 100644 index 2e453a57a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/prepare_position_tagger/when_updating_prepare_postion_tracker.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.prepare_position_tagger { - [TestFixture] - public class when_updating_prepare_postion_tracker { - private PositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - _tagger = new PreparePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void checkpoint_tag_is_for_correct_position() { - Assert.AreEqual(50, _positionTracker.LastTag.Position.PreparePosition); - } - - [Test] - public void cannot_update_to_the_same_postion() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPreparePosition(0, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/stream_position_tagger.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/stream_position_tagger.cs deleted file mode 100644 index ceb87be25..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/stream_position_tagger.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.stream_position_tagger { - [TestFixture] - public class stream_position_tagger { - private ReaderSubscriptionMessage.CommittedEventDistributed _zeroEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _firstEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _secondEvent; - - [SetUp] - public void setup() { - _zeroEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(10, 0), "stream1", 0, false, Guid.NewGuid(), "StreamCreated", false, - new byte[0], new byte[0]); - _firstEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(30, 20), "stream1", 1, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - _secondEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(50, 40), "stream1", 2, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - } - - [Test] - public void can_be_created() { - var t = new StreamPositionTagger(0, "stream1"); - new PositionTracker(t); - } - - [Test] - public void is_message_after_checkpoint_tag_after_case() { - var t = new StreamPositionTagger(0, "stream1"); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromStreamPosition(0, "stream1", 0), _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_before_case() { - var t = new StreamPositionTagger(0, "stream1"); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromStreamPosition(0, "stream1", 2), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_equal_case() { - var t = new StreamPositionTagger(0, "stream1"); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromStreamPosition(0, "stream1", 1), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_incompatible_case() { - // events from other streams are not after any tag - var t = new StreamPositionTagger(0, "stream-other"); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromStreamPosition(0, "stream1", 1), _firstEvent); - Assert.IsFalse(result); - } - - - [Test] - public void null_stream_throws_argument_null_exception() { - Assert.Throws(() => { new StreamPositionTagger(0, null); }); - } - - [Test] - public void empty_stream_throws_argument_exception() { - Assert.Throws(() => { new StreamPositionTagger(0, ""); }); - } - - [Test] - public void position_checkpoint_tag_is_incompatible() { - var t = new StreamPositionTagger(0, "stream1"); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromPosition(0, 1000, 500))); - } - - [Test] - public void anothe_stream_checkpoint_tag_is_incompatible() { - var t = new StreamPositionTagger(0, "stream1"); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromStreamPosition(0, "stream2", 100))); - } - - [Test] - public void the_same_stream_checkpoint_tag_is_compatible() { - var t = new StreamPositionTagger(0, "stream1"); - Assert.IsTrue(t.IsCompatible(CheckpointTag.FromStreamPosition(0, "stream1", 100))); - } - - [Test] - public void adjust_compatible_tag_returns_the_same_tag() { - var t = new StreamPositionTagger(0, "stream1"); - var tag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - Assert.AreEqual(tag, t.AdjustTag(tag)); - } - - [Test] - public void can_adjust_multi_stream_position_tag() { - var t = new StreamPositionTagger(0, "stream1"); - var tag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - var original = - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 2}}); - Assert.AreEqual(tag, t.AdjustTag(original)); - } - - [Test] - public void zero_position_tag_is_before_first_event_possible() { - var t = new StreamPositionTagger(0, "stream1"); - var zero = t.MakeZeroCheckpointTag(); - - var zeroFromEvent = t.MakeCheckpointTag(zero, _zeroEvent); - - Assert.IsTrue(zeroFromEvent > zero); - } - - [Test] - public void produced_checkpoint_tags_are_correctly_ordered() { - var t = new StreamPositionTagger(0, "stream1"); - var zero = t.MakeZeroCheckpointTag(); - - var zeroEvent = t.MakeCheckpointTag(zero, _zeroEvent); - var zeroEvent2 = t.MakeCheckpointTag(zeroEvent, _zeroEvent); - var first = t.MakeCheckpointTag(zeroEvent2, _firstEvent); - var second = t.MakeCheckpointTag(first, _secondEvent); - var second2 = t.MakeCheckpointTag(zero, _secondEvent); - - Assert.IsTrue(zeroEvent > zero); - Assert.IsTrue(first > zero); - Assert.IsTrue(second > first); - - Assert.AreEqual(zeroEvent2, zeroEvent); - Assert.AreEqual(second, second2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_creating_stream_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_creating_stream_postion_tracker.cs deleted file mode 100644 index f0f2b29ee..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_creating_stream_postion_tracker.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.stream_position_tagger { - [TestFixture] - public class when_creating_stream_postion_tracker { - private StreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void when() { - _tagger = new StreamPositionTagger(0, "stream1"); - _positionTracker = new PositionTracker(_tagger); - } - - [Test] - public void it_can_be_updated_with_correct_stream() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void it_cannot_be_updated_with_other_stream() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPosition(0, "other_stream1", 1); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - }); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_postion_stream_position_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_postion_stream_position_tracker.cs deleted file mode 100644 index 45ef5e9f8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_postion_stream_position_tracker.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.stream_position_tagger { - [TestFixture] - public class when_updating_postion_stream_position_tracker { - private StreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - _tagger = new StreamPositionTagger(0, "stream1"); - _positionTracker = new PositionTracker(_tagger); - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - var newTag2 = CheckpointTag.FromStreamPosition(0, "stream1", 2); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag2); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(2, _positionTracker.LastTag.Streams["stream1"]); - } - - - [Test] - public void cannot_update_to_the_same_postion() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 2); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_cannot_be_updated_with_other_stream() { - Assert.Throws(() => { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromStreamPosition(0, "other_stream1", 2); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - //TODO: write tests on updating with incompatible snapshot loaded - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_from_a_tag.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_from_a_tag.cs deleted file mode 100644 index 4d431e851..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_from_a_tag.cs +++ /dev/null @@ -1,34 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.stream_position_tagger { - [TestFixture] - public class when_updating_stream_postion_tracker_from_a_tag { - private StreamPositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new StreamPositionTagger(0, "stream1"); - var tracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromStreamPosition(0, "stream1", 1); - tracker.UpdateByCheckpointTagInitial(newTag); - _tag = tracker.LastTag; - _tagger = new StreamPositionTagger(0, "stream1"); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tag); - } - - [Test] - public void stream_position_is_updated() { - Assert.AreEqual(1, _positionTracker.LastTag.Streams["stream1"]); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_to_zero.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_to_zero.cs deleted file mode 100644 index 3e15311bf..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/stream_position_tagger/when_updating_stream_postion_tracker_to_zero.cs +++ /dev/null @@ -1,31 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.stream_position_tagger { - [TestFixture] - public class when_updating_stream_postion_tracker_to_zero { - private StreamPositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - _tagger = new StreamPositionTagger(0, "stream1"); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void streams_are_set_up() { - Assert.Contains("stream1", _positionTracker.LastTag.Streams.Keys); - } - - [Test] - public void stream_position_is_minus_one() { - Assert.AreEqual(-1, _positionTracker.LastTag.Streams["stream1"]); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/transaction_file_position_tagger.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/transaction_file_position_tagger.cs deleted file mode 100644 index a366f15be..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/transaction_file_position_tagger.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.transaction_file_position_tagger { - [TestFixture] - public class transaction_file_position_tagger { - private ReaderSubscriptionMessage.CommittedEventDistributed _zeroEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _firstEvent; - private ReaderSubscriptionMessage.CommittedEventDistributed _secondEvent; - - [SetUp] - public void setup() { - _zeroEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(10, 0), "stream", 0, false, Guid.NewGuid(), "StreamCreated", false, - new byte[0], new byte[0]); - _firstEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(30, 20), "stream", 1, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - _secondEvent = ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(50, 40), "stream", 2, false, Guid.NewGuid(), "Data", true, - Helper.UTF8NoBom.GetBytes("{}"), new byte[0]); - } - - [Test] - public void can_be_created() { - new TransactionFilePositionTagger(0); - } - - [Test] - public void is_message_after_checkpoint_tag_after_case() { - var t = new TransactionFilePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPosition(0, 20, 10), _firstEvent); - Assert.IsTrue(result); - } - - [Test] - public void is_message_after_checkpoint_tag_before_case() { - var t = new TransactionFilePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPosition(0, 50, 40), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void is_message_after_checkpoint_tag_equal_case() { - var t = new TransactionFilePositionTagger(0); - var result = t.IsMessageAfterCheckpointTag(CheckpointTag.FromPosition(0, 30, 20), _firstEvent); - Assert.IsFalse(result); - } - - [Test] - public void position_checkpoint_tag_is_compatible() { - var t = new TransactionFilePositionTagger(0); - Assert.IsTrue(t.IsCompatible(CheckpointTag.FromPosition(0, 1000, 500))); - } - - [Test] - public void stream_checkpoint_tag_is_incompatible() { - var t = new TransactionFilePositionTagger(0); - Assert.IsFalse(t.IsCompatible(CheckpointTag.FromStreamPosition(0, "stream2", 100))); - } - - [Test] - public void adjust_compatible_tag_returns_the_same_tag() { - var t = new TransactionFilePositionTagger(0); - var tag = CheckpointTag.FromPosition(0, 100, 50); - Assert.AreSame(tag, t.AdjustTag(tag)); - } - - [Test] - public void can_adjust_tf_position_tag() { - var t = new TransactionFilePositionTagger(0); - var tag = CheckpointTag.FromPosition(0, 100, 50); - var original = CheckpointTag.FromEventTypeIndexPositions(0, new TFPos(100, 50), - new Dictionary {{"type1", 1}, {"type2", 2}}); - Assert.AreEqual(tag, t.AdjustTag(original)); - } - - [Test] - public void zero_position_tag_is_before_first_event_possible() { - var t = new TransactionFilePositionTagger(0); - var zero = t.MakeZeroCheckpointTag(); - - var zeroFromEvent = t.MakeCheckpointTag(zero, _zeroEvent); - - Assert.IsTrue(zeroFromEvent > zero); - } - - [Test] - public void produced_checkpoint_tags_are_correctly_ordered() { - var t = new TransactionFilePositionTagger(0); - var zero = t.MakeZeroCheckpointTag(); - - var zeroEvent = t.MakeCheckpointTag(zero, _zeroEvent); - var zeroEvent2 = t.MakeCheckpointTag(zeroEvent, _zeroEvent); - var first = t.MakeCheckpointTag(zeroEvent2, _firstEvent); - var second = t.MakeCheckpointTag(first, _secondEvent); - var second2 = t.MakeCheckpointTag(zero, _secondEvent); - - Assert.IsTrue(zeroEvent > zero); - Assert.IsTrue(first > zero); - Assert.IsTrue(second > first); - - Assert.AreEqual(zeroEvent2, zeroEvent); - Assert.AreEqual(second, second2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_creating_transaction_file_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_creating_transaction_file_postion_tracker.cs deleted file mode 100644 index ddd9e8a61..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_creating_transaction_file_postion_tracker.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.transaction_file_position_tagger { - [TestFixture] - public class when_creating_transaction_file_postion_tracker { - private PositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void when() { - _tagger = new TransactionFilePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - } - - [Test] - public void it_can_be_updated() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_reinitializing_transaction_file_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_reinitializing_transaction_file_postion_tracker.cs deleted file mode 100644 index a6f3f6a72..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_reinitializing_transaction_file_postion_tracker.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.transaction_file_position_tagger { - [TestFixture] - public class when_reinitializing_transaction_file_postion_tracker { - private PositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new TransactionFilePositionTagger(0); - var positionTracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromPosition(0, 100, 50); - positionTracker.UpdateByCheckpointTagInitial(newTag); - _tag = positionTracker.LastTag; - _tagger = new TransactionFilePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - _positionTracker.UpdateByCheckpointTagInitial(_tag); - // when - - - _positionTracker.Initialize(); - } - - [Test] - public void it_can_be_updated() { - // even not initialized (UpdateToZero can be removed) - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void initial_position_cannot_be_set_twice() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - - [Test] - public void it_can_be_updated_to_zero() { - _positionTracker.UpdateByCheckpointTagInitial(_tagger.MakeZeroCheckpointTag()); - } - - [Test] - public void it_cannot_be_updated_forward() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_postion_tagger_from_a_tag.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_postion_tagger_from_a_tag.cs deleted file mode 100644 index c6919ac4e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_postion_tagger_from_a_tag.cs +++ /dev/null @@ -1,35 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.transaction_file_position_tagger { - [TestFixture] - public class when_updating_postion_tagger_from_a_tag { - private PositionTagger _tagger; - private CheckpointTag _tag; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - var tagger = new TransactionFilePositionTagger(0); - var positionTracker = new PositionTracker(tagger); - - var newTag = CheckpointTag.FromPosition(0, 100, 50); - positionTracker.UpdateByCheckpointTagInitial(newTag); - _tag = positionTracker.LastTag; - _tagger = new TransactionFilePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - // when - - _positionTracker.UpdateByCheckpointTagInitial(_tag); - } - - [Test] - public void position_is_updated() { - Assert.AreEqual(50, _positionTracker.LastTag.PreparePosition); - Assert.AreEqual(100, _positionTracker.LastTag.CommitPosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_transaction_file_postion_tracker.cs b/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_transaction_file_postion_tracker.cs deleted file mode 100644 index 2dea00568..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/position_tagging/transaction_file_position_tagger/when_updating_transaction_file_postion_tracker.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.position_tagging.transaction_file_position_tagger { - [TestFixture] - public class when_updating_transaction_file_postion_tracker { - private PositionTagger _tagger; - private PositionTracker _positionTracker; - - [SetUp] - public void When() { - // given - _tagger = new TransactionFilePositionTagger(0); - _positionTracker = new PositionTracker(_tagger); - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagInitial(newTag); - } - - [Test] - public void checkpoint_tag_is_for_correct_position() { - Assert.AreEqual(new TFPos(100, 50), _positionTracker.LastTag.Position); - } - - [Test] - public void cannot_update_to_the_same_postion() { - Assert.Throws(() => { - var newTag = CheckpointTag.FromPosition(0, 100, 50); - _positionTracker.UpdateByCheckpointTagForward(newTag); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_core_service/when_stopping_the_projection_core_service.cs b/src/EventStore.Projections.Core.Tests/Services/projection_core_service/when_stopping_the_projection_core_service.cs deleted file mode 100644 index 644307dfb..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_core_service/when_stopping_the_projection_core_service.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_core_service { - [TestFixture] - public class when_stopping_the_projection_core_service_with_no_running_projections - : TestFixtureWithProjectionCoreService { - private readonly Guid _stopCorrelationId = Guid.NewGuid(); - - [SetUp] - public override void Setup() { - base.Setup(); - _service.Handle(new ProjectionCoreServiceMessage.StopCore(_stopCorrelationId)); - } - - [Test] - public void should_handle_subcomponent_stopped() { - var componentStopped = _consumer.HandledMessages - .OfType() - .LastOrDefault(x => x.SubComponent == "ProjectionCoreService"); - Assert.IsNotNull(componentStopped); - Assert.AreEqual(_stopCorrelationId, componentStopped.QueueId); - } - } - - [TestFixture] - public class when_stopping_the_projection_core_service_with_running_projections - : TestFixtureWithProjectionCoreService { - private readonly Guid _projectionId = Guid.NewGuid(); - private readonly Guid _stopCorrelationId = Guid.NewGuid(); - - [SetUp] - public override void Setup() { - base.Setup(); - _bus.Subscribe(_service); - _service.Handle(new CoreProjectionManagementMessage.CreateAndPrepare( - _projectionId, _workerId, "test-projection", - new ProjectionVersion(), new ProjectionConfig(null, 1000, 1000 * 1000, 100, 500, true, true, false, false, true, 10000, - 1, 250), - "JS", "fromStream('$user-admin').outputState()", true)); - _service.Handle(new ProjectionCoreServiceMessage.StopCore(_stopCorrelationId)); - } - - [Test] - public void should_handle_projection_suspended_message() { - var suspended = _consumer.HandledMessages - .OfType() - .LastOrDefault(x => x.ProjectionId == _projectionId); - Assert.IsNotNull(suspended); - } - - [Test] - public void should_handle_subcomponent_stopped() { - var componentStopped = _consumer.HandledMessages - .OfType() - .LastOrDefault(x => x.SubComponent == "ProjectionCoreService"); - Assert.IsNotNull(componentStopped); - } - } - - [TestFixture] - public class when_stopping_the_projection_core_service_times_out_suspending_projections - : TestFixtureWithProjectionCoreService { - private readonly Guid _projectionId = Guid.NewGuid(); - private readonly Guid _stopCorrelationId = Guid.NewGuid(); - - [SetUp] - public override void Setup() { - base.Setup(); - // Don't subscribe to the suspended message - _bus.Unsubscribe(_service); - _service.Handle(new CoreProjectionManagementMessage.CreateAndPrepare( - _projectionId, _workerId, "test-projection", - new ProjectionVersion(), new ProjectionConfig(null, 1000, 1000 * 1000, 100, 500, true, true, false, false, true, 10000, - 1, 250), - "JS", "fromStream('$user-admin').outputState()", true)); - _service.Handle(new ProjectionCoreServiceMessage.StopCore(_stopCorrelationId)); - _service.Handle(new ProjectionCoreServiceMessage.StopCoreTimeout(_stopCorrelationId)); - } - - [Test] - public void should_handle_subcomponent_stopped() { - var componentStopped = _consumer.HandledMessages - .OfType() - .LastOrDefault(x => x.SubComponent == "ProjectionCoreService"); - Assert.IsNotNull(componentStopped); - } - } - - [TestFixture] - public class when_stopping_the_projection_core_service_and_timeout_for_wrong_correlation_received - : TestFixtureWithProjectionCoreService { - private readonly Guid _projectionId = Guid.NewGuid(); - private readonly Guid _stopCorrelationId = Guid.NewGuid(); - - [SetUp] - public override void Setup() { - base.Setup(); - // Don't subscribe to the suspended message - _bus.Unsubscribe(_service); - _service.Handle(new CoreProjectionManagementMessage.CreateAndPrepare( - _projectionId, _workerId, "test-projection", - new ProjectionVersion(), new ProjectionConfig(null, 1000, 1000 * 1000, 100, 500, true, true, false, false, true, 10000, - 1, 250), - "JS", "fromStream('$user-admin').outputState()", true)); - _service.Handle(new ProjectionCoreServiceMessage.StopCore(_stopCorrelationId)); - _service.Handle(new ProjectionCoreServiceMessage.StopCoreTimeout(Guid.NewGuid())); - } - - [Test] - public void should_not_handle_subcomponent_stopped() { - var componentStopped = _consumer.HandledMessages - .OfType() - .LastOrDefault(x => x.SubComponent == "ProjectionCoreService"); - Assert.IsNull(componentStopped); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/TestFixtureWithProjectionSubscription.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/TestFixtureWithProjectionSubscription.cs deleted file mode 100644 index 86f116468..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/TestFixtureWithProjectionSubscription.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Bus.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - public abstract class TestFixtureWithProjectionSubscription { - protected Guid _projectionCorrelationId; - protected TestHandler _eventHandler; - protected TestHandler _checkpointHandler; - protected TestHandler _progressHandler; - protected TestHandler _subscriptionStartedHandler; - protected TestHandler _notAuthorizedHandler; - protected TestHandler _eofHandler; - protected TestHandler _partitionEofHandler; - protected TestHandler _partitionDeletedHandler; - protected IReaderSubscription _subscription; - protected ITimeProvider _timeProvider; - protected SynchronousScheduler _bus; - protected Action _source = null; - protected int _checkpointUnhandledBytesThreshold; - protected int _checkpointProcessedEventsThreshold; - protected int _checkpointAfterMs; - protected IReaderStrategy _readerStrategy; - - [SetUp] - public void setup() { - _checkpointUnhandledBytesThreshold = 1000; - _checkpointProcessedEventsThreshold = 2000; - _checkpointAfterMs = 10000; - _timeProvider = new RealTimeProvider(); - Given(); - _bus = new(); - _projectionCorrelationId = Guid.NewGuid(); - _eventHandler = new TestHandler(); - _checkpointHandler = new TestHandler(); - _progressHandler = new TestHandler(); - _subscriptionStartedHandler = new TestHandler(); - _notAuthorizedHandler = new TestHandler(); - _eofHandler = new TestHandler(); - _partitionEofHandler = new TestHandler(); - _partitionDeletedHandler = new TestHandler(); - - _bus.Subscribe(_eventHandler); - _bus.Subscribe(_checkpointHandler); - _bus.Subscribe(_progressHandler); - _bus.Subscribe(_eofHandler); - _bus.Subscribe(_partitionEofHandler); - _readerStrategy = CreateCheckpointStrategy(); - _subscription = CreateProjectionSubscription(); - - - When(); - } - - protected virtual IReaderSubscription CreateProjectionSubscription() { - return new ReaderSubscription( - "Test Subscription", - _bus, - _projectionCorrelationId, - _readerStrategy.PositionTagger.MakeZeroCheckpointTag(), - _readerStrategy, - _timeProvider, - _checkpointUnhandledBytesThreshold, - _checkpointProcessedEventsThreshold, - _checkpointAfterMs, - false, - null, - false); - } - - protected virtual void Given() { - } - - protected abstract void When(); - - protected virtual IReaderStrategy CreateCheckpointStrategy() { - var readerBuilder = new SourceDefinitionBuilder(); - if (_source != null) { - _source(readerBuilder); - } else { - readerBuilder.FromAll(); - readerBuilder.AllEvents(); - } - - var config = new ProjectionConfig(null, 1000, 1000 * 1000, 100, 500, true, true, false, false, true, 10000, - 1, 250); - IQuerySources sources = readerBuilder.Build(); - var readerStrategy = ReaderStrategy.Create( - "test", - 0, - sources, - _timeProvider, - stopOnEof: false, - runAs: config.RunAs); - return readerStrategy; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/failing_test_github_issue_2785.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/failing_test_github_issue_2785.cs deleted file mode 100644 index e4d44ef0b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/failing_test_github_issue_2785.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - public class - failing_test_github_issue_2785 : - TestFixtureWithProjectionSubscription { - - protected override void Given() { - _source = source => { - source.FromAll(); - source.IncludeEvent("good-event-type"); - }; - } - - protected override void When() { - } - - [Test] - public void should_gracefully_handle_resolved_linkto_events() { - var stream = "any-stream-name"; - var eventType = "any-event-type"; - var position = new TFPos(-1, 200); //resolved linkTo event with incomplete TF position - var resolvedLinkToEvent = true; - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), position, stream, 1, resolvedLinkToEvent, Guid.NewGuid(), - eventType, false, new byte[0], new byte[0])); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_creating_projection_subscription.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_creating_projection_subscription.cs deleted file mode 100644 index 094930169..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_creating_projection_subscription.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Fakes; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class when_creating_projection_subscription { - [Test] - public void it_can_be_created() { - new ReaderSubscription( - "Test Subscription", - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - new FakeTimeProvider(), - 1000, - 2000, - 10000, - false, - null, - false); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - new ReaderSubscription( - "Test Subscription", - null, - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - new FakeTimeProvider(), - 1000, - 2000, - 10000, - false, - null, - false); - }); - } - - [Test] - public void null_checkpoint_strategy_throws_argument_null_exception() { - Assert.Throws(() => { - new ReaderSubscription( - "Test Subscription", - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - null, - new FakeTimeProvider(), - 1000, - 2000, - 10000, - false, - null, - false); - }); - } - - [Test] - public void null_time_provider_throws_argument_null_exception() { - Assert.Throws(() => { - new ReaderSubscription( - "Test Subscription", - new FakePublisher(), - Guid.NewGuid(), - CheckpointTag.FromPosition(0, 0, -1), - CreateReaderStrategy(), - null, - 1000, - 2000, - 10000, - false, - null, - false); - }); - } - - private IReaderStrategy CreateReaderStrategy() { - var result = new SourceDefinitionBuilder(); - result.FromAll(); - result.AllEvents(); - return ReaderStrategy.Create( - "test", - 0, - result.Build(), - new RealTimeProvider(), - stopOnEof: false, - runAs: null); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_committed_event_passing_the_filter.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_committed_event_passing_the_filter.cs deleted file mode 100644 index a2620e655..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_committed_event_passing_the_filter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class when_handling_committed_event_passing_the_filter : TestFixtureWithProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void event_is_passed_to_downstream_handler() { - Assert.AreEqual(1, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_duplicate_events.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_duplicate_events.cs deleted file mode 100644 index 47af5ecd8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_duplicate_events.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class when_handling_duplicate_events : TestFixtureWithProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(100, 50), "test-stream", 0, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void duplicates_are_not_passed_to_downstream_handler() { - Assert.AreEqual(1, _eventHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_after_specified_time_elapses.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_after_specified_time_elapses.cs deleted file mode 100644 index ee1d22f75..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_after_specified_time_elapses.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Core.Tests.Services.TimeService; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class - when_handling_enough_events_for_a_checkpoint_after_specified_time_elapses : - TestFixtureWithProjectionSubscription { - protected override void Given() { - _checkpointAfterMs = 1000; - _checkpointProcessedEventsThreshold = 1; - _timeProvider = new FakeTimeProvider(); - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _checkpointHandler.HandledMessages.Clear(); - ((FakeTimeProvider)_timeProvider).AddToUtcTime(TimeSpan.FromMilliseconds(_checkpointAfterMs + 1)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_is_suggested() { - Assert.AreEqual(1, _checkpointHandler.HandledMessages.Count); - } - } - - [TestFixture] - public class - when_handling_enough_events_for_a_checkpoint_after_specified_time_elapses_and_not_passing_filter : - TestFixtureWithProjectionSubscription { - protected override void Given() { - _source = source => { - source.FromAll(); - source.IncludeEvent("specific-event"); - }; - _checkpointAfterMs = 1000; - _checkpointUnhandledBytesThreshold = 50; - _checkpointProcessedEventsThreshold = 1; - _timeProvider = new FakeTimeProvider(); - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _checkpointHandler.HandledMessages.Clear(); - ((FakeTimeProvider)_timeProvider).AddToUtcTime(TimeSpan.FromMilliseconds(_checkpointAfterMs + 1)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(400, 400), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_is_suggested() { - Assert.AreEqual(1, _checkpointHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_before_specified_time_elapses.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_before_specified_time_elapses.cs deleted file mode 100644 index 0c51482be..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_enough_events_for_a_checkpoint_before_specified_time_elapses.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Core.Tests.Services.TimeService; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class - when_handling_enough_events_for_a_checkpoint_before_specified_time_elapses : - TestFixtureWithProjectionSubscription { - protected override void Given() { - _checkpointAfterMs = 1000; - _checkpointProcessedEventsThreshold = 1; - _timeProvider = new FakeTimeProvider(); - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _checkpointHandler.HandledMessages.Clear(); - ((FakeTimeProvider)_timeProvider).AddToUtcTime(TimeSpan.FromMilliseconds(_checkpointAfterMs)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_is_not_suggested() { - Assert.AreEqual(0, _checkpointHandler.HandledMessages.Count); - } - } - - [TestFixture] - public class - when_handling_enough_events_for_a_checkpoint_before_specified_time_elapses_and_not_passing_filter : - TestFixtureWithProjectionSubscription { - protected override void Given() { - _source = source => { - source.FromAll(); - source.IncludeEvent("specific-event"); - }; - _checkpointAfterMs = 1000; - _checkpointUnhandledBytesThreshold = 50; - _checkpointProcessedEventsThreshold = 1; - _timeProvider = new FakeTimeProvider(); - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _checkpointHandler.HandledMessages.Clear(); - ((FakeTimeProvider)_timeProvider).AddToUtcTime(TimeSpan.FromMilliseconds(_checkpointAfterMs)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(400, 400), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_is_not_suggested() { - Assert.AreEqual(0, _checkpointHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_content_type_validation.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_content_type_validation.cs deleted file mode 100644 index 924c9deb2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_content_type_validation.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Text; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - public class when_handling_events_with_content_type_validation { - [TestFixture] - public class given_json_events_and_content_type_validation_enabled : TestFixtureWithProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(100, 100), "test-stream", 0, false, Guid.NewGuid(), - "null-json", true, null, null)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "invalid-json", true, Encoding.UTF8.GetBytes("{foo:bar}"), new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 2, false, Guid.NewGuid(), - "valid-json", true, Encoding.UTF8.GetBytes("{\"foo\":\"bar\"}"), new byte[0])); - } - - protected override IReaderSubscription CreateProjectionSubscription() { - return new ReaderSubscription( - "Test Subscription", - _bus, - _projectionCorrelationId, - _readerStrategy.PositionTagger.MakeZeroCheckpointTag(), - _readerStrategy, - _timeProvider, - _checkpointUnhandledBytesThreshold, - _checkpointProcessedEventsThreshold, - _checkpointAfterMs, - false, - null, - true); - } - - [Test] - public void only_the_valid_json_is_handled() { - Assert.AreEqual(1, _eventHandler.HandledMessages.Count); - Assert.AreEqual("valid-json", _eventHandler.HandledMessages[0].Data.EventType); - } - } - - [TestFixture] - public class given_non_json_events_and_content_type_validation_enabled : TestFixtureWithProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(100, 100), "test-stream", 0, false, Guid.NewGuid(), - "null-event", false, null, null)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "plain-text", false, Encoding.UTF8.GetBytes("foo bar"), new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 2, false, Guid.NewGuid(), - "valid-json", false, Encoding.UTF8.GetBytes("{\"foo\":\"bar\"}"), new byte[0])); - } - - protected override IReaderSubscription CreateProjectionSubscription() { - return new ReaderSubscription( - "Test Subscription", - _bus, - _projectionCorrelationId, - _readerStrategy.PositionTagger.MakeZeroCheckpointTag(), - _readerStrategy, - _timeProvider, - _checkpointUnhandledBytesThreshold, - _checkpointProcessedEventsThreshold, - _checkpointAfterMs, - false, - null, - true); - } - - [Test] - public void all_events_are_handled() { - Assert.AreEqual(3, _eventHandler.HandledMessages.Count); - } - } - - [TestFixture] - public class given_json_and_non_json_events_and_content_type_validation_disabled : TestFixtureWithProjectionSubscription { - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(100, 100), "test-stream", 0, false, Guid.NewGuid(), - "null-json", true, null, null)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 200), "test-stream", 1, false, Guid.NewGuid(), - "invalid-json", true, Encoding.UTF8.GetBytes("{foo:bar}"), new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 300), "test-stream", 2, false, Guid.NewGuid(), - "valid-json", true, Encoding.UTF8.GetBytes("{\"foo\":\"bar\"}"), new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(400, 400), "test-stream", 3, false, Guid.NewGuid(), - "null-event", false, null, null)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(500, 500), "test-stream", 4, false, Guid.NewGuid(), - "plain-text", false, Encoding.UTF8.GetBytes("foo bar"), new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(600, 600), "test-stream", 5, false, Guid.NewGuid(), - "valid-json", false, Encoding.UTF8.GetBytes("{\"foo\":\"bar\"}"), new byte[0])); - } - - protected override IReaderSubscription CreateProjectionSubscription() { - return new ReaderSubscription( - "Test Subscription", - _bus, - _projectionCorrelationId, - _readerStrategy.PositionTagger.MakeZeroCheckpointTag(), - _readerStrategy, - _timeProvider, - _checkpointUnhandledBytesThreshold, - _checkpointProcessedEventsThreshold, - _checkpointAfterMs, - false, - null, - false); - } - - [Test] - public void all_events_are_handled() { - Assert.AreEqual(6, _eventHandler.HandledMessages.Count); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_different_event_filters.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_different_event_filters.cs deleted file mode 100644 index d1dd8ce4d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_events_with_different_event_filters.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Core.Tests.Services.TimeService; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture("$all", "good-event-type", "any-stream", "bad-event-type", true, true)] - [TestFixture("$all", "good-event-type", "any-stream", "bad-event-type", true, false)] - [TestFixture("$all", "good-event-type", "any-stream", "bad-event-type", false, true)] - [TestFixture("$all", "good-event-type", "any-stream", "bad-event-type", false, false)] - [TestFixture("$all", "good-event-type", "any-stream", "good-event-type", true, true)] - [TestFixture("$all", "good-event-type", "any-stream", "good-event-type", true, false)] - [TestFixture("$all", "good-event-type", "any-stream", "good-event-type", false, true)] - [TestFixture("$all", "good-event-type", "any-stream", "good-event-type", false, false)] - [TestFixture("good-stream", "good-event-type", "good-stream", "good-event-type", true, true)] - [TestFixture("good-stream", "good-event-type", "good-stream", "good-event-type", true, false)] - [TestFixture("good-stream", "good-event-type", "good-stream", "good-event-type", false, true)] - [TestFixture("good-stream", "good-event-type", "good-stream", "good-event-type", false, false)] - [TestFixture("good-stream", "good-event-type", "good-stream", "bad-event-type", true, true)] - [TestFixture("good-stream", "good-event-type", "good-stream", "bad-event-type", true, false)] - [TestFixture("good-stream", "good-event-type", "good-stream", "bad-event-type", false, true)] - [TestFixture("good-stream", "good-event-type", "good-stream", "bad-event-type", false, false)] - [TestFixture("good-stream", "good-event-type", "bad-stream", "good-event-type", false, true)] - [TestFixture("good-stream", "good-event-type", "bad-stream", "good-event-type", false, false)] - [TestFixture("good-stream", "good-event-type", "bad-stream", "bad-event-type", false, true)] - [TestFixture("good-stream", "good-event-type", "bad-stream", "bad-event-type", false, false)] - public class - when_handling_events_with_different_event_filters : - TestFixtureWithProjectionSubscription { - private string _sourceStream; - private string _sourceEventType; - private string _stream; - private string _eventType; - private bool _exceedUnhandledBytesThreshold; - private bool _checkpointIfEventsProcessed; - private int _processedEvents; - - public when_handling_events_with_different_event_filters( - string sourceStream, string sourceEventType, string stream, string eventType, bool exceedUnhandledBytesThreshold, bool checkpointIfEventsProcessed) { - _sourceStream = sourceStream; - _sourceEventType = sourceEventType; - _stream = stream; - _eventType = eventType; - _exceedUnhandledBytesThreshold = exceedUnhandledBytesThreshold; - _checkpointIfEventsProcessed = checkpointIfEventsProcessed; - var passesEventFilter = (sourceStream == "$all" || stream == sourceStream) && eventType == sourceEventType; - _processedEvents = passesEventFilter ? 1 : 0; - } - - protected override void Given() { - _source = source => { - if (_sourceStream == "$all") { - source.FromAll(); - } else { - source.FromStream(_sourceStream); - } - source.IncludeEvent(_sourceEventType); - }; - _checkpointAfterMs = 1000; - _checkpointProcessedEventsThreshold = _checkpointIfEventsProcessed ? 1 : 2; - _checkpointUnhandledBytesThreshold = 4096; - _timeProvider = new FakeTimeProvider(); - } - - protected override void When() { - var firstPosition = new TFPos(200, 200); - var offset = _exceedUnhandledBytesThreshold - ? (_checkpointUnhandledBytesThreshold + 1) - : _checkpointUnhandledBytesThreshold; - var secondPosition = new TFPos(firstPosition.CommitPosition + offset, firstPosition.PreparePosition + offset); - - //send a first event for checkpointing initialization if necessary - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), firstPosition, "a-random-stream-name", 1, false, Guid.NewGuid(), - "a-random-event-type", false, new byte[0], new byte[0])); - - _checkpointHandler.HandledMessages.Clear(); - - //send a second event to trigger checkpoint if necessary - ((FakeTimeProvider)_timeProvider).AddToUtcTime(TimeSpan.FromMilliseconds(_checkpointAfterMs + 1)); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), secondPosition, _stream, 1, false, Guid.NewGuid(), - _eventType, false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_is_suggested_when_processed_events_threshold_exceeded_or_unhandled_bytes_threshold_exceeded() { - var shouldCheckpoint = (_processedEvents >= _checkpointProcessedEventsThreshold) || - (_processedEvents == 0 && _exceedUnhandledBytesThreshold); - Assert.AreEqual(shouldCheckpoint ? 1 : 0, _checkpointHandler.HandledMessages.Count); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_multiple_committed_event_passing_the_filter.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_multiple_committed_event_passing_the_filter.cs deleted file mode 100644 index 57553b9c3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_handling_multiple_committed_event_passing_the_filter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class when_handling_multiple_committed_event_passing_the_filter : TestFixtureWithProjectionSubscription { - protected override void Given() { - base.Given(); - _checkpointProcessedEventsThreshold = 2; - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(300, 250), "test-stream", 2, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void events_passed_to_downstream_handler_have_correct_subscription_sequence_numbers() { - Assert.AreEqual(2, _eventHandler.HandledMessages.Count); - - Assert.AreEqual(0, _eventHandler.HandledMessages[0].SubscriptionMessageSequenceNumber); - Assert.AreEqual(1, _eventHandler.HandledMessages[1].SubscriptionMessageSequenceNumber); - } - - [Test] - public void suggests_a_checkpoint() { - Assert.AreEqual(1, _checkpointHandler.HandledMessages.Count); - Assert.AreEqual(CheckpointTag.FromPosition(0, 300, 250), - _checkpointHandler.HandledMessages[0].CheckpointTag); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs b/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs deleted file mode 100644 index 228a45897..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_subscription/when_receiving_multiple_events_not_passing_event_filter.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_subscription { - [TestFixture] - public class when_receiving_multiple_events_not_passing_event_filter : TestFixtureWithProjectionSubscription { - protected override void Given() { - _source = source => { - source.FromAll(); - source.IncludeEvent("specific-event"); - }; - } - - protected override void When() { - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(200, 150), "test-stream", 1, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(2000, 1950), "test-stream", 2, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - _subscription.Handle( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - Guid.NewGuid(), new TFPos(2100, 2050), "test-stream", 2, false, Guid.NewGuid(), - "bad-event-type", false, new byte[0], new byte[0])); - } - - [Test] - public void checkpoint_suggested_message_is_published_once_for_interval() { - Assert.AreEqual(1, _checkpointHandler.HandledMessages.Count); - Assert.AreEqual(2000, _checkpointHandler.HandledMessages[0].CheckpointTag.CommitPosition); - Assert.AreEqual(1950, _checkpointHandler.HandledMessages[0].CheckpointTag.PreparePosition); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projection_version/when_comparing.cs b/src/EventStore.Projections.Core.Tests/Services/projection_version/when_comparing.cs deleted file mode 100644 index bbbc9e7e3..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projection_version/when_comparing.cs +++ /dev/null @@ -1,39 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projection_version { - [TestFixture] - public class when_comparing { - [Test] - public void equal() { - var v1 = new ProjectionVersion(10, 5, 6); - var v2 = new ProjectionVersion(10, 5, 6); - - Assert.AreEqual(v1, v2); - } - - [Test] - public void not_equal_id() { - var v1 = new ProjectionVersion(10, 5, 6); - var v2 = new ProjectionVersion(11, 5, 6); - - Assert.AreNotEqual(v1, v2); - } - - [Test] - public void not_equal_epoch() { - var v1 = new ProjectionVersion(10, 5, 6); - var v2 = new ProjectionVersion(11, 6, 6); - - Assert.AreNotEqual(v1, v2); - } - - [Test] - public void not_equal_version() { - var v1 = new ProjectionVersion(10, 5, 6); - var v2 = new ProjectionVersion(10, 5, 7); - - Assert.AreNotEqual(v1, v2); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeBiStateProjection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeBiStateProjection.cs deleted file mode 100644 index 6707f7c28..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeBiStateProjection.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public class FakeBiStateProjection : IProjectionStateHandler { - private readonly string _query; - private readonly Action _logger; - - public FakeBiStateProjection(string query, Action logger) { - _query = query; - _logger = logger; - } - - public void Dispose() { - } - - private void Log(string msg, params object[] args) { - _logger(msg, args); - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - Log("ConfigureSourceProcessingStrategy(" + builder + ")"); - builder.FromAll(); - builder.AllEvents(); - builder.SetByStream(); - builder.SetIsBiState(true); - } - - public void Load(string state) { - Log("Load(" + state + ")"); - } - - public void LoadShared(string state) { - Log("LoadShared(" + state + ")"); - } - - public void Initialize() { - Log("Initialize"); - } - - public void InitializeShared() { - Log("InitializeShared"); - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - Log("GetStatePartition(" + "..." + ")"); - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, out string newState, - out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - if (data.EventType == "fail" || _query == "fail") - throw new Exception("failed"); - Log("ProcessEvent(" + "..." + ")"); - newState = "{\"data\": 1}"; - newSharedState = "{\"data\": 2}"; - emittedEvents = null; - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - Log("ProcessPartitionCreated"); - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeForeachStreamProjection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeForeachStreamProjection.cs deleted file mode 100644 index 36e2a113e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeForeachStreamProjection.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public class FakeForeachStreamProjection : IProjectionStateHandler { - private readonly string _query; - private readonly Action _logger; - private string _state; - - public FakeForeachStreamProjection(string query, Action logger) { - _query = query; - _logger = logger; - } - - public void Dispose() { - } - - private void Log(string msg, params object[] args) { - _logger(msg, args); - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - Log("ConfigureSourceProcessingStrategy(" + builder + ")"); - builder.FromAll(); - builder.AllEvents(); - builder.SetByStream(); - builder.SetDefinesStateTransform(); - } - - public void Load(string state) { - Log("Load(" + state + ")"); - _state = state; - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - Log("Initialize"); - _state = ""; - } - - public void InitializeShared() { - Log("InitializeShared"); - throw new NotImplementedException(); - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - Log("GetStatePartition(" + "..." + ")"); - return @data.EventStreamId; - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - if (data.EventType == "fail" || _query == "fail") - throw new Exception("failed"); - Log("ProcessEvent(" + "..." + ")"); - newState = "{\"data\": " + _state + data + "}"; - emittedEvents = null; - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - Log("Process ProcessPartitionCreated"); - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - return _state; - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeProjection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeProjection.cs deleted file mode 100644 index 2ddd5e172..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/FakeProjection.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public class FakeProjection : IProjectionStateHandler { - private readonly string _query; - private readonly Action _logger; - - public FakeProjection(string query, Action logger) { - _query = query; - _logger = logger; - } - - public void Dispose() { - } - - private void Log(string msg, params object[] args) { - _logger(msg, args); - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - Log("ConfigureSourceProcessingStrategy(" + builder + ")"); - builder.FromAll(); - builder.AllEvents(); - } - - public void Load(string state) { - Log("Load(" + state + ")"); - throw new NotImplementedException(); - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - Log("Initialize"); - } - - public void InitializeShared() { - Log("InitializeShared"); - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - Log("GetStatePartition(" + "..." + ")"); - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - if (data.EventType == "fail" || _query == "fail") - throw new Exception("failed"); - Log("ProcessEvent(" + "..." + ")"); - newState = "{\"data\": 1}"; - emittedEvents = null; - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - Log("Process ProcessPartitionCreated"); - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/TestFixtureWithProjectionCoreAndManagementServices.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/TestFixtureWithProjectionCoreAndManagementServices.cs deleted file mode 100644 index 99522e123..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/TestFixtureWithProjectionCoreAndManagementServices.cs +++ /dev/null @@ -1,264 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using DotNext; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.Monitoring.Stats; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public abstract class TestFixtureWithProjectionCoreAndManagementServices : core_projection.TestFixtureWithExistingEvents { - protected class GuardBusToTriggerFixingIfUsed : IQueuedHandler, IPublisher, ISubscriber { - public void Handle(Message message) { - throw new NotImplementedException(); - } - - public void Publish(Message message) { - throw new NotImplementedException(); - } - - public string Name { get; } - public Task Start() { - throw new NotImplementedException(); - } - - public void Stop() { - throw new NotImplementedException(); - } - - public void RequestStop() { - throw new NotImplementedException(); - } - - public QueueStats GetStatistics() { - throw new NotImplementedException(); - } - - public void Subscribe(IAsyncHandle handler) where T : Message { - throw new NotImplementedException(); - } - - public void Unsubscribe(IAsyncHandle handler) where T : Message { - throw new NotImplementedException(); - } - } - protected ProjectionManager _manager; - protected ProjectionManagerMessageDispatcher _managerMessageDispatcher; - private bool _initializeSystemProjections; - protected Tuple[] _processingQueues; - private ProjectionCoreCoordinator _coordinator; - - protected override void Given1() { - base.Given1(); - _initializeSystemProjections = GivenInitializeSystemProjections(); - if (!_initializeSystemProjections) { - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, - ProjectionEventTypes.ProjectionsInitialized, "", ""); - } - } - - protected virtual bool GivenInitializeSystemProjections() { - return false; - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, _timeProvider); - } - - [SetUp] - public void Setup() { - //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well - _bus.Subscribe(_consumer); - - _processingQueues = GivenProcessingQueues(); - var queues = _processingQueues.ToDictionary(v => v.Item4, v => v.Item1.As()); - _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues); - _manager = new ProjectionManager( - GetInputQueue(), - GetInputQueue(), - queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp, - _initializeSystemProjections); - - _coordinator = new ProjectionCoreCoordinator( - ProjectionType.All, - queues.Values.ToArray(), - _bus); - - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_coordinator); - _bus.Subscribe(_coordinator); - - if (GetInputQueue() != _processingQueues.First().Item2) { - _bus.Subscribe( - _managerMessageDispatcher); - } - - foreach (var q in _processingQueues) - SetUpCoreServices(q.Item4, q.Item1, q.Item2, q.Item3); - - //Given(); - WhenLoop(); - } - - protected virtual Tuple[] GivenProcessingQueues() { - return new[] { - Tuple.Create(_bus, GetInputQueue(), (SynchronousScheduler)null, Guid.NewGuid()) - }; - } - - private void SetUpCoreServices( - Guid workerId, - SynchronousScheduler bus, - IPublisher inputQueue, - SynchronousScheduler output_) { - var output = (output_ ?? inputQueue); - ICheckpoint writerCheckpoint = new InMemoryCheckpoint(1000); - var readerService = new EventReaderCoreService( - output, - _ioDispatcher, - 10, - writerCheckpoint, - runHeadingReader: true, faultOutOfOrderProjections: true); - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(inputQueue); - - bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - bus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - - var ioDispatcher = new IODispatcher(output, inputQueue, true); - - var guardBus = new GuardBusToTriggerFixingIfUsed(); - var configuration = new ProjectionsStandardComponents(1, ProjectionType.All, guardBus, guardBus, guardBus, guardBus, true, - 500, 250); - var coreService = new ProjectionCoreService( - workerId, - inputQueue, - output, - _subscriptionDispatcher, - _timeProvider, - ioDispatcher, - configuration); - - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(ioDispatcher.ForwardReader); - bus.Subscribe(ioDispatcher.BackwardReader); - bus.Subscribe(ioDispatcher.BackwardReader); - bus.Subscribe(ioDispatcher.Writer); - bus.Subscribe(ioDispatcher.StreamDeleter); - bus.Subscribe(ioDispatcher.Awaker); - bus.Subscribe(ioDispatcher); - bus.Subscribe(coreService); - bus.Subscribe(coreService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(coreService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - bus.Subscribe(readerService); - - if (output_ != null) { - bus.Subscribe(new UnwrapEnvelopeHandler()); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe( - Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(GetInputQueue())); - output_.Subscribe(Forwarder.Create(inputQueue)); // forward all - - var forwarder = new RequestResponseQueueForwarder( - inputQueue: inputQueue, - externalRequestQueue: GetInputQueue()); - // forwarded messages - output_.Subscribe(forwarder); - output_.Subscribe(forwarder); - output_.Subscribe(forwarder); - output_.Subscribe(forwarder); - output_.Subscribe(forwarder); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/bi_state/a_new_posted_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/bi_state/a_new_posted_projection.cs deleted file mode 100644 index 6b9a30c08..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/bi_state/a_new_posted_projection.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.bi_state { - public static class a_new_posted_projection { - public abstract class Base : TestFixtureWithProjectionCoreAndManagementServices { - protected string _projectionName; - protected string _projectionSource; - protected Type _fakeProjectionType; - protected ProjectionMode _projectionMode; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - - _projectionName = "test-projection"; - _projectionSource = @""; - _fakeProjectionType = typeof(FakeBiStateProjection); - _projectionMode = ProjectionMode.Continuous; - _checkpointsEnabled = true; - _trackEmittedStreams = true; - _emitEnabled = false; - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, _projectionMode, _projectionName, - ProjectionManagementMessage.RunAs.System, "native:" + _fakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: _checkpointsEnabled, - trackEmittedStreams: _trackEmittedStreams, - emitEnabled: _emitEnabled)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_get_state : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return ( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - } - - [Test] - public void returns_correct_state() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_stopping : Base { - private Guid _reader; - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream1", 1, "stream1", 1, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(200, 150), new TFPos(200, 150), "stream2", 1, "stream2", 1, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - } - - [Test] - public void writes_both_stream_and_shared_partition_checkpoints() { - var writeProjectionCheckpoints = - HandledMessages.OfType() - .OfEventType(ProjectionEventTypes.ProjectionCheckpoint).ToArray(); - var writeCheckpoints = - HandledMessages.OfType() - .OfEventType(ProjectionEventTypes.PartitionCheckpoint).ToArray(); - - Assert.AreEqual(1, writeProjectionCheckpoints.Length); - Assert.AreEqual(@"[{""data"": 2}]", Encoding.UTF8.GetString(writeProjectionCheckpoints[0].Data)); - Assert.AreEqual(2, writeCheckpoints.Length); - - Assert.That( - writeCheckpoints.All( - v => Encoding.UTF8.GetString(v.Data) == @"[{""data"": 1},{""data"": 1}]")); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_new_posted_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_new_posted_projection.cs deleted file mode 100644 index fc23b6f05..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_new_posted_projection.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.continuous { - public static class a_new_posted_projection { - public abstract class Base : TestFixtureWithProjectionCoreAndManagementServices { - protected string _projectionName; - protected string _projectionSource; - protected Type _fakeProjectionType; - protected ProjectionMode _projectionMode; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - protected bool _projectionEnabled; - - protected override void Given() { - base.Given(); - - _projectionName = "test-projection"; - _projectionSource = @""; - _fakeProjectionType = typeof(FakeProjection); - _projectionMode = ProjectionMode.Continuous; - _checkpointsEnabled = true; - _trackEmittedStreams = true; - _emitEnabled = true; - _projectionEnabled = true; - - NoStream("$projections-test-projection-checkpoint"); - NoStream("$projections-test-projection-order"); - NoOtherStreams(); - AllWritesSucceed(); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return ( - new ProjectionManagementMessage.Command.Post( - _bus, _projectionMode, _projectionName, - ProjectionManagementMessage.RunAs.System, - "native:" + _fakeProjectionType.AssemblyQualifiedName, _projectionSource, - enabled: _projectionEnabled, - checkpointsEnabled: _checkpointsEnabled, trackEmittedStreams: _trackEmittedStreams, - emitEnabled: _emitEnabled)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_get_query : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) - yield return m; - yield return - (new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void returns_correct_source() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual("", projectionQuery.Query); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_get_state : Base { - protected override void Given() { - base.Given(); - EnableReadAll(); - ExistingEvent("temp1", "test1", "{}", "{}"); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return (new ProjectionManagementMessage.Command.GetState(_bus, - _projectionName, "")); - } - - [Test] - public void returns_correct_state() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - //at least projection initializaed message is here - Assert.AreEqual( - "{\"data\": 1}", - _consumer.HandledMessages.OfType().Single().State); - Assert.AreEqual( - _all.Last(v => !SystemStreams.IsSystemStream(v.Value.EventStreamId)).Key, - _consumer.HandledMessages.OfType() - .Single() - .Position.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_failing : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - var reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, Guid.NewGuid(), - "fail", false, new byte[0], new byte[0], 100, 33.3f)); - } - - [Test] - public void publishes_faulted_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void the_projection_status_becomes_faulted() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Faulted, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - } - } - - public class an_expired_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - AllWritesSucceed(); - base.Given(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, - Guid.NewGuid(), - "type", false, new byte[0], new byte[0], 100, 33.3f)); - _timeProvider.AddToUtcTime(TimeSpan.FromMinutes(6)); - yield return Yield; - foreach (var m in _consumer.HandledMessages.OfType().ToArray()) - m.Envelope.ReplyWith(m.ReplyMessage); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_retrieving_statistics : Base { - protected override IEnumerable When() { - foreach (var s in base.When()) yield return s; - _consumer.HandledMessages.Clear(); - yield return ( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - } - - [Test] - public void projection_is_not_deleted() { - Assert.IsFalse(_consumer.HandledMessages.OfType().Any()); - var res = _consumer.HandledMessages.OfType() - .First(x => x.Projections.Any(y => y.Name == _projectionName)); - Assert.AreEqual("Running", res.Projections.First(x => x.Name == _projectionName).Status); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_running_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_running_projection.cs deleted file mode 100644 index c3bbd1464..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/continuous/a_running_projection.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.continuous { - public class a_running_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - base.Given(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - if (_projectionEnabled) { - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, - Guid.NewGuid(), "type", false, new byte[0], new byte[0], 100, 33.3f)); - } else - _reader = Guid.Empty; - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_stopping : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - yield return - (new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System)); - for (var i = 0; i < 50; i++) { - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100 * i + 200, 150), new TFPos(100 * i + 200, 150), "stream", 1 + i + 1, - "stream", 1 + i + 1, false, Guid.NewGuid(), "type", false, new byte[0], new byte[0], - 100 * i + 200, 33.3f)); - } - } - - [Test] - public void pause_message_is_published() { - Assert.Inconclusive("actually in unsubscribes..."); - } - - [Test] - public void unsubscribe_message_is_published() { - Assert.Inconclusive("actually in unsubscribes..."); - } - - - [Test] - public void the_projection_status_becomes_stopped_disabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - false, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_event : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(200, 150), new TFPos(200, 150), "stream", 2, "stream", 2, false, - Guid.NewGuid(), "type", false, new byte[0], new byte[0], 100, 33.3f)); - } - - [Test] - public void the_projection_status_remains_running_enabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_resetting : Base { - protected override void Given() { - base.Given(); - _projectionEnabled = false; - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - yield return - (new ProjectionManagementMessage.Command.Reset( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System)); - } - - [Test] - public void the_projection_epoch_changes() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Epoch); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Version); - } - - [Test] - public void the_projection_status_is_enabled_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - false, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_resetting_and_starting : Base { - protected override void Given() { - base.Given(); - _projectionEnabled = false; - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Reset( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System)); - yield return - (new ProjectionManagementMessage.Command.Enable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System)); - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 150), new TFPos(100, 150), "stream", 1 + 1, "stream", 1 + 1, false, - Guid.NewGuid(), "type", false, new byte[0], new byte[0], 200, 33.3f)); - } - - [Test] - public void the_projection_epoch_changes() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Epoch); - Assert.AreEqual( - 2, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Version); - } - - [Test] - public void the_projection_status_is_enabled_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_creating_a_managed_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_creating_a_managed_projection.cs deleted file mode 100644 index 0caee9efe..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_creating_a_managed_projection.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using TestFixtureWithReadWriteDispatchers = - EventStore.Projections.Core.Tests.Services.core_projection.TestFixtureWithReadWriteDispatchers; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture] - public class when_creating_a_managed_projection : TestFixtureWithReadWriteDispatchers { - private new ITimeProvider _timeProvider; - - private - RequestResponseDispatcher - _getStateDispatcher; - - private - RequestResponseDispatcher - - _getResultDispatcher; - - [SetUp] - public void setup() { - _timeProvider = new FakeTimeProvider(); - _getStateDispatcher = - new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus); - _getResultDispatcher = - new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus); - } - - - [Test] - public void empty_guid_throws_invalid_argument_exception() { - Assert.Throws(() => { - new ManagedProjection( - Guid.NewGuid(), - Guid.Empty, - 1, - "name", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, - _getStateDispatcher, - _getResultDispatcher, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - }); - } - - [Test] - public void null_name_throws_argument_null_exception() { - Assert.Throws(() => { - new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - null, - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, - _getStateDispatcher, - _getResultDispatcher, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - }); - } - - [Test] - public void empty_name_throws_argument_exception() { - Assert.Throws(() => { - new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - "", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, - _getStateDispatcher, - _getResultDispatcher, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_a_managed_projection_state.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_a_managed_projection_state.cs deleted file mode 100644 index 4ac5c0c47..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_a_managed_projection_state.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_loading_a_managed_projection_state : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - - private ManagedProjection _mp; - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - "name", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - [Test] - public void null_handler_type_throws_argument_null_exception() { - Assert.Throws(() => { - ProjectionManagementMessage.Command.Post message = new ProjectionManagementMessage.Command.Post( - new NoopEnvelope(), ProjectionMode.OneTime, "name", ProjectionManagementMessage.RunAs.Anonymous, - (string)null, @"log(1);", enabled: true, checkpointsEnabled: false, emitEnabled: false, - trackEmittedStreams: false); - _mp.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = message.Enabled, - HandlerType = message.HandlerType, - Query = message.Query, - Mode = message.Mode, - EmitEnabled = message.EmitEnabled, - CheckpointsDisabled = !message.CheckpointsEnabled, - Epoch = -1, - Version = -1, - RunAs = message.EnableRunAs ? SerializedRunAs.SerializePrincipal(message.RunAs) : null, - }, - null); - }); - } - - [Test] - public void empty_handler_type_throws_argument_null_exception() { - Assert.Throws(() => { - ProjectionManagementMessage.Command.Post message = new ProjectionManagementMessage.Command.Post( - new NoopEnvelope(), ProjectionMode.OneTime, "name", ProjectionManagementMessage.RunAs.Anonymous, "", - @"log(1);", enabled: true, checkpointsEnabled: false, emitEnabled: false, - trackEmittedStreams: false); - _mp.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = message.Enabled, - HandlerType = message.HandlerType, - Query = message.Query, - Mode = message.Mode, - EmitEnabled = message.EmitEnabled, - CheckpointsDisabled = !message.CheckpointsEnabled, - Epoch = -1, - Version = -1, - RunAs = message.EnableRunAs ? SerializedRunAs.SerializePrincipal(message.RunAs) : null, - }, - null); - }); - } - - [Test] - public void null_query_throws_argument_null_exception() { - Assert.Throws(() => { - ProjectionManagementMessage.Command.Post message = new ProjectionManagementMessage.Command.Post( - new NoopEnvelope(), ProjectionMode.OneTime, "name", ProjectionManagementMessage.RunAs.Anonymous, - "JS", query: null, enabled: true, checkpointsEnabled: false, emitEnabled: false, - trackEmittedStreams: false); - _mp.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = message.Enabled, - HandlerType = message.HandlerType, - Query = message.Query, - Mode = message.Mode, - EmitEnabled = message.EmitEnabled, - CheckpointsDisabled = !message.CheckpointsEnabled, - Epoch = -1, - Version = -1, - RunAs = message.EnableRunAs ? SerializedRunAs.SerializePrincipal(message.RunAs) : null, - }, - null); - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_existing_projection_state.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_existing_projection_state.cs deleted file mode 100644 index 71b50612c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_loading_existing_projection_state.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_loading_existing_projection_state_with_no_projection_subsystem_version : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - private string _projectionName = Guid.NewGuid().ToString(); - - private ManagedProjection _mp; - - protected override void Given() { - var persistedState = new ManagedProjection.PersistedState { - Enabled = true, - HandlerType = "JS", - Query = @"log(1);", - Mode = ProjectionMode.Continuous, - EmitEnabled = true, - CheckpointsDisabled = true, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous) - }; - ExistingEvent(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName, - ProjectionEventTypes.ProjectionUpdated, "", persistedState.ToJson()); - - _timeProvider = new FakeTimeProvider(); - _mp = new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - "name", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - [Test] - public void content_type_validation_is_disabled() { - _mp.InitializeExisting(_projectionName); - Assert.False(_mp.EnableContentTypeValidation); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_loading_existing_projection_state_with_projection_subsystem_version : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - private string _projectionName = Guid.NewGuid().ToString(); - - private ManagedProjection _mp; - - protected override void Given() { - var persistedState = new ManagedProjection.PersistedState { - Enabled = true, - HandlerType = "JS", - Query = @"log(1);", - Mode = ProjectionMode.Continuous, - EmitEnabled = true, - CheckpointsDisabled = true, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous), - ProjectionSubsystemVersion = 4 - }; - ExistingEvent(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName, - ProjectionEventTypes.ProjectionUpdated, "", persistedState.ToJson()); - - _timeProvider = new FakeTimeProvider(); - _mp = new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - "name", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - [Test] - public void content_type_validation_is_enabled() { - _mp.InitializeExisting(_projectionName); - Assert.True(_mp.EnableContentTypeValidation); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_persisted_state_write_fails.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_persisted_state_write_fails.cs deleted file mode 100644 index c8b043816..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_persisted_state_write_fails.cs +++ /dev/null @@ -1,123 +0,0 @@ -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.ForwardTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.ForwardTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.PrepareTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.PrepareTimeout)] - public class when_persisted_state_write_fails : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - private ManagedProjection _managedProjection; - private Guid _coreProjectionId; - private string _projectionName; - private string _projectionDefinitionStreamId; - private Guid _originalPersistedStateEventId; - - private OperationResult _failureCondition; - - public when_persisted_state_write_fails(OperationResult failureCondition) { - _failureCondition = failureCondition; - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, _timeProvider); - } - - [SetUp] - public void SetUp() { - AllWritesQueueUp(); - WhenLoop(); - } - - protected override void Given() { - _projectionName = "projectionName"; - _projectionDefinitionStreamId = ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName; - _coreProjectionId = Guid.NewGuid(); - _timeProvider = new FakeTimeProvider(); - _managedProjection = new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - _projectionName, - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - protected override IEnumerable When() { - ProjectionManagementMessage.Command.Post message = new ProjectionManagementMessage.Command.Post( - Envelope, ProjectionMode.OneTime, _projectionName, ProjectionManagementMessage.RunAs.System, - typeof(FakeForeachStreamProjection), "", true, false, false, false); - _managedProjection.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = message.Enabled, - HandlerType = message.HandlerType, - Query = message.Query, - Mode = message.Mode, - EmitEnabled = message.EmitEnabled, - CheckpointsDisabled = !message.CheckpointsEnabled, - Epoch = -1, - Version = -1, - RunAs = message.EnableRunAs ? SerializedRunAs.SerializePrincipal(message.RunAs) : null, - }, - null); - - var sourceDefinition = new FakeForeachStreamProjection("", Console.WriteLine).GetSourceDefinition(); - var projectionSourceDefinition = ProjectionSourceDefinition.From(sourceDefinition); - - _managedProjection.Handle( - new CoreProjectionStatusMessage.Prepared( - _coreProjectionId, projectionSourceDefinition)); - - _originalPersistedStateEventId = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == _projectionDefinitionStreamId).First().Events[0].EventId; - - CompleteWriteWithResult(_failureCondition); - - _consumer.HandledMessages.Clear(); - - yield break; - } - - [Test] - public void should_retry_writing_the_persisted_state_with_the_same_event_id() { - var eventId = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == _projectionDefinitionStreamId).First().Events[0].EventId; - Assert.AreEqual(eventId, _originalPersistedStateEventId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_starting_a_managed_projection_without_follower_projections.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_starting_a_managed_projection_without_follower_projections.cs deleted file mode 100644 index fe0fe4f1c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_starting_a_managed_projection_without_follower_projections.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Core.Util; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_a_managed_projection_without_follower_projections : core_projection.TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - - private ManagedProjection _mp; - private Guid _coreProjectionId; - private string _projectionName; - - [SetUp] - public new void SetUp() { - WhenLoop(); - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, _timeProvider); - } - - protected override void Given() { - _projectionName = "projection"; - _coreProjectionId = Guid.NewGuid(); - _timeProvider = new FakeTimeProvider(); - _mp = new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - "name", - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - protected override IEnumerable When() { - ProjectionManagementMessage.Command.Post message = new ProjectionManagementMessage.Command.Post( - Envelope, ProjectionMode.Transient, _projectionName, ProjectionManagementMessage.RunAs.System, - typeof(FakeForeachStreamProjection), "", true, false, false, false); - _mp.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = message.Enabled, - HandlerType = message.HandlerType, - Query = message.Query, - Mode = message.Mode, - EmitEnabled = message.EmitEnabled, - CheckpointsDisabled = !message.CheckpointsEnabled, - Epoch = -1, - Version = -1, - RunAs = message.EnableRunAs ? SerializedRunAs.SerializePrincipal(message.RunAs) : null, - }, - null); - - var sourceDefinition = new FakeForeachStreamProjection("", Console.WriteLine).GetSourceDefinition(); - var projectionSourceDefinition = ProjectionSourceDefinition.From(sourceDefinition); - - _mp.Handle( - new CoreProjectionStatusMessage.Prepared( - _coreProjectionId, projectionSourceDefinition)); - yield break; - } - - [Test] - public void publishes_start_message() { - var startMessage = HandledMessages.OfType().LastOrDefault(); - Assert.IsNotNull(startMessage); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_updating_projection_config.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_updating_projection_config.cs deleted file mode 100644 index 6743aa6f0..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/managed_projection/when_updating_projection_config.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Tests.Services.core_projection; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.managed_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - public class when_initializing_projection_with_default_options : projection_config_test_base { - private ManagedProjection _mp; - private Guid _projectionId = Guid.NewGuid(); - private ProjectionManagementMessage.ProjectionConfig _config; - private EventRecord _persistedStateWrite; - - private ManagedProjection.PersistedState _persistedState = new ManagedProjection.PersistedState { - Enabled = true, - HandlerType = "JS", - Query = "fromAll().when({});", - Mode = ProjectionMode.Continuous, - CheckpointsDisabled = null, - Epoch = null, - Version = null, - RunAs = null, - EmitEnabled = null, - TrackEmittedStreams = null, - CheckpointAfterMs = (int)ProjectionConsts.CheckpointAfterMs.TotalMilliseconds, - CheckpointHandledThreshold = ProjectionConsts.CheckpointHandledThreshold, - CheckpointUnhandledBytesThreshold = ProjectionConsts.CheckpointUnhandledBytesThreshold, - MaxAllowedWritesInFlight = ProjectionConsts.MaxAllowedWritesInFlight, - ProjectionExecutionTimeout = null, - CreateTempStreams = null - }; - - public when_initializing_projection_with_default_options() { - AllWritesQueueUp(); - } - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = CreateManagedProjection(); - - _mp.InitializeNew( - _persistedState, - null); - _mp.Handle(new CoreProjectionStatusMessage.Prepared(_projectionId, new ProjectionSourceDefinition())); - - // Complete write of persisted state to start projection - OneWriteCompletes(); - _config = GetProjectionConfig(_mp); - _persistedStateWrite = _streams[ProjectionStreamId].LastOrDefault(); - } - - [Test] - public void projection_execution_timeout_should_be_null() { - Assert.IsNotNull(_config); - Assert.IsNull(_config.ProjectionExecutionTimeout, "ProjectionExecutionTimeout"); - } - - [Test] - public void emit_options_should_default_to_false() { - Assert.IsNotNull(_config); - Assert.AreEqual(false, _config.EmitEnabled, "EmitEnabled"); - Assert.AreEqual(false, _config.TrackEmittedStreams, "TrackEmittedStreams"); - } - - [Test] - public void persisted_state_should_leave_fallback_options_unset() { - Assert.IsNotNull(_persistedStateWrite); - var actualState = _persistedStateWrite.Data.ParseJson(); - Assert.IsNull(actualState.ProjectionExecutionTimeout, "ProjectionExecutionTimeout"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_initializing_projection_with_persisted_state : projection_config_test_base { - private ManagedProjection _mp; - private Guid _projectionId = Guid.NewGuid(); - private ProjectionManagementMessage.ProjectionConfig _config; - private EventRecord _persistedStateWrite; - - private ManagedProjection.PersistedState _persistedState = new ManagedProjection.PersistedState { - Enabled = true, - HandlerType = "JS", - Query = "fromAll().when({});", - Mode = ProjectionMode.Continuous, - CheckpointsDisabled = false, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous), - EmitEnabled = false, - TrackEmittedStreams = true, - CheckpointAfterMs = 1, - CheckpointHandledThreshold = 2, - CheckpointUnhandledBytesThreshold = 3, - PendingEventsThreshold = 4, - MaxWriteBatchLength = 5, - MaxAllowedWritesInFlight = 6, - ProjectionExecutionTimeout = 11 - }; - - public when_initializing_projection_with_persisted_state() { - AllWritesQueueUp(); - } - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = CreateManagedProjection(); - - _mp.InitializeNew( - _persistedState, - null); - _mp.Handle(new CoreProjectionStatusMessage.Prepared(_projectionId, new ProjectionSourceDefinition())); - - // Complete write of persisted state to start projection - OneWriteCompletes(); - _config = GetProjectionConfig(_mp); - _persistedStateWrite = _streams[ProjectionStreamId].LastOrDefault(); - } - - [Test] - public void config_should_be_same_as_persisted_state() { - Assert.IsNotNull(_config); - Assert.AreEqual(_persistedState.EmitEnabled, _config.EmitEnabled, "EmitEnabled"); - Assert.AreEqual(_persistedState.TrackEmittedStreams, _config.TrackEmittedStreams, "TrackEmittedStreams"); - Assert.AreEqual(_persistedState.CheckpointAfterMs, _config.CheckpointAfterMs, "CheckpointAfterMs"); - Assert.AreEqual(_persistedState.CheckpointHandledThreshold, _config.CheckpointHandledThreshold, - "CheckpointHandledThreshold"); - Assert.AreEqual(_persistedState.CheckpointUnhandledBytesThreshold, - _config.CheckpointUnhandledBytesThreshold, "CheckpointUnhandledBytesThreshold"); - Assert.AreEqual(_persistedState.PendingEventsThreshold, _config.PendingEventsThreshold, - "PendingEventsThreshold"); - Assert.AreEqual(_persistedState.MaxWriteBatchLength, _config.MaxWriteBatchLength, "MaxWriteBatchLength"); - Assert.AreEqual(_persistedState.MaxAllowedWritesInFlight, _config.MaxAllowedWritesInFlight, - "MaxAllowedWritesInFlight"); - Assert.AreEqual(_persistedState.ProjectionExecutionTimeout, _config.ProjectionExecutionTimeout, - "ProjectionExecutionTimeout"); - } - - [Test] - public void persisted_state_is_written_correctly() { - Assert.IsNotNull(_persistedStateWrite); - var actualState = _persistedStateWrite.Data.ParseJson(); - - Assert.AreEqual(_persistedState.EmitEnabled, actualState.EmitEnabled, "EmitEnabled"); - Assert.AreEqual(_persistedState.TrackEmittedStreams, actualState.TrackEmittedStreams, "TrackEmittedStreams"); - Assert.AreEqual(_persistedState.CheckpointAfterMs, actualState.CheckpointAfterMs, "CheckpointAfterMs"); - Assert.AreEqual(_persistedState.CheckpointHandledThreshold, actualState.CheckpointHandledThreshold, - "CheckpointHandledThreshold"); - Assert.AreEqual(_persistedState.CheckpointUnhandledBytesThreshold, - actualState.CheckpointUnhandledBytesThreshold, "CheckpointUnhandledBytesThreshold"); - Assert.AreEqual(_persistedState.PendingEventsThreshold, actualState.PendingEventsThreshold, - "PendingEventsThreshold"); - Assert.AreEqual(_persistedState.MaxWriteBatchLength, actualState.MaxWriteBatchLength, "MaxWriteBatchLength"); - Assert.AreEqual(_persistedState.MaxAllowedWritesInFlight, actualState.MaxAllowedWritesInFlight, - "MaxAllowedWritesInFlight"); - Assert.AreEqual(_persistedState.ProjectionExecutionTimeout, actualState.ProjectionExecutionTimeout, - "ProjectionExecutionTimeout"); - } - } - - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - public class when_updating_projection_config_to_remove_execution_timeout : projection_config_test_base { - private ManagedProjection _mp; - private Guid _projectionId = Guid.NewGuid(); - private ProjectionManagementMessage.ProjectionConfig _config; - private EventRecord _persistedStateWrite; - private ProjectionManagementMessage.Command.UpdateConfig _updateConfig; - - private ManagedProjection.PersistedState _persistedState => new ManagedProjection.PersistedState { - Enabled = false, - HandlerType = "JS", - Query = "fromAll().when({});", - Mode = ProjectionMode.Continuous, - CheckpointsDisabled = false, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous), - EmitEnabled = false, - TrackEmittedStreams = true, - CheckpointAfterMs = 1, - CheckpointHandledThreshold = 2, - CheckpointUnhandledBytesThreshold = 3, - PendingEventsThreshold = 4, - MaxWriteBatchLength = 5, - MaxAllowedWritesInFlight = 6, - ProjectionExecutionTimeout = 11 - }; - - public when_updating_projection_config_to_remove_execution_timeout() { - AllWritesQueueUp(); - } - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = CreateManagedProjection(); - - _mp.InitializeNew( - _persistedState, - null); - _mp.Handle(new CoreProjectionStatusMessage.Prepared(_projectionId, new ProjectionSourceDefinition())); - OneWriteCompletes(); - _mp.Handle(new CoreProjectionStatusMessage.Stopped(_projectionId, ProjectionName, false)); - - _updateConfig = new ProjectionManagementMessage.Command.UpdateConfig( - new NoopEnvelope(), ProjectionName, _persistedState.EmitEnabled ?? false, _persistedState.TrackEmittedStreams ?? false, - _persistedState.CheckpointAfterMs, _persistedState.CheckpointHandledThreshold, _persistedState.CheckpointUnhandledBytesThreshold, - _persistedState.PendingEventsThreshold, _persistedState.MaxWriteBatchLength, _persistedState.MaxAllowedWritesInFlight, - _persistedState.RunAs, - projectionExecutionTimeout: null); - _mp.Handle(_updateConfig); - OneWriteCompletes(); - - _config = GetProjectionConfig(_mp); - _persistedStateWrite = _streams[ProjectionStreamId].LastOrDefault(); - - } - - [Test] - public void config_should_have_null_projection_execution_timeout() { - Assert.IsNotNull(_config); - Assert.IsNull(_config.ProjectionExecutionTimeout, "ProjectionExecutionTimeout"); - } - - [Test] - public void persisted_state_should_have_null_projection_execution_timeout() { - Assert.IsNotNull(_persistedStateWrite); - var actualState = _persistedStateWrite.Data.ParseJson(); - Assert.IsNull(actualState.ProjectionExecutionTimeout, "ProjectionExecutionTimeout"); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_projection_config_of_faulted_projection : projection_config_test_base { - private ManagedProjection _mp; - private Guid _projectionId = Guid.NewGuid(); - private Exception _thrownException; - private ProjectionManagementMessage.Command.UpdateConfig _updateConfig; - - public when_updating_projection_config_of_faulted_projection() { - AllWritesQueueUp(); - } - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = CreateManagedProjection(); - _mp.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = false, - HandlerType = "JS", - Query = "fromAll().when({});", - Mode = ProjectionMode.Continuous, - EmitEnabled = true, - CheckpointsDisabled = false, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous), - ProjectionExecutionTimeout = 11 - }, - null); - - _mp.Handle(new CoreProjectionStatusMessage.Prepared(_projectionId, new ProjectionSourceDefinition())); - OneWriteCompletes(); - _consumer.HandledMessages.Clear(); - - _mp.Handle(new CoreProjectionStatusMessage.Faulted( - _projectionId, - "test")); - - _updateConfig = CreateConfig(); - try { - _mp.Handle(_updateConfig); - } catch (Exception ex) { - _thrownException = ex; - } - } - - [Test] - public void persisted_state_is_written() { - var writeEvents = _consumer.HandledMessages.OfType().ToList(); - Assert.AreEqual(1, writeEvents.Count()); - Assert.AreEqual(ProjectionStreamId, writeEvents[0].EventStreamId); - } - - [Test] - public void config_update_does_not_throw_exception() { - Assert.IsNull(_thrownException); - } - - [Test] - public void config_is_updated() { - var getConfigResult = GetProjectionConfig(_mp); - - Assert.IsNotNull(getConfigResult); - Assert.AreEqual(_updateConfig.EmitEnabled, getConfigResult.EmitEnabled); - Assert.AreEqual(_updateConfig.TrackEmittedStreams, getConfigResult.TrackEmittedStreams); - Assert.AreEqual(_updateConfig.CheckpointAfterMs, getConfigResult.CheckpointAfterMs); - Assert.AreEqual(_updateConfig.CheckpointHandledThreshold, getConfigResult.CheckpointHandledThreshold); - Assert.AreEqual(_updateConfig.CheckpointUnhandledBytesThreshold, - getConfigResult.CheckpointUnhandledBytesThreshold); - Assert.AreEqual(_updateConfig.PendingEventsThreshold, getConfigResult.PendingEventsThreshold); - Assert.AreEqual(_updateConfig.MaxWriteBatchLength, getConfigResult.MaxWriteBatchLength); - Assert.AreEqual(_updateConfig.MaxAllowedWritesInFlight, getConfigResult.MaxAllowedWritesInFlight); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_projection_config_of_running_projection : projection_config_test_base { - private ManagedProjection _mp; - private Guid _projectionId = Guid.NewGuid(); - - private ManagedProjection.PersistedState _persistedState = new ManagedProjection.PersistedState { - Enabled = true, - HandlerType = "JS", - Query = "fromAll().when({});", - Mode = ProjectionMode.Continuous, - CheckpointsDisabled = false, - Epoch = -1, - Version = -1, - RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous), - EmitEnabled = false, - TrackEmittedStreams = true, - CheckpointAfterMs = 1, - CheckpointHandledThreshold = 2, - CheckpointUnhandledBytesThreshold = 3, - PendingEventsThreshold = 4, - MaxWriteBatchLength = 5, - MaxAllowedWritesInFlight = 6, - ProjectionExecutionTimeout = 11 - }; - - private InvalidOperationException _thrownException; - - public when_updating_projection_config_of_running_projection() { - AllWritesQueueUp(); - } - - protected override void Given() { - _timeProvider = new FakeTimeProvider(); - _mp = CreateManagedProjection(); - - _mp.InitializeNew( - _persistedState, - null); - _mp.Handle(new CoreProjectionStatusMessage.Prepared(_projectionId, new ProjectionSourceDefinition())); - - // Complete write of persisted state to start projection - OneWriteCompletes(); - - try { - _mp.Handle(CreateConfig()); - } catch (InvalidOperationException ex) { - _thrownException = ex; - } - } - - [Test] - public void should_throw_exception_when_trying_to_update_config() { - Assert.IsNotNull(_thrownException); - } - - [Test] - public void config_should_remain_unchanged() { - var getConfigResult = GetProjectionConfig(_mp); - - Assert.IsNotNull(getConfigResult); - Assert.AreEqual(_persistedState.EmitEnabled, getConfigResult.EmitEnabled, "EmitEnabled"); - Assert.AreEqual(_persistedState.TrackEmittedStreams, getConfigResult.TrackEmittedStreams, - "TrackEmittedStreams"); - Assert.AreEqual(_persistedState.CheckpointAfterMs, getConfigResult.CheckpointAfterMs, "CheckpointAfterMs"); - Assert.AreEqual(_persistedState.CheckpointHandledThreshold, getConfigResult.CheckpointHandledThreshold, - "CheckpointHandledThreshold"); - Assert.AreEqual(_persistedState.CheckpointUnhandledBytesThreshold, - getConfigResult.CheckpointUnhandledBytesThreshold, "CheckpointUnhandledBytesThreshold"); - Assert.AreEqual(_persistedState.PendingEventsThreshold, getConfigResult.PendingEventsThreshold, - "PendingEventsThreshold"); - Assert.AreEqual(_persistedState.MaxWriteBatchLength, getConfigResult.MaxWriteBatchLength, - "MaxWriteBatchLength"); - Assert.AreEqual(_persistedState.MaxAllowedWritesInFlight, getConfigResult.MaxAllowedWritesInFlight, - "MaxAllowedWritesInFlight"); - Assert.AreEqual(_persistedState.ProjectionExecutionTimeout, getConfigResult.ProjectionExecutionTimeout, - "ProjectionExecutionTimeout"); - } - } - - public abstract class projection_config_test_base : TestFixtureWithExistingEvents { - protected const string ProjectionName = "name"; - protected readonly string ProjectionStreamId = ProjectionNamesBuilder.ProjectionsStreamPrefix + ProjectionName; - protected ManagedProjection CreateManagedProjection() { - return new ManagedProjection( - Guid.NewGuid(), - Guid.NewGuid(), - 1, - ProjectionName, - true, - null, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _bus, - _timeProvider, new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), new RequestResponseDispatcher - ( - _bus, - v => v.CorrelationId, - v => v.CorrelationId, - _bus), - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault)); - } - - protected ProjectionManagementMessage.Command.UpdateConfig CreateConfig() { - return new ProjectionManagementMessage.Command.UpdateConfig( - new NoopEnvelope(), ProjectionName, true, false, 100, 200, 300, 400, 500, 600, - ProjectionManagementMessage.RunAs.Anonymous, ClusterVNodeOptions.ProjectionOptions.DefaultProjectionExecutionTimeout); - } - - protected ProjectionManagementMessage.ProjectionConfig GetProjectionConfig(ManagedProjection mp) { - ProjectionManagementMessage.ProjectionConfig getConfigResult = null; - mp.Handle(new ProjectionManagementMessage.Command.GetConfig( - new CallbackEnvelope(m => getConfigResult = (ProjectionManagementMessage.ProjectionConfig)m), "name", - SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.Anonymous))); - return getConfigResult; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_completed_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_completed_projection.cs deleted file mode 100644 index 564f39921..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_completed_projection.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - namespace a_completed_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - base.Given(); - AllWritesToSucceed(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName + "-result"); - AllWritesToSucceed("$$$projections-" + _projectionName + "-result"); - NoOtherStreams(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - yield return ( - ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, - Guid.NewGuid(), "type", - false, new byte[0], new byte[0], 100, 33.3f)); - yield return (new ReaderSubscriptionMessage.EventReaderEof(_reader)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_stopping : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - yield return - (new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void the_projection_status_becomes_completed_disabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - false, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Enable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void the_projection_status_becomes_running_enabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_failed_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_failed_projection.cs deleted file mode 100644 index c99c1dfb6..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_failed_projection.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - public class a_failed_projection { - public abstract class Base : a_new_posted_projection.Base { - protected override void Given() { - base.Given(); - _projectionSource = "fail"; - NoOtherStreams(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - var reader = readerAssignedMessage.ReaderId; - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, Guid.NewGuid(), - "event", false, new byte[0], new byte[0], 100, 33.3f)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_query : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous, - @"", null)); - } - - [Test] - public void the_projection_status_becomes_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_stopping : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void the_projection_status_becomes_faulted_disabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - false, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Enable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void the_projection_status_becomes_running_enabled() // as we restart - { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_new_posted_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_new_posted_projection.cs deleted file mode 100644 index ecdf31492..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_new_posted_projection.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - public static class a_new_posted_projection { - public abstract class Base : TestFixtureWithProjectionCoreAndManagementServices { - protected string _projectionName; - protected string _projectionSource; - protected Type _fakeProjectionType; - protected ProjectionMode _projectionMode; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - - protected override void Given() { - base.Given(); - - _projectionName = "test-projection"; - _projectionSource = @""; - _fakeProjectionType = typeof(FakeProjection); - _projectionMode = ProjectionMode.Transient; - _checkpointsEnabled = false; - _trackEmittedStreams = false; - _emitEnabled = false; - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, _projectionMode, _projectionName, - ProjectionManagementMessage.RunAs.System, "native:" + _fakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: _checkpointsEnabled, - emitEnabled: _emitEnabled, trackEmittedStreams: _trackEmittedStreams)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_get_query : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - } - - [Test] - public void returns_correct_source() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual("", projectionQuery.Query); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_get_state : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return ( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - } - - [Test] - public void returns_correct_state() { - Assert.AreEqual( - 1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_failing : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - var reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, Guid.NewGuid(), - "fail", false, new byte[0], new byte[0], 100, 33.3f)); - } - - [Test] - public void publishes_faulted_message() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - - [Test] - public void the_projection_status_becomes_faulted() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Faulted, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_foreach_stream_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_foreach_stream_projection.cs deleted file mode 100644 index afcb02398..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_foreach_stream_projection.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - public class a_running_foreach_stream_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - base.Given(); - _fakeProjectionType = typeof(FakeForeachStreamProjection); - _projectionMode = ProjectionMode.Transient; - _checkpointsEnabled = false; - _emitEnabled = false; - AllWritesSucceed(); - NoOtherStreams(); - //NOTE: do not respond to reads from the following stream - //NoStream("$projections-test-projection-stream-checkpoint"); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - _consumer.HandledMessages.Clear(); - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream1", 1, "stream1", 1, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(200, 150), new TFPos(200, 150), "stream2", 1, "stream2", 1, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(300, 250), new TFPos(300, 250), "stream3", 1, "stream3", 1, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(400, 350), new TFPos(400, 350), "stream1", 2, "stream1", 2, false, - Guid.NewGuid(), - "type", false, Helper.UTF8NoBom.GetBytes("1"), new byte[0], 100, 33.3f)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_receiving_eof : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - yield return (new ReaderSubscriptionMessage.EventReaderEof(_reader)); - } - - [Test] - public void the_projection_status_becomes_completed_enabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Completed, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - - [Test] - public void writes_result_stream() { - List resultsStream; - Assert.IsTrue((_streams.TryGetValue("$projections-test-projection-result", out resultsStream))); - Assert.AreEqual(3 + 1 /* $Eof */, resultsStream.Count); - } - - [Test] - public void does_not_write_to_any_other_streams() { - Assert.IsEmpty( - HandledMessages.OfType() - .Where(v => v.EventStreamId != "$projections-test-projection-result") - .Where(v => v.EventStreamId != "$$$projections-test-projection-result") - .Select(v => v.EventStreamId)); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_projection.cs deleted file mode 100644 index 6ff5a5bea..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/a_running_projection.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - namespace a_running_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - _consumer.HandledMessages.Clear(); - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, - Guid.NewGuid(), - "type", false, new byte[0], new byte[0], 100, 33.3f)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_eof : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - - yield return (new ReaderSubscriptionMessage.EventReaderEof(_reader)); - } - - [Test] - public void pause_message_is_published() { - Assert.Inconclusive("actually in unsubscribes..."); - } - - - [Test] - public void the_projection_status_becomes_completed_enabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Completed, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - - [Test] - public void writes_result_stream() { - List resultsStream; - Assert.IsTrue((_streams.TryGetValue("$projections-test-projection-result", out resultsStream))); - Assert.AreEqual(1 + 1 /* $Eof*/, resultsStream.Count); - Assert.AreEqual("{\"data\": 1}", Encoding.UTF8.GetString(resultsStream[0].Data.Span)); - } - - [Test] - public void does_not_write_to_any_other_streams() { - Assert.IsEmpty( - HandledMessages.OfType() - .Where(v => v.EventStreamId != "$projections-test-projection-result") - .Where(v => v.EventStreamId != "$$$projections-test-projection-result") - .Select(v => v.EventStreamId)); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_handling_event : Base { - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(200, 150), new TFPos(200, 150), "stream", 2, "stream", 1, false, - Guid.NewGuid(), "type", false, new byte[0], new byte[0], 100, 33.3f)); - } - - [Test] - public void the_projection_status_remains_running_enabled() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Enabled); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/an_expired_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/an_expired_projection.cs deleted file mode 100644 index 3869ba86c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/query/an_expired_projection.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.query { - public class an_expired_projection { - public abstract class Base : a_new_posted_projection.Base { - protected Guid _reader; - - protected override void Given() { - AllWritesSucceed(); - base.Given(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - var readerAssignedMessage = - _consumer.HandledMessages.OfType() - .LastOrDefault(); - Assert.IsNotNull(readerAssignedMessage); - _reader = readerAssignedMessage.ReaderId; - - yield return - (ReaderSubscriptionMessage.CommittedEventDistributed.Sample( - _reader, new TFPos(100, 50), new TFPos(100, 50), "stream", 1, "stream", 1, false, - Guid.NewGuid(), - "type", false, new byte[0], new byte[0], 100, 33.3f)); - _timeProvider.AddToUtcTime(TimeSpan.FromMinutes(6)); - yield return Yield; - foreach (var m in _consumer.HandledMessages.OfType().ToArray()) - m.Envelope.ReplyWith(m.ReplyMessage); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_retrieving_statistics : Base { - protected override IEnumerable When() { - foreach (var s in base.When()) yield return s; - _consumer.HandledMessages.Clear(); - yield return ( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - } - - [Test] - public void projection_is_not_found() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.IsFalse(_consumer.HandledMessages.OfType().Any()); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleted_on_expiry : Base { - protected override IEnumerable When() { - foreach (var s in base.When()) yield return s; - _consumer.HandledMessages.Clear(); - } - - [Test] - public void projection_deletion_should_not_be_written() { - var registrationEvents = _streams["$projections-$all"]; - Assert.AreEqual(1, registrationEvents.Count(e => e.EventType == "$ProjectionsInitialized")); - Assert.AreEqual(0, - registrationEvents.Count(e => Helper.UTF8NoBom.GetString(e.Data.ToArray()) == _projectionName)); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/race_conditions_when_successive_writes_are_quick.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/race_conditions_when_successive_writes_are_quick.cs deleted file mode 100644 index a6a83c9a5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/race_conditions_when_successive_writes_are_quick.cs +++ /dev/null @@ -1,373 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Tests.Services.Replication; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager; - -public abstract class race_conditions_when_successive_writes_are_quick { - public abstract class - Base : - TestFixtureWithProjectionCoreAndManagementServices { - protected static readonly Type FakeProjectionType = typeof(FakeProjection); - protected const string _projectionSource = @""; - protected const string _projection1 = "projection#1"; - protected const string _projection2 = "projection#2"; - - protected override void Given() { - base.Given(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, new RealTimeProvider()); - } - - protected void Process() { - int count = 1; - while (count > 0) { - count = 0; - count += _queue.ProcessNonTimer(); - } - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string), true, true)] - [TestFixture(typeof(LogFormat.V2), typeof(string), true, false)] - [TestFixture(typeof(LogFormat.V2), typeof(string), false, true)] - [TestFixture(typeof(LogFormat.V2), typeof(string), false, false)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), true, true)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), true, false)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), false, true)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), false, false)] - public class create_create_race_condition : Base { - - private readonly bool shouldBatchCreate1; - private readonly bool shouldBatchCreate2; - public create_create_race_condition(bool shouldBatchCreate1, bool shouldBatchCreate2) { - this.shouldBatchCreate1 = shouldBatchCreate1; - this.shouldBatchCreate2 = shouldBatchCreate2; - } - - private WhenStep GetCreate(string name, bool batch) { - if (batch) { - var projectionPost = new ProjectionManagementMessage.Command.PostBatch.ProjectionPost( - ProjectionMode.Continuous, ProjectionManagementMessage.RunAs.System, name, - "native:" + FakeProjectionType.AssemblyQualifiedName, enabled: true, - checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: false, query: _projectionSource, enableRunAs: true); - return (new ProjectionManagementMessage.Command.PostBatch(_bus, - ProjectionManagementMessage.RunAs.System, new[] { projectionPost })); - } - - return (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - name, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - protected override void Given() { - base.Given(); - AllWritesQueueUp(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return GetCreate(_projection1, shouldBatchCreate1); - yield return GetCreate(_projection2, shouldBatchCreate2); - } - - [Test] - public void no_WrongExpectedVersion_for_create_create() { - AllWriteComplete(); - AllWritesSucceed(); - while (_queue.TimerMessagesOfType().Count() + _queue.TimerMessagesOfType().Count() > 0) { - _queue.ProcessTimer(); - Thread.Sleep(100); - } - - Process(); - - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - var fakeEnvelope = new FakeEnvelope(); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection1, "dummy")); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection2, "dummy")); - - Process(); - - Assert.AreEqual(2, fakeEnvelope.Replies.Count); - Assert.IsTrue(fakeEnvelope.Replies[0] is ProjectionManagementMessage.ProjectionState); - Assert.IsTrue(fakeEnvelope.Replies[1] is ProjectionManagementMessage.ProjectionState); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string), true)] - [TestFixture(typeof(LogFormat.V2), typeof(string), false)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), true)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), false)] - public class create_delete_race_condition : Base { - private readonly bool shouldBatchCreate; - public create_delete_race_condition(bool shouldBatchCreate) { - this.shouldBatchCreate = shouldBatchCreate; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - _projection1, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - private IEnumerable TestMessages(Guid projectionToDeletedId) { - yield return GetCreate(_projection2); - yield return - (new ProjectionManagementMessage.Internal.Deleted(_projection1, projectionToDeletedId)); - } - - private WhenStep GetCreate(string name) { - if (shouldBatchCreate) { - var projectionPost = new ProjectionManagementMessage.Command.PostBatch.ProjectionPost( - ProjectionMode.Continuous, ProjectionManagementMessage.RunAs.System, name, - "native:" + FakeProjectionType.AssemblyQualifiedName, enabled: true, - checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: false, query: _projectionSource, enableRunAs: true); - return (new ProjectionManagementMessage.Command.PostBatch(_bus, - ProjectionManagementMessage.RunAs.System, new[] { projectionPost })); - } - - return (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - name, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - private Guid GetProjectionId(string name) { - var field = _manager.GetType().GetField("_projectionsMap", - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - var projectionsMap = (Dictionary)field!.GetValue(_manager); - foreach (var entry in projectionsMap!) { - if (entry.Value.Equals(name)) { - return entry.Key; - } - } - - return Guid.Empty; - } - - [Test] - public void no_WrongExpectedVersion_for_create_delete() { - Guid projection1Id = GetProjectionId(_projection1); - AllWritesSucceed(false); - AllWritesQueueUp(); - WhenLoop(TestMessages(projection1Id)); - AllWriteComplete(); - AllWritesSucceed(); - while (_queue.TimerMessagesOfType().Count() > 0) { - _queue.ProcessTimer(); - Thread.Sleep(100); - } - - Process(); - - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - var fakeEnvelope = new FakeEnvelope(); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection1, "dummy")); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection2, "dummy")); - - Process(); - - Assert.AreEqual(2, fakeEnvelope.Replies.Count); - Assert.IsTrue(fakeEnvelope.Replies[0] is ProjectionManagementMessage.NotFound); - Assert.IsTrue(fakeEnvelope.Replies[1] is ProjectionManagementMessage.ProjectionState); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string), true)] - [TestFixture(typeof(LogFormat.V2), typeof(string), false)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), true)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), false)] - public class delete_create_race_condition : Base { - private readonly bool shouldBatchCreate; - - public delete_create_race_condition(bool shouldBatchCreate) { - this.shouldBatchCreate = shouldBatchCreate; - } - - protected override void Given() { - base.Given(); - AllWritesSucceed(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return (new ProjectionManagementMessage.Command.Post(_bus, - ProjectionMode.Continuous, - _projection1, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - private WhenStep GetCreate(string name) { - if (shouldBatchCreate) { - var projectionPost = new ProjectionManagementMessage.Command.PostBatch.ProjectionPost( - ProjectionMode.Continuous, ProjectionManagementMessage.RunAs.System, name, - "native:" + FakeProjectionType.AssemblyQualifiedName, enabled: true, - checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: false, query: _projectionSource, enableRunAs: true); - return (new ProjectionManagementMessage.Command.PostBatch(_bus, - ProjectionManagementMessage.RunAs.System, new[] { projectionPost })); - } - - return (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - name, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - private IEnumerable TestMessages(Guid projectionToDeletedId) { - yield return - (new ProjectionManagementMessage.Internal.Deleted(_projection1, projectionToDeletedId)); - yield return GetCreate(_projection2); - } - - private Guid GetProjectionId(string name) { - var field = _manager.GetType().GetField("_projectionsMap", - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - var projectionsMap = (Dictionary)field!.GetValue(_manager); - foreach (var entry in projectionsMap!) { - if (entry.Value.Equals(name)) { - return entry.Key; - } - } - - return Guid.Empty; - } - - [Test] - public void no_WrongExpectedVersion_for_delete_create() { - Guid projection1Id = GetProjectionId(_projection1); - AllWritesSucceed(false); - AllWritesQueueUp(); - WhenLoop(TestMessages(projection1Id)); - AllWriteComplete(); - AllWritesSucceed(); - while (_queue.TimerMessagesOfType().Count() + _queue.TimerMessagesOfType().Count() > 0) { - _queue.ProcessTimer(); - Thread.Sleep(100); - } - - Process(); - - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - var fakeEnvelope = new FakeEnvelope(); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection1, "dummy")); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection2, "dummy")); - - Process(); - - Assert.AreEqual(2, fakeEnvelope.Replies.Count); - Assert.IsTrue(fakeEnvelope.Replies[0] is ProjectionManagementMessage.NotFound); - Assert.IsTrue(fakeEnvelope.Replies[1] is ProjectionManagementMessage.ProjectionState); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class delete_delete_race_condition : Base { - protected override void Given() { - base.Given(); - AllWritesSucceed(); - } - - protected override IEnumerable When() { - foreach (var m in base.When()) yield return m; - yield return - (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - _projection1, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - yield return - (new ProjectionManagementMessage.Command.Post(_bus, ProjectionMode.Continuous, - _projection2, - ProjectionManagementMessage.RunAs.System, "native:" + FakeProjectionType.AssemblyQualifiedName, - _projectionSource, enabled: true, checkpointsEnabled: true, - emitEnabled: false, trackEmittedStreams: false)); - } - - private IEnumerable TestMessages(Guid projectionToDeletedId1, Guid projectionToDeletedId2) { - yield return - (new ProjectionManagementMessage.Internal.Deleted(_projection1, projectionToDeletedId1)); - yield return - (new ProjectionManagementMessage.Internal.Deleted(_projection2, projectionToDeletedId2)); - } - - private Guid GetProjectionId(string name) { - var field = _manager.GetType().GetField("_projectionsMap", - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - var projectionsMap = (Dictionary)field!.GetValue(_manager); - foreach (var entry in projectionsMap!) { - if (entry.Value.Equals(name)) { - return entry.Key; - } - } - - return Guid.Empty; - } - - [Test] - public void no_WrongExpectedVersion_for_delete_create() { - Guid projection1Id = GetProjectionId(_projection1); - Guid projection2Id = GetProjectionId(_projection2); - AllWritesSucceed(false); - AllWritesQueueUp(); - WhenLoop(TestMessages(projection1Id, projection2Id)); - AllWriteComplete(); - AllWritesSucceed(); - while (_queue.TimerMessagesOfType().Count() > 0) { - _queue.ProcessTimer(); - Thread.Sleep(100); - } - - Process(); - - Assert.AreEqual(0, - _consumer.HandledMessages.OfType().Count()); - var fakeEnvelope = new FakeEnvelope(); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection1, "dummy")); - _manager.Handle(new ProjectionManagementMessage.Command.GetState(fakeEnvelope, _projection2, "dummy")); - - Process(); - - Assert.AreEqual(2, fakeEnvelope.Replies.Count); - Assert.IsTrue(fakeEnvelope.Replies[0] is ProjectionManagementMessage.NotFound); - Assert.IsTrue(fakeEnvelope.Replies[1] is ProjectionManagementMessage.NotFound); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_persistent_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_persistent_projection.cs deleted file mode 100644 index 9038e5707..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_persistent_projection.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.runas { - namespace when_posting_a_persistent_projection { - [Ignore("Persistent projections are admin only")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class Authenticated : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private ClaimsPrincipal _testUserPrincipal; - - private string _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - protected override void Given() { - _projectionName = "test-projection"; - _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - _testUserPrincipal = new ClaimsPrincipal(new ClaimsIdentity( - new [] { - new Claim(ClaimTypes.Name,"test-user"), - new Claim(ClaimTypes.Role,"test-role1"), - new Claim(ClaimTypes.Role,"test-role2") - } - , "ES-Test")); - - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - GetInputQueue(), ProjectionMode.Continuous, _projectionName, - new ProjectionManagementMessage.RunAs(_testUserPrincipal), "JS", _projectionBody, enabled: true, - checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true, enableRunAs: true); - } - - [Test, Ignore("Persistent projections are admin only")] - public void anonymous_cannot_retrieve_projection_query() { - GetInputQueue() - .Publish( - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - _queue.Process(); - - Assert.IsTrue(HandledMessages.OfType().Any()); - } - - [Test] - public void projection_owner_can_retrieve_projection_query() { - GetInputQueue() - .Publish( - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, new ProjectionManagementMessage.RunAs(_testUserPrincipal))); - _queue.Process(); - - var query = HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(query); - Assert.AreEqual(_projectionBody, query.Query); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class Anonymous : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - private string _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - protected override void Given() { - _projectionName = "test-projection"; - _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - GetInputQueue(), ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.Anonymous, "JS", _projectionBody, enabled: true, - checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true, enableRunAs: true); - } - - [Test] - public void replies_with_not_authorized() { - Assert.IsTrue(HandledMessages.OfType().Any()); - } - } - } - - namespace when_setting_new_runas_account { - public abstract class with_runas_projection : TestFixtureWithProjectionCoreAndManagementServices { - protected string _projectionName; - protected ClaimsPrincipal _testUserPrincipal; - protected ClaimsPrincipal _testUserPrincipal2; - - protected string _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - protected override void Given() { - _projectionName = "test-projection"; - _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - _testUserPrincipal = new ClaimsPrincipal(new ClaimsIdentity( - new [] { - new Claim(ClaimTypes.Name,"test-user"), - new Claim(ClaimTypes.Role,"test-role1"), - new Claim(ClaimTypes.Role,"test-role2") - } - , "ES-Test")); - _testUserPrincipal2 = new ClaimsPrincipal(new ClaimsIdentity( - new [] { - new Claim(ClaimTypes.Name,"test-user2"), - new Claim(ClaimTypes.Role,"test-role2"), - new Claim(ClaimTypes.Role,"test-role3") - } - , "ES-Test")); - - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable PreWhen() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - GetInputQueue(), ProjectionMode.Continuous, _projectionName, - new ProjectionManagementMessage.RunAs(_testUserPrincipal), "JS", _projectionBody, enabled: true, - checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true, enableRunAs: true); - } - } - - [Ignore("Persistent projections are admin only")] - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class as_another_user : with_runas_projection { - protected override IEnumerable When() { - yield return - new ProjectionManagementMessage.Command.SetRunAs( - Envelope, _projectionName, new ProjectionManagementMessage.RunAs(_testUserPrincipal2), - ProjectionManagementMessage.Command.SetRunAs.SetRemove.Set); - } - - [Test] - public void new_projection_owner_can_retrieve_projection_query() { - GetInputQueue() - .Publish( - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, new ProjectionManagementMessage.RunAs(_testUserPrincipal2))); - _queue.Process(); - - var query = HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(query); - Assert.AreEqual(_projectionBody, query.Query); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_transient_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_transient_projection.cs deleted file mode 100644 index 085277d9e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/runas/when_posting_a_transient_projection.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.runas { - namespace when_posting_a_transient_projection { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class Authenticated : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private ClaimsPrincipal _testUserPrincipal; - - private string _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - protected override void Given() { - _projectionName = "test-projection"; - _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - _testUserPrincipal = new ClaimsPrincipal(new ClaimsIdentity( - new [] { - new Claim(ClaimTypes.Name,"test-user"), - new Claim(ClaimTypes.Role,"test-role1"), - new Claim(ClaimTypes.Role,"test-role2") - } - , "ES-Test")); - - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - GetInputQueue(), ProjectionMode.Transient, _projectionName, - new ProjectionManagementMessage.RunAs(_testUserPrincipal), "JS", _projectionBody, enabled: true, - checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true, enableRunAs: true); - } - - [Test, Ignore("ignored")] - public void anonymous_cannot_retrieve_projection_query() { - GetInputQueue() - .Publish( - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - _queue.Process(); - - Assert.IsTrue(HandledMessages.OfType().Any()); - } - - [Test] - public void projection_owner_can_retrieve_projection_query() { - GetInputQueue() - .Publish( - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, new ProjectionManagementMessage.RunAs(_testUserPrincipal))); - _queue.Process(); - - var query = HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(query); - Assert.AreEqual(_projectionBody, query.Query); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class Anonymous : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - private string _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - protected override void Given() { - _projectionName = "test-projection"; - _projectionBody = @"fromAll().when({$any:function(s,e){return s;}});"; - - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - GetInputQueue(), ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.Anonymous, "JS", _projectionBody, enabled: true, - checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true, enableRunAs: true); - } - - [Test] - public void replies_with_not_authorized() { - Assert.IsTrue(HandledMessages.OfType().Any()); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/specification_with_projection_management_service.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/specification_with_projection_management_service.cs deleted file mode 100644 index 1708d390e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/specification_with_projection_management_service.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Tests.Helpers; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public abstract class specification_with_projection_management_service : TestFixtureWithExistingEvents { - protected ProjectionManager _manager; - protected ProjectionManagerMessageDispatcher _managerMessageDispatcher; - private bool _initializeSystemProjections; - protected AwakeService AwakeService; - - - protected override void Given1() { - base.Given1(); - _initializeSystemProjections = GivenInitializeSystemProjections(); - if (!_initializeSystemProjections) { - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, - ProjectionEventTypes.ProjectionsInitialized, "", ""); - } - } - - protected virtual bool GivenInitializeSystemProjections() { - return false; - } - - protected override ManualQueue GiveInputQueue() { - return new ManualQueue(_bus, _timeProvider); - } - - [SetUp] - public void Setup() { - //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well - _bus.Subscribe(_consumer); - - var queues = GivenCoreQueues(); - _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues); - _manager = new ProjectionManager( - GetInputQueue(), - GetInputQueue(), - queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp, - _initializeSystemProjections); - - IPublisher inputQueue = GetInputQueue(); - IPublisher publisher = GetInputQueue(); - var ioDispatcher = new IODispatcher(publisher, inputQueue, true); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_managerMessageDispatcher); - - _bus.Subscribe(ioDispatcher.ForwardReader); - _bus.Subscribe(ioDispatcher.BackwardReader); - _bus.Subscribe(ioDispatcher.BackwardReader); - _bus.Subscribe(ioDispatcher.Writer); - _bus.Subscribe(ioDispatcher.StreamDeleter); - _bus.Subscribe(ioDispatcher.Awaker); - _bus.Subscribe(ioDispatcher); - - AwakeService = new AwakeService(); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - _bus.Subscribe(AwakeService); - - - Given(); - WhenLoop(); - } - - protected abstract Dictionary GivenCoreQueues(); - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/verify_persistent_state_rules_for_deleting_streams.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/verify_persistent_state_rules_for_deleting_streams.cs deleted file mode 100644 index 331a85d78..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/verify_persistent_state_rules_for_deleting_streams.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace EventStore.Projections.Core.Tests.Services.projections_manager{ - using Core.Services.Management; - using NUnit.Framework; - - [TestFixture] - public class VerifyPersistentStateRulesForDeletingStreams { - [Test] - [TestCase(true,true,true)] - [TestCase(false,true,false)] - [TestCase(true,false,false)] - [TestCase(false,false,false)] - public void EmitStreamNeedsDeletedAsExpected(bool emitEnabled,bool deleteEmitStreams,bool expectedResult) { - ManagedProjection.PersistedState persistedState = new ManagedProjection.PersistedState(); - - persistedState.EmitEnabled = emitEnabled; - persistedState.DeleteEmittedStreams = deleteEmitStreams; - - Assert.IsTrue(persistedState.EmitStreamNeedsDeleted() == expectedResult); - } - - [Test] - [TestCase(true, true, false)] - [TestCase(false, true, true)] - [TestCase(true, false, false)] - [TestCase(false, false, false)] - public void CheckpointStreamNeedsDeletedAsExpected(bool checkPointsDisabled, bool deleteCheckpointStreams, bool expectedResult) { - ManagedProjection.PersistedState persistedState = new ManagedProjection.PersistedState(); - - persistedState.CheckpointsDisabled = checkPointsDisabled; - persistedState.DeleteCheckpointStream = deleteCheckpointStreams; - - Assert.IsTrue(persistedState.CheckpointStreamNeedsDeleted() == expectedResult); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_a_disabled_projection_has_been_loaded.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_a_disabled_projection_has_been_loaded.cs deleted file mode 100644 index 6a4d2ccb8..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_a_disabled_projection_has_been_loaded.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_a_disabled_projection_has_been_loaded : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - base.Given(); - NoStream("$projections-test-projection-result"); - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "test-projection"); - ExistingEvent( - "$projections-test-projection", ProjectionEventTypes.ProjectionUpdated, null, - @"{ - ""Query"":""fromAll(); on_any(function(){});log('hello-from-projection-definition');"", - ""Mode"":""3"", - ""Enabled"":false, - ""HandlerType"":""JS"", - ""SourceDefinition"":{ - ""AllEvents"":true, - ""AllStreams"":true, - } - }"); - AllWritesSucceed(); - } - - private string _projectionName; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - } - - [Test] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - } - - [Test] - public void the_projection_status_is_stopped() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .LeaderStatus); - } - - [Test] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_creating_projection_manager.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_creating_projection_manager.cs deleted file mode 100644 index 41a97ef1b..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_creating_projection_manager.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests.Fakes; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Metrics; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture] - public class when_creating_projection_manager { - private ITimeProvider _timeProvider; - private Dictionary _queues; - private IODispatcher _ioDispatcher; - - [SetUp] - public void setup() { - _timeProvider = new FakeTimeProvider(); - _queues = new Dictionary {{Guid.NewGuid(), new FakePublisher()}}; - var fakePublisher = new FakePublisher(); - new ProjectionCoreCoordinator( - ProjectionType.All, - _queues.Values.ToArray(), - fakePublisher); - _ioDispatcher = new IODispatcher(fakePublisher, fakePublisher, true); - } - - [Test] - public void it_can_be_created() { - using ( - new ProjectionManager( - new FakePublisher(), - new FakePublisher(), - _queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp)) { - } - } - - [Test] - public void null_main_queue_throws_argument_null_exception() { - Assert.Throws(() => { - using ( - new ProjectionManager( - null, - new FakePublisher(), - _queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp)) { - } - }); - } - - [Test] - public void null_publisher_throws_argument_null_exception() { - Assert.Throws(() => { - using ( - new ProjectionManager( - new FakePublisher(), - null, - _queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp)) { - } - }); - } - - [Test] - public void null_queues_throws_argument_null_exception() { - Assert.Throws(() => { - using ( - new ProjectionManager( - new FakePublisher(), - new FakePublisher(), - null, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp)) { - } - }); - } - - [Test] - public void empty_queues_throws_argument_exception() { - Assert.Throws(() => { - using ( - new ProjectionManager( - new FakePublisher(), - new FakePublisher(), - new Dictionary(), - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp)) { - } - }); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_faulted_persistent_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_faulted_persistent_projection.cs deleted file mode 100644 index 4d5bd433a..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_faulted_persistent_projection.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleting_a_faulted_persistent_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private const string _projectionCheckpointStream = "$projections-test-projection-checkpoint"; - private const string _projectionEmittedStreamsStream = "$projections-test-projection-emittedstreams"; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"faulted_projection", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, true); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType().Any(x => - x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && - Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - - [Test, Category("v8")] - public void should_have_attempted_to_delete_the_checkpoint_stream() { - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionCheckpointStream)); - } - - [Test, Category("v8")] - public void should_have_attempted_to_delete_the_emitted_streams_stream() { - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionEmittedStreamsStream)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection.cs deleted file mode 100644 index 13e1b1641..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleting_a_persistent_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private const string _projectionCheckpointStream = "$projections-test-projection-checkpoint"; - private const string _projectionEmittedStreamsStream = "$projections-test-projection-emittedstreams"; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, true); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType().Any(x => - x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && - Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - - [Test, Category("v8")] - public void should_have_attempted_to_delete_the_checkpoint_stream() { - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionCheckpointStream)); - } - - [Test, Category("v8")] - public void should_have_attempted_to_delete_the_emitted_streams_stream() { - Assert.IsTrue( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionEmittedStreamsStream)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_emitted_not_enabled.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_emitted_not_enabled.cs deleted file mode 100644 index db33c7d63..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_emitted_not_enabled.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace EventStore.Projections.Core.Tests.Services.projections_manager{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Runtime.CompilerServices; - using Core.Services; - using EventStore.Common.Utils; - using EventStore.Core.Messages; - using EventStore.Core.Messaging; - using EventStore.Core.Tests; - using Messages; - using NUnit.Framework; - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class WhenDeletingAPersistentProjectionAndEmittedNotEnabled : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: false); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, true); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - var deletedStreamEvents = _consumer.HandledMessages.OfType().ToList(); - - Assert.AreEqual(deletedStreamEvents.Count, 1); - - Assert.AreEqual(deletedStreamEvents.First().EventStreamId,$"$projections-{_projectionName}-checkpoint"); - - Assert.AreEqual(true, _consumer.HandledMessages.OfType().Any(x => x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_checkpoint_stream.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_checkpoint_stream.cs deleted file mode 100644 index d5da69af4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_checkpoint_stream.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_deleting_a_persistent_projection_and_keep_checkpoint_stream : - TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private const string _projectionStateStream = "$projections-test-projection-result"; - private const string _projectionCheckpointStream = "$projections-test-projection-checkpoint"; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, false, false, false); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType().Any(x => - x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && - Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - - [Test, Category("v8")] - public void should_not_have_attempted_to_delete_the_checkpoint_stream() { - Assert.IsFalse( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionCheckpointStream)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_emitted_streams_stream.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_emitted_streams_stream.cs deleted file mode 100644 index d0ac5a2f5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_keep_emitted_streams_stream.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_deleting_a_persistent_projection_and_keep_emitted_streams_stream : - TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private const string _projectionEmittedStreamsStream = "$projections-test-projection-emittedstreams"; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, false, false, false); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - Assert.AreEqual( - true, - _consumer.HandledMessages.OfType().Any(x => - x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && - Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - - [Test, Category("v8")] - public void should_not_have_attempted_to_delete_the_emitted_streams_stream() { - Assert.IsFalse( - _consumer.HandledMessages.OfType() - .Any(x => x.EventStreamId == _projectionEmittedStreamsStream)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_not_authorised.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_not_authorised.cs deleted file mode 100644 index 70d4f2cc5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_and_not_authorised.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_deleting_a_persistent_projection_and_not_authorised : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.Anonymous, false, false, false); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_not_written() { - Assert.AreNotEqual( - ProjectionEventTypes.ProjectionDeleted, - _consumer.HandledMessages.OfType().Last().Events[0].EventType, - $"{ProjectionEventTypes.ProjectionDeleted} event was not supposed to be written"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_with_default_options.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_with_default_options.cs deleted file mode 100644 index bdfa6f139..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_persistent_projection_with_default_options.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleting_a_persistent_projection_with_default_options : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: false, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, true); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_written() { - var deletedStreamEvents =_consumer.HandledMessages.OfType().ToList(); - Assert.AreEqual(true, _consumer.HandledMessages.OfType().Any(x => x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && Helper.UTF8NoBom.GetString(x.Events[0].Data) == _projectionName)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_running_persistent_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_running_persistent_projection.cs deleted file mode 100644 index 620a62d48..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_running_persistent_projection.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_deleting_a_running_persistent_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private const string _projectionCheckpointStream = "$projections-test-projection-checkpoint"; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, false); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_not_written() { - var projectionDeletedEventExists = _consumer.HandledMessages.Any(x => - x.GetType() == typeof(ClientMessage.WriteEvents) && - ((ClientMessage.WriteEvents)x).Events[0].EventType == ProjectionEventTypes.ProjectionDeleted); - Assert.IsFalse(projectionDeletedEventExists, - $"Expected that the {ProjectionEventTypes.ProjectionDeleted} event not to have been written"); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_system_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_system_projection.cs deleted file mode 100644 index 07c496138..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_deleting_a_system_projection.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.ClientAPI.Common.Utils; -using System.Collections; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; -using LogV3StreamId = System.UInt32; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - public class SystemProjectionNames : IEnumerable { - public IEnumerator GetEnumerator() { - foreach (var projection in typeof(ProjectionNamesBuilder.StandardProjections).GetFields( - System.Reflection.BindingFlags.Public | - System.Reflection.BindingFlags.Static | - System.Reflection.BindingFlags.FlattenHierarchy) - .Where(x => x.IsLiteral && !x.IsInitOnly) - .Select(x => x.GetRawConstantValue())) { - yield return new[] {typeof(LogFormat.V2), typeof(string), projection}; - yield return new[] {typeof(LogFormat.V3), typeof(LogV3StreamId), projection}; - } - } - } - - [TestFixture, TestFixtureSource(typeof(SystemProjectionNames))] - public class when_deleting_a_system_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _systemProjectionName; - - public when_deleting_a_system_projection(string projectionName) { - _systemProjectionName = projectionName; - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override void Given() { - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _systemProjectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _systemProjectionName, - ProjectionManagementMessage.RunAs.System, false, false, false); - } - - [Test, Category("v8")] - public void a_projection_deleted_event_is_not_written() { - Assert.IsFalse( - _consumer.HandledMessages.OfType().Any(x => - x.Events[0].EventType == ProjectionEventTypes.ProjectionDeleted && - Helper.UTF8NoBom.GetString(x.Events[0].Data) == _systemProjectionName)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection.cs deleted file mode 100644 index 1e0662664..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_posting_a_persistent_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesQueueUp(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - OneWriteCompletes(); - } - - [Test, Category("v8")] - public void the_projection_status_is_writing() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - true)); - Assert.AreEqual( - ManagedProjectionState.Prepared, - _consumer.HandledMessages.OfType().Single().Projections[0] - .LeaderStatus); - } - - [Test, Category("v8")] - public void a_projection_created_event_is_written() { - var createdEventWrite = _consumer.HandledMessages.OfType().FirstOrDefault(); - Assert.NotNull(createdEventWrite); - Assert.AreEqual(ProjectionNamesBuilder.ProjectionsRegistrationStream, createdEventWrite.EventStreamId); - Assert.AreEqual(ProjectionEventTypes.ProjectionCreated, createdEventWrite.Events[0].EventType); - Assert.AreEqual(_projectionName, Helper.UTF8NoBom.GetString(createdEventWrite.Events[0].Data)); - } - - [Test, Category("v8")] - public void persisted_projection_state_is_written_with_empty_execution_timeout() { - var persistedStateStream = ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName; - var persistedStateWrite = _consumer.HandledMessages.OfType() - .FirstOrDefault(x => x.EventStreamId == persistedStateStream); - - Assert.NotNull(persistedStateWrite); - Assert.AreEqual(ProjectionEventTypes.ProjectionUpdated, persistedStateWrite.Events[0].EventType); - var actualState = persistedStateWrite.Events[0].Data.ParseJson(); - Assert.IsNull(actualState.ProjectionExecutionTimeout); - } - - [Test, Category("v8")] - public void a_projection_updated_message_is_not_published() { - // not published until all writes complete - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_registration_write_fails.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_registration_write_fails.cs deleted file mode 100644 index 0240bacfc..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_registration_write_fails.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using System.Collections; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.ForwardTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.ForwardTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.PrepareTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.PrepareTimeout)] - public class - when_posting_a_persistent_projection_and_registration_write_fails : - TestFixtureWithProjectionCoreAndManagementServices { - private OperationResult _failureCondition; - - public when_posting_a_persistent_projection_and_registration_write_fails(OperationResult failureCondition) { - _failureCondition = failureCondition; - } - - protected override void Given() { - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - NoOtherStreams(); - AllWritesQueueUp(); - } - - private string _projectionName; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - } - - [Test, Category("v8")] - public void retries_creating_the_projection_only_the_specified_number_of_times_and_the_same_event_id() { - int retryCount = 0; - var projectionRegistrationWrite = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream).Last(); - var eventId = projectionRegistrationWrite.Events[0].EventId; - while (projectionRegistrationWrite != null) { - Assert.AreEqual(eventId, projectionRegistrationWrite.Events[0].EventId); - projectionRegistrationWrite.Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted( - projectionRegistrationWrite.CorrelationId, _failureCondition, - Enum.GetName(typeof(OperationResult), _failureCondition))); - _queue.Process(); - projectionRegistrationWrite = _consumer.HandledMessages.OfType() - .Where(x => x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream) - .LastOrDefault(); - if (projectionRegistrationWrite != null) { - retryCount++; - } - - _consumer.HandledMessages.Clear(); - } - - Assert.AreEqual(ProjectionManager.ProjectionCreationRetryCount, retryCount); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_writes_succeed.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_writes_succeed.cs deleted file mode 100644 index 119478e1c..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_a_persistent_projection_and_writes_succeed.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_posting_a_persistent_projection_and_writes_succeed : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - AllWritesSucceed(); - NoOtherStreams(); - } - - private string _projectionName; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - } - - [Test, Category("v8")] - public void projection_status_is_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - true)); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType().Single().Projections[0] - .LeaderStatus); - } - - [Test, Category("v8")] - public void a_projection_updated_event_is_written() { - Assert.IsTrue( - _consumer.HandledMessages.OfType().Any( - v => v.Events[0].EventType == ProjectionEventTypes.ProjectionUpdated)); - } - - [Test, Category("v8")] - public void a_projection_updated_message_is_published() { - // not published until writes complete - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_an_onetime_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_an_onetime_projection.cs deleted file mode 100644 index f6075ec94..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_posting_an_onetime_projection.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_posting_an_onetime_projection : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionManagementMessage.RunAs.Anonymous, - @"fromAll().when({$any:function(s,e){return s;}});", enabled: true)); - } - - [Test, Category("v8")] - public void projection_updated_is_published() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream.cs deleted file mode 100644 index d73451643..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using System.Collections.Generic; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.when_reading_registered_projections { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class with_no_stream : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - AllWritesSucceed(); - NoStream(ProjectionNamesBuilder.ProjectionsRegistrationStream); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - } - - protected override bool GivenInitializeSystemProjections() { - return false; - } - - [Test] - public void it_should_write_the_projections_initialized_event() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events[0].EventType == ProjectionEventTypes.ProjectionsInitialized)); - } - - [Test] - public void it_should_not_write_any_projection_created_events() { - Assert.AreEqual(0, _consumer.HandledMessages.OfType().Count(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events[0].EventType == ProjectionEventTypes.ProjectionCreated)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream_and_intialize_system_projections.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream_and_intialize_system_projections.cs deleted file mode 100644 index 8de782335..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_reading_registered_projections/with_no_stream_and_intialize_system_projections.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using System.Collections.Generic; -using System.Collections; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Messages; -using LogV3StreamId = System.UInt32; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager.when_reading_registered_projections { - [TestFixture, TestFixtureSource(typeof(SystemProjectionNames))] - public class with_no_stream_and_intialize_system_projections : TestFixtureWithProjectionCoreAndManagementServices { - private string _systemProjectionName; - - public with_no_stream_and_intialize_system_projections(string projectionName) { - _systemProjectionName = projectionName; - } - - protected override void Given() { - AllWritesSucceed(); - NoStream(ProjectionNamesBuilder.ProjectionsRegistrationStream); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - } - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - [Test] - public void it_should_write_the_projections_initialized_event() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events[0].EventType == ProjectionEventTypes.ProjectionsInitialized)); - } - - [Test] - public void it_should_write_the_system_projection_created_event() { - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events.All(e => e.EventType == ProjectionEventTypes.ProjectionCreated) && - x.Events.Any(e => Helper.UTF8NoBom.GetString(e.Data) == _systemProjectionName))); - } - } - - public class SystemProjectionNames : IEnumerable { - public IEnumerator GetEnumerator() { - foreach (var projection in typeof(ProjectionNamesBuilder.StandardProjections).GetFields( - System.Reflection.BindingFlags.Public | - System.Reflection.BindingFlags.Static | - System.Reflection.BindingFlags.FlattenHierarchy) - .Where(x => x.IsLiteral && !x.IsInitOnly) - .Select(x => x.GetRawConstantValue())) { - yield return new[] { typeof(LogFormat.V2), typeof(string), projection }; - yield return new[] { typeof(LogFormat.V3), typeof(LogV3StreamId), projection }; - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_recreating_a_deleted_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_recreating_a_deleted_projection.cs deleted file mode 100644 index 907594e12..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_recreating_a_deleted_projection.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_recreating_a_deleted_projection : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - - protected override void Given() { - _projectionName = "test-projection"; - AllWritesSucceed(); - NoOtherStreams(); - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - yield return - new ProjectionManagementMessage.Command.Disable( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.Delete( - _bus, _projectionName, - ProjectionManagementMessage.RunAs.System, true, true, false); - yield return - new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll().when({$any:function(s,e){return s;}});", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true); - } - - [Test, Category("v8")] - public void a_projection_created_event_should_be_written() { - Assert.AreEqual( - ProjectionEventTypes.ProjectionCreated, - _consumer.HandledMessages.OfType().First().Events[0].EventType); - Assert.AreEqual( - _projectionName, - Helper.UTF8NoBom.GetString(_consumer.HandledMessages.OfType().First() - .Events[0].Data)); - } - - [Test, Category("v8")] - public void it_can_be_listed() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, null, false)); - - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Count( - v => v.Projections.Any(p => p.Name == _projectionName))); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_requesting_partition_state_from_a_stopped_foreach_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_requesting_partition_state_from_a_stopped_foreach_projection.cs deleted file mode 100644 index 7a6b69a00..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_requesting_partition_state_from_a_stopped_foreach_projection.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_requesting_partition_state_from_a_stopped_foreach_projection : - TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection-order"); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "test-projection"); - ExistingEvent( - "$projections-test-projection", ProjectionEventTypes.ProjectionUpdated, null, - @"{""Query"":""fromCategory('test').foreachStream().when({'e': function(s,e){}})"", - ""Mode"":""3"", ""Enabled"":false, ""HandlerType"":""JS"", - ""SourceDefinition"":{ - ""AllEvents"":true, - ""AllStreams"":false, - ""Streams"":[""$ce-test""] - } - }"); - ExistingEvent("$projections-test-projection-a-checkpoint", ProjectionEventTypes.PartitionCheckpoint, - @"{""s"":{""$ce-test"": 9}}", @"{""data"":1}"); - NoStream("$projections-test-projection-b-checkpoint"); - ExistingEvent("$projections-test-projection-checkpoint", ProjectionEventTypes.ProjectionCheckpoint, - @"{""s"":{""$ce-test"": 10}}", @"{}"); - AllWritesSucceed(); - } - - private string _projectionName; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - // when - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [Test] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "a")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - - var first = _consumer.HandledMessages.OfType().First(); - Assert.AreEqual(_projectionName, first.Name); - Assert.AreEqual(@"{""data"":1}", first.State); - - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "b")); - _queue.Process(); - - Assert.AreEqual(2, _consumer.HandledMessages.OfType().Count()); - var second = _consumer.HandledMessages.OfType().Skip(1) - .First(); - Assert.AreEqual(_projectionName, second.Name); - Assert.AreEqual("", second.State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_duplicate_projection_created.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_duplicate_projection_created.cs deleted file mode 100644 index f5fdb4bbc..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_duplicate_projection_created.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Tests.Services.core_projection; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class - when_starting_the_projection_manager_with_duplicate_projection_created : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - private ProjectionManager _manager; - private Guid _workerId; - - protected override void Given() { - _workerId = Guid.NewGuid(); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "projection1"); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "projection1"); - ExistingEvent( - "$projections-projection1", ProjectionEventTypes.ProjectionUpdated, null, - @"{""Query"":""fromAll(); on_any(function(){});log('hello-from-projection-definition');"", ""Mode"":""3"", ""Enabled"":true, ""HandlerType"":""JS""}"); - } - - [SetUp] - public void setup() { - _timeProvider = new FakeTimeProvider(); - var queues = new Dictionary {{_workerId, _bus}}; - _manager = new ProjectionManager( - _bus, - _bus, - queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _manager.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [TearDown] - public void TearDown() { - _manager.Dispose(); - } - - [Test] - public void projection_status_is_preparing() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.AreEqual( - ManagedProjectionState.Preparing, - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1").Projections[0].LeaderStatus); - } - - [Test] - public void projection_id_is_latest() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1").Projections[0].ProjectionId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_partially_created_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_partially_created_projection.cs deleted file mode 100644 index 5a60c95c7..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_partially_created_projection.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_the_projection_manager_with_existing_partially_created_projection : - TestFixtureWithExistingEvents { - private ProjectionManager _manager; - private new ITimeProvider _timeProvider; - private Guid _workerId; - - protected override void Given() { - _workerId = Guid.NewGuid(); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "projection1"); - NoStream("$projections-projection1"); - } - - - [SetUp] - public void setup() { - _timeProvider = new FakeTimeProvider(); - var queues = new Dictionary {{_workerId, _bus}}; - _manager = new ProjectionManager( - _bus, - _bus, - queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _manager.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [TearDown] - public void TearDown() { - _manager.Dispose(); - } - - [Test] - public void projection_status_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.IsNotNull( - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1")); - } - - [Test] - public void projection_status_is_creating() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.AreEqual( - ManagedProjectionState.Creating, - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1").Projections[0].LeaderStatus); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_projection.cs deleted file mode 100644 index da0e0720d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_starting_the_projection_manager_with_existing_projection.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json.Nodes; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Telemetry; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Services.TimeService; -using EventStore.Core.Util; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Tests.Services.core_projection; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_the_projection_manager_with_existing_projection : TestFixtureWithExistingEvents { - private new ITimeProvider _timeProvider; - private ProjectionManager _manager; - private Guid _workerId; - - protected override void Given() { - _workerId = Guid.NewGuid(); - ExistingEvent(ProjectionNamesBuilder.ProjectionsRegistrationStream, ProjectionEventTypes.ProjectionCreated, - null, "projection1"); - ExistingEvent( - "$projections-projection1", ProjectionEventTypes.ProjectionUpdated, null, - @"{""Query"":""fromAll(); on_any(function(){});log('hello-from-projection-definition');"", ""Mode"":""3"", ""Enabled"":true, ""HandlerType"":""JS""}"); - } - - - [SetUp] - public void setup() { - _timeProvider = new FakeTimeProvider(); - var queues = new Dictionary {{_workerId, _bus}}; - _manager = new ProjectionManager( - _bus, - _bus, - queues, - _timeProvider, - ProjectionType.All, - _ioDispatcher, - TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault), - IProjectionTracker.NoOp); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _bus.Subscribe(_manager); - _manager.Handle(new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - } - - [TearDown] - public void TearDown() { - _manager.Dispose(); - } - - [Test] - public void projection_status_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.IsNotNull( - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1")); - } - - [Test] - public void projection_status_is_starting() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, "projection1", - true)); - Assert.AreEqual( - ManagedProjectionState.Preparing, - _consumer.HandledMessages.OfType().SingleOrDefault( - v => v.Projections[0].Name == "projection1").Projections[0].LeaderStatus); - } - - [Test] - public void projection_telemetry_working() { - _manager.Handle( - new TelemetryMessage.Request( - _bus)); - - var actual = _consumer.HandledMessages.OfType().Single(); - - Assert.AreEqual("projections", actual.Key); - Assert.AreEqual( - new JsonObject { - ["customProjectionCount"] = 1, - ["standardProjectionCount"] = 0, - ["customProjectionRunningCount"] = 0, - ["standardProjectionRunningCount"] = 0, - ["totalCount"] = 1, - ["totalRunningCount"] = 0, - }.ToJsonString(), - actual.Value.ToJsonString()); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_onetime_projection_has_been_posted.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_onetime_projection_has_been_posted.cs deleted file mode 100644 index d149c9140..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_onetime_projection_has_been_posted.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_the_onetime_projection_has_been_posted : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private string _projectionQuery; - - protected override void Given() { - NoOtherStreams(); - } - - protected override IEnumerable When() { - _projectionQuery = @"fromAll(); on_any(function(){});log(1);"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionManagementMessage.RunAs.Anonymous, _projectionQuery, - enabled: true)); - _projectionName = _consumer.HandledMessages.OfType().Single().Name; - } - - [Test, Category("v8")] - public void it_has_been_posted() { - Assert.IsFalse(string.IsNullOrEmpty(_projectionName)); - } - - [Test, Category("v8")] - public void it_cab_be_listed() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, null, false)); - - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Count( - v => v.Projections.Any(p => p.Name == _projectionName))); - } - - [Test, Category("v8")] - public void the_projection_status_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics( - _bus, null, _projectionName, false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = _consumer.HandledMessages.OfType() - .Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_projectionQuery, projectionQuery.Query); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_projections_initialized_write_fails.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_projections_initialized_write_fails.cs deleted file mode 100644 index 8a2585844..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_the_projections_initialized_write_fails.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messages; -using NUnit.Framework; -using EventStore.Projections.Core.Services.Processing; -using System.Collections; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.CommitTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.PrepareTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.PrepareTimeout)] - [TestFixture(typeof(LogFormat.V2), typeof(string), OperationResult.ForwardTimeout)] - [TestFixture(typeof(LogFormat.V3), typeof(uint), OperationResult.ForwardTimeout)] - public class - when_writing_the_projections_initialized_event_fails : TestFixtureWithProjectionCoreAndManagementServices { - - private OperationResult _failureCondition; - - public when_writing_the_projections_initialized_event_fails(OperationResult failureCondition) { - _failureCondition = failureCondition; - } - - protected override void Given() { - AllWritesQueueUp(); - NoStream(ProjectionNamesBuilder.ProjectionsRegistrationStream); - } - - protected override bool GivenInitializeSystemProjections() { - return false; - } - - protected override IEnumerable When() { - yield return new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid()); - } - - [Test, Category("v8")] - public void retries_writing_with_the_same_event_id() { - int retryCount = 0; - var projectionsInitializedWrite = _consumer.HandledMessages.OfType().Where(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events[0].EventType == ProjectionEventTypes.ProjectionsInitialized).Last(); - var eventId = projectionsInitializedWrite.Events[0].EventId; - while (retryCount < 5) { - Assert.AreEqual(eventId, projectionsInitializedWrite.Events[0].EventId); - projectionsInitializedWrite.Envelope.ReplyWith(new ClientMessage.WriteEventsCompleted( - projectionsInitializedWrite.CorrelationId, _failureCondition, - Enum.GetName(typeof(OperationResult), _failureCondition))); - _queue.Process(); - projectionsInitializedWrite = _consumer.HandledMessages.OfType().Where(x => - x.EventStreamId == ProjectionNamesBuilder.ProjectionsRegistrationStream && - x.Events[0].EventType == ProjectionEventTypes.ProjectionsInitialized).LastOrDefault(); - if (projectionsInitializedWrite != null) { - retryCount++; - } - - _consumer.HandledMessages.Clear(); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_disabled_projection_query_text.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_disabled_projection_query_text.cs deleted file mode 100644 index d76ec6b5e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_disabled_projection_query_text.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_disabled_projection_query_text : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection"); - NoStream("$projections-test-projection-result"); - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - AllWritesSucceed(); - } - - private string _projectionName; - private string _newProjectionSource; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll(); on_any(function(){});log(1);", - enabled: false, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true)); - // when - _newProjectionSource = @"fromAll(); on_any(function(){});log(2);"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System, - _newProjectionSource, emitEnabled: null)); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void the_projection_status_is_still_stopped() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_faulted_projection_query_text_invalid_defintion.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_faulted_projection_query_text_invalid_defintion.cs deleted file mode 100644 index 2c4e1c17e..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_faulted_projection_query_text_invalid_defintion.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_faulted_projection_query_text_invalid_defintion : - TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection"); - NoStream("$projections-test-projection-result"); - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - AllWritesSucceed(); - } - - private string _projectionName; - private string _newProjectionSource; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", @"fromAll(); on_any(function(){});log(1****);", - enabled: false, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true)); - // when - _newProjectionSource = @"fromAll(); on_any(function(){});log(2);"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System, - _newProjectionSource, emitEnabled: null)); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void the_projection_status_is_stopped() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Stopped, - _consumer.HandledMessages.OfType() - .Single() - .Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_emit_enabled_option.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_emit_enabled_option.cs deleted file mode 100644 index 5f4e968e0..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_emit_enabled_option.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_persistent_projection_emit_enabled_option : - TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection"); - NoStream("$projections-test-projection-result"); - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - AllWritesSucceed(); - } - - private string _projectionName; - private string _source; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - _source = @"fromAll(); on_any(function(){});log(1);"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", _source, enabled: true, checkpointsEnabled: true, - emitEnabled: true, trackEmittedStreams: true)); - // when - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System, - _source, emitEnabled: false)); - } - - [Test, Category("v8")] - public void emit_enabled_options_remains_unchanged() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(false, projectionQuery.EmitEnabled); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_query_text.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_query_text.cs deleted file mode 100644 index 9c6d414e4..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_projection_query_text.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_persistent_projection_query_text : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-test-projection"); - NoStream("$projections-test-projection-result"); - NoStream("$projections-test-projection-order"); - AllWritesToSucceed("$projections-test-projection-order"); - NoStream("$projections-test-projection-checkpoint"); - AllWritesSucceed(); - } - - private string _projectionName; - private string _newProjectionSource; - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "JS", - @"fromAll(); on_any(function(){return {};});log(1);", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true)); - // when - _newProjectionSource = @"fromAll().when({a:function(){return {};}});log(2);"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System, - _newProjectionSource, emitEnabled: null)); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void emit_enabled_options_remains_unchanged() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(true, projectionQuery.EmitEnabled); - } - - [Test, Category("v8")] - public void the_projection_status_is_still_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( // empty? why? - "", _consumer.HandledMessages.OfType().Single().State); - } - - [Test, Category("v8")] - public void correct_query_has_been_prepared() { - var lastPrepared = _consumer.HandledMessages.OfType().LastOrDefault(); - Assert.IsNotNull(lastPrepared); - Assert.IsFalse(lastPrepared.SourceDefinition.AllEvents); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_system_projection_query_text.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_system_projection_query_text.cs deleted file mode 100644 index f4d9a54d2..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_a_persistent_system_projection_query_text.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_a_continous_system_projection_query_text : TestFixtureWithProjectionCoreAndManagementServices { - protected override void Given() { - NoStream("$projections-$by_correlation_id"); - NoStream("$projections-$by_correlation_id-result"); - NoStream("$projections-$by_correlation_id-order"); - AllWritesToSucceed("$projections-$by_correlation_id-order"); - NoStream("$projections-$by_correlation_id-checkpoint"); - AllWritesSucceed(); - } - - private string _projectionName; - private string _newProjectionSource; - - protected override IEnumerable When() { - _projectionName = "$by_correlation_id"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System,"native:EventStore.Projections.Core.Standard.ByCorrelationId", "{\"correlationIdProperty\":\"$myCorrelationId\"}", - enabled: true, checkpointsEnabled: true, emitEnabled: true, trackEmittedStreams: true)); - // when - _newProjectionSource = "{\"correlationIdProperty\":\"$updateCorrelationId\"}"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.System, - _newProjectionSource, emitEnabled: null)); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void emit_enabled_options_remains_unchanged() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(true, projectionQuery.EmitEnabled); - } - - [Test, Category("v8")] - public void the_projection_status_is_still_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( // empty? why? - "", _consumer.HandledMessages.OfType().Single().State); - } - - [Test, Category("v8")] - public void correct_query_has_been_prepared() { - var lastPrepared = _consumer.HandledMessages.OfType().LastOrDefault(); - Assert.IsNotNull(lastPrepared); - Assert.IsTrue(lastPrepared.SourceDefinition.AllEvents); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_projection_query_text.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_projection_query_text.cs deleted file mode 100644 index aa5c8f395..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_projection_query_text.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_an_onetime_projection_query_text : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private string _newProjectionSource; - - protected override void Given() { - NoOtherStreams(); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void the_projection_status_is_still_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - - protected override IEnumerable When() { - _projectionName = "test-projection"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Transient, _projectionName, - ProjectionManagementMessage.RunAs.Anonymous, "JS", @"fromAll(); on_any(function(){});log(1);", - enabled: true, checkpointsEnabled: false, emitEnabled: false, trackEmittedStreams: true)); - // when - _newProjectionSource = @"fromAll(); on_any(function(){});log(2);"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous, - _newProjectionSource, emitEnabled: null)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_system_projection_query_text.cs b/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_system_projection_query_text.cs deleted file mode 100644 index 0c732c41f..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_manager/when_updating_an_onetime_system_projection_query_text.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Messaging; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.projections_manager { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_updating_an_onetime_system_projection_query_text : TestFixtureWithProjectionCoreAndManagementServices { - private string _projectionName; - private string _newProjectionSource; - - protected override void Given() { - NoOtherStreams(); - } - - protected override IEnumerable When() { - _projectionName = "$by_correlation_id"; - yield return (new ProjectionSubsystemMessage.StartComponents(Guid.NewGuid())); - yield return - (new ProjectionManagementMessage.Command.Post( - _bus, ProjectionMode.Transient, _projectionName, - ProjectionManagementMessage.RunAs.Anonymous, "native:EventStore.Projections.Core.Standard.ByCorrelationId", "{\"correlationIdProperty\":\"$myCorrelationId\"}", - enabled: true, checkpointsEnabled: false, emitEnabled: false, trackEmittedStreams: true)); - // when - _newProjectionSource = "{\"correlationIdProperty\":\"$updateCorrelationId\"}"; - yield return - (new ProjectionManagementMessage.Command.UpdateQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous, - _newProjectionSource, emitEnabled: null)); - } - - [Test, Category("v8")] - public void the_projection_source_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetQuery( - _bus, _projectionName, ProjectionManagementMessage.RunAs.Anonymous)); - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - var projectionQuery = - _consumer.HandledMessages.OfType().Single(); - Assert.AreEqual(_projectionName, projectionQuery.Name); - Assert.AreEqual(_newProjectionSource, projectionQuery.Query); - } - - [Test, Category("v8")] - public void the_projection_status_is_still_running() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetStatistics(_bus, null, _projectionName, - false)); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - 1, - _consumer.HandledMessages.OfType().Single().Projections.Length); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .Name); - Assert.AreEqual( - ManagedProjectionState.Running, - _consumer.HandledMessages.OfType().Single().Projections.Single() - .LeaderStatus); - } - - [Test, Category("v8")] - public void the_projection_state_can_be_retrieved() { - _manager.Handle( - new ProjectionManagementMessage.Command.GetState(_bus, _projectionName, "")); - _queue.Process(); - - Assert.AreEqual(1, _consumer.HandledMessages.OfType().Count()); - Assert.AreEqual( - _projectionName, - _consumer.HandledMessages.OfType().Single().Name); - Assert.AreEqual( - "", _consumer.HandledMessages.OfType().Single().State); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_system/updating_projections/updating_projection_sources.cs b/src/EventStore.Projections.Core.Tests/Services/projections_system/updating_projections/updating_projection_sources.cs deleted file mode 100644 index 370b11106..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_system/updating_projections/updating_projection_sources.cs +++ /dev/null @@ -1,349 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using System.Linq; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -using EventStore.Common.Utils; -using EventStore.Core.Tests; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Tests.Services.projections_system.updating_projections { - namespace updating_projection_sources { - public abstract class with_updated_projection : with_projection_config { - private ProjectionManagementMessage.Statistics _allStatistics; - protected ProjectionManagementMessage.ProjectionState _state; - private ProjectionManagementMessage.ProjectionQuery _query; - private ProjectionStatistics _statistics; - protected JObject _stateData; - - protected abstract string GivenOriginalSource(); - protected abstract string GivenUpdatedSource(); - - protected override bool GivenStartSystemProjections() { - return true; - } - - protected override IEnumerable When() { - yield return CreateWriteEvent("stream1", "type1", "{\"Data\": 1}"); - yield return - new ProjectionManagementMessage.Command.Post( - Envelope, ProjectionMode.Continuous, _projectionName, - ProjectionManagementMessage.RunAs.System, "js", GivenOriginalSource(), true, - _checkpointsEnabled, _emitEnabled, _trackEmittedStreams); - yield return CreateWriteEvent("stream1", "type2", "{\"Data\": 2}"); - yield return CreateWriteEvent("stream2", "type2", "{\"Data\": 3}"); - yield return CreateWriteEvent("stream3", "type3", "{\"Data\": 4}"); - yield return CreateWriteEvent("stream3", "type1", "{\"Data\": 5}"); - yield return - new ProjectionManagementMessage.Command.Disable( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return - new ProjectionManagementMessage.Command.UpdateQuery( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.System, - GivenUpdatedSource(), _emitEnabled); - yield return CreateWriteEvent("stream2", "type3", "{\"Data\": 6}"); - yield return CreateWriteEvent("stream3", "type4", "{\"Data\": 7}"); - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.System); - yield return CreateWriteEvent("stream3", "type4", "{\"Data\": 8}"); - yield return CreateWriteEvent("stream4", "type5", "{\"Data\": 9}"); - yield return CreateWriteEvent("stream5", "type1", "{\"Data\": 10}"); - yield return - new ProjectionManagementMessage.Command.GetStatistics( - Envelope, ProjectionMode.AllNonTransient, _projectionName, false); - yield return new ProjectionManagementMessage.Command.GetState(Envelope, _projectionName, ""); - yield return - new ProjectionManagementMessage.Command.GetQuery( - Envelope, _projectionName, ProjectionManagementMessage.RunAs.Anonymous); - - _allStatistics = HandledMessages.OfType().LastOrDefault(); - _statistics = _allStatistics != null ? _allStatistics.Projections.SingleOrDefault() : null; - - _state = HandledMessages.OfType().LastOrDefault(); - _stateData = _state != null ? EatException(() => _state.State.ParseJson()) : null; - _query = HandledMessages.OfType().LastOrDefault(); - } - - [Test] - public void status_is_running() { - Assert.NotNull(_statistics); - Assert.AreEqual("Running", _statistics.Status); - } - - [Test] - public void query_test_is_updated() { - Assert.NotNull(_query); - Assert.AreEqual(GivenUpdatedSource(), _query.Query); - } - - [Test] - public void projection_state_can_be_retrieved() { - Assert.NotNull(_state); - Assert.NotNull(_stateData); - Console.WriteLine(_stateData.ToJson()); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_adding_an_event_type : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type1: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type1: handle, - type3: handle, - }); - "; - } - - [Test] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 5, 6}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - var pos = GetTfPos("stream5", 0); - Assert.AreEqual( - CheckpointTag.FromEventTypeIndexPositions(0, pos, - new Dictionary {{"type1", 1}, {"type3", 1}}), _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_an_event_type : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type1: handle, - type2: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type1: handle, - type3: handle, - }); - "; - } - - [Test] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 3, 5, 6, 10}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - var pos = GetTfPos("stream5", 0); - Assert.AreEqual( - CheckpointTag.FromEventTypeIndexPositions(0, pos, - new Dictionary {{"type1", 1}, {"type3", 1}}), _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_any_with_an_event_type : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type3: handle, - }); - "; - } - - [Test] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 3, 4, 5, 6}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - var pos = GetTfPos("stream2", 1); - Assert.That( - CheckpointTag.FromEventTypeIndexPositions(0, pos, new Dictionary {{"type3", 1}}) <= - _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_specific_event_types_with_any : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - type1: handle, - type2: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromAll().when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - [Test] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 3, 5, 6, 7, 8, 9, 10}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - var pos = GetTfPos("stream5", 0); - Assert.AreEqual(CheckpointTag.FromPosition(0, pos.CommitPosition, pos.PreparePosition), - _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_stream_with_multiple_streams : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStream('stream1').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStreams('stream1', 'stream2').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - [Test, Ignore("No position with stream tag yet")] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 6}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream1", 1}, {"stream2", 1}}), - _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_multiple_streams_with_one_of_them : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStreams('stream1', 'stream2').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStream('stream2').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - [Test] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 3, 6}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - Assert.AreEqual(CheckpointTag.FromStreamPosition(0, "stream2", 1), _state.Position); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_replacing_a_stream_in_multiple_streams : with_updated_projection { - protected override string GivenOriginalSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStreams('stream1', 'stream2').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - protected override string GivenUpdatedSource() { - return @" - function handle(s, e) { if (e.data && e.data.Data) s.d.push(e.data.Data); return s; } - fromStreams('stream2', 'stream3').when({ - $init: function(){return {d:[]};}, - $any: handle, - }); - "; - } - - [Test, Ignore("No position in multi-stream tag")] - public void correct_event_sequence_has_been_processed() { - HelperExtensions.AssertJson(new {d = new[] {1, 2, 3, 6, 7, 8}}, _stateData); - } - - [Test] - public void projection_position_is_correct() { - Assert.AreEqual( - CheckpointTag.FromStreamPositions(0, new Dictionary {{"stream2", 1}, {"stream3", 3}}), - _state.Position); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_system/when_requesting_state_from_a_faulted_projection.cs b/src/EventStore.Projections.Core.Tests/Services/projections_system/when_requesting_state_from_a_faulted_projection.cs deleted file mode 100644 index c14c537b9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_system/when_requesting_state_from_a_faulted_projection.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; -using System.Linq; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_system { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_requesting_state_from_a_faulted_projection : with_projection_config { - private TFPos _message1Position; - - protected override void Given() { - base.Given(); - NoOtherStreams(); - _message1Position = ExistingEvent("stream1", "message1", null, "{}"); - - _projectionSource = @"fromAll().when({message1: function(s,e){ throw 1; }});"; - } - - protected override IEnumerable When() { - yield return - new ProjectionManagementMessage.Command.Post( - Envelope, ProjectionMode.Continuous, _projectionName, ProjectionManagementMessage.RunAs.System, - "js", - _projectionSource, enabled: true, checkpointsEnabled: true, emitEnabled: true, - trackEmittedStreams: true); - yield return Yield; - yield return new ProjectionManagementMessage.Command.GetState(Envelope, _projectionName, ""); - } - - protected override bool GivenStartSystemProjections() { - return true; - } - - [Test] - public void reported_state_is_before_the_fault_position() { - var states = HandledMessages.OfType().ToArray(); - Assert.AreEqual(1, states.Length); - var state = states[0]; - - Assert.That(state.Position.Streams.Count == 1); - Assert.That(state.Position.Streams.Keys.First() == "message1"); - Assert.That(state.Position.Streams["message1"] == -1); - Assert.That( - state.Position.Position <= _message1Position, "{0} <= {1}", state.Position.Position, _message1Position); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_system/when_starting_up.cs b/src/EventStore.Projections.Core.Tests/Services/projections_system/when_starting_up.cs deleted file mode 100644 index 00ce985f5..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_system/when_starting_up.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using NUnit.Framework; -using EventStore.Core.Messages; -using System; -using System.Net; -using EventStore.Core.Cluster; -using EventStore.Core.Data; -using EventStore.Core.Tests; - -namespace EventStore.Projections.Core.Tests.Services.projections_system { - namespace startup { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_with_empty_db : with_projections_subsystem { - protected override IEnumerable When() { - yield return - new ProjectionManagementMessage.Command.GetStatistics(Envelope, ProjectionMode.AllNonTransient, - null, false) - ; - } - - [Test] - public void system_projections_are_registered() { - var statistics = HandledMessages.OfType().LastOrDefault(); - Assert.NotNull(statistics); - Assert.AreEqual(5, statistics.Projections.Length); - } - - [Test] - public void system_projections_are_running() { - var statistics = HandledMessages.OfType().LastOrDefault(); - Assert.NotNull(statistics); - Assert.That(statistics.Projections.All(s => s.Status == "Stopped")); - } - - [Test] - public void core_readers_should_use_the_unique_id_provided_by_the_component_start_message() { - var startComponentMessages = _consumer.HandledMessages.OfType().First(); - var startCoreMessages = _consumer.HandledMessages.OfType(); - - Assert.AreEqual(1, startCoreMessages.Select(x => x.InstanceCorrelationId).Distinct().Count()); - Assert.AreEqual(startComponentMessages.InstanceCorrelationId, startCoreMessages.First().InstanceCorrelationId); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - public class when_starting_as_follower : with_projections_subsystem { - protected override IEnumerable PreWhen() { - yield return (new SystemMessage.BecomeFollower(Guid.NewGuid(), - MemberInfo.Initial(Guid.NewGuid(), DateTime.UtcNow, VNodeState.Unknown, true, - new IPEndPoint(IPAddress.Loopback, 1111), - new IPEndPoint(IPAddress.Loopback, 1112), - new IPEndPoint(IPAddress.Loopback, 1113), - new IPEndPoint(IPAddress.Loopback, 1114), - new IPEndPoint(IPAddress.Loopback, 1115), null, 0, 0, - 1, - false - ))); - yield return (new SystemMessage.SystemCoreReady()); - yield return Yield; - if (_startSystemProjections) { - yield return - new ProjectionManagementMessage.Command.GetStatistics(Envelope, ProjectionMode.AllNonTransient, - null, false) - ; - var statistics = HandledMessages.OfType().Last(); - foreach (var projection in statistics.Projections) { - if (projection.Status != "Running") - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, projection.Name, ProjectionManagementMessage.RunAs.Anonymous); - } - } - } - - [Test] - public void projections_core_coordinator_should_not_publish_start_core_message() { - //projections are not allowed (yet) to run on followers - var startCoreMessages = _consumer.HandledMessages.OfType(); - Assert.AreEqual(0, startCoreMessages.Select(x => x.InstanceCorrelationId).Distinct().Count()); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projection_config.cs b/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projection_config.cs deleted file mode 100644 index fecbc2a5d..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projection_config.cs +++ /dev/null @@ -1,26 +0,0 @@ -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests.Services.projections_system { - public abstract class with_projection_config : with_projections_subsystem { - protected string _projectionName; - protected string _projectionSource; - protected bool _checkpointsEnabled; - protected bool _trackEmittedStreams; - protected bool _emitEnabled; - - protected override void Given() { - base.Given(); - - _projectionName = "test-projection"; - _projectionSource = @""; - _checkpointsEnabled = true; - _trackEmittedStreams = true; - _emitEnabled = true; - - NoStream(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName + "-checkpoint"); - NoStream(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName + "-order"); - NoStream(ProjectionNamesBuilder.ProjectionsStreamPrefix + _projectionName + "-emittedstreams"); - AllWritesSucceed(); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projections_subsystem.cs b/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projections_subsystem.cs deleted file mode 100644 index 73581a261..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/projections_system/with_projections_subsystem.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Tests.Services.projections_manager; -using System.Linq; - -namespace EventStore.Projections.Core.Tests.Services.projections_system { - public abstract class with_projections_subsystem : TestFixtureWithProjectionCoreAndManagementServices { - protected bool _startSystemProjections; - protected Guid _instanceCorrelation = Guid.NewGuid(); - - protected override bool GivenInitializeSystemProjections() { - return true; - } - - protected override void Given1() { - base.Given1(); - _startSystemProjections = GivenStartSystemProjections(); - AllWritesSucceed(); - NoOtherStreams(); - EnableReadAll(); - } - - protected virtual bool GivenStartSystemProjections() { - return false; - } - - protected override IEnumerable PreWhen() { - yield return (new ProjectionSubsystemMessage.StartComponents(_instanceCorrelation)); - yield return Yield; - if (_startSystemProjections) { - yield return - new ProjectionManagementMessage.Command.GetStatistics(Envelope, ProjectionMode.AllNonTransient, - null, false) - ; - var statistics = HandledMessages.OfType().Last(); - foreach (var projection in statistics.Projections) { - if (projection.Status != "Running") - yield return - new ProjectionManagementMessage.Command.Enable( - Envelope, projection.Name, ProjectionManagementMessage.RunAs.Anonymous); - } - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/result_emitter/result_emitter.cs b/src/EventStore.Projections.Core.Tests/Services/result_emitter/result_emitter.cs deleted file mode 100644 index 8cdf2b8cf..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/result_emitter/result_emitter.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Text; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.result_emitter { - public static class result_emitter { - [TestFixture] - public class when_creating { - private ProjectionNamesBuilder _namesBuilder; - - [SetUp] - public void setup() { - _namesBuilder = ProjectionNamesBuilder.CreateForTest("projection"); - } - - [Test] - public void it_can_be_created() { - new ResultEventEmitter(_namesBuilder); - } - - [Test] - public void null_names_builder_throws_argument_null_exception() { - Assert.Throws(() => { new ResultEventEmitter(null); }); - } - } - - [TestFixture] - public class when_result_updated { - private ProjectionNamesBuilder _namesBuilder; - private ResultEventEmitter _re; - private string _partition; - private string _projection; - private CheckpointTag _resultAt; - private EmittedEventEnvelope[] _emittedEvents; - private string _result; - - [SetUp] - public void setup() { - Given(); - When(); - } - - private void Given() { - _projection = "projection"; - _resultAt = CheckpointTag.FromPosition(0, 100, 50); - _partition = "partition"; - _result = "{\"result\":1}"; - _namesBuilder = ProjectionNamesBuilder.CreateForTest(_projection); - _re = new ResultEventEmitter(_namesBuilder); - } - - private void When() { - _emittedEvents = _re.ResultUpdated(_partition, _result, _resultAt); - } - - [Test] - public void emits_result_event() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(2, _emittedEvents.Length); - var @event = _emittedEvents[0]; - var link = _emittedEvents[1].Event; - - Assert.AreEqual("Result", @event.Event.EventType); - Assert.AreEqual(_result, @event.Event.Data); - Assert.AreEqual("$projections-projection-partition-result", @event.Event.StreamId); - Assert.AreEqual(_resultAt, @event.Event.CausedByTag); - Assert.IsNull(@event.Event.ExpectedTag); - - Assert.AreEqual("$>", link.EventType); - ((EmittedLinkTo)link).SetTargetEventNumber(1); - Assert.AreEqual("1@$projections-projection-partition-result", link.Data); - Assert.AreEqual("$projections-projection-result", link.StreamId); - Assert.AreEqual(_resultAt, link.CausedByTag); - Assert.IsNull(link.ExpectedTag); - } - } - - [TestFixture] - public class when_result_removed { - private ProjectionNamesBuilder _namesBuilder; - private ResultEventEmitter _re; - private string _partition; - private string _projection; - private CheckpointTag _resultAt; - private EmittedEventEnvelope[] _emittedEvents; - - [SetUp] - public void setup() { - Given(); - When(); - } - - private void Given() { - _projection = "projection"; - _resultAt = CheckpointTag.FromPosition(0, 100, 50); - _partition = "partition"; - _namesBuilder = ProjectionNamesBuilder.CreateForTest(_projection); - _re = new ResultEventEmitter(_namesBuilder); - } - - private void When() { - _emittedEvents = _re.ResultUpdated(_partition, null, _resultAt); - } - - [Test] - public void emits_result_event() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(2, _emittedEvents.Length); - var @event = _emittedEvents[0]; - var link = _emittedEvents[1].Event; - - Assert.AreEqual("ResultRemoved", @event.Event.EventType); - Assert.IsNull(@event.Event.Data); - Assert.AreEqual("$projections-projection-partition-result", @event.Event.StreamId); - Assert.AreEqual(_resultAt, @event.Event.CausedByTag); - Assert.IsNull(@event.Event.ExpectedTag); - - Assert.AreEqual("$>", link.EventType); - ((EmittedLinkTo)link).SetTargetEventNumber(1); - Assert.AreEqual("1@$projections-projection-partition-result", link.Data); - Assert.AreEqual("$projections-projection-result", link.StreamId); - Assert.AreEqual(_resultAt, link.CausedByTag); - Assert.IsNull(link.ExpectedTag); - } - } - - [TestFixture] - public class when_result_updated_on_root_partition { - private ProjectionNamesBuilder _namesBuilder; - private ResultEventEmitter _re; - private string _partition; - private string _projection; - private CheckpointTag _resultAt; - private EmittedEventEnvelope[] _emittedEvents; - private string _result; - - [SetUp] - public void setup() { - Given(); - When(); - } - - private void Given() { - _projection = "projection"; - _resultAt = CheckpointTag.FromPosition(0, 100, 50); - _partition = ""; - _result = "{\"result\":1}"; - _namesBuilder = ProjectionNamesBuilder.CreateForTest(_projection); - _re = new ResultEventEmitter(_namesBuilder); - } - - private void When() { - _emittedEvents = _re.ResultUpdated(_partition, _result, _resultAt); - } - - [Test] - public void emits_result_event() { - Assert.NotNull(_emittedEvents); - Assert.AreEqual(1, _emittedEvents.Length); - var @event = _emittedEvents[0].Event; - - Assert.AreEqual("Result", @event.EventType); - Assert.AreEqual(_result, @event.Data); - Assert.AreEqual("$projections-projection-result", @event.StreamId); - Assert.AreEqual(_resultAt, @event.CausedByTag); - Assert.IsNull(@event.ExpectedTag); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/staged_processing_queue.cs b/src/EventStore.Projections.Core.Tests/Services/staged_processing_queue.cs deleted file mode 100644 index 6c9d48566..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/staged_processing_queue.cs +++ /dev/null @@ -1,434 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services { - public class staged_processing_queue { - [TestFixture] - public class when_creating { - private StagedProcessingQueue _q; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true}); - } - - [Test] - public void it_can_be_created() { - Assert.IsNotNull(_q); - } - - [Test] - public void task_can_be_enqueued() { - _q.Enqueue(new TestTask(1, 1)); - } - - [Test] - public void process_does_not_proces_anything() { - var processed = _q.Process(); - Assert.IsFalse(processed); - } - } - - [TestFixture] - public class when_enqueuing_a_one_step_task { - private StagedProcessingQueue _q; - private TestTask _t1; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true}); - _t1 = new TestTask(1, 1); - _q.Enqueue(_t1); - } - - [Test] - public void process_executes_the_task_at_stage_zero() { - _q.Process(); - - Assert.That(_t1.StartedOn(0)); - } - - [Test] - public void process_returns_true() { - var processed = _q.Process(); - - Assert.IsTrue(processed); - } - } - - [TestFixture] - public class when_enqueuing_a_two_step_task_and_the_first_step_completes_immediately { - private StagedProcessingQueue _q; - private TestTask _t1; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 2, 0); - _q.Enqueue(_t1); - } - - [Test] - public void process_executes_the_task_up_to_stage_one() { - _q.Process(max: 2); - - Assert.That(_t1.StartedOn(1)); - } - } - - [TestFixture] - public class when_reinitializing { - private StagedProcessingQueue _q; - private TestTask _t1; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 2, 0); - _q.Enqueue(_t1); - _q.Initialize(); - } - - [Test] - public void process_does_not_execute_a_task() { - _q.Process(); - - Assert.That(!_t1.StartedOn(0)); - } - - [Test] - public void queue_length_iz_zero() { - Assert.AreEqual(0, _q.Count); - } - - [Test] - public void task_can_be_enqueued() { - _q.Enqueue(new TestTask(1, 1)); - } - } - - [TestFixture] - public class when_enqueuing_a_two_step_task_and_both_steps_complete_immediately { - private StagedProcessingQueue _q; - private TestTask _t1; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 2, 1); - _q.Enqueue(_t1); - } - - [Test] - public void queue_becomes_empty() { - _q.Process(max: 2); - - Assert.That(_q.IsEmpty); - } - - [Test] - public void process_returns_true() { - var processed = _q.Process(max: 2); - - Assert.IsTrue(processed); - } - } - - [TestFixture] - public class when_enqueuing_two_related_one_step_tasks { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 1); - _t2 = new TestTask(1, 1); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - } - - [Test] - public void two_process_execute_only_the_first_task() { - _q.Process(); - _q.Process(); - - Assert.That(_t1.StartedOn(0)); - Assert.That(!_t2.StartedOn(0)); - } - } - - [TestFixture] - public class when_enqueuing_two_related_one_step_tasks_one_by_one { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 1, 1); - _t2 = new TestTask(1, 1, 1); - _q.Enqueue(_t1); - _q.Process(); - _q.Enqueue(_t2); - _q.Process(); - } - - [Test] - public void two_process_execute_only_the_first_task() { - Assert.That(_t1.StartedOn(0)); - Assert.That(_t2.StartedOn(0)); - } - } - - [TestFixture] - public class when_enqueuing_two_two_step_tasks_that_relate_on_first_stage { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(null, 2, stageCorrelations: new object[] {"a", "a"}); - _t2 = new TestTask(null, 2, stageCorrelations: new object[] {"a", "a"}); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - } - - [Test] - public void first_task_starts_on_second_stage_on_first_stage_completion() { - _q.Process(); - _q.Process(); - - _t1.Complete(); - - _q.Process(); - - Assert.That(_t1.StartedOn(1)); - } - - [Test] - public void second_task_does_not_start_on_second_stage_on_first_stage_completion() { - _q.Process(); - _q.Process(); - - _t2.Complete(); - - _q.Process(); - _q.Process(); - - Assert.That(!_t2.StartedOn(1)); - } - - [Test] - public void second_task_does_not_start_on_both_task_completion_on_the_first_stage() { - _q.Process(); - _q.Process(); - - _t1.Complete(); - _t2.Complete(); - - _q.Process(); - _q.Process(); - - Assert.That(!_t2.StartedOn(1)); - } - - [Test] - public void second_task_starts_on_the_first_task_completion_on_the_first_stage() { - _q.Process(); - _q.Process(); - - _t1.Complete(); - _t2.Complete(); - - _q.Process(); - _q.Process(); - - _t1.Complete(); - - _q.Process(); - - - Assert.That(_t2.StartedOn(1)); - } - } - - [TestFixture] - public class when_enqueuing_two_two_step_tasks_and_the_second_completes_first { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 2); - _t2 = new TestTask(2, 2, 0); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - _q.Process(max: 2); - _q.Process(max: 2); - _q.Process(max: 2); - } - - [Test] - public void process_waits_for_the_first_task_to_complete() { - Assert.That(_t1.StartedOn(0)); - Assert.That(_t2.StartedOn(0)); - } - - [Test] - public void first_task_completed_unblocks_both_tasks() { - _t1.Complete(); - _q.Process(); - _q.Process(); - - Assert.That(_t1.StartedOn(1)); - Assert.That(_t2.StartedOn(1)); - } - } - - [TestFixture] - public class when_enqueuing_two_async_async_sync_step_tasks_and_the_second_completes_first { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {false, false, true}); - _t1 = new TestTask(1, 3); - _t2 = new TestTask(2, 3, 0); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - _q.Process(max: 3); - _q.Process(max: 3); - _q.Process(max: 3); - } - - [Test] - public void start_processing_second_task_on_stage_one() { - Assert.That(_t1.StartedOn(0)); - Assert.That(_t2.StartedOn(1)); - } - - [Test] - public void first_task_completed_unblocks_both_tasks() { - _t1.Complete(); - _q.Process(); - _q.Process(); - - Assert.That(_t1.StartedOn(1)); - Assert.That(_t2.StartedOn(1)); - } - } - - [TestFixture] - public class when_enqueuing_three_async_async_sync_step_tasks_and_they_complete_starting_from_second { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - private TestTask _t3; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {false, false, true}); - _t1 = new TestTask(1, 3); - _t2 = new TestTask(2, 3, 0); - _t3 = new TestTask(3, 3, 0); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - _q.Enqueue(_t3); - _q.Process(max: 3); - _q.Process(max: 3); - _q.Process(max: 3); - } - - [Test] - public void start_processing_second_and_third_tasks_on_stage_one() { - Assert.That(_t1.StartedOn(0)); - Assert.That(_t2.StartedOn(1)); - Assert.That(_t3.StartedOn(1)); - } - - [Test] - public void first_task_keeps_other_blocked_at_stage_two() { - _t1.Complete(); - _q.Process(max: 2); - _q.Process(max: 2); - _t2.Complete(); - _t3.Complete(); - _q.Process(); - Assert.That(!_t2.StartedOn(2)); - Assert.That(!_t3.StartedOn(2)); - } - - [Test] - public void first_task_completed_at_stage_one_unblock_all() { - _t1.Complete(); - _q.Process(); - _q.Process(); - _t2.Complete(); - _t3.Complete(); - _q.Process(); - _t1.Complete(); - _q.Process(); - _q.Process(); - _q.Process(); - - Assert.That(_t2.StartedOn(2)); - Assert.That(_t3.StartedOn(2)); - } - } - - [TestFixture] - public class when_enqueuing_two_one_step_tasks { - private StagedProcessingQueue _q; - private TestTask _t1; - private TestTask _t2; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {true, true}); - _t1 = new TestTask(1, 1); - _t2 = new TestTask(2, 1); - _q.Enqueue(_t1); - _q.Enqueue(_t2); - } - - [Test] - public void two_process_execute_both_tasks_at_stage_zero() { - _q.Process(); - _q.Process(); - - Assert.That(_t1.StartedOn(0)); - Assert.That(_t2.StartedOn(0)); - } - } - - - [TestFixture] - public class when_changing_correlation_id_on_unordered_stage { - private StagedProcessingQueue _q; - private TestTask _t1; - - [SetUp] - public void when() { - _q = new StagedProcessingQueue(new[] {false}); - _t1 = new TestTask(Guid.NewGuid(), 1, stageCorrelations: new object[] {"a"}); - _q.Enqueue(_t1); - } - - [Test] - public void first_task_starts_on_second_stage_on_first_stage_completion() { - _q.Process(); - Assert.Throws(() => { _t1.Complete(); }); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Services/write_query_result_phase/creating.cs b/src/EventStore.Projections.Core.Tests/Services/write_query_result_phase/creating.cs deleted file mode 100644 index febcceef9..000000000 --- a/src/EventStore.Projections.Core.Tests/Services/write_query_result_phase/creating.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Tests; -using EventStore.Core.Tests.Helpers; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using EventStore.Projections.Core.Tests.Services.core_projection.checkpoint_manager; -using EventStore.Projections.Core.Tests.Services.core_projection.multi_phase; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Services.write_query_result_phase { - namespace creating { - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_creating { - [Test] - public void it_can_be_created() { - var coreProjection = new FakeCoreProjection(); - var stateCache = new PartitionStateCache(); - var bus = new SynchronousScheduler(); - var fakeCheckpointManager = - new specification_with_multi_phase_core_projection.FakeCheckpointManager(bus, Guid.NewGuid()); - var fakeEmittedStreamsTracker = - new specification_with_multi_phase_core_projection.FakeEmittedStreamsTracker(); - TestHelper.Consume( - new WriteQueryResultProjectionProcessingPhase( - bus, - 1, - "result-stream", - coreProjection, - stateCache, - fakeCheckpointManager, - fakeCheckpointManager, - fakeEmittedStreamsTracker)); - } - } - - abstract class specification_with_write_query_result_projection_processing_phase { - protected WriteQueryResultProjectionProcessingPhase _phase; - protected specification_with_multi_phase_core_projection.FakeCheckpointManager _checkpointManager; - protected specification_with_multi_phase_core_projection.FakeEmittedStreamsTracker _emittedStreamsTracker; - protected SynchronousScheduler _publisher; - protected PartitionStateCache _stateCache; - protected string _resultStreamName; - protected FakeCoreProjection _coreProjection; - - [SetUp] - public void SetUp() { - _stateCache = GivenStateCache(); - _publisher = new(); - _coreProjection = new FakeCoreProjection(); - _checkpointManager = new specification_with_multi_phase_core_projection.FakeCheckpointManager( - _publisher, Guid.NewGuid()); - _emittedStreamsTracker = new specification_with_multi_phase_core_projection.FakeEmittedStreamsTracker(); - _resultStreamName = "result-stream"; - _phase = new WriteQueryResultProjectionProcessingPhase( - _publisher, - 1, - _resultStreamName, - _coreProjection, - _stateCache, - _checkpointManager, - _checkpointManager, - _emittedStreamsTracker); - When(); - } - - protected virtual PartitionStateCache GivenStateCache() { - var stateCache = new PartitionStateCache(); - - stateCache.CachePartitionState( - "a", new PartitionState("{}", null, CheckpointTag.FromPhase(0, completed: false))); - stateCache.CachePartitionState( - "b", new PartitionState("{}", null, CheckpointTag.FromPhase(0, completed: false))); - stateCache.CachePartitionState( - "c", new PartitionState("{}", null, CheckpointTag.FromPhase(0, completed: false))); - return stateCache; - } - - protected abstract void When(); - - [TearDown] - public void TearDown() { - _phase = null; - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_created : specification_with_write_query_result_projection_processing_phase { - protected override void When() { - } - - [Test] - public void can_be_initialized_from_phase_checkpoint() { - _phase.InitializeFromCheckpoint(CheckpointTag.FromPhase(1, completed: false)); - } - - [Test] - public void process_event_throws_invalid_operation_exception() { - Assert.Throws(() => { _phase.ProcessEvent(); }); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_subscribing : specification_with_write_query_result_projection_processing_phase { - protected override void When() { - _phase.Subscribe(CheckpointTag.FromPhase(1, completed: false), false); - } - - [Test] - public void notifies_core_projection_with_subscribed() { - Assert.AreEqual(1, _coreProjection.SubscribedInvoked); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class when_processing_event : specification_with_write_query_result_projection_processing_phase { - protected override void When() { - _phase.Subscribe(CheckpointTag.FromPhase(1, completed: false), false); - _phase.SetProjectionState(PhaseState.Running); - _phase.ProcessEvent(); - } - - [Test] - public void writes_query_results() { - Assert.AreEqual(3, _checkpointManager.EmittedEvents.Count(v => v.Event.EventType == "Result")); - } - } - - [TestFixture(typeof(LogFormat.V2), typeof(string))] - [TestFixture(typeof(LogFormat.V3), typeof(uint))] - class - when_completed_query_processing_event : specification_with_write_query_result_projection_processing_phase { - protected override void When() { - _phase.Subscribe(CheckpointTag.FromPhase(1, completed: false), false); - _phase.SetProjectionState(PhaseState.Running); - _phase.ProcessEvent(); - _phase.SetProjectionState(PhaseState.Stopped); - _phase.ProcessEvent(); - } - - [Test] - public void writes_query_results_only_once() { - Assert.AreEqual(3, _checkpointManager.EmittedEvents.Count(v => v.Event.EventType == "Result")); - } - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Subsystem/TestFixtureWithProjectionSubsystem.cs b/src/EventStore.Projections.Core.Tests/Subsystem/TestFixtureWithProjectionSubsystem.cs deleted file mode 100644 index 9b442e937..000000000 --- a/src/EventStore.Projections.Core.Tests/Subsystem/TestFixtureWithProjectionSubsystem.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using EventStore.Common.Options; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.Transport.Http; -using EventStore.Core.Tests.TransactionLog; -using EventStore.Projections.Core.Messages; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Subsystem { - public class TestFixtureWithProjectionSubsystem { - private StandardComponents _standardComponents; - - protected ProjectionsSubsystem Subsystem; - protected const int WaitTimeoutMs = 3000; - - private readonly ManualResetEvent _stopReceived = new ManualResetEvent(false); - private ProjectionSubsystemMessage.StopComponents _lastStopMessage; - - private readonly ManualResetEvent _startReceived = new ManualResetEvent(false); - private ProjectionSubsystemMessage.StartComponents _lastStartMessage; - - protected Task Started { get; private set; } - - static readonly IConfiguration EmptyConfiguration = new ConfigurationBuilder().AddInMemoryCollection().Build(); - - private StandardComponents CreateStandardComponents() { - var dbConfig = TFChunkHelper.CreateDbConfig(Path.GetTempPath(), 0); - var mainQueue = new QueuedHandlerThreadPool - (new AdHocHandler(msg => { - /* Ignore messages */ - }), "MainQueue", new QueueStatsManager(), new()); - var mainBus = new InMemoryBus("mainBus"); - var threadBasedScheduler = new ThreadBasedScheduler(new QueueStatsManager(), new()); - var timerService = new TimerService(threadBasedScheduler); - - return new StandardComponents(dbConfig, mainQueue, mainBus, - timerService, timeProvider: null, httpForwarder: null, httpServices: new IHttpService[] { }, - networkSendService: null, queueStatsManager: new QueueStatsManager(), - trackers: new(), true); - } - - [OneTimeSetUp] - public void SetUp() { - _standardComponents = CreateStandardComponents(); - - var builder = WebApplication.CreateBuilder(); - builder.Services.AddGrpc(); - builder.Services.AddSingleton(_standardComponents); - - Subsystem = new ProjectionsSubsystem( - new ProjectionSubsystemOptions(1, ProjectionType.All, true, TimeSpan.FromSeconds(3), true, 500, 250)); - - Subsystem.ConfigureServices(builder.Services, new ConfigurationBuilder().Build()); - Subsystem.ConfigureApplication(builder.Build().UseRouting(), EmptyConfiguration); - - // Unsubscribe from the actual components so we can test in isolation - Subsystem.LeaderInputBus.Unsubscribe(Subsystem); - Subsystem.LeaderInputBus.Unsubscribe(Subsystem); - - Subsystem.LeaderInputBus.Subscribe(new AdHocHandler( - msg => { - switch (msg) { - case ProjectionSubsystemMessage.StartComponents start: { - _lastStartMessage = start; - _startReceived.Set(); - break; - } - case ProjectionSubsystemMessage.StopComponents stop: { - _lastStopMessage = stop; - _stopReceived.Set(); - break; - } - } - })); - - Started = Subsystem.Start(); - - Given(); - } - - [OneTimeTearDown] - public void TearDown() { - _standardComponents.TimerService.Dispose(); - } - - protected virtual void Given() { - } - - protected ProjectionSubsystemMessage.StartComponents WaitForStartMessage - (string timeoutMsg = null, bool failOnTimeout = true) { - timeoutMsg ??= "Timed out waiting for Start Components"; - if (_startReceived.WaitOne(WaitTimeoutMs)) - return _lastStartMessage; - if (failOnTimeout) - Assert.Fail(timeoutMsg); - return null; - } - - protected ProjectionSubsystemMessage.StopComponents WaitForStopMessage(string timeoutMsg = null) { - timeoutMsg ??= "Timed out waiting for Stop Components"; - if (_stopReceived.WaitOne(WaitTimeoutMs)) { - return _lastStopMessage; - } - - Assert.Fail(timeoutMsg); - return null; - } - - protected void ResetMessageEvents() { - _stopReceived.Reset(); - _startReceived.Reset(); - _lastStopMessage = null; - _lastStartMessage = null; - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_restarting.cs b/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_restarting.cs deleted file mode 100644 index 6f5f54986..000000000 --- a/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_restarting.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; -// ReSharper disable InconsistentNaming - -namespace EventStore.Projections.Core.Tests.Subsystem { - - [TestFixture] - public class when_projection_subsystem_restarted - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - private Message _restartResponse; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _restartResponse = message))); - } - - [Test] - public void should_respond_that_subsystem_is_restarting() { - Assert.IsInstanceOf(_restartResponse); - } - - [Test] - public void should_stop_the_subsystem() { - var stopMsg = WaitForStopMessage(); - Assert.AreEqual(_instanceCorrelation, stopMsg.InstanceCorrelationId); - } - - [Test] - public void should_start_the_subsystem_when_fully_stopped() { - WaitForStopMessage(); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - - var restartMsg = WaitForStartMessage("Timed out waiting for restart StartComponents"); - - Assert.AreNotEqual(_instanceCorrelation, restartMsg.InstanceCorrelationId); - } - } - - [TestFixture,Explicit] - public class when_projection_subsystem_restarted_twice - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - private Guid _restartInstanceCorrelation; - - private Message _secondRestartResponse; - - protected override void Given() { - // Start subsystem - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - // Restart subsystem - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem(new NoopEnvelope())); - - WaitForStopMessage("Timed out waiting for StopComponents on first restart"); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - - var restartMsg = WaitForStartMessage("Timed out waiting for StartComponents on first restart"); - ResetMessageEvents(); - _restartInstanceCorrelation = restartMsg.InstanceCorrelationId; - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _restartInstanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _restartInstanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _secondRestartResponse = message))); - } - - [Test] - public void should_respond_success_on_second_restart() { - Assert.IsInstanceOf(_secondRestartResponse); - } - - [Test] - public void should_stop_the_subsystem() { - var stopMsg = WaitForStopMessage("Timed out waiting for StopComponents on second restart"); - Assert.AreEqual(_restartInstanceCorrelation, stopMsg.InstanceCorrelationId); - } - - [Test] - public void should_start_the_subsystem() { - WaitForStopMessage("Timed out waiting for StopComponents on second restart"); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _restartInstanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _restartInstanceCorrelation)); - - var restartMsg = WaitForStartMessage("Timed out waiting for StartComponents on second restart"); - Assert.AreNotEqual(_restartInstanceCorrelation, restartMsg.InstanceCorrelationId); - } - } - - [TestFixture] - public class when_projection_subsystem_restarting_and_node_becomes_unknown - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - private ProjectionSubsystemMessage.StopComponents _stopMsg; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem(new NoopEnvelope())); - - _stopMsg = WaitForStopMessage(); - - // Become unknown before components stopped - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - } - - [Test] - public void should_stop_the_subsystem_for_the_restart() { - Assert.AreEqual(_instanceCorrelation, _stopMsg.InstanceCorrelationId); - } - - [Test] - public void should_not_start_the_subsystem() { - var startMsg = WaitForStartMessage(failOnTimeout: false); - Assert.IsNull(startMsg); - } - } - - [TestFixture] - public class when_projection_subsystem_starting_and_told_to_restart - : TestFixtureWithProjectionSubsystem { - private Message _restartResponse; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - WaitForStartMessage(); - - // Restart subsystem before fully started - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _restartResponse = message))); - } - - [Test] - public void should_report_restart_failure() { - Assert.IsInstanceOf(_restartResponse); - } - } - - [TestFixture] - public class when_projection_subsystem_stopping_and_told_to_restart - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - private Message _restartResponse; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - - WaitForStopMessage(); - - // Restart subsystem before fully stopped - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _restartResponse = message))); - } - - [Test] - public void should_report_restart_failure() { - Assert.IsInstanceOf(_restartResponse); - } - } - - [TestFixture] - public class when_projection_subsystem_restarting_and_told_to_restart - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - private Message _restartResponse; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - - // First restart - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem(new NoopEnvelope())); - - WaitForStopMessage(); - - // Restart subsystem before finished restart - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _restartResponse = message))); - } - - [Test] - public void should_report_restart_failure() { - Assert.IsInstanceOf(_restartResponse); - } - } - - [TestFixture] - public class when_projection_subsystem_stopped_and_told_to_restart - : TestFixtureWithProjectionSubsystem { - private Message _restartResponse; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - // Don't start the subsystem - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - - // Restart subsystem while stopped - Subsystem.Handle(new ProjectionSubsystemMessage.RestartSubsystem( - new CallbackEnvelope(message => _restartResponse = message))); - } - - [Test] - public void should_report_restart_failure() { - Assert.IsInstanceOf(_restartResponse); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_starting.cs b/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_starting.cs deleted file mode 100644 index bda53096a..000000000 --- a/src/EventStore.Projections.Core.Tests/Subsystem/when_projection_subsystem_starting.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System; -using System.Threading; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests.Subsystem { - [TestFixture] - public class when_projection_subsystem_starting_and_all_components_started - : TestFixtureWithProjectionSubsystem { - private readonly ManualResetEventSlim _initializedReceived = new ManualResetEventSlim(); - - protected override void Given() { - Subsystem.LeaderOutputBus.Subscribe( - new AdHocHandler(msg => { - _initializedReceived.Set(); - })); - - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - } - - [Test] - public void should_publish_all_components_started() { - if (!_initializedReceived.Wait(WaitTimeoutMs)) { - Assert.Fail("Timed out waiting for Subsystem Initialized"); - } - } - } - - [TestFixture] - public class when_projection_subsystem_starting_and_wrong_components_started - : TestFixtureWithProjectionSubsystem { - private readonly ManualResetEventSlim _initializedReceived = new ManualResetEventSlim(); - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - WaitForStartMessage(); - - var wrongCorrelation = Guid.NewGuid(); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, wrongCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, wrongCorrelation)); - } - - [Test] - public void should_ignore_component_started_for_incorrect_correlation() { - Assert.False(Started.Wait(WaitTimeoutMs)); - } - } - - [TestFixture] - public class when_projection_subsystem_started_and_leader_changes - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMsg = WaitForStartMessage(); - _instanceCorrelation = startMsg.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - } - - [Test] - public void should_stop_the_subsystem_with_start_correlation() { - var stopMessage = WaitForStopMessage(); - Assert.NotNull(stopMessage); - Assert.AreEqual(_instanceCorrelation, stopMessage.InstanceCorrelationId); - } - } - - [TestFixture] - public class when_projection_subsystem_stopping_and_all_components_stopped - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMessage = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMessage.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - - WaitForStopMessage(); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - } - - [Test] - public void should_allow_starting_the_subsystem_again() { - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - var startMessage = WaitForStartMessage(); - - Assert.AreNotEqual(_instanceCorrelation, startMessage.InstanceCorrelationId); - } - } - - [TestFixture] - public class when_projection_subsystem_starting_and_node_becomes_unknown - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMessage = WaitForStartMessage(); - _instanceCorrelation = startMessage.InstanceCorrelationId; - - // Become unknown before components started - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - } - - [Test] - public void should_stop_the_subsystem() { - var stopMessage = WaitForStopMessage(); - Assert.AreEqual(_instanceCorrelation, stopMessage.InstanceCorrelationId); - } - } - - [TestFixture] - public class when_projection_subsystem_stopping_and_node_becomes_leader - : TestFixtureWithProjectionSubsystem { - private Guid _instanceCorrelation; - - protected override void Given() { - Subsystem.Handle(new SystemMessage.SystemCoreReady()); - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - var startMessage = WaitForStartMessage(); - ResetMessageEvents(); - _instanceCorrelation = startMessage.InstanceCorrelationId; - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStarted( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - - // Become unknown to stop the subsystem - Subsystem.Handle(new SystemMessage.BecomeUnknown(Guid.NewGuid())); - WaitForStopMessage(); - - // Become leader again before subsystem fully stopped - Subsystem.Handle(new SystemMessage.BecomeLeader(Guid.NewGuid())); - - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionManager.ServiceName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.ComponentStopped( - ProjectionCoreCoordinator.ComponentName, _instanceCorrelation)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionManager.ServiceName)); - Subsystem.Handle(new ProjectionSubsystemMessage.IODispatcherDrained(ProjectionCoreService.SubComponentName)); - } - - [Test] - public void should_start_the_subsystem_again() { - var startMessages = WaitForStartMessage(); - Assert.AreNotEqual(_instanceCorrelation, startMessages.InstanceCorrelationId); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/SystemProjections.cs b/src/EventStore.Projections.Core.Tests/SystemProjections.cs deleted file mode 100644 index a2ae028ef..000000000 --- a/src/EventStore.Projections.Core.Tests/SystemProjections.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Linq; -using System.Threading.Tasks; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Tests { - internal static class SystemProjections { - public static Task Created(ISubscriber bus) { - var systemProjectionsReady = - typeof(ProjectionNamesBuilder.StandardProjections).GetFields( - System.Reflection.BindingFlags.Public | - System.Reflection.BindingFlags.Static | - System.Reflection.BindingFlags.FlattenHierarchy) - .Where(x => x.IsLiteral && !x.IsInitOnly) - .Select(x => x.GetRawConstantValue().ToString()) - .ToDictionary(x => x, _ => new TaskCompletionSource()); - - bus.Subscribe(new AdHocHandler(m => { - if (!systemProjectionsReady.TryGetValue(m.Name, out var ready)) return; - ready.TrySetResult(true); - })); - - return Task.WhenAll(systemProjectionsReady.Values.Select(x => x.Task)); - } - } -} diff --git a/src/EventStore.Projections.Core.Tests/TestsInitFixture.cs b/src/EventStore.Projections.Core.Tests/TestsInitFixture.cs deleted file mode 100644 index 71eb01438..000000000 --- a/src/EventStore.Projections.Core.Tests/TestsInitFixture.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; - -namespace EventStore.Projections.Core.Tests { - [SetUpFixture] - public class TestsInitFixture { - private readonly EventStore.Core.Tests.TestsInitFixture _initFixture = - new EventStore.Core.Tests.TestsInitFixture(); - - [OneTimeSetUp] - public void SetUp() { - _initFixture.SetUp(); - } - - [OneTimeTearDown] - public void TearDown() { - _initFixture.TearDown(); - } - } -} diff --git a/src/EventStore.Projections.Core.XUnit.Tests/CheckpointManagers/MultiStreamMultiOutputCheckpointManagerTests.cs b/src/EventStore.Projections.Core.XUnit.Tests/CheckpointManagers/MultiStreamMultiOutputCheckpointManagerTests.cs deleted file mode 100644 index 07a4d934a..000000000 --- a/src/EventStore.Projections.Core.XUnit.Tests/CheckpointManagers/MultiStreamMultiOutputCheckpointManagerTests.cs +++ /dev/null @@ -1,231 +0,0 @@ -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Tests.Fakes; -using EventStore.Core.Tests.Services.Replication; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.XUnit.Tests.TestHelpers; -using Xunit; -using ExistingEvent = EventStore.Projections.Core.XUnit.Tests.TestHelpers.ExistingStreamsHelper.ExistingEvent; - -namespace EventStore.Projections.Core.XUnit.Tests.CheckpointManagers; - -/// More tests for MultiStreamMultiOutputCheckpointManager exist in the NUnit tests, -/// and derive from -public class MultiStreamMultiOutputCheckpointManagerTests { - private const string ProjectionName = "test-projection"; - private const string OrderStreamName = $"$projections-{ProjectionName}-order"; - private const int ProjectionPhase = 0; - private readonly MultiStreamMultiOutputCheckpointManager _sut; - private readonly FakePublisher _publisher; - private readonly IODispatcher _ioDispatcher; - private readonly CoreProjectionCheckpointWriter _checkpointWriter; - private readonly ExistingStreamsHelper _existingStreams; - - public MultiStreamMultiOutputCheckpointManagerTests() { - var projectionId = Guid.NewGuid(); - var projectionVersion = new ProjectionVersion(3, ProjectionPhase, 5); - var namingBuilder = new ProjectionNamesBuilder(ProjectionName, new ProjectionSourceDefinition()); - _publisher = new FakePublisher(); - var envelope = new FakeEnvelope(); - _ioDispatcher = new IODispatcher(_publisher, envelope); - _checkpointWriter = new CoreProjectionCheckpointWriter( - namingBuilder.MakeCheckpointStreamName(),_ioDispatcher, projectionVersion, ProjectionName); - _existingStreams = new ExistingStreamsHelper(); - - var projectionConfig = new ProjectionConfig(SystemAccounts.System, 10, 1000, 20, 2, - true, true, false, false, false, 10000, 100, null); - var positionTagger = new FakePositionTagger(ProjectionPhase); - - _sut = new MultiStreamMultiOutputCheckpointManager( - _publisher, projectionId, projectionVersion, SystemAccounts.System, _ioDispatcher, projectionConfig, ProjectionName, - positionTagger, namingBuilder, usePersistentCheckpoints: true, producesRunningResults: true, definesFold: false, - _checkpointWriter); - } - - [Theory] - [MemberData(nameof(PreRecordedEvents))] - public void when_loading_prerecorded_events(PreRecordedEventsScenario scenario) { - _existingStreams.AddEvents(scenario.WithExistingEvents); - _existingStreams.HardDeleteStreams(scenario.WithHardDeletedStreams); - - var checkpointTag = CheckpointTag.Empty; - _checkpointWriter.StartFrom(checkpointTag, 0); - _sut.BeginLoadPrerecordedEvents(checkpointTag); - - // Read the order stream to find prerecorded events - var orderStreamRead = _publisher.Messages - .OfType() - .FirstOrDefault(); - Assert.NotNull(orderStreamRead); - Assert.Equal(OrderStreamName, orderStreamRead.EventStreamId); - _ioDispatcher.BackwardReader.Handle( - _existingStreams.ReadStreamBackward(orderStreamRead)); - - // Read each event in the input streams 1 event at a time - var readRequests = _publisher.Messages - .OfType() - .Skip(1) // Order stream read - .ToArray(); - for (var i = 0; i < scenario.ExpectedInputStreamReads.Length; i++) { - var (expectedStream, expectedFrom) = scenario.ExpectedInputStreamReads[i]; - var actual = readRequests[i]; - Assert.Equal(expectedStream, actual.EventStreamId); - Assert.Equal(expectedFrom, actual.FromEventNumber); - Assert.Equal(1, actual.MaxCount); - _ioDispatcher.BackwardReader.Handle(_existingStreams.ReadStreamBackward(actual)); - } - - // Publish a CommittedEventReceived for the prerecorded events that were found - var committedEvents = _publisher.Messages - .OfType().ToArray(); - Assert.Equal(scenario.ExpectedCommittedEvents.Length, committedEvents.Length); - for (var i = 0; i < scenario.ExpectedCommittedEvents.Length; i++) { - var exp = scenario.ExpectedCommittedEvents[i]; - var act = committedEvents[i]; - Assert.Equal(exp.EventStreamId, act.Data.EventStreamId); - Assert.Equal(exp.EventNumber, act.Data.EventSequenceNumber); - Assert.Equal(i, act.SubscriptionMessageSequenceNumber); - Assert.Equal(exp.PreparePosition, act.Data.Position.PreparePosition); - } - - // Publish completed message - var completeMessage = _publisher.Messages - .OfType() - .SingleOrDefault(); - Assert.NotNull(completeMessage); - } - - public readonly struct PreRecordedEventsScenario( - string scenarioName, - ExistingEvent[] withExistingEvents, - ExistingEvent[] expectedCommittedEvents, - Tuple[] expectedInputStreamReads, - string[]? withHardDeletedStreams = null) { - private string ScenarioName { get; } = scenarioName; - public ExistingEvent[] WithExistingEvents { get; } = withExistingEvents; - public ExistingEvent[] ExpectedCommittedEvents { get; } = expectedCommittedEvents; - public Tuple[] ExpectedInputStreamReads { get; } = expectedInputStreamReads; - public string[] WithHardDeletedStreams { get; } = withHardDeletedStreams ?? []; - - public override string ToString() => ScenarioName; - } - - public static TheoryData PreRecordedEvents() => - new() { - new PreRecordedEventsScenario("No prerecorded events", [], [], []), - new PreRecordedEventsScenario("All prerecorded events can be read", - withExistingEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }"""), - new(OrderStreamName, 0, 200, "0@a", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new("b", 0, 300, """{ "data": "b0" }"""), - new(OrderStreamName, 1, 400, "0@b", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new("a", 1, 500, """{ "data": "a1" }"""), - new(OrderStreamName, 2, 600, "1@a", """{"s": { "a": 1, "b": 0 }}""", SystemEventTypes.LinkTo), - new("b", 1, 700, """{ "data": "b1" }"""), - new(OrderStreamName, 3, 800, "1@b", """{"s": { "a": 1, "b": 1 }}""", SystemEventTypes.LinkTo), - }, - expectedCommittedEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }"""), - new("b", 0, 300, """{ "data": "b0" }"""), - new("a", 1, 500, """{ "data": "a1" }"""), - new("b", 1, 700, """{ "data": "b1" }"""), - }, - expectedInputStreamReads: new Tuple[] { - new("b", 1), - new("a", 1), - new("b", 0), - new("a", 0), - } - ), - new PreRecordedEventsScenario("Some prerecorded events have been truncated", - withExistingEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }""", ""), - new(OrderStreamName, 0, 200, "0@a", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - // b@0 has been deleted - new(OrderStreamName, 1, 400, "0@b", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new("a", 1, 500, """{ "data": "a1" }"""), - new(OrderStreamName, 2, 600, "1@a", """{"s": { "a": 1, "b": 0 }}""", SystemEventTypes.LinkTo), - // b@1 has been deleted - new(OrderStreamName, 3, 800, "1@b", """{"s": { "a": 1, "b": 1 }}""", SystemEventTypes.LinkTo), - new("a", 2, 900, """{ "data": "a2" }"""), - new(OrderStreamName, 4, 1000, "2@a", """{"s": { "a": 2, "b": 1 }}""", SystemEventTypes.LinkTo), - new("b", 2, 1100, """{ "data": "b2" }"""), - new(OrderStreamName, 5, 1200, "2@b", """{"s": { "a": 2, "b": 2 }}""", SystemEventTypes.LinkTo) - }, - expectedCommittedEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }"""), - new("a", 1, 500, """{ "data": "a1" }"""), - new("a", 2, 900, """{ "data": "a2" }"""), - new("b", 2, 1100, """{ "data": "b2" }"""), - }, - expectedInputStreamReads: new Tuple[] { - new("b", 2), - new("a", 2), - new("b", 1), - new("a", 1), - new("b", 0), - new("a", 0), - }), - new PreRecordedEventsScenario("All prerecorded events have been truncated", - withExistingEvents: new ExistingEvent[] { - new(OrderStreamName, 0, 200, "0@a", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 1, 400, "0@b", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 2, 600, "1@a", """{"s": { "a": 1, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 3, 800, "1@b", """{"s": { "a": 1, "b": 1 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 4, 1000, "2@a", """{"s": { "a": 2, "b": 1 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 5, 1200, "2@b", """{"s": { "a": 2, "b": 2 }}""", SystemEventTypes.LinkTo), - // We must write events at the end of the input stream because this is a different scenario to stream not found. - new("a", 3, 1300, """{ "data": "a3" }"""), - new("b", 3, 1400, """{ "data": "b3" }"""), - }, - expectedCommittedEvents: new ExistingEvent[] { }, - expectedInputStreamReads: new Tuple[] { - new("b", 2), - new("a", 2), - new("b", 1), - new("a", 1), - new("b", 0), - new("a", 0), - }), - new PreRecordedEventsScenario("All input streams have been soft deleted", - withExistingEvents: new ExistingEvent[] { - new(OrderStreamName, 0, 200, "0@a", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 1, 400, "0@b", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 2, 600, "1@a", """{"s": { "a": 1, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 3, 800, "1@b", """{"s": { "a": 1, "b": 1 }}""", SystemEventTypes.LinkTo), - }, - expectedCommittedEvents: new ExistingEvent[] { }, - expectedInputStreamReads: new Tuple[] { - new("b", 1), - new("a", 1), - new("b", 0), - new("a", 0), - }), - new PreRecordedEventsScenario("One of the input streams has been hard deleted", - withExistingEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }"""), - new(OrderStreamName, 0, 200, "0@a", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 1, 400, "0@b", """{"s": { "a": 0, "b": 0 }}""", SystemEventTypes.LinkTo), - new("a", 1, 500, """{ "data": "a1" }"""), - new(OrderStreamName, 2, 600, "1@a", """{"s": { "a": 1, "b": 0 }}""", SystemEventTypes.LinkTo), - new(OrderStreamName, 3, 800, "1@b", """{"s": { "a": 1, "b": 1 }}""", SystemEventTypes.LinkTo), - }, - withHardDeletedStreams: new string[] { "b" }, - expectedCommittedEvents: new ExistingEvent[] { - new("a", 0, 100, """{ "data": "a0" }"""), - new("a", 1, 500, """{ "data": "a1" }"""), - }, - expectedInputStreamReads: new Tuple[] { - new("b", 1), - new("a", 1), - new("b", 0), - new("a", 0), - }) - }; -} diff --git a/src/EventStore.Projections.Core.XUnit.Tests/EventStore.Projections.Core.XUnit.Tests.csproj b/src/EventStore.Projections.Core.XUnit.Tests/EventStore.Projections.Core.XUnit.Tests.csproj deleted file mode 100644 index dda0edd05..000000000 --- a/src/EventStore.Projections.Core.XUnit.Tests/EventStore.Projections.Core.XUnit.Tests.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/src/EventStore.Projections.Core.XUnit.Tests/Metrics/ProjectionMetricsTests.cs b/src/EventStore.Projections.Core.XUnit.Tests/Metrics/ProjectionMetricsTests.cs deleted file mode 100644 index 16d536a87..000000000 --- a/src/EventStore.Projections.Core.XUnit.Tests/Metrics/ProjectionMetricsTests.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Diagnostics.Metrics; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Management; -using Xunit; - -namespace EventStore.Projections.Core.XUnit.Tests.Metrics; - -public class ProjectionMetricsTests { - readonly ProjectionTracker _sut = new(); - - public ProjectionMetricsTests() { - _sut.OnNewStats([new() { - Name = "TestProjection", - ProjectionId = 1234, - Epoch = -1, - Version = -1, - Mode = ProjectionMode.Continuous, - Status = "Running", - LeaderStatus = ManagedProjectionState.Running, - Progress = 75, - EventsProcessedAfterRestart = 50, - }]); - } - - [Fact] - public void ObserveEventsProcessed() { - var measurements = _sut.ObserveEventsProcessed(); - var measurement = Assert.Single(measurements); - AssertMeasurement(50L, ("projection", "TestProjection"))(measurement); - } - - [Fact] - public void ObserveRunning() { - var measurements = _sut.ObserveRunning(); - var measurement = Assert.Single(measurements); - AssertMeasurement(1L, ("projection", "TestProjection"))(measurement); - } - - [Fact] - public void ObserveProgress() { - var measurements = _sut.ObserveProgress(); - var measurement = Assert.Single(measurements); - AssertMeasurement(0.75f, ("projection", "TestProjection"))(measurement); - } - - [Fact] - public void ObserveStatus() { - var measurements = _sut.ObserveStatus(); - Assert.Collection(measurements, - AssertMeasurement(1L, ("projection", "TestProjection"), ("status", "Running")), - AssertMeasurement(0L, ("projection", "TestProjection"), ("status", "Faulted")), - AssertMeasurement(0L, ("projection", "TestProjection"), ("status", "Stopped"))); - } - - static Action> AssertMeasurement( - T expectedValue, params (string, string?)[] tags) where T : struct => - - actualMeasurement => { - Assert.Equal(expectedValue, actualMeasurement.Value); - if (actualMeasurement.Tags == null) return; - - Assert.Equal( - tags, - actualMeasurement.Tags.ToArray().Select(tag => (tag.Key, tag.Value as string))); - }; -} diff --git a/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/ExistingStreamsHelper.cs b/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/ExistingStreamsHelper.cs deleted file mode 100644 index 46ccb8542..000000000 --- a/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/ExistingStreamsHelper.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System.Text; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.TransactionLog.LogRecords; - -namespace EventStore.Projections.Core.XUnit.Tests.TestHelpers; - -// TODO: Flesh out this helper as more tests need it -public class ExistingStreamsHelper { - private readonly Dictionary> _streams = new(); - private readonly List _hardDeletedStreams = new(); - private long _lastPosition; - - public void AddEvents(params ExistingEvent[] newEvents) { - foreach (var newEvent in newEvents) { - if (_streams.TryGetValue(newEvent.EventStreamId, out var existingEvents)) { - existingEvents.Add(newEvent); - } else { - _streams.Add(newEvent.EventStreamId, [newEvent]); - } - - if (newEvent.PreparePosition > _lastPosition) { - _lastPosition = newEvent.PreparePosition; - } - } - } - - public void HardDeleteStreams(string[] deletedStreams) { - foreach (var stream in deletedStreams) { - if (!_hardDeletedStreams.Contains(stream)) { - _hardDeletedStreams.Add(stream); - } - } - } - - public long GetLastEventNumberForStream(string streamId) { - if (_hardDeletedStreams.Contains(streamId)) { - return EventNumber.DeletedStream; - } - - return _streams.TryGetValue(streamId, out var existingEvents) - ? existingEvents.Max(x => x.EventNumber) - : EventNumber.Invalid; - } - - public ClientMessage.ReadStreamEventsBackwardCompleted ReadStreamBackward( - ClientMessage.ReadStreamEventsBackward request) { - if (_hardDeletedStreams.Contains(request.EventStreamId)) { - return CreateReadBackwardCompleted(request, ReadStreamResult.StreamDeleted, []); - } - - if (!_streams.TryGetValue(request.EventStreamId, out var existingEvents)) { - return CreateReadBackwardCompleted(request, ReadStreamResult.NoStream, []); - } - - var resolvedEvents = new List(); - var lastEventNumber = GetLastEventNumberForStream(request.EventStreamId); - var current = request.FromEventNumber == -1 ? lastEventNumber : request.FromEventNumber; - for (var i = 0; i < request.MaxCount; i++) { - var foundEvent = existingEvents.FirstOrDefault(x => x.EventNumber == current); - if (foundEvent is not null) { - resolvedEvents.Add(ResolvedEvent.ForUnresolvedEvent(foundEvent.ToEventRecord(request.CorrelationId))); - } - - current--; - } - - return CreateReadBackwardCompleted(request, ReadStreamResult.Success, resolvedEvents.ToArray()); - } - - private ClientMessage.ReadStreamEventsBackwardCompleted CreateReadBackwardCompleted( - ClientMessage.ReadStreamEventsBackward request, ReadStreamResult result, ResolvedEvent[] events) { - if (result is ReadStreamResult.NoStream) { - return new ClientMessage.ReadStreamEventsBackwardCompleted(request.CorrelationId, request.EventStreamId, - request.FromEventNumber, request.MaxCount, result, [], StreamMetadata.Empty, false, - "", -1, EventNumber.Invalid, true, _lastPosition); - } - - long nextEventNumber = 0; - if (events.Length > 0) { - nextEventNumber = events.Last().OriginalEventNumber; - } - - var isEof = nextEventNumber == 0; - return new ClientMessage.ReadStreamEventsBackwardCompleted( - request.CorrelationId, request.EventStreamId, request.FromEventNumber, request.MaxCount, - ReadStreamResult.Success, events.ToArray(), StreamMetadata.Empty, false, string.Empty, - nextEventNumber, GetLastEventNumberForStream(request.EventStreamId), isEof, _lastPosition); - } - - public class ExistingEvent { - public ExistingEvent(string eventStreamId, long eventNumber, long position, string data, - string metadata = "", string eventType = "test-event") { - EventStreamId = eventStreamId; - EventNumber = eventNumber; - PreparePosition = position; - Data = data; - Metadata = metadata; - EventType = eventType; - } - - public string EventStreamId { get; } - public string EventType { get; } - public long EventNumber { get; } - public long PreparePosition { get; } - public string Data { get; } - public string Metadata { get; } - - public EventRecord ToEventRecord(Guid correlationId) => - new(EventNumber, PreparePosition, correlationId, Guid.NewGuid(), transactionPosition: 0, - transactionOffset: 0, - EventStreamId, EventNumber, DateTime.Now, PrepareFlags.IsCommitted, EventType, - Encoding.UTF8.GetBytes(Data), Encoding.UTF8.GetBytes(Metadata)); - } -} - diff --git a/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/FakePositionTagger.cs b/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/FakePositionTagger.cs deleted file mode 100644 index 0a2762c39..000000000 --- a/src/EventStore.Projections.Core.XUnit.Tests/TestHelpers/FakePositionTagger.cs +++ /dev/null @@ -1,39 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.XUnit.Tests.TestHelpers; - -// TODO: Flesh out this helper as more tests need it -public class FakePositionTagger : PositionTagger { - public FakePositionTagger(int phase) : base(phase) { - } - - public override bool IsMessageAfterCheckpointTag(CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.Empty; - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - throw new NotImplementedException(); - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - return tag; - } -} - diff --git a/src/EventStore.Projections.Core/Common/AllowedWritesInFlight.cs b/src/EventStore.Projections.Core/Common/AllowedWritesInFlight.cs deleted file mode 100644 index 04d4ab9d9..000000000 --- a/src/EventStore.Projections.Core/Common/AllowedWritesInFlight.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace EventStore.Projections.Core.Common { - public static class AllowedWritesInFlight { - public const int Unbounded = 0; - } -} diff --git a/src/EventStore.Projections.Core/Common/ProjectionConsts.cs b/src/EventStore.Projections.Core/Common/ProjectionConsts.cs deleted file mode 100644 index 7166b9380..000000000 --- a/src/EventStore.Projections.Core/Common/ProjectionConsts.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Common { - public static class ProjectionConsts { - public const int CheckpointHandledThreshold = 4000; - public const int PendingEventsThreshold = 5000; - public const int MaxWriteBatchLength = 500; - public const int CheckpointUnhandledBytesThreshold = 10 * 1000 * 1000; - public const int MaxAllowedWritesInFlight = AllowedWritesInFlight.Unbounded; - public static TimeSpan CheckpointAfterMs = TimeSpan.FromSeconds(0); - } -} diff --git a/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReader.cs b/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReader.cs deleted file mode 100644 index 52dd859b2..000000000 --- a/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReader.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.EventReaders.Feeds { - public class FeedReader : IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - private readonly - ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private readonly ClaimsPrincipal _user; - - private readonly QuerySourcesDefinition _querySource; - private readonly CheckpointTag _fromPosition; - private readonly int _maxEvents; - private readonly Guid _requestCorrelationId; - - private readonly List _batch = new List(); - private readonly IEnvelope _replyEnvelope; - private readonly ITimeProvider _timeProvider; - - private Guid _subscriptionId; - private CheckpointTag _lastReaderPosition; - - public static FeedReader Create( - ReaderSubscriptionDispatcher readerSubscriptionDispatcher, FeedReaderMessage.ReadPage message, ITimeProvider timeProvider) { - return new FeedReader( - readerSubscriptionDispatcher, message.User, message.QuerySource, message.FromPosition, message.MaxEvents, - message.CorrelationId, message.Envelope, timeProvider); - } - - public FeedReader( - ReaderSubscriptionDispatcher subscriptionDispatcher, ClaimsPrincipal user, - QuerySourcesDefinition querySource, CheckpointTag fromPosition, - int maxEvents, Guid requestCorrelationId, IEnvelope replyEnvelope, ITimeProvider timeProvider) { - ArgumentNullException.ThrowIfNull(subscriptionDispatcher); - ArgumentNullException.ThrowIfNull(querySource); - ArgumentNullException.ThrowIfNull(fromPosition); - ArgumentNullException.ThrowIfNull(replyEnvelope); - if (maxEvents <= 0) throw new ArgumentException("non-negative expected", nameof(maxEvents)); - - _subscriptionDispatcher = subscriptionDispatcher; - _user = user; - _querySource = querySource; - _fromPosition = fromPosition; - _maxEvents = maxEvents; - _requestCorrelationId = requestCorrelationId; - _replyEnvelope = replyEnvelope; - _timeProvider = timeProvider; - } - - public void Start() { - var readerStrategy = ReaderStrategy.Create( - _querySource.ToJson(), // tag - 0, - _querySource, - _timeProvider, - stopOnEof: true, - runAs: _user); - - //TODO: make reader mode explicit - var readerOptions = new ReaderSubscriptionOptions( - 1024 * 1024, - checkpointAfterMs: 10000, - checkpointProcessedEventsThreshold: null, - stopOnEof: true, - stopAfterNEvents: _maxEvents, - // The projection must be stopped for debugging, so will enable content type validation automatically - enableContentTypeValidation: true); - - _subscriptionId = Guid.NewGuid(); - _subscriptionDispatcher.PublishSubscribe( - new ReaderSubscriptionManagement.Subscribe( - _subscriptionId, _fromPosition, readerStrategy, readerOptions), this, false); - } - - public void Handle(EventReaderSubscriptionMessage.CommittedEventReceived message) { - _lastReaderPosition = message.CheckpointTag; - _batch.Add(new TaggedResolvedEvent(message.Data, message.CheckpointTag)); - } - - public void Handle(EventReaderSubscriptionMessage.EofReached message) { - _lastReaderPosition = message.CheckpointTag; - Reply(); - Unsubscribe(); - } - - public void Handle(EventReaderSubscriptionMessage.PartitionEofReached message) { - _lastReaderPosition = message.CheckpointTag; - } - - public void Handle(EventReaderSubscriptionMessage.CheckpointSuggested message) { - throw new NotSupportedException(); - } - - private void Unsubscribe() { - _subscriptionDispatcher.Cancel(_subscriptionId); - } - - private void Reply() { - _replyEnvelope.ReplyWith( - new FeedReaderMessage.FeedPage( - _requestCorrelationId, FeedReaderMessage.FeedPage.ErrorStatus.Success, _batch.ToArray(), - _lastReaderPosition)); - } - - private void ReplyNotAuthorized() { - _replyEnvelope.ReplyWith( - new FeedReaderMessage.FeedPage( - _requestCorrelationId, FeedReaderMessage.FeedPage.ErrorStatus.NotAuthorized, null, - _lastReaderPosition)); - } - - public void Handle(EventReaderSubscriptionMessage.NotAuthorized message) { - ReplyNotAuthorized(); - } - } -} diff --git a/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReaderService.cs b/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReaderService.cs deleted file mode 100644 index d608543a8..000000000 --- a/src/EventStore.Projections.Core/EventReaders/Feeds/FeedReaderService.cs +++ /dev/null @@ -1,22 +0,0 @@ -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.EventReaders.Feeds { - public class FeedReaderService : IHandle { - private readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private readonly ITimeProvider _timeProvider; - - public FeedReaderService(ReaderSubscriptionDispatcher subscriptionDispatcher, ITimeProvider timeProvider) { - _subscriptionDispatcher = subscriptionDispatcher; - _timeProvider = timeProvider; - } - - public void Handle(FeedReaderMessage.ReadPage message) { - var reader = FeedReader.Create(_subscriptionDispatcher, message, _timeProvider); - reader.Start(); - } - } -} diff --git a/src/EventStore.Projections.Core/EventStore.Projections.Core.csproj b/src/EventStore.Projections.Core/EventStore.Projections.Core.csproj deleted file mode 100644 index 66a4ed967..000000000 --- a/src/EventStore.Projections.Core/EventStore.Projections.Core.csproj +++ /dev/null @@ -1,44 +0,0 @@ - - - true - - - - - - - - - - Always - - - Always - - - Always - - - Always - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - - - Services\Grpc\Protos\projections.proto - - - diff --git a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementControlMessage.cs b/src/EventStore.Projections.Core/Messages/CoreProjectionManagementControlMessage.cs deleted file mode 100644 index 3bd1b8e2b..000000000 --- a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementControlMessage.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messages { - [DerivedMessage] - public abstract partial class CoreProjectionManagementControlMessage : CoreProjectionManagementMessageBase { - private readonly Guid _workerId; - - public Guid WorkerId { - get { return _workerId; } - } - - public CoreProjectionManagementControlMessage(Guid projectionId, Guid workerId) - : base(projectionId) { - _workerId = workerId; - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessage.cs b/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessage.cs deleted file mode 100644 index 5024e2c7e..000000000 --- a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessage.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core.Messages { - public static partial class CoreProjectionManagementMessage { - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class Start : CoreProjectionManagementControlMessage { - public Start(Guid projectionId, Guid workerId) - : base(projectionId, workerId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class LoadStopped : CoreProjectionManagementControlMessage { - public LoadStopped(Guid correlationId, Guid workerId) - : base(correlationId, workerId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class Stop : CoreProjectionManagementControlMessage { - public Stop(Guid projectionId, Guid workerId) - : base(projectionId, workerId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class Kill : CoreProjectionManagementControlMessage { - public Kill(Guid projectionId, Guid workerId) - : base(projectionId, workerId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class GetState : CoreProjectionManagementControlMessage { - private readonly Guid _correlationId; - private readonly string _partition; - - public GetState(Guid correlationId, Guid projectionId, string partition, Guid workerId) - : base(projectionId, workerId) { - if (partition == null) throw new ArgumentNullException("partition"); - _correlationId = correlationId; - _partition = partition; - } - - public string Partition { - get { return _partition; } - } - - public Guid CorrelationId { - get { return _correlationId; } - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class GetResult : CoreProjectionManagementControlMessage { - private readonly Guid _correlationId; - private readonly string _partition; - - public GetResult(Guid correlationId, Guid projectionId, string partition, Guid workerId) - : base(projectionId, workerId) { - if (partition == null) throw new ArgumentNullException("partition"); - _correlationId = correlationId; - _partition = partition; - } - - public string Partition { - get { return _partition; } - } - - public Guid CorrelationId { - get { return _correlationId; } - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class CreateAndPrepare : CoreProjectionManagementControlMessage { - private readonly ProjectionConfig _config; - private readonly string _handlerType; - private readonly string _query; - private readonly string _name; - private readonly ProjectionVersion _version; - private readonly bool _enableContentTypeValidation; - - public CreateAndPrepare( - Guid projectionId, - Guid workerId, - string name, - ProjectionVersion version, - ProjectionConfig config, - string handlerType, - string query, - bool enableContentTypeValidation) - : base(projectionId, workerId) { - _name = name; - _version = version; - _config = config; - _handlerType = handlerType; - _query = query; - _enableContentTypeValidation = enableContentTypeValidation; - } - - public ProjectionConfig Config { - get { return _config; } - } - - public string Name { - get { return _name; } - } - - public ProjectionVersion Version { - get { return _version; } - } - - public string HandlerType { - get { return _handlerType; } - } - - public string Query { - get { return _query; } - } - - public bool EnableContentTypeValidation { - get { return _enableContentTypeValidation; } - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class CreatePrepared : CoreProjectionManagementControlMessage { - private readonly ProjectionConfig _config; - private readonly QuerySourcesDefinition _sourceDefinition; - private readonly string _handlerType; - private readonly string _query; - private readonly string _name; - private readonly ProjectionVersion _version; - private readonly bool _enableContentTypeValidation; - - public CreatePrepared( - Guid projectionId, - Guid workerId, - string name, - ProjectionVersion version, - ProjectionConfig config, - QuerySourcesDefinition sourceDefinition, - string handlerType, - string query, - bool enableContentTypeValidation) - : base(projectionId, workerId) { - if (name == null) throw new ArgumentNullException("name"); - if (config == null) throw new ArgumentNullException("config"); - if (sourceDefinition == null) throw new ArgumentNullException("sourceDefinition"); - if (handlerType == null) throw new ArgumentNullException("handlerType"); - if (query == null) throw new ArgumentNullException("query"); - _name = name; - _version = version; - _config = config; - _sourceDefinition = sourceDefinition; - _handlerType = handlerType; - _query = query; - _enableContentTypeValidation = enableContentTypeValidation; - } - - public ProjectionConfig Config { - get { return _config; } - } - - public string Name { - get { return _name; } - } - - public QuerySourcesDefinition SourceDefinition { - get { return _sourceDefinition; } - } - - public ProjectionVersion Version { - get { return _version; } - } - - public string HandlerType { - get { return _handlerType; } - } - - public string Query { - get { return _query; } - } - - public bool EnableContentTypeValidation { - get { return _enableContentTypeValidation; } - } - } - - [DerivedMessage(ProjectionMessage.CoreManagement)] - public partial class Dispose : CoreProjectionManagementControlMessage { - public Dispose(Guid projectionId, Guid workerId) - : base(projectionId, workerId) { - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessageBase.cs b/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessageBase.cs deleted file mode 100644 index 87a25afda..000000000 --- a/src/EventStore.Projections.Core/Messages/CoreProjectionManagementMessageBase.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messages { - [DerivedMessage] - public abstract partial class CoreProjectionManagementMessageBase : Message { - private readonly Guid _projectionIdId; - - protected CoreProjectionManagementMessageBase(Guid projectionId) { - _projectionIdId = projectionId; - } - - public Guid ProjectionId { - get { return _projectionIdId; } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/CoreProjectionProcessingMessage.cs b/src/EventStore.Projections.Core/Messages/CoreProjectionProcessingMessage.cs deleted file mode 100644 index bc4fdb14a..000000000 --- a/src/EventStore.Projections.Core/Messages/CoreProjectionProcessingMessage.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Messages { - public static partial class CoreProjectionCheckpointWriterMessage { - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public sealed partial class CheckpointWritten : Message { - private readonly CheckpointTag _position; - - public CheckpointWritten(CheckpointTag position) { - _position = position; - } - - public CheckpointTag Position { - get { return _position; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public sealed partial class RestartRequested : Message { - public string Reason { - get { return _reason; } - } - - private readonly string _reason; - - public RestartRequested(string reason) { - _reason = reason; - } - } - } -} - -public static partial class CoreProjectionProcessingMessage { - [DerivedMessage] - public abstract partial class Message : EventStore.Core.Messaging.Message { - private readonly Guid _projectionId; - - protected Message(Guid projectionId) { - _projectionId = projectionId; - } - - public Guid ProjectionId { - get { return _projectionId; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class CheckpointLoaded : Message { - private readonly CheckpointTag _checkpointTag; - private readonly string _checkpointData; - private readonly long _checkpointEventNumber; - - public CheckpointLoaded( - Guid projectionId, CheckpointTag checkpointTag, string checkpointData, long checkpointEventNumber) - : base(projectionId) { - _checkpointTag = checkpointTag; - _checkpointData = checkpointData; - _checkpointEventNumber = checkpointEventNumber; - } - - public CheckpointTag CheckpointTag { - get { return _checkpointTag; } - } - - public string CheckpointData { - get { return _checkpointData; } - } - - public long CheckpointEventNumber { - get { return _checkpointEventNumber; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class PrerecordedEventsLoaded : Message { - private readonly CheckpointTag _checkpointTag; - - public PrerecordedEventsLoaded(Guid projectionId, CheckpointTag checkpointTag) - : base(projectionId) { - _checkpointTag = checkpointTag; - } - - public CheckpointTag CheckpointTag { - get { return _checkpointTag; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class CheckpointCompleted : Message { - private readonly CheckpointTag _checkpointTag; - - public CheckpointCompleted(Guid projectionId, CheckpointTag checkpointTag) - : base(projectionId) { - _checkpointTag = checkpointTag; - } - - public CheckpointTag CheckpointTag { - get { return _checkpointTag; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class RestartRequested : Message { - private readonly string _reason; - - public RestartRequested(Guid projectionId, string reason) - : base(projectionId) { - _reason = reason; - } - - public string Reason { - get { return _reason; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class Failed : Message { - private readonly string _reason; - - public Failed(Guid projectionId, string reason) - : base(projectionId) { - _reason = reason; - } - - public string Reason { - get { return _reason; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class ReadyForCheckpoint : EventStore.Core.Messaging.Message { - private readonly object _sender; - - public ReadyForCheckpoint(object sender) { - _sender = sender; - } - - public object Sender { - get { return _sender; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class EmittedStreamAwaiting : EventStore.Core.Messaging.Message { - private readonly IEnvelope _envelope; - private readonly string _streamId; - - public EmittedStreamAwaiting(string streamId, IEnvelope envelope) { - _envelope = envelope; - _streamId = streamId; - } - - public string StreamId { - get { return _streamId; } - } - - public IEnvelope Envelope { - get { return _envelope; } - } - } - - [DerivedMessage(ProjectionMessage.CoreProcessing)] - public partial class EmittedStreamWriteCompleted : EventStore.Core.Messaging.Message { - private readonly string _streamId; - - public EmittedStreamWriteCompleted(string streamId) { - _streamId = streamId; - } - - public string StreamId { - get { return _streamId; } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/CoreProjectionStatusMessage.cs b/src/EventStore.Projections.Core/Messages/CoreProjectionStatusMessage.cs deleted file mode 100644 index db55351b0..000000000 --- a/src/EventStore.Projections.Core/Messages/CoreProjectionStatusMessage.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Messages { - public static partial class CoreProjectionStatusMessage { - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class CoreProjectionStatusMessageBase : CoreProjectionManagementMessageBase { - protected CoreProjectionStatusMessageBase(Guid projectionId) - : base(projectionId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class Started : CoreProjectionStatusMessageBase { - public string Name { get; } - public Started(Guid projectionId, string name) - : base(projectionId) { - Name = name; - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class Faulted : CoreProjectionStatusMessageBase { - private readonly string _faultedReason; - - public Faulted(Guid projectionId, string faultedReason) - : base(projectionId) { - _faultedReason = faultedReason; - } - - public string FaultedReason { - get { return _faultedReason; } - } - } - - [DerivedMessage] - public abstract partial class DataReportBase : CoreProjectionStatusMessageBase { - private readonly Guid _correlationId; - private readonly string _partition; - private readonly CheckpointTag _position; - - protected DataReportBase(Guid correlationId, Guid projectionId, string partition, CheckpointTag position) - : base(projectionId) { - _correlationId = correlationId; - _partition = partition; - _position = position; - } - - public string Partition { - get { return _partition; } - } - - public Guid CorrelationId { - get { return _correlationId; } - } - - public CheckpointTag Position { - get { return _position; } - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class StateReport : DataReportBase { - private readonly string _state; - - public StateReport( - Guid correlationId, - Guid projectionId, - string partition, - string state, - CheckpointTag position) - : base(correlationId, projectionId, partition, position) { - _state = state; - } - - public string State { - get { return _state; } - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class ResultReport : DataReportBase { - private readonly string _result; - - public ResultReport( - Guid correlationId, - Guid projectionId, - string partition, - string result, - CheckpointTag position) - : base(correlationId, projectionId, partition, position) { - _result = result; - } - - public string Result { - get { return _result; } - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class StatisticsReport : CoreProjectionStatusMessageBase { - private readonly ProjectionStatistics _statistics; - private readonly int _sequentialNumber; - - public StatisticsReport(Guid projectionId, ProjectionStatistics statistics, int sequentialNumber) - : base(projectionId) { - _statistics = statistics; - _sequentialNumber = sequentialNumber; - } - - public ProjectionStatistics Statistics { - get { return _statistics; } - } - - public int SequentialNumber { - get { return _sequentialNumber; } - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class Prepared : CoreProjectionStatusMessageBase { - private readonly ProjectionSourceDefinition _sourceDefinition; - - public Prepared(Guid projectionId, ProjectionSourceDefinition sourceDefinition) - : base(projectionId) { - _sourceDefinition = sourceDefinition; - } - - public ProjectionSourceDefinition SourceDefinition { - get { return _sourceDefinition; } - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class Suspended : CoreProjectionStatusMessageBase { - public Suspended(Guid projectionId) - : base(projectionId) { - } - } - - [DerivedMessage(ProjectionMessage.CoreStatus)] - public partial class Stopped : CoreProjectionStatusMessageBase { - private readonly bool _completed; - private readonly string _name; - - public Stopped(Guid projectionId, string name, bool completed) - : base(projectionId) { - _completed = completed; - _name = name; - } - - public bool Completed { - get { return _completed; } - } - - public string Name { - get { return _name; } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/EventReaderSubscriptionMessageBase.cs b/src/EventStore.Projections.Core/Messages/EventReaderSubscriptionMessageBase.cs deleted file mode 100644 index 39f48c401..000000000 --- a/src/EventStore.Projections.Core/Messages/EventReaderSubscriptionMessageBase.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Messages { - public static partial class EventReaderSubscriptionMessage { - /// - /// A CheckpointSuggested message is sent to core projection - /// to allow bookmarking a position that can be used to - /// restore the projection processing (typically - /// an event at this position does not satisfy projection filter) - /// - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class CheckpointSuggested : EventReaderSubscriptionMessageBase { - public CheckpointSuggested( - Guid subscriptionId, CheckpointTag checkpointTag, float progress, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber, source) { - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class ProgressChanged : EventReaderSubscriptionMessageBase { - public ProgressChanged( - Guid subscriptionId, CheckpointTag checkpointTag, float progress, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber, source) { - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class SubscriptionStarted : EventReaderSubscriptionMessageBase { - private readonly long _startingLastCommitPosition; - - public long StartingLastCommitPosition { - get { return _startingLastCommitPosition; } - } - - public SubscriptionStarted( - Guid subscriptionId, CheckpointTag checkpointTag, long startingLastCommitPosition, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, 0f, subscriptionMessageSequenceNumber, source) { - _startingLastCommitPosition = startingLastCommitPosition; - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public sealed partial class NotAuthorized : EventReaderSubscriptionMessageBase { - public NotAuthorized( - Guid subscriptionId, CheckpointTag checkpointTag, float progress, - long subscriptionMessageSequenceNumber, - object source = null) - : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber, source) { - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public sealed partial class SubscribeTimeout : EventReaderSubscriptionMessageBase { - public SubscribeTimeout(Guid subscriptionId) - : base(subscriptionId, CheckpointTag.Empty, 100.0f, -1, null) { - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public sealed partial class Failed : EventReaderSubscriptionMessageBase { - private readonly string _reason; - - public string Reason { - get { return _reason; } - } - - public Failed(Guid subscriptionId, string reason) - : base(subscriptionId, CheckpointTag.Empty, 100.0f, -1, null) { - _reason = reason; - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class EofReached : EventReaderSubscriptionMessageBase { - public EofReached( - Guid subscriptionId, CheckpointTag checkpointTag, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, 100.0f, subscriptionMessageSequenceNumber, source) { - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class PartitionEofReached : EventReaderSubscriptionMessageBase { - private readonly string _partition; - - public string Partition { - get { return _partition; } - } - - public PartitionEofReached( - Guid subscriptionId, CheckpointTag checkpointTag, string partition, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, 100.0f, subscriptionMessageSequenceNumber, source) { - _partition = partition; - } - } - - /// - /// NOTEL the PartitionDeleted may appear out-of-order and is not guaranteed - /// to appear at the same sequence position in a recovery - /// - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class PartitionDeleted : EventReaderSubscriptionMessageBase { - private readonly string _partition; - - public string Partition { - get { return _partition; } - } - - public PartitionDeleted( - Guid subscriptionId, CheckpointTag checkpointTag, string partition, - long subscriptionMessageSequenceNumber, object source = null) - : base(subscriptionId, checkpointTag, 100.0f, subscriptionMessageSequenceNumber, source) { - _partition = partition; - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class CommittedEventReceived : EventReaderSubscriptionMessageBase { - public static CommittedEventReceived Sample( - ResolvedEvent data, Guid subscriptionId, long subscriptionMessageSequenceNumber) { - return new CommittedEventReceived( - subscriptionId, 0, null, data, 77.7f, subscriptionMessageSequenceNumber); - } - - public static CommittedEventReceived Sample( - ResolvedEvent data, CheckpointTag checkpointTag, Guid subscriptionId, - long subscriptionMessageSequenceNumber) { - return new CommittedEventReceived( - subscriptionId, checkpointTag, null, data, 77.7f, subscriptionMessageSequenceNumber, null); - } - - private readonly ResolvedEvent _data; - - private readonly string _eventCategory; - - private CommittedEventReceived( - Guid subscriptionId, CheckpointTag checkpointTag, string eventCategory, ResolvedEvent data, - float progress, long subscriptionMessageSequenceNumber, object source) - : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber, source) { - if (data == null) - throw new ArgumentNullException("data"); - _data = data; - _eventCategory = eventCategory; - } - - private CommittedEventReceived( - Guid subscriptionId, int phase, string eventCategory, ResolvedEvent data, float progress, - long subscriptionMessageSequenceNumber) - : this( - subscriptionId, - CheckpointTag.FromPosition(phase, data.Position.CommitPosition, data.Position.PreparePosition), - eventCategory, data, progress, subscriptionMessageSequenceNumber, null) { - } - - public ResolvedEvent Data { - get { return _data; } - } - - public string EventCategory { - get { return _eventCategory; } - } - - public static CommittedEventReceived FromCommittedEventDistributed( - ReaderSubscriptionMessage.CommittedEventDistributed message, CheckpointTag checkpointTag, - string eventCategory, Guid subscriptionId, long subscriptionMessageSequenceNumber) { - return new CommittedEventReceived( - subscriptionId, checkpointTag, eventCategory, message.Data, message.Progress, - subscriptionMessageSequenceNumber, message.Source); - } - - public override string ToString() { - return CheckpointTag.ToString(); - } - } - - [DerivedMessage(ProjectionMessage.EventReaderSubscription)] - public partial class ReaderAssignedReader : EventReaderSubscriptionMessageBase { - private readonly Guid _readerId; - - public ReaderAssignedReader(Guid subscriptionId, Guid readerId) - : base(subscriptionId, null, 0, 0, null) { - _readerId = readerId; - } - - public Guid ReaderId { - get { return _readerId; } - } - } - } - - [DerivedMessage] - public abstract partial class EventReaderSubscriptionMessageBase : Message { - private readonly Guid _subscriptionId; - private readonly long _subscriptionMessageSequenceNumber; - private readonly object _source; - private readonly CheckpointTag _checkpointTag; - private readonly float _progress; - - internal EventReaderSubscriptionMessageBase(Guid subscriptionId, CheckpointTag checkpointTag, float progress, - long subscriptionMessageSequenceNumber, object source) { - _subscriptionId = subscriptionId; - _checkpointTag = checkpointTag; - _progress = progress; - _subscriptionMessageSequenceNumber = subscriptionMessageSequenceNumber; - _source = source; - } - - - public CheckpointTag CheckpointTag { - get { return _checkpointTag; } - } - - public float Progress { - get { return _progress; } - } - - public long SubscriptionMessageSequenceNumber { - get { return _subscriptionMessageSequenceNumber; } - } - - public Guid SubscriptionId { - get { return _subscriptionId; } - } - - public object Source { - get { return _source; } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/EventReaders/Feeds/FeedReaderMessage.cs b/src/EventStore.Projections.Core/Messages/EventReaders/Feeds/FeedReaderMessage.cs deleted file mode 100644 index 1f914a6f3..000000000 --- a/src/EventStore.Projections.Core/Messages/EventReaders/Feeds/FeedReaderMessage.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Messages.EventReaders.Feeds { - public static partial class FeedReaderMessage { - [DerivedMessage] - public abstract partial class FeedReaderMessageBase : Message { - } - - [DerivedMessage(ProjectionMessage.FeedReader)] - public sealed partial class ReadPage : FeedReaderMessageBase { - public readonly Guid CorrelationId; - public readonly IEnvelope Envelope; - public readonly ClaimsPrincipal User; - - public readonly QuerySourcesDefinition QuerySource; - public readonly CheckpointTag FromPosition; - public readonly int MaxEvents; - - public ReadPage( - Guid correlationId, IEnvelope envelope, ClaimsPrincipal user, QuerySourcesDefinition querySource, - CheckpointTag fromPosition, - int maxEvents) { - User = user; - CorrelationId = correlationId; - Envelope = envelope; - QuerySource = querySource; - FromPosition = fromPosition; - MaxEvents = maxEvents; - } - } - - [DerivedMessage(ProjectionMessage.FeedReader)] - public sealed partial class FeedPage : FeedReaderMessageBase { - public enum ErrorStatus { - Success, - NotAuthorized - } - - public readonly Guid CorrelationId; - public readonly ErrorStatus Error; - public readonly TaggedResolvedEvent[] Events; - public readonly CheckpointTag LastReaderPosition; - - public FeedPage( - Guid correlationId, ErrorStatus error, TaggedResolvedEvent[] events, CheckpointTag lastReaderPosition) { - CorrelationId = correlationId; - Error = error; - Events = events; - LastReaderPosition = lastReaderPosition; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ICoreProjection.cs b/src/EventStore.Projections.Core/Messages/ICoreProjection.cs deleted file mode 100644 index 0b976e179..000000000 --- a/src/EventStore.Projections.Core/Messages/ICoreProjection.cs +++ /dev/null @@ -1,11 +0,0 @@ -using EventStore.Core.Bus; - -namespace EventStore.Projections.Core.Messages { - public interface ICoreProjection : - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - } -} diff --git a/src/EventStore.Projections.Core/Messages/IProjectionCheckpointManager.cs b/src/EventStore.Projections.Core/Messages/IProjectionCheckpointManager.cs deleted file mode 100644 index 55bf72378..000000000 --- a/src/EventStore.Projections.Core/Messages/IProjectionCheckpointManager.cs +++ /dev/null @@ -1,13 +0,0 @@ -using EventStore.Core.Bus; - -namespace EventStore.Projections.Core.Messages { - public interface IProjectionCheckpointManager : IHandle, - IHandle, - IHandle { - } - - public interface IEmittedStreamContainer : IProjectionCheckpointManager, - IHandle, - IHandle { - } -} diff --git a/src/EventStore.Projections.Core/Messages/IQuerySources.cs b/src/EventStore.Projections.Core/Messages/IQuerySources.cs deleted file mode 100644 index a57a68122..000000000 --- a/src/EventStore.Projections.Core/Messages/IQuerySources.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace EventStore.Projections.Core.Messages { - public interface IQuerySources { - bool AllStreams { get; } - - string[] Categories { get; } - - string[] Streams { get; } - - bool AllEvents { get; } - - string[] Events { get; } - - bool ByStreams { get; } - - bool ByCustomPartitions { get; } - - bool DefinesStateTransform { get; } - - bool DefinesFold { get; } - - bool HandlesDeletedNotifications { get; } - - bool ProducesResults { get; } - - bool IsBiState { get; } - - bool IncludeLinksOption { get; } - - string ResultStreamNameOption { get; } - - string PartitionResultStreamNamePatternOption { get; } - - bool ReorderEventsOption { get; } - - int? ProcessingLagOption { get; } - - long? LimitingCommitPosition { get; } - } - - public static class QuerySourcesExtensions { - public static bool HasStreams(this IQuerySources sources) { - var streams = sources.Streams; - return streams != null && streams.Length > 0; - } - - public static bool HasCategories(this IQuerySources sources) { - var categories = sources.Categories; - return categories != null && categories.Length > 0; - } - - public static bool HasEvents(this IQuerySources sources) { - var events = sources.Events; - return events != null && events.Length > 0; - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ProjectionCoreServiceMessage.cs b/src/EventStore.Projections.Core/Messages/ProjectionCoreServiceMessage.cs deleted file mode 100644 index 82e8289e2..000000000 --- a/src/EventStore.Projections.Core/Messages/ProjectionCoreServiceMessage.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messages { - public static partial class ProjectionCoreServiceMessage { - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class StartCore : Message { - public readonly Guid InstanceCorrelationId; - - public StartCore(Guid instanceCorrelationId) { - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class StopCore : Message { - public Guid QueueId { get; } - - public StopCore(Guid queueId) { - QueueId = queueId; - } - } - - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class StopCoreTimeout : Message { - public Guid QueueId { get; } - - public StopCoreTimeout(Guid queueId) { - QueueId = queueId; - } - } - - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class CoreTick : Message { - private readonly Action _action; - - public CoreTick(Action action) { - _action = action; - } - - public Action Action { - get { return _action; } - } - } - - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class SubComponentStarted : Message { - public string SubComponent { get; } - public Guid InstanceCorrelationId { get; } - - public SubComponentStarted(string subComponent, Guid instanceCorrelationId) { - InstanceCorrelationId = instanceCorrelationId; - SubComponent = subComponent; - } - } - - [DerivedMessage(ProjectionMessage.ServiceMessage)] - public partial class SubComponentStopped : Message { - public readonly string SubComponent; - - public Guid QueueId { get; } - - public SubComponentStopped(string subComponent, Guid queueId) { - SubComponent = subComponent; - QueueId = queueId; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ProjectionManagementMessage.cs b/src/EventStore.Projections.Core/Messages/ProjectionManagementMessage.cs deleted file mode 100644 index bb683a103..000000000 --- a/src/EventStore.Projections.Core/Messages/ProjectionManagementMessage.cs +++ /dev/null @@ -1,852 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using System.Collections.Generic; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Messages { - public static partial class ProjectionManagementMessage { - public static partial class Command { - [DerivedMessage] - public abstract partial class ControlMessage : Message { - private readonly IEnvelope _envelope; - public readonly RunAs RunAs; - - protected ControlMessage(IEnvelope envelope, RunAs runAs) { - _envelope = envelope; - RunAs = runAs; - } - - public IEnvelope Envelope { - get { return _envelope; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class PostBatch : ControlMessage { - public ProjectionPost[] Projections { get; } - - public PostBatch( - IEnvelope envelope, RunAs runAs, ProjectionPost[] projections) - : base(envelope, runAs) { - Projections = projections; - } - - public class ProjectionPost - { - public ProjectionMode Mode { get; } - public RunAs RunAs {get;} - public string Name { get; } - public string HandlerType { get; } - public string Query { get; } - public bool Enabled { get;} - public bool CheckpointsEnabled{ get;} - public bool EmitEnabled { get; } - public bool EnableRunAs { get; } - public bool TrackEmittedStreams { get; } - - public ProjectionPost( - ProjectionMode mode, RunAs runAs, string name, string handlerType, string query, - bool enabled, bool checkpointsEnabled, bool emitEnabled, bool enableRunAs, - bool trackEmittedStreams) - { - Mode = mode; - RunAs = runAs; - Name = name; - HandlerType = handlerType; - Query = query; - Enabled = enabled; - CheckpointsEnabled = checkpointsEnabled; - EmitEnabled = emitEnabled; - EnableRunAs = enableRunAs; - TrackEmittedStreams = trackEmittedStreams; - } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Post : ControlMessage { - private readonly ProjectionMode _mode; - private readonly string _name; - private readonly string _handlerType; - private readonly string _query; - private readonly bool _enabled; - private readonly bool _checkpointsEnabled; - private readonly bool _emitEnabled; - private readonly bool _enableRunAs; - private readonly bool _trackEmittedStreams; - - public Post( - IEnvelope envelope, ProjectionMode mode, string name, RunAs runAs, string handlerType, string query, - bool enabled, bool checkpointsEnabled, bool emitEnabled, bool trackEmittedStreams, - bool enableRunAs = false) - : base(envelope, runAs) { - _name = name; - _handlerType = handlerType; - _mode = mode; - _query = query; - _enabled = enabled; - _checkpointsEnabled = checkpointsEnabled; - _emitEnabled = emitEnabled; - _trackEmittedStreams = trackEmittedStreams; - _enableRunAs = enableRunAs; - } - - public Post( - IEnvelope envelope, ProjectionMode mode, string name, RunAs runAs, Type handlerType, string query, - bool enabled, bool checkpointsEnabled, bool emitEnabled, bool trackEmittedStreams, - bool enableRunAs = false) - : base(envelope, runAs) { - _name = name; - _handlerType = "native:" + handlerType.Namespace + "." + handlerType.Name; - _mode = mode; - _query = query; - _enabled = enabled; - _checkpointsEnabled = checkpointsEnabled; - _emitEnabled = emitEnabled; - _trackEmittedStreams = trackEmittedStreams; - _enableRunAs = enableRunAs; - } - - // shortcut for posting ad-hoc JS queries - public Post(IEnvelope envelope, RunAs runAs, string query, bool enabled) - : base(envelope, runAs) { - _name = Guid.NewGuid().ToString("D"); - _handlerType = "JS"; - _mode = ProjectionMode.Transient; - _query = query; - _enabled = enabled; - _checkpointsEnabled = false; - _emitEnabled = false; - _trackEmittedStreams = false; - } - - public ProjectionMode Mode { - get { return _mode; } - } - - public string Query { - get { return _query; } - } - - public string Name { - get { return _name; } - } - - public string HandlerType { - get { return _handlerType; } - } - - public bool Enabled { - get { return _enabled; } - } - - public bool EmitEnabled { - get { return _emitEnabled; } - } - - public bool CheckpointsEnabled { - get { return _checkpointsEnabled; } - } - - public bool EnableRunAs { - get { return _enableRunAs; } - } - - public bool TrackEmittedStreams { - get { return _trackEmittedStreams; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Disable : ControlMessage { - private readonly string _name; - - public Disable(IEnvelope envelope, string name, RunAs runAs) - : base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Enable : ControlMessage { - private readonly string _name; - - public Enable(IEnvelope envelope, string name, RunAs runAs) - : base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Abort : ControlMessage { - private readonly string _name; - - public Abort(IEnvelope envelope, string name, RunAs runAs) - : base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class SetRunAs : ControlMessage { - public enum SetRemove { - Set, - Remove - }; - - private readonly string _name; - private readonly SetRemove _action; - - public SetRunAs(IEnvelope envelope, string name, RunAs runAs, SetRemove action) - : base(envelope, runAs) { - _name = name; - _action = action; - } - - public string Name { - get { return _name; } - } - - public SetRemove Action { - get { return _action; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class UpdateQuery : ControlMessage { - private readonly string _name; - private readonly string _query; - private readonly bool? _emitEnabled; - - public UpdateQuery( - IEnvelope envelope, string name, RunAs runAs, string query, bool? emitEnabled) - : base(envelope, runAs) { - _name = name; - _query = query; - _emitEnabled = emitEnabled; - } - - public string Query { - get { return _query; } - } - - public string Name { - get { return _name; } - } - - public bool? EmitEnabled { - get { return _emitEnabled; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Reset : ControlMessage { - private readonly string _name; - - public Reset(IEnvelope envelope, string name, RunAs runAs) - : base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Delete : ControlMessage { - private readonly string _name; - private readonly bool _deleteCheckpointStream; - private readonly bool _deleteStateStream; - private readonly bool _deleteEmittedStreams; - - public Delete( - IEnvelope envelope, string name, RunAs runAs, bool deleteCheckpointStream, bool deleteStateStream, - bool deleteEmittedStreams) - : base(envelope, runAs) { - _name = name; - _deleteCheckpointStream = deleteCheckpointStream; - _deleteStateStream = deleteStateStream; - _deleteEmittedStreams = deleteEmittedStreams; - } - - public string Name { - get { return _name; } - } - - public bool DeleteCheckpointStream { - get { return _deleteCheckpointStream; } - } - - public bool DeleteStateStream { - get { return _deleteStateStream; } - } - - public bool DeleteEmittedStreams { - get { return _deleteEmittedStreams; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class GetQuery : ControlMessage { - private readonly string _name; - - public GetQuery(IEnvelope envelope, string name, RunAs runAs) : - base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class GetConfig : ControlMessage { - private readonly string _name; - - public GetConfig(IEnvelope envelope, string name, RunAs runAs) : - base(envelope, runAs) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class UpdateConfig : ControlMessage { - private readonly string _name; - private readonly bool _emitEnabled; - private readonly bool _trackEmittedStreams; - private readonly int _checkpointAfterMs; - private readonly int _checkpointHandledThreshold; - private readonly int _checkpointUnhandledBytesThreshold; - private readonly int _pendingEventsThreshold; - private readonly int _maxWriteBatchLength; - private readonly int _maxAllowedWritesInFlight; - private readonly int? _projectionExecutionTimeout; - - public UpdateConfig(IEnvelope envelope, string name, bool emitEnabled, bool trackEmittedStreams, - int checkpointAfterMs, - int checkpointHandledThreshold, int checkpointUnhandledBytesThreshold, int pendingEventsThreshold, - int maxWriteBatchLength, int maxAllowedWritesInFlight, RunAs runAs, int? projectionExecutionTimeout) : - base(envelope, runAs) { - _name = name; - _emitEnabled = emitEnabled; - _trackEmittedStreams = trackEmittedStreams; - _checkpointAfterMs = checkpointAfterMs; - _checkpointHandledThreshold = checkpointHandledThreshold; - _checkpointUnhandledBytesThreshold = checkpointUnhandledBytesThreshold; - _pendingEventsThreshold = pendingEventsThreshold; - _maxWriteBatchLength = maxWriteBatchLength; - _maxAllowedWritesInFlight = maxAllowedWritesInFlight; - _projectionExecutionTimeout = projectionExecutionTimeout; - } - - public string Name { - get { return _name; } - } - - public bool EmitEnabled { - get { return _emitEnabled; } - } - - public bool TrackEmittedStreams { - get { return _trackEmittedStreams; } - } - - public int CheckpointAfterMs { - get { return _checkpointAfterMs; } - } - - public int CheckpointHandledThreshold { - get { return _checkpointHandledThreshold; } - } - - public int CheckpointUnhandledBytesThreshold { - get { return _checkpointUnhandledBytesThreshold; } - } - - public int PendingEventsThreshold { - get { return _pendingEventsThreshold; } - } - - public int MaxWriteBatchLength { - get { return _maxWriteBatchLength; } - } - - public int MaxAllowedWritesInFlight { - get { return _maxAllowedWritesInFlight; } - } - - public int? ProjectionExecutionTimeout { get => _projectionExecutionTimeout; } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class GetStatistics : Message { - private readonly IEnvelope _envelope; - private readonly ProjectionMode? _mode; - private readonly string _name; - private readonly bool _includeDeleted; - - public GetStatistics(IEnvelope envelope, ProjectionMode? mode, string name, bool includeDeleted) { - _envelope = envelope; - _mode = mode; - _name = name; - _includeDeleted = includeDeleted; - } - - public ProjectionMode? Mode { - get { return _mode; } - } - - public string Name { - get { return _name; } - } - - public bool IncludeDeleted { - get { return _includeDeleted; } - } - - public IEnvelope Envelope { - get { return _envelope; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class GetState : Message { - private readonly IEnvelope _envelope; - private readonly string _name; - private readonly string _partition; - - public GetState(IEnvelope envelope, string name, string partition) { - if (envelope == null) throw new ArgumentNullException("envelope"); - if (name == null) throw new ArgumentNullException("name"); - if (partition == null) throw new ArgumentNullException("partition"); - _envelope = envelope; - _name = name; - _partition = partition; - } - - public string Name { - get { return _name; } - } - - public IEnvelope Envelope { - get { return _envelope; } - } - - public string Partition { - get { return _partition; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class GetResult : Message { - private readonly IEnvelope _envelope; - private readonly string _name; - private readonly string _partition; - - public GetResult(IEnvelope envelope, string name, string partition) { - if (envelope == null) throw new ArgumentNullException("envelope"); - if (name == null) throw new ArgumentNullException("name"); - if (partition == null) throw new ArgumentNullException("partition"); - _envelope = envelope; - _name = name; - _partition = partition; - } - - public string Name { - get { return _name; } - } - - public IEnvelope Envelope { - get { return _envelope; } - } - - public string Partition { - get { return _partition; } - } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class OperationFailed : Message { - private readonly string _reason; - - public OperationFailed(string reason) { - _reason = reason; - } - - public string Reason { - get { return _reason; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class NotFound : OperationFailed { - public NotFound() - : base("Not Found") { - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class NotAuthorized : OperationFailed { - public NotAuthorized() - : base("Not authorized") { - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Conflict : OperationFailed { - public Conflict(string reason) - : base(reason) { - } - } - - public sealed class RunAs { - private readonly ClaimsPrincipal _runAs; - - public RunAs(ClaimsPrincipal runAs) { - _runAs = runAs; - } - - private static readonly RunAs _anonymous = new RunAs(SystemAccounts.Anonymous); - private static readonly RunAs _system = new RunAs(SystemAccounts.System); - - public static RunAs Anonymous { - get { return _anonymous; } - } - - public static RunAs System { - get { return _system; } - } - - public ClaimsPrincipal Principal { - get { return _runAs; } - } - - public static bool ValidateRunAs(ProjectionMode mode, ReadWrite readWrite, ClaimsPrincipal existingRunAs, - Command.ControlMessage message, bool replace = false) { - if (mode > ProjectionMode.Transient && readWrite == ReadWrite.Write - && (message.RunAs == null || message.RunAs.Principal == null - || !( - message.RunAs.Principal.LegacyRoleCheck(SystemRoles.Admins) - || message.RunAs.Principal.LegacyRoleCheck(SystemRoles.Operations) - ))) { - message.Envelope.ReplyWith(new NotAuthorized()); - return false; - } - - if (replace && message.RunAs.Principal == null) { - message.Envelope.ReplyWith(new NotAuthorized()); - return false; - } - - if (replace && message.RunAs.Principal != null) - return true; // enable this operation while no projection permissions are defined - - return true; - - //if (existingRunAs == null) - // return true; - //if (message.RunAs1.Principal == null - // || !string.Equals( - // existingRunAs.Identity.Name, message.RunAs1.Principal.Identity.Name, - // StringComparison.OrdinalIgnoreCase)) - //{ - // message.Envelope.ReplyWith(new NotAuthorized()); - // return false; - //} - //return true; - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Updated : Message { - private readonly string _name; - - public Updated(string name) { - _name = name; - } - - public string Name { - get { return _name; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Statistics : Message { - private readonly ProjectionStatistics[] _projections; - - public Statistics(ProjectionStatistics[] projections) { - _projections = projections; - } - - public ProjectionStatistics[] Projections { - get { return _projections; } - } - } - - [DerivedMessage] - public abstract partial class ProjectionDataBase : Message { - private readonly string _name; - private readonly string _partition; - private readonly CheckpointTag _position; - private readonly Exception _exception; - - protected ProjectionDataBase( - string name, string partition, CheckpointTag position, Exception exception = null) { - _name = name; - _partition = partition; - _position = position; - _exception = exception; - } - - public string Name { - get { return _name; } - } - - public Exception Exception { - get { return _exception; } - } - - public string Partition { - get { return _partition; } - } - - public CheckpointTag Position { - get { return _position; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class ProjectionState : ProjectionDataBase { - private readonly string _state; - - public ProjectionState( - string name, string partition, string state, CheckpointTag position, Exception exception = null) - : base(name, partition, position, exception) { - _state = state; - } - - public string State { - get { return _state; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class ProjectionResult : ProjectionDataBase { - private readonly string _result; - - public ProjectionResult( - string name, string partition, string result, CheckpointTag position, Exception exception = null) - : base(name, partition, position, exception) { - _result = result; - } - - public string Result { - get { return _result; } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class ProjectionQuery : Message { - private readonly string _name; - private readonly string _query; - private readonly bool _emitEnabled; - private readonly ProjectionSourceDefinition _definition; - private readonly ProjectionOutputConfig _outputConfig; - private readonly string _projectionType; - private readonly bool? _trackEmittedStreams; - private readonly bool? _checkpointsEnabled; - - public ProjectionQuery( - string name, - string query, - bool emitEnabled, - string projectionType, - bool? trackEmittedStreams, - bool? checkpointsEnabled, - ProjectionSourceDefinition definition, - ProjectionOutputConfig outputConfig) { - _name = name; - _query = query; - _emitEnabled = emitEnabled; - _projectionType = projectionType; - _trackEmittedStreams = trackEmittedStreams; - _checkpointsEnabled = checkpointsEnabled; - _definition = definition; - _outputConfig = outputConfig; - } - - public string Name { - get { return _name; } - } - - public string Query { - get { return _query; } - } - - public bool EmitEnabled { - get { return _emitEnabled; } - } - - public bool? TrackEmittedStreams { - get { return _trackEmittedStreams; } - } - - public bool? CheckpointsEnabled { - get { return _checkpointsEnabled; } - } - - public string Type { - get { return _projectionType; } - } - - public ProjectionSourceDefinition Definition { - get { return _definition; } - } - - public ProjectionOutputConfig OutputConfig { - get { return _outputConfig; } - } - } - - public static partial class Internal { - [DerivedMessage(ProjectionMessage.Management)] - public partial class CleanupExpired : Message { - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class ReadTimeout : Message { - private readonly Guid _correlationId; - private readonly string _streamId; - private readonly Dictionary _parameters; - - public Guid CorrelationId { - get { return _correlationId; } - } - - public string StreamId { - get { return _streamId; } - } - - public Dictionary Parameters { - get { return _parameters; } - } - - public ReadTimeout(Guid correlationId, string streamId, Dictionary parameters) { - _correlationId = correlationId; - _streamId = streamId; - _parameters = parameters; - } - - public ReadTimeout(Guid correlationId, string streamId) : this(correlationId, streamId, - new Dictionary()) { - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class Deleted : Message { - private readonly string _name; - private readonly Guid _id; - - public Deleted(string name, Guid id) { - _name = name; - _id = id; - } - - public string Name { - get { return _name; } - } - - public Guid Id { - get { return _id; } - } - } - } - - [DerivedMessage(ProjectionMessage.Management)] - public partial class ProjectionConfig : Message { - private readonly bool _emitEnabled; - private readonly bool _trackEmittedStreams; - private readonly int _checkpointAfterMs; - private readonly int _checkpointHandledThreshold; - private readonly int _checkpointUnhandledBytesThreshold; - private readonly int _pendingEventsThreshold; - private readonly int _maxWriteBatchLength; - private readonly int _maxAllowedWritesInFlight; - private readonly int? _projectionExecutionTimeout; - - public ProjectionConfig(bool emitEnabled, bool trackEmittedStreams, int checkpointAfterMs, - int checkpointHandledThreshold, - int checkpointUnhandledBytesThreshold, int pendingEventsThreshold, int maxWriteBatchLength, - int maxAllowedWritesInFlight, int? projectionExecutionTimeout) { - _emitEnabled = emitEnabled; - _trackEmittedStreams = trackEmittedStreams; - _checkpointAfterMs = checkpointAfterMs; - _checkpointHandledThreshold = checkpointHandledThreshold; - _checkpointUnhandledBytesThreshold = checkpointUnhandledBytesThreshold; - _pendingEventsThreshold = pendingEventsThreshold; - _maxWriteBatchLength = maxWriteBatchLength; - _maxAllowedWritesInFlight = maxAllowedWritesInFlight; - _projectionExecutionTimeout = projectionExecutionTimeout; - } - - public bool EmitEnabled { - get { return _emitEnabled; } - } - - public bool TrackEmittedStreams { - get { return _trackEmittedStreams; } - } - - public int CheckpointAfterMs { - get { return _checkpointAfterMs; } - } - - public int CheckpointHandledThreshold { - get { return _checkpointHandledThreshold; } - } - - public int CheckpointUnhandledBytesThreshold { - get { return _checkpointUnhandledBytesThreshold; } - } - - public int PendingEventsThreshold { - get { return _pendingEventsThreshold; } - } - - public int MaxWriteBatchLength { - get { return _maxWriteBatchLength; } - } - - public int MaxAllowedWritesInFlight { - get { return _maxAllowedWritesInFlight; } - } - - public int? ProjectionExecutionTimeout { get => _projectionExecutionTimeout; } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ProjectionMessage.cs b/src/EventStore.Projections.Core/Messages/ProjectionMessage.cs deleted file mode 100644 index 9bbc895da..000000000 --- a/src/EventStore.Projections.Core/Messages/ProjectionMessage.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace EventStore.Projections.Core.Messages { - // The name of this enum and its members are used for metrics - public enum ProjectionMessage { - None, - CoreManagement, - CoreProcessing, - CoreStatus, - EventReaderSubscription, - FeedReader, - Management, - Misc, - ReaderCoreService, - ReaderSubscription, - ReaderSubscriptionManagement, - ServiceMessage, - Subsystem, - } -} diff --git a/src/EventStore.Projections.Core/Messages/ProjectionSubsystemMessage.cs b/src/EventStore.Projections.Core/Messages/ProjectionSubsystemMessage.cs deleted file mode 100644 index 136bebb78..000000000 --- a/src/EventStore.Projections.Core/Messages/ProjectionSubsystemMessage.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messages { - public static partial class ProjectionSubsystemMessage { - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class RestartSubsystem : Message { - public IEnvelope ReplyEnvelope { get; } - - public RestartSubsystem(IEnvelope replyEnvelope) { - ReplyEnvelope = replyEnvelope; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class InvalidSubsystemRestart : Message { - public string SubsystemState { get; } - public string Reason { get; } - - public InvalidSubsystemRestart(string subsystemState, string reason) { - SubsystemState = subsystemState; - Reason = reason; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class SubsystemRestarting : Message { - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class StartComponents : Message { - public Guid InstanceCorrelationId { get; } - - public StartComponents(Guid instanceCorrelationId) { - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class ComponentStarted : Message { - public string ComponentName { get; } - public Guid InstanceCorrelationId { get; } - - public ComponentStarted(string componentName, Guid instanceCorrelationId) { - ComponentName = componentName; - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class StopComponents : Message { - public Guid InstanceCorrelationId { get; } - - public StopComponents(Guid instanceCorrelationId) { - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class ComponentStopped : Message { - public string ComponentName { get; } - public Guid InstanceCorrelationId { get; } - - public ComponentStopped(string componentName, Guid instanceCorrelationId) { - ComponentName = componentName; - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.Subsystem)] - public partial class IODispatcherDrained : Message { - public string ComponentName { get; } - - public IODispatcherDrained(string componentName) { - ComponentName = componentName; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/QuerySourcesDefinition.cs b/src/EventStore.Projections.Core/Messages/QuerySourcesDefinition.cs deleted file mode 100644 index 7244daf8c..000000000 --- a/src/EventStore.Projections.Core/Messages/QuerySourcesDefinition.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Linq; -using System.Runtime.Serialization; - -namespace EventStore.Projections.Core.Messages { - [DataContract] - public class QuerySourcesDefinition : IQuerySources { - [DataMember(Name = "allStreams")] public bool AllStreams { get; set; } - - [DataMember(Name = "categories")] public string[] Categories { get; set; } - - [DataMember(Name = "streams")] public string[] Streams { get; set; } - - [DataMember(Name = "allEvents")] public bool AllEvents { get; set; } - - [DataMember(Name = "events")] public string[] Events { get; set; } - - [DataMember(Name = "byStreams")] public bool ByStreams { get; set; } - - [DataMember(Name = "byCustomPartitions")] - public bool ByCustomPartitions { get; set; } - - [DataMember(Name = "limitingCommitPosition")] - public long? LimitingCommitPosition { get; set; } - - bool IQuerySources.DefinesStateTransform { - get { return Options != null && Options.DefinesStateTransform; } - } - - bool IQuerySources.ProducesResults { - get { return Options != null && Options.ProducesResults; } - } - - bool IQuerySources.DefinesFold { - get { return Options != null && Options.DefinesFold; } - } - - bool IQuerySources.HandlesDeletedNotifications { - get { return Options != null && Options.HandlesDeletedNotifications; } - } - - bool IQuerySources.IncludeLinksOption { - get { return Options != null && Options.IncludeLinks; } - } - - string IQuerySources.ResultStreamNameOption { - get { return Options != null ? Options.ResultStreamName : null; } - } - - string IQuerySources.PartitionResultStreamNamePatternOption { - get { return Options != null ? Options.PartitionResultStreamNamePattern : null; } - } - - bool IQuerySources.ReorderEventsOption { - get { return Options != null && Options.ReorderEvents; } - } - - int? IQuerySources.ProcessingLagOption { - get { return Options != null ? Options.ProcessingLag : null; } - } - - bool IQuerySources.IsBiState { - get { return Options != null ? Options.IsBiState : false; } - } - - [DataMember(Name = "options")] public QuerySourcesDefinitionOptions Options { get; set; } - - public static QuerySourcesDefinition From(IQuerySources sources) { - return new QuerySourcesDefinition { - AllEvents = sources.AllEvents, - AllStreams = sources.AllStreams, - ByStreams = sources.ByStreams, - ByCustomPartitions = sources.ByCustomPartitions, - Categories = (sources.Categories ?? new string[0]).ToArray(), - Events = (sources.Events ?? new string[0]).ToArray(), - Streams = (sources.Streams ?? new string[0]).ToArray(), - LimitingCommitPosition = sources.LimitingCommitPosition, - Options = - new QuerySourcesDefinitionOptions { - DefinesStateTransform = sources.DefinesStateTransform, - ProducesResults = sources.ProducesResults, - DefinesFold = sources.DefinesFold, - HandlesDeletedNotifications = sources.HandlesDeletedNotifications, - IncludeLinks = sources.IncludeLinksOption, - PartitionResultStreamNamePattern = sources.PartitionResultStreamNamePatternOption, - ProcessingLag = sources.ProcessingLagOption.GetValueOrDefault(), - IsBiState = sources.IsBiState, - ReorderEvents = sources.ReorderEventsOption, - ResultStreamName = sources.ResultStreamNameOption, - } - }; - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/QuerySourcesDefinitionOptions.cs b/src/EventStore.Projections.Core/Messages/QuerySourcesDefinitionOptions.cs deleted file mode 100644 index 421d3fe6d..000000000 --- a/src/EventStore.Projections.Core/Messages/QuerySourcesDefinitionOptions.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Runtime.Serialization; - -namespace EventStore.Projections.Core.Messages { - [DataContract] - public class QuerySourcesDefinitionOptions { - [DataMember(Name = "producesResults")] public bool ProducesResults { get; set; } - - [DataMember(Name = "definesFold")] public bool DefinesFold { get; set; } - - [DataMember(Name = "handlesDeletedNotifications")] - public bool HandlesDeletedNotifications { get; set; } - - [DataMember(Name = "definesStateTransform")] - public bool DefinesStateTransform { get; set; } - - [DataMember(Name = "resultStreamName")] - public string ResultStreamName { get; set; } - - [DataMember(Name = "partitionResultStreamNamePattern")] - public string PartitionResultStreamNamePattern { get; set; } - - [DataMember(Name = "$includeLinks")] public bool IncludeLinks { get; set; } - - [DataMember(Name = "reorderEvents")] public bool ReorderEvents { get; set; } - - [DataMember(Name = "processingLag")] public int? ProcessingLag { get; set; } - - [DataMember(Name = "biState")] public bool IsBiState { get; set; } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ReaderCoreServiceMessage.cs b/src/EventStore.Projections.Core/Messages/ReaderCoreServiceMessage.cs deleted file mode 100644 index 0b486112a..000000000 --- a/src/EventStore.Projections.Core/Messages/ReaderCoreServiceMessage.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messages { - public static partial class ReaderCoreServiceMessage { - [DerivedMessage(ProjectionMessage.ReaderCoreService)] - public partial class StartReader : Message { - public Guid InstanceCorrelationId { get; } - - public StartReader(Guid instanceCorrelationId) { - InstanceCorrelationId = instanceCorrelationId; - } - } - - [DerivedMessage(ProjectionMessage.ReaderCoreService)] - public partial class StopReader : Message { - public Guid QueueId { get; } - - public StopReader(Guid queueId) { - QueueId = queueId; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ReaderSubscriptionManagement.cs b/src/EventStore.Projections.Core/Messages/ReaderSubscriptionManagement.cs deleted file mode 100644 index d8d2134f0..000000000 --- a/src/EventStore.Projections.Core/Messages/ReaderSubscriptionManagement.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Messages { - public static partial class ReaderSubscriptionManagement { - [DerivedMessage] - public abstract partial class ReaderSubscriptionManagementMessage : Message { - private readonly Guid _subscriptionId; - - protected ReaderSubscriptionManagementMessage(Guid subscriptionId) { - _subscriptionId = subscriptionId; - } - - public Guid SubscriptionId { - get { return _subscriptionId; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscriptionManagement)] - public partial class Subscribe : ReaderSubscriptionManagementMessage { - private readonly CheckpointTag _fromPosition; - private readonly IReaderStrategy _readerStrategy; - private readonly ReaderSubscriptionOptions _options; - - public Subscribe( - Guid subscriptionId, CheckpointTag from, - IReaderStrategy readerStrategy, ReaderSubscriptionOptions readerSubscriptionOptions) : base( - subscriptionId) { - if (@from == null) throw new ArgumentNullException("from"); - if (readerStrategy == null) throw new ArgumentNullException("readerStrategy"); - _fromPosition = @from; - _readerStrategy = readerStrategy; - _options = readerSubscriptionOptions; - } - - public CheckpointTag FromPosition { - get { return _fromPosition; } - } - - public IReaderStrategy ReaderStrategy { - get { return _readerStrategy; } - } - - public ReaderSubscriptionOptions Options { - get { return _options; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscriptionManagement)] - public partial class Pause : ReaderSubscriptionManagementMessage { - public Pause(Guid subscriptionId) - : base(subscriptionId) { - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscriptionManagement)] - public partial class Resume : ReaderSubscriptionManagementMessage { - public Resume(Guid subscriptionId) - : base(subscriptionId) { - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscriptionManagement)] - public partial class Unsubscribe : ReaderSubscriptionManagementMessage { - public Unsubscribe(Guid subscriptionId) - : base(subscriptionId) { - } - } - } -} diff --git a/src/EventStore.Projections.Core/Messages/ReaderSubscriptionMessage.cs b/src/EventStore.Projections.Core/Messages/ReaderSubscriptionMessage.cs deleted file mode 100644 index d447399c0..000000000 --- a/src/EventStore.Projections.Core/Messages/ReaderSubscriptionMessage.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Messages { - public static partial class ReaderSubscriptionMessage { - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class SubscriptionMessage : Message { - private readonly Guid _correlationId; - private readonly CheckpointTag _preTagged; - private readonly object _source; - - public SubscriptionMessage(Guid correlationId, CheckpointTag preTagged, object source) { - _correlationId = correlationId; - _preTagged = preTagged; - _source = source; - } - - public Guid CorrelationId { - get { return _correlationId; } - } - - public CheckpointTag PreTagged { - get { return _preTagged; } - } - - public object Source { - get { return _source; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class EventReaderIdle : SubscriptionMessage { - private readonly DateTime _idleTimestampUtc; - - public EventReaderIdle(Guid correlationId, DateTime idleTimestampUtc, object source = null) - : base(correlationId, null, source) { - _idleTimestampUtc = idleTimestampUtc; - } - - public DateTime IdleTimestampUtc { - get { return _idleTimestampUtc; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public sealed partial class EventReaderStarting : SubscriptionMessage { - private readonly long _lastCommitPosition; - - public EventReaderStarting(Guid correlationId, long lastCommitPosition, object source = null) - : base(correlationId, null, source) { - _lastCommitPosition = lastCommitPosition; - } - - public long LastCommitPosition { - get { return _lastCommitPosition; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class EventReaderEof : SubscriptionMessage { - private readonly bool _maxEventsReached; - - public EventReaderEof(Guid correlationId, bool maxEventsReached = false, object source = null) - : base(correlationId, null, source) { - _maxEventsReached = maxEventsReached; - } - - public bool MaxEventsReached { - get { return _maxEventsReached; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class EventReaderPartitionEof : SubscriptionMessage { - private readonly string _partition; - - public EventReaderPartitionEof( - Guid correlationId, string partition, CheckpointTag preTagged, object source = null) - : base(correlationId, preTagged, source) { - _partition = partition; - } - - public string Partition { - get { return _partition; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class EventReaderPartitionDeleted : SubscriptionMessage { - private readonly string _partition; - private readonly long? _lastEventNumber; - private readonly TFPos? _deleteLinkOrEventPosition; - private readonly TFPos? _deleteEventOrLinkTargetPosition; - private readonly string _positionStreamId; - private readonly long? _positionEventNumber; - - public EventReaderPartitionDeleted( - Guid correlationId, string partition, long? lastEventNumber, TFPos? deleteLinkOrEventPosition, - TFPos? deleteEventOrLinkTargetPosition, string positionStreamId, long? positionEventNumber, - CheckpointTag preTagged = null, object source = null) - : base(correlationId, preTagged, source) { - _partition = partition; - _lastEventNumber = lastEventNumber; - _deleteLinkOrEventPosition = deleteLinkOrEventPosition; - _deleteEventOrLinkTargetPosition = deleteEventOrLinkTargetPosition; - _positionStreamId = positionStreamId; - _positionEventNumber = positionEventNumber; - } - - public string Partition { - get { return _partition; } - } - - public long? LastEventNumber { - get { return _lastEventNumber; } - } - - public TFPos? DeleteEventOrLinkTargetPosition { - get { return _deleteEventOrLinkTargetPosition; } - } - - public string PositionStreamId { - get { return _positionStreamId; } - } - - public long? PositionEventNumber { - get { return _positionEventNumber; } - } - - public TFPos? DeleteLinkOrEventPosition { - get { return _deleteLinkOrEventPosition; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public sealed partial class EventReaderNotAuthorized : SubscriptionMessage { - public EventReaderNotAuthorized(Guid correlationId, object source = null) - : base(correlationId, null, source) { - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class CommittedEventDistributed : SubscriptionMessage { - public static CommittedEventDistributed Sample( - Guid correlationId, TFPos position, TFPos originalPosition, string positionStreamId, - long positionSequenceNumber, - string eventStreamId, long eventSequenceNumber, bool resolvedLinkTo, Guid eventId, string eventType, - bool isJson, byte[] data, byte[] metadata, long? safeTransactionFileReaderJoinPosition, - float progress) { - return new CommittedEventDistributed( - correlationId, - new ResolvedEvent( - positionStreamId, positionSequenceNumber, eventStreamId, eventSequenceNumber, resolvedLinkTo, - position, originalPosition, eventId, eventType, isJson, data, metadata, null, null, - default(DateTime)), - safeTransactionFileReaderJoinPosition, progress); - } - - public static CommittedEventDistributed Sample( - Guid correlationId, TFPos position, string eventStreamId, long eventSequenceNumber, - bool resolvedLinkTo, Guid eventId, string eventType, bool isJson, byte[] data, byte[] metadata, - DateTime? timestamp = null) { - return new CommittedEventDistributed( - correlationId, - new ResolvedEvent( - eventStreamId, eventSequenceNumber, eventStreamId, eventSequenceNumber, resolvedLinkTo, - position, - position, eventId, eventType, isJson, data, metadata, null, null, - timestamp.GetValueOrDefault()), - position.PreparePosition, 11.1f); - } - - private readonly ResolvedEvent _data; - private readonly long? _safeTransactionFileReaderJoinPosition; - private readonly float _progress; - - //NOTE: committed event with null event _data means - end of the source reached. - // Current last available TF commit position is in _position.CommitPosition - // TODO: separate message? - - public CommittedEventDistributed( - Guid correlationId, ResolvedEvent data, long? safeTransactionFileReaderJoinPosition, float progress, - object source = null, CheckpointTag preTagged = null) - : base(correlationId, preTagged, source) { - _data = data; - _safeTransactionFileReaderJoinPosition = safeTransactionFileReaderJoinPosition; - _progress = progress; - } - - public CommittedEventDistributed(Guid correlationId, ResolvedEvent data, CheckpointTag preTagged = null) - : this(correlationId, data, data.Position.PreparePosition, 11.1f, preTagged) { - } - - public ResolvedEvent Data { - get { return _data; } - } - - public long? SafeTransactionFileReaderJoinPosition { - get { return _safeTransactionFileReaderJoinPosition; } - } - - public float Progress { - get { return _progress; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class Faulted : SubscriptionMessage { - private readonly string _reason; - - public Faulted( - Guid correlationId, string reason, object source = null) - : base(correlationId, null, source) { - _reason = reason; - } - - public string Reason { - get { return _reason; } - } - } - - [DerivedMessage(ProjectionMessage.ReaderSubscription)] - public partial class ReportProgress : SubscriptionMessage { - public ReportProgress(Guid correlationId, object source = null) : base(correlationId, null, source) { } - } - } -} diff --git a/src/EventStore.Projections.Core/Messaging/PublishToWrapEnvelop.cs b/src/EventStore.Projections.Core/Messaging/PublishToWrapEnvelop.cs deleted file mode 100644 index 5bf6065df..000000000 --- a/src/EventStore.Projections.Core/Messaging/PublishToWrapEnvelop.cs +++ /dev/null @@ -1,18 +0,0 @@ -using EventStore.Core.Bus; -using EventStore.Core.Messaging; - -namespace EventStore.Projections.Core.Messaging { - class PublishToWrapEnvelop : IEnvelope { - private readonly IPublisher _publisher; - private readonly IEnvelope _nestedEnevelop; - - public PublishToWrapEnvelop(IPublisher publisher, IEnvelope nestedEnevelop) { - _publisher = publisher; - _nestedEnevelop = nestedEnevelop; - } - - public void ReplyWith(T message) where T : Message { - _publisher.Publish(new UnwrapEnvelopeMessage(() => _nestedEnevelop.ReplyWith(message))); - } - } -} diff --git a/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeHandler.cs b/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeHandler.cs deleted file mode 100644 index 30ec7eccf..000000000 --- a/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -using EventStore.Core.Bus; - -namespace EventStore.Projections.Core.Messaging { - public class UnwrapEnvelopeHandler : IHandle { - public void Handle(UnwrapEnvelopeMessage message) { - message.Action(); - } - } -} diff --git a/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeMessage.cs b/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeMessage.cs deleted file mode 100644 index aadcf66d7..000000000 --- a/src/EventStore.Projections.Core/Messaging/UnwrapEnvelopeMessage.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Messaging { - [DerivedMessage(ProjectionMessage.Misc)] - public partial class UnwrapEnvelopeMessage : Message { - private readonly Action _action; - - public UnwrapEnvelopeMessage(Action action) { - _action = action; - } - - public Action Action { - get { return _action; } - } - } -} diff --git a/src/EventStore.Projections.Core/Metrics/IProjectionTracker.cs b/src/EventStore.Projections.Core/Metrics/IProjectionTracker.cs deleted file mode 100644 index a528fc64b..000000000 --- a/src/EventStore.Projections.Core/Metrics/IProjectionTracker.cs +++ /dev/null @@ -1,15 +0,0 @@ -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Metrics; - -public interface IProjectionTracker { - void OnNewStats(ProjectionStatistics[] newStats); - - public static IProjectionTracker NoOp => NoOpTracker.Instance; -} - -file sealed class NoOpTracker : IProjectionTracker { - public static NoOpTracker Instance { get; } = new(); - - public void OnNewStats(ProjectionStatistics[] newStats) { } -} diff --git a/src/EventStore.Projections.Core/Metrics/ProjectionTracker.cs b/src/EventStore.Projections.Core/Metrics/ProjectionTracker.cs deleted file mode 100644 index 7e0817b7e..000000000 --- a/src/EventStore.Projections.Core/Metrics/ProjectionTracker.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Metrics; -using System.Linq; -using EventStore.Projections.Core.Services; - -namespace EventStore.Projections.Core.Metrics; - -public class ProjectionTracker : IProjectionTracker { - private ProjectionStatistics[] _currentStats = []; - - public void OnNewStats(ProjectionStatistics[] newStats) { - _currentStats = newStats ?? []; - } - - public IEnumerable> ObserveEventsProcessed() => - _currentStats.Select(x => - new Measurement( - x.EventsProcessedAfterRestart, - [ - new("projection", x.Name) - ])); - - public IEnumerable> ObserveProgress() => - _currentStats.Select(x => - new Measurement( - x.Progress / 100.0f, - [ - new("projection", x.Name) - ])); - - public IEnumerable> ObserveRunning() => - _currentStats.Select(x => { - var projectionRunning = x.Status.Equals("running", StringComparison.CurrentCultureIgnoreCase) - ? 1 - : 0; - - return new Measurement( - projectionRunning, [ - new("projection", x.Name) - ]); - }); - - public IEnumerable> ObserveStatus() { - foreach (var statistics in _currentStats) { - var projectionRunning = 0; - var projectionFaulted = 0; - var projectionStopped = 0; - - switch (statistics.Status.ToLower()) { - case "running": - projectionRunning = 1; - break; - case "stopped": - projectionStopped = 1; - break; - case "faulted": - projectionFaulted = 1; - break; - } - - yield return new(projectionRunning, [ - new("projection", statistics.Name), - new("status", "Running"), - ]); - - yield return new(projectionFaulted, [ - new("projection", statistics.Name), - new("status", "Faulted"), - ]); - - yield return new(projectionStopped, [ - new("projection", statistics.Name), - new("status", "Stopped"), - ]); - } - } -} diff --git a/src/EventStore.Projections.Core/Prelude/1Prelude.js b/src/EventStore.Projections.Core/Prelude/1Prelude.js deleted file mode 100644 index 4a22d2a57..000000000 --- a/src/EventStore.Projections.Core/Prelude/1Prelude.js +++ /dev/null @@ -1,251 +0,0 @@ -"use strict"; - -// these $ globals are defined by external environment -// they are redefined here to make R# like tools understand them -var _log = $log; -var _load_module = $load_module; - -function log(message) { - _log("PROJECTIONS (JS): " + message); -} - -function initializeModules() { - // load module load new instance of the given module every time - // this is a responsibility of prelude to manage instances of modules - var modules = _load_module('Modules'); - - // TODO: replace with createRequire($load_module) - modules.$load_module = _load_module; - - return modules; -} - -function initializeProjections() { - var projections = _load_module('Projections'); - return projections; -} - -var modules = initializeModules(); -var projections = initializeProjections(); -var eventProcessor; - -function scope($on, $notify) { - eventProcessor = projections.createEventProcessor(log, $notify); - eventProcessor.register_command_handlers($on); - - function queryLog(message) { - if (typeof message === "string") - _log(message); - else - _log(JSON.stringify(message)); - } - - function translateOn(handlers) { - - for (var name in handlers) { - if (name == 0 || name === "$init") { - eventProcessor.on_init_state(handlers[name]); - } else if (name === "$initShared") { - eventProcessor.on_init_shared_state(handlers[name]); - } else if (name === "$any") { - eventProcessor.on_any(handlers[name]); - } else if (name === "$deleted") { - eventProcessor.on_deleted_notification(handlers[name]); - } else if (name === "$created") { - eventProcessor.on_created_notification(handlers[name]); - } else { - eventProcessor.on_event(name, handlers[name]); - } - } - } - - - function $defines_state_transform() { - eventProcessor.$defines_state_transform(); - } - - function transformBy(by) { - eventProcessor.chainTransformBy(by); - return { - transformBy: transformBy, - filterBy: filterBy, - outputState: outputState, - outputTo: outputTo, - }; - } - - function filterBy(by) { - eventProcessor.chainTransformBy(function(s) { - var result = by(s); - return result ? s : null; - }); - return { - transformBy: transformBy, - filterBy: filterBy, - outputState: outputState, - outputTo: outputTo, - }; - } - - function outputTo(resultStream, partitionResultStreamPattern) { - eventProcessor.$defines_state_transform(); - eventProcessor.options({ - resultStreamName: resultStream, - partitionResultStreamNamePattern: partitionResultStreamPattern, - }); - } - - function outputState() { - eventProcessor.$outputState(); - return { - transformBy: transformBy, - filterBy: filterBy, - outputTo: outputTo, - }; - } - - function when(handlers) { - translateOn(handlers); - return { - $defines_state_transform: $defines_state_transform, - transformBy: transformBy, - filterBy: filterBy, - outputTo: outputTo, - outputState: outputState, - }; - } - - function foreachStream() { - eventProcessor.byStream(); - return { - when: when, - }; - } - - function partitionBy(byHandler) { - eventProcessor.partitionBy(byHandler); - return { - when: when, - }; - } - - function fromCategory(category) { - eventProcessor.fromCategory(category); - return { - partitionBy: partitionBy, - foreachStream: foreachStream, - when: when, - outputState: outputState, - }; - } - - function fromAll() { - eventProcessor.fromAll(); - return { - partitionBy: partitionBy, - when: when, - foreachStream: foreachStream, - outputState: outputState, - }; - } - - function fromStream(stream) { - eventProcessor.fromStream(stream); - return { - partitionBy: partitionBy, - when: when, - outputState: outputState, - }; - } - - function fromStreams(streams) { - var arr = Array.isArray(streams) ? streams : arguments; - for (var i = 0; i < arr.length; i++) - eventProcessor.fromStream(arr[i]); - - return { - partitionBy: partitionBy, - when: when, - outputState: outputState, - }; - } - - function fromCategories(categories) { - var arr = Array.isArray(categories) ? categories : Array.prototype.slice.call(arguments); - arr = arr.map(function(x) { - return '$ce-' + x; - }); - return fromStreams(arr); - } - - function emit(streamId, eventName, eventBody, metadata) { - var message = { - streamId: streamId, - eventName: eventName, - body: JSON.stringify(eventBody), - metadata: metadata, - isJson: true - }; - eventProcessor.emit(message); - } - - function linkTo(streamId, event, metadata) { - var message = { - streamId: streamId, - eventName: "$>", - body: event.sequenceNumber + "@" + event.streamId, - metadata: metadata, - isJson: false - }; - eventProcessor.emit(message); - } - - function copyTo(streamId, event, metadata) { - var m = {}; - - var em = event.metadata; - if (em) - for (var p1 in em) - if (p1.indexOf("$") !== 0 || p1 === "$correlationId") - m[p1] = em[p1]; - - if (metadata) - for (var p2 in metadata) - if (p2.indexOf("$") !== 0) - m[p2] = metadata[p2]; - - var message = { streamId: streamId, eventName: event.eventType, body: event.bodyRaw, metadata: m }; - eventProcessor.emit(message); - } - - function linkStreamTo(streamId, linkedStreamId, metadata) { - var message = { streamId: streamId, eventName: "$@", body: linkedStreamId, metadata: metadata, isJson: false }; - eventProcessor.emit(message); - } - - function options(options_object) { - eventProcessor.options(options_object); - } - - return { - log: queryLog, - - on_any: eventProcessor.on_any, - on_raw: eventProcessor.on_raw, - - fromAll: fromAll, - fromCategory: fromCategory, - fromStream: fromStream, - fromStreams: fromStreams, - fromCategories: fromCategories, - - options: options, - emit: emit, - linkTo: linkTo, - copyTo: copyTo, - linkStreamTo: linkStreamTo, - require: modules.require, - }; -}; - -scope; diff --git a/src/EventStore.Projections.Core/Prelude/Modules.js b/src/EventStore.Projections.Core/Prelude/Modules.js deleted file mode 100644 index b8afa93a1..000000000 --- a/src/EventStore.Projections.Core/Prelude/Modules.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -var $modules = (function() { - var loadedModules = {}; - var modules = { - require: function(moduleName) { - var module = loadedModules[moduleName]; - - if (module === undefined) { - module = modules.$load_module(moduleName); - loadedModules[moduleName] = module; - } - - return module; - } - }; - return modules; -})(); - -$modules; diff --git a/src/EventStore.Projections.Core/Prelude/ModulesExecuted.js b/src/EventStore.Projections.Core/Prelude/ModulesExecuted.js deleted file mode 100644 index 552f0af15..000000000 --- a/src/EventStore.Projections.Core/Prelude/ModulesExecuted.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - - -var modules = (function() { - var loadedModules = {}; - var modules = { - require: function(moduleName) { - var module = loadedModules[moduleName]; - - if (module === undefined) { - module = modules.$load_module(moduleName); - loadedModules[moduleName] = module; - } - - return module; - } - }; - return modules; -})(); - -modules; diff --git a/src/EventStore.Projections.Core/Prelude/Projections.js b/src/EventStore.Projections.Core/Prelude/Projections.js deleted file mode 100644 index 138605179..000000000 --- a/src/EventStore.Projections.Core/Prelude/Projections.js +++ /dev/null @@ -1,552 +0,0 @@ -"use strict"; - -var $projections = { - createEventProcessor: function(_log, _notify) { - var debugging = false; - var runDefaultHandler = true; - var eventHandlers = {}; - var anyEventHandlers = []; - var deletedNotificationHandlers = []; - var createdNotificationHandlers = []; - var rawEventHandlers = []; - var transformers = []; - var getStatePartitionHandler = function() { - throw "GetStatePartition is not defined"; - }; - - var sources = { - /* TODO: comment out default falses to reduce message size */ - allStreams: false, - allEvents: true, - byStreams: false, - byCustomPartitions: false, - categories: [], - streams: [], - events: [], - - options: { - definesStateTransform: false, - handlesDeletedNotifications: false, - producesResults: false, - definesFold: false, - resultStreamName: null, - partitionResultStreamNamePattern: null, - $includeLinks: false, - reorderEvents: false, - processingLag: 0, - biState: false - }, - version: 4 - }; - - var initStateHandler = function() { - return {}; - }; - - var initSharedStateHandler = function() { - return {}; - }; - - var projectionState = null; - var projectionSharedState = null; - - var commandHandlers = { - set_debugging: function() { - debugging = true; - }, - - initialize: function() { - var initialState = initStateHandler(); - projectionState = initialState; - return "OK"; - }, - - initialize_shared: function() { - var initialState = initSharedStateHandler(); - projectionSharedState = initialState; - return "OK"; - }, - - get_state_partition: function(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata) { - return getStatePartition(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata); - }, - - process_event: function(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata, - partition, - eventId) { - processEvent(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata, - partition, - eventId); - var stateJson; - var finalResult; - if (!sources.options.biState) { - stateJson = JSON.stringify(projectionState); - return stateJson; - } else { - stateJson = JSON.stringify(projectionState); - var sharedStateJson = JSON.stringify(projectionSharedState); - finalResult = [stateJson, sharedStateJson]; - return finalResult; - } - }, - - process_deleted_notification: function(partition, isSoftDeleted) { - processDeletedNotification(partition, isSoftDeleted); - var stateJson; - if (!sources.options.biState) { - stateJson = JSON.stringify(projectionState); - return stateJson; - } else { - throw "Bi-State projections do not support delete notifications"; - } - }, - - process_created_notification: function(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata, - partition) { - processCreatedNotification(event, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadata, - linkMetadata, - partition); - var stateJson; - stateJson = JSON.stringify(projectionState); - return stateJson; - }, - - transform_state_to_result: function() { - var result = projectionState; - for (var i = 0; i < transformers.length; i++) { - var by = transformers[i]; - result = by(result); - if (result === null) - break; - } - return result !== null ? JSON.stringify(result) : null; - }, - - set_state: function(jsonState) { - var parsedState = JSON.parse(jsonState); - projectionState = parsedState; - return "OK"; - }, - - set_shared_state: function(jsonState) { - var parsedState = JSON.parse(jsonState); - projectionSharedState = parsedState; - return "OK"; - }, - - debugging_get_state: function() { - return JSON.stringify(projectionState); - }, - - get_sources: function() { - return JSON.stringify(sources); - } - }; - - function registerCommandHandlers($on) { - // this is the only way to pass parameters to the system module - - for (var name in commandHandlers) { - $on(name, commandHandlers[name]); - } - } - - function on_event(eventName, eventHandler) { - runDefaultHandler = false; - eventHandlers[eventName] = eventHandler; - sources.allEvents = false; - sources.events.push(eventName); - sources.options.definesFold = true; - } - - function on_init_state(initHandler) { - initStateHandler = initHandler; - sources.options.definesFold = true; - } - - function on_init_shared_state(initHandler) { - initSharedStateHandler = initHandler; - sources.options.definesFold = true; - } - - function on_any(eventHandler) { - runDefaultHandler = false; - sources.allEvents = true; - anyEventHandlers.push(eventHandler); - sources.options.definesFold = true; - } - - function on_deleted_notification(eventHandler) { - deletedNotificationHandlers.push(eventHandler); - sources.options.handlesDeletedNotifications = true; - sources.options.definesFold = true; - } - - function on_created_notification(eventHandler) { - createdNotificationHandlers.push(eventHandler); - sources.options.handlesCreatedNotifications = true; - sources.options.definesFold = true; - } - - function on_raw(eventHandler) { - runDefaultHandler = false; - sources.allEvents = true; - rawEventHandlers.push(eventHandler); - sources.options.definesFold = true; - } - - function callHandler(handler, state, eventEnvelope) { - if (debugging) - debugger; - var newState = handler(state, eventEnvelope); - if (newState === undefined) - newState = state; - return newState; - }; - - function tryDeserializeBody(eventEnvelope) { - var eventRaw = eventEnvelope.bodyRaw; - try { - if (eventRaw == '') { - eventEnvelope.body = {}; - } else if (typeof eventRaw === "object") { //TODO: why do we need this? - eventEnvelope.body = eventRaw; - eventEnvelope.isJson = true; - } else { - eventEnvelope.body = JSON.parse(eventRaw); - eventEnvelope.isJson = true; - } - eventEnvelope.data = eventEnvelope.body; - - } catch (ex) { - _log("JSON Parsing error: " + ex); - eventEnvelope.jsonError = ex; - eventEnvelope.body = undefined; - eventEnvelope.data = undefined; - } - } - - function envelope(body, - bodyRaw, - eventType, - streamId, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - partition, - eventId) { - this.isJson = false; - this.data = body; - this.body = body; - this.bodyRaw = bodyRaw;; - this.eventType = eventType; - this.streamId = streamId; - this.sequenceNumber = sequenceNumber; - this.metadataRaw = metadataRaw; - this.linkMetadataRaw = linkMetadataRaw; - this.partition = partition; - this.metadata_ = null; - this.eventId = eventId; - } - - Object.defineProperty(envelope.prototype, - "metadata", - { - get: function() { - if (!this.metadata_ && this.metadataRaw) { - this.metadata_ = JSON.parse(this.metadataRaw); - } - return this.metadata_; - } - }); - - Object.defineProperty(envelope.prototype, - "linkMetadata", - { - get: function() { - if (!this.linkMetadata_) { - if (this.linkMetadataRaw) { - this.linkMetadata_ = JSON.parse(this.linkMetadataRaw); - } else { - this.linkMetadata_ = {}; - } - } - return this.linkMetadata_; - } - }); - - function getStatePartition(eventRaw, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadataRaw, - linkMetadataRaw) { - - var eventHandler = getStatePartitionHandler; - - var eventEnvelope = new envelope(null, - eventRaw, - eventType, - streamId, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - null, - null); - - if (isJson) - tryDeserializeBody(eventEnvelope); - - var partition = eventHandler(eventEnvelope); - - var result; - //TODO: warn/disable empty string - if (partition === undefined || partition === null || partition === "") - result = ""; - else - result = partition.toString(); - return result; - - } - - function defaultEventHandler(state, eventEnvelope) { - return eventEnvelope.isJson ? eventEnvelope.body : { $e: eventEnvelope.bodyRaw }; - } - - function processEvent(eventRaw, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - partition, - eventId) { - - var eventName = eventType; - - var eventHandler; - var state = !sources.options.biState ? projectionState : [projectionState, projectionSharedState]; - - var index; - - var eventEnvelope = new envelope(null, - eventRaw, - eventType, - streamId, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - partition, - eventId); - // debug only - for (index = 0; index < rawEventHandlers.length; index++) { - eventHandler = rawEventHandlers[index]; - state = callHandler(eventHandler, state, eventEnvelope); - } - - eventHandler = eventHandlers[eventName]; - if (isJson && (runDefaultHandler || eventHandler !== undefined || anyEventHandlers.length > 0)) { - tryDeserializeBody(eventEnvelope); - } - - if (runDefaultHandler) { - state = callHandler(defaultEventHandler, state, eventEnvelope); - } - - for (index = 0; index < anyEventHandlers.length; index++) { - eventHandler = anyEventHandlers[index]; - state = callHandler(eventHandler, state, eventEnvelope); - } - - eventHandler = eventHandlers[eventName]; - if (eventHandler !== undefined) { - state = callHandler(eventHandler, state, eventEnvelope); - } - if (!sources.options.biState) { - projectionState = state; - } else { - projectionState = state[0]; - projectionSharedState = state[1]; - } - } - - function processDeletedNotification(partition, isSoftDeleted) { - - var eventEnvelope = { partition: partition, isSoftDeleted: isSoftDeleted }; - var state = !sources.options.biState ? projectionState : [projectionState, projectionSharedState]; - var index; - var eventHandler; - - for (index = 0; index < deletedNotificationHandlers.length; index++) { - eventHandler = deletedNotificationHandlers[index]; - state = callHandler(eventHandler, state, eventEnvelope); - } - - if (!sources.options.biState) { - projectionState = state; - } else { - throw "Bi-State projections do not support delete notifications"; - } - } - - function processCreatedNotification(eventRaw, - isJson, - streamId, - eventType, - category, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - partition) { - - var eventHandler; - var state = !sources.options.biState ? projectionState : [projectionState, projectionSharedState]; - - var index; - - var eventEnvelope = new envelope(null, - eventRaw, - eventType, - streamId, - sequenceNumber, - metadataRaw, - linkMetadataRaw, - partition); - - if (isJson) { - tryDeserializeBody(eventEnvelope); - } - - for (index = 0; index < createdNotificationHandlers.length; index++) { - eventHandler = createdNotificationHandlers[index]; - state = callHandler(eventHandler, state, eventEnvelope); - } - - if (!sources.options.biState) { - projectionState = state; - } else { - projectionState = state[0]; - projectionSharedState = state[1]; - } - } - - function fromStream(sourceStream) { - sources.streams.push(sourceStream); - } - - function fromCategory(sourceCategory) { - sources.categories.push(sourceCategory); - } - - function byStream() { - sources.byStreams = true; - } - - function partitionBy(eventHandler) { - getStatePartitionHandler = eventHandler; - sources.byCustomPartitions = true; - } - - function $defines_state_transform() { - sources.options.definesStateTransform = true; - sources.options.producesResults = true; - } - - function $outputState() { - sources.options.producesResults = true; - } - - function chainTransformBy(by) { - transformers.push(by); - sources.options.definesStateTransform = true; - sources.options.producesResults = true; - } - - function fromAll() { - sources.allStreams = true; - } - - function emit(ev) { - _notify("emit", JSON.stringify(ev)); - } - - function options(opts) { - for (var name in opts) { - if (sources.options[name] === undefined) - throw "Unrecognized option: " + name; - sources.options[name] = opts[name]; - } - } - - return { - on_event: on_event, - on_init_state: on_init_state, - on_init_shared_state: on_init_shared_state, - on_any: on_any, - on_raw: on_raw, - on_deleted_notification: on_deleted_notification, - on_created_notification: on_created_notification, - - fromAll: fromAll, - fromCategory: fromCategory, - fromStream: fromStream, - - byStream: byStream, - partitionBy: partitionBy, - $defines_state_transform: $defines_state_transform, - $outputState: $outputState, - chainTransformBy: chainTransformBy, - - emit: emit, - options: options, - - register_command_handlers: registerCommandHandlers, - }; - } -}; -$projections; diff --git a/src/EventStore.Projections.Core/ProjectionCoreWorkersNode.cs b/src/EventStore.Projections.Core/ProjectionCoreWorkersNode.cs deleted file mode 100644 index 95d59d738..000000000 --- a/src/EventStore.Projections.Core/ProjectionCoreWorkersNode.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Options; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core { - public static class ProjectionCoreWorkersNode { - public static Dictionary CreateCoreWorkers( - StandardComponents standardComponents, - ProjectionsStandardComponents projectionsStandardComponents) { - var coreWorkers = new Dictionary(); - while (coreWorkers.Count < projectionsStandardComponents.ProjectionWorkerThreadCount) { - var coreInputBus = new InMemoryBus("bus"); - var coreInputQueue = new QueuedHandlerThreadPool(coreInputBus, - "Projection Core #" + coreWorkers.Count, - standardComponents.QueueStatsManager, - standardComponents.QueueTrackers, - groupName: "Projection Core"); - var coreOutputBus = new InMemoryBus("output bus"); - var coreOutputQueue = new QueuedHandlerThreadPool(coreOutputBus, - "Projection Core #" + coreWorkers.Count + " output", - standardComponents.QueueStatsManager, - standardComponents.QueueTrackers, - groupName: "Projection Core"); - var workerId = Guid.NewGuid(); - var projectionNode = new ProjectionWorkerNode( - workerId, - standardComponents.DbConfig, - inputQueue: coreInputQueue, - outputQueue: coreOutputQueue, - coreOutputBus, - standardComponents.TimeProvider, - projectionsStandardComponents.RunProjections, - projectionsStandardComponents.FaultOutOfOrderProjections, - projectionsStandardComponents.LeaderOutputQueue, - projectionsStandardComponents); - projectionNode.SetupMessaging(coreInputBus); - - var forwarder = new RequestResponseQueueForwarder( - inputQueue: coreInputQueue, - externalRequestQueue: standardComponents.MainQueue); - // forwarded messages - var coreOutput = projectionNode.CoreOutputBus; - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - coreOutput.Subscribe(forwarder); - - if (projectionsStandardComponents.RunProjections >= ProjectionType.System) { - coreOutput.Subscribe( - Forwarder.Create(standardComponents.MainQueue)); - coreOutput.Subscribe( - Forwarder.Create(standardComponents.MainQueue)); - coreOutput.Subscribe( - Forwarder.Create(projectionsStandardComponents - .LeaderOutputQueue)); - } - - coreOutput.Subscribe(standardComponents.TimerService); - - coreOutput.Subscribe(Forwarder.Create(coreInputQueue)); // forward all - - coreInputBus.Subscribe(new UnwrapEnvelopeHandler()); - - coreWorkers.Add(workerId, new CoreWorker(workerId, coreInputQueue, coreOutputQueue)); - } - - var queues = coreWorkers.Select(v => v.Value.CoreInputQueue).ToArray(); - var coordinator = new ProjectionCoreCoordinator( - projectionsStandardComponents.RunProjections, - queues, - projectionsStandardComponents.LeaderOutputQueue); - - coordinator.SetupMessaging(projectionsStandardComponents.LeaderInputBus); - projectionsStandardComponents.LeaderInputBus.Subscribe( - Forwarder.CreateBalancing(coreWorkers - .Select(x => x.Value.CoreInputQueue) - .ToArray())); - return coreWorkers; - } - } - - public class CoreWorker { - public Guid WorkerId { get; } - public IQueuedHandler CoreInputQueue { get; } - public IQueuedHandler CoreOutputQueue { get; } - - public CoreWorker(Guid workerId, IQueuedHandler inputQueue, IQueuedHandler outputQueue) { - WorkerId = workerId; - CoreInputQueue = inputQueue; - CoreOutputQueue = outputQueue; - } - - public void Start() { - CoreInputQueue.Start(); - CoreOutputQueue.Start(); - } - - public void Stop() { - CoreInputQueue.Stop(); - CoreOutputQueue.Stop(); - } - } -} diff --git a/src/EventStore.Projections.Core/ProjectionManagerNode.cs b/src/EventStore.Projections.Core/ProjectionManagerNode.cs deleted file mode 100644 index 7e6ff7f5e..000000000 --- a/src/EventStore.Projections.Core/ProjectionManagerNode.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Common.Options; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Telemetry; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Http; -using EventStore.Projections.Core.Services.Management; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core { - public class ProjectionManagerNode { - public static void CreateManagerService( - StandardComponents standardComponents, - ProjectionsStandardComponents projectionsStandardComponents, - IDictionary queues, - TimeSpan projectionQueryExpiry, - IProjectionTracker projectionTracker) { - IPublisher inputQueue = projectionsStandardComponents.LeaderInputQueue; - IPublisher outputQueue = projectionsStandardComponents.LeaderOutputQueue; - var ioDispatcher = new IODispatcher(outputQueue, inputQueue, true); - - var projectionsController = new ProjectionsController( - standardComponents.HttpForwarder, - inputQueue, - standardComponents.NetworkSendService); - - var forwarder = new RequestResponseQueueForwarder( - inputQueue: projectionsStandardComponents.LeaderInputQueue, - externalRequestQueue: standardComponents.MainQueue); - - if (projectionsStandardComponents.RunProjections != ProjectionType.None) { - foreach (var httpService in standardComponents.HttpServices) { - httpService.SetupController(projectionsController); - } - } - - var projectionManagerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues); - - var projectionManager = new ProjectionManager( - inputQueue, - outputQueue, - queues, - new RealTimeProvider(), - projectionsStandardComponents.RunProjections, - ioDispatcher, - projectionQueryExpiry, - projectionTracker); - - SubscribeMainBus( - projectionsStandardComponents.LeaderInputBus, - projectionManager, - projectionsStandardComponents.RunProjections, - ioDispatcher, - projectionManagerMessageDispatcher); - - - SubscribeOutputBus(standardComponents, projectionsStandardComponents, forwarder, ioDispatcher); - } - - private static void SubscribeMainBus( - ISubscriber mainBus, - ProjectionManager projectionManager, - ProjectionType runProjections, - IODispatcher ioDispatcher, - ProjectionManagerMessageDispatcher projectionManagerMessageDispatcher) { - if (runProjections >= ProjectionType.System) { - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - } - - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - mainBus.Subscribe(projectionManager); - - mainBus.Subscribe(ioDispatcher.Awaker); - mainBus.Subscribe(ioDispatcher.BackwardReader); - mainBus.Subscribe(ioDispatcher.BackwardReader); - mainBus.Subscribe(ioDispatcher.ForwardReader); - mainBus.Subscribe(ioDispatcher.StreamDeleter); - mainBus.Subscribe(ioDispatcher.Writer); - mainBus.Subscribe(ioDispatcher.EventReader); - mainBus.Subscribe(ioDispatcher); - mainBus.Subscribe(ioDispatcher); - - mainBus.Subscribe(projectionManagerMessageDispatcher); - } - - private static void SubscribeOutputBus( - StandardComponents standardComponents, - ProjectionsStandardComponents projectionsStandardComponents, - RequestResponseQueueForwarder forwarder, - IODispatcher ioDispatcher) { - var managerOutput = projectionsStandardComponents.LeaderOutputBus; - managerOutput.Subscribe(forwarder); - managerOutput.Subscribe(forwarder); - managerOutput.Subscribe(forwarder); - managerOutput.Subscribe(forwarder); - managerOutput.Subscribe(forwarder); - managerOutput.Subscribe(Forwarder.Create(projectionsStandardComponents.LeaderInputQueue)); - managerOutput.Subscribe(ioDispatcher); - - managerOutput.Subscribe(standardComponents.TimerService); - managerOutput.Subscribe(Forwarder.Create(standardComponents.MainQueue)); - managerOutput.Subscribe( - Forwarder.Create(standardComponents.MainQueue)); - managerOutput.Subscribe(forwarder); - - // self forward all - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents.LeaderInputQueue)); - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents.LeaderInputQueue)); - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents.LeaderInputQueue)); - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents - .LeaderInputQueue)); - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents - .LeaderInputQueue)); - standardComponents.MainBus.Subscribe( - Forwarder.Create(projectionsStandardComponents.LeaderInputQueue)); - projectionsStandardComponents.LeaderInputBus.Subscribe(new UnwrapEnvelopeHandler()); - } - } -} diff --git a/src/EventStore.Projections.Core/ProjectionWorkerNode.cs b/src/EventStore.Projections.Core/ProjectionWorkerNode.cs deleted file mode 100644 index efc8c328a..000000000 --- a/src/EventStore.Projections.Core/ProjectionWorkerNode.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Common.Utils; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.TransactionLog.Chunks; -using EventStore.Projections.Core.EventReaders.Feeds; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; - -namespace EventStore.Projections.Core { - public class ProjectionWorkerNode { - private readonly ProjectionType _runProjections; - private readonly ProjectionCoreService _projectionCoreService; - private readonly ISubscriber _coreOutputBus; - private readonly EventReaderCoreService _eventReaderCoreService; - - private readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private readonly FeedReaderService _feedReaderService; - private readonly IODispatcher _ioDispatcher; - private readonly IPublisher _leaderOutputQueue; - - public ProjectionWorkerNode( - Guid workerId, - TFChunkDbConfig dbConfig, - IPublisher inputQueue, - IPublisher outputQueue, - ISubscriber outputBus, - ITimeProvider timeProvider, - ProjectionType runProjections, - bool faultOutOfOrderProjections, - IPublisher leaderOutputQueue, - ProjectionsStandardComponents configuration) { - _runProjections = runProjections; - Ensure.NotNull(dbConfig, "dbConfig"); - - _leaderOutputQueue = leaderOutputQueue; - _coreOutputBus = outputBus; - - _subscriptionDispatcher = new ReaderSubscriptionDispatcher(outputQueue); - - _ioDispatcher = new IODispatcher(outputQueue, inputQueue, true); - _eventReaderCoreService = new EventReaderCoreService( - outputQueue, - _ioDispatcher, - 10, - dbConfig.WriterCheckpoint, - runHeadingReader: runProjections >= ProjectionType.System, - faultOutOfOrderProjections: faultOutOfOrderProjections); - - _feedReaderService = new FeedReaderService(_subscriptionDispatcher, timeProvider); - if (runProjections >= ProjectionType.System) { - _projectionCoreService = new ProjectionCoreService( - workerId, - inputQueue, - outputQueue, - _subscriptionDispatcher, - timeProvider, - _ioDispatcher, - configuration); - } - } - - public ISubscriber CoreOutputBus { - get { return _coreOutputBus; } - } - - public void SetupMessaging(ISubscriber coreInputBus) { - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe( - _subscriptionDispatcher.CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher - .CreateSubscriber()); - coreInputBus.Subscribe(_subscriptionDispatcher.CreateSubscriber()); - - coreInputBus.Subscribe(_feedReaderService); - - if (_runProjections >= ProjectionType.System) { - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_ioDispatcher.ForwardReader); - coreInputBus.Subscribe(_ioDispatcher.BackwardReader); - coreInputBus.Subscribe(_ioDispatcher.BackwardReader); - coreInputBus.Subscribe(_ioDispatcher.EventReader); - coreInputBus.Subscribe(_ioDispatcher.Writer); - coreInputBus.Subscribe(_ioDispatcher.StreamDeleter); - coreInputBus.Subscribe(_ioDispatcher.Awaker); - coreInputBus.Subscribe(_ioDispatcher); - coreInputBus.Subscribe(_ioDispatcher); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - coreInputBus.Subscribe(_projectionCoreService); - //NOTE: message forwarding is set up outside (for Read/Write events) - - // Forward messages back to projection manager - coreInputBus.Subscribe( - Forwarder.Create(_leaderOutputQueue)); - coreInputBus.Subscribe( - Forwarder.Create(_leaderOutputQueue)); - coreInputBus.Subscribe( - Forwarder.Create(_leaderOutputQueue)); - } - - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - coreInputBus.Subscribe(_eventReaderCoreService); - //NOTE: message forwarding is set up outside (for Read/Write events) - } - } -} diff --git a/src/EventStore.Projections.Core/ProjectionsStandardComponents.cs b/src/EventStore.Projections.Core/ProjectionsStandardComponents.cs deleted file mode 100644 index 5a80bf846..000000000 --- a/src/EventStore.Projections.Core/ProjectionsStandardComponents.cs +++ /dev/null @@ -1,41 +0,0 @@ -using EventStore.Common.Options; -using EventStore.Core.Bus; - -namespace EventStore.Projections.Core { - public class ProjectionsStandardComponents { - public ProjectionsStandardComponents( - int projectionWorkerThreadCount, - ProjectionType runProjections, - ISubscriber leaderOutputBus, - IPublisher leaderOutputQueue, - ISubscriber leaderInputBus, - IPublisher leaderInputQueue, - bool faultOutOfOrderProjections, int projectionCompilationTimeout, int projectionExecutionTimeout) { - ProjectionWorkerThreadCount = projectionWorkerThreadCount; - RunProjections = runProjections; - LeaderOutputBus = leaderOutputBus; - LeaderOutputQueue = leaderOutputQueue; - LeaderInputQueue = leaderInputQueue; - LeaderInputBus = leaderInputBus; - FaultOutOfOrderProjections = faultOutOfOrderProjections; - ProjectionCompilationTimeout = projectionCompilationTimeout; - ProjectionExecutionTimeout = projectionExecutionTimeout; - } - - public int ProjectionWorkerThreadCount { get; } - - public ProjectionType RunProjections { get; } - - public ISubscriber LeaderOutputBus { get; } - public IPublisher LeaderOutputQueue { get; } - - public IPublisher LeaderInputQueue { get; } - public ISubscriber LeaderInputBus { get; } - - public bool FaultOutOfOrderProjections { get; } - - public int ProjectionCompilationTimeout { get; } - - public int ProjectionExecutionTimeout { get; } - } -} diff --git a/src/EventStore.Projections.Core/ProjectionsSubsystem.cs b/src/EventStore.Projections.Core/ProjectionsSubsystem.cs deleted file mode 100644 index 6ba24027d..000000000 --- a/src/EventStore.Projections.Core/ProjectionsSubsystem.cs +++ /dev/null @@ -1,429 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Metrics; -using System.Linq; -using System.Threading.Tasks; -using DotNext; -using EventStore.Common.Options; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Plugins.Authorization; -using EventStore.Plugins.Subsystems; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Metrics; -using EventStore.Projections.Core.Services.Grpc; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core { - public record ProjectionSubsystemOptions( - int ProjectionWorkerThreadCount, - ProjectionType RunProjections, - bool StartStandardProjections, - TimeSpan ProjectionQueryExpiry, - bool FaultOutOfOrderProjections, - int CompilationTimeout, - int ExecutionTimeout); - - public sealed class ProjectionsSubsystem : ISubsystem, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - - static readonly ILogger Logger = Serilog.Log.ForContext(); - - public const int VERSION = 4; - public const int CONTENT_TYPE_VALIDATION_VERSION = 4; - - private readonly int _projectionWorkerThreadCount; - private readonly ProjectionType _runProjections; - private readonly bool _startStandardProjections; - private readonly TimeSpan _projectionsQueryExpiry; - - private readonly InMemoryBus _leaderInputBus; - private readonly InMemoryBus _leaderOutputBus; - - private IQueuedHandler _leaderInputQueue; - private IQueuedHandler _leaderOutputQueue; - - private IDictionary _coreWorkers; - private Dictionary _queueMap; - private bool _subsystemStarted; - private readonly TaskCompletionSource _subsystemInitialized; - - private readonly bool _faultOutOfOrderProjections; - - private readonly int _compilationTimeout; - private readonly int _executionTimeout; - - private readonly int _componentCount; - private readonly int _dispatcherCount; - private bool _restarting; - private int _pendingComponentStarts; - private int _runningComponentCount; - private int _runningDispatchers; - - private VNodeState _nodeState; - private SubsystemState _subsystemState = SubsystemState.NotReady; - private Guid _instanceCorrelationId; - private IProjectionTracker _projectionTracker = IProjectionTracker.NoOp; - - private readonly List _standardProjections = new List { - "$by_category", - "$stream_by_category", - "$streams", - "$by_event_type", - "$by_correlation_id" - }; - - public ProjectionsSubsystem(ProjectionSubsystemOptions projectionSubsystemOptions) { - if (projectionSubsystemOptions.RunProjections <= ProjectionType.System) - _projectionWorkerThreadCount = 1; - else - _projectionWorkerThreadCount = projectionSubsystemOptions.ProjectionWorkerThreadCount; - - _runProjections = projectionSubsystemOptions.RunProjections; - // Projection manager & Projection Core Coordinator - // The manager only starts when projections are running - _componentCount = _runProjections == ProjectionType.None ? 1 : 2; - - // Projection manager & each projection core worker - _dispatcherCount = 1 + _projectionWorkerThreadCount; - - _startStandardProjections = projectionSubsystemOptions.StartStandardProjections; - _projectionsQueryExpiry = projectionSubsystemOptions.ProjectionQueryExpiry; - _faultOutOfOrderProjections = projectionSubsystemOptions.FaultOutOfOrderProjections; - - _leaderInputBus = new InMemoryBus("manager input bus"); - _leaderOutputBus = new InMemoryBus("ProjectionManagerAndCoreCoordinatorOutput"); - - _subsystemInitialized = new(); - _executionTimeout = projectionSubsystemOptions.ExecutionTimeout; - _compilationTimeout = projectionSubsystemOptions.CompilationTimeout; - } - - public IPublisher LeaderOutputQueue => _leaderOutputQueue; - public IPublisher LeaderInputQueue => _leaderInputQueue; - public ISubscriber LeaderOutputBus => _leaderOutputBus; - public ISubscriber LeaderInputBus => _leaderInputBus; - - public string Name => "Projections"; - public string DiagnosticsName => Name; - public KeyValuePair[] DiagnosticsTags => []; - public string Version => VERSION.ToString(); - public bool Enabled => true; - public string LicensePublicKey => string.Empty; - - public void ConfigureApplication(IApplicationBuilder builder, IConfiguration configuration) { - var standardComponents = builder.ApplicationServices.GetRequiredService(); - - _leaderInputQueue = new QueuedHandlerThreadPool( - _leaderInputBus, - "Projections Leader", - standardComponents.QueueStatsManager, - standardComponents.QueueTrackers - ); - _leaderOutputQueue = new QueuedHandlerThreadPool( - _leaderOutputBus, - "Projections Leader", - standardComponents.QueueStatsManager, - standardComponents.QueueTrackers - ); - - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - - var projectionsStandardComponents = new ProjectionsStandardComponents( - _projectionWorkerThreadCount, - _runProjections, - leaderOutputBus: _leaderOutputBus, - leaderOutputQueue: _leaderOutputQueue, - leaderInputBus: _leaderInputBus, - leaderInputQueue: _leaderInputQueue, - _faultOutOfOrderProjections, - _compilationTimeout, - _executionTimeout); - - CreateAwakerService(standardComponents); - _coreWorkers = ProjectionCoreWorkersNode.CreateCoreWorkers(standardComponents, projectionsStandardComponents); - _queueMap = _coreWorkers.ToDictionary(v => v.Key, v => v.Value.CoreInputQueue.As()); - - ConfigureProjectionMetrics(standardComponents.ProjectionStats); - - ProjectionManagerNode.CreateManagerService(standardComponents, projectionsStandardComponents, _queueMap, - _projectionsQueryExpiry, _projectionTracker); - LeaderInputBus.Subscribe(this); - LeaderInputBus.Subscribe(this); - - builder.UseEndpoints(endpoints => endpoints.MapGrpcService()); - } - - private void ConfigureProjectionMetrics(bool isEnabled) { - if (!isEnabled) - return; - - var projectionMeter = new Meter("EventStore.Projections.Core", version: "1.0.0"); - - var tracker = new ProjectionTracker(); - _projectionTracker = tracker; - - projectionMeter.CreateObservableCounter("eventstore-projection-events-processed-after-restart-total", tracker.ObserveEventsProcessed); - projectionMeter.CreateObservableUpDownCounter("eventstore-projection-progress", tracker.ObserveProgress); - projectionMeter.CreateObservableUpDownCounter("eventstore-projection-running", tracker.ObserveRunning); - projectionMeter.CreateObservableUpDownCounter("eventstore-projection-status", tracker.ObserveStatus); - } - - public void ConfigureServices(IServiceCollection services, IConfiguration configuration) => - services.AddSingleton(provider => new ProjectionManagement(_leaderInputQueue, provider.GetRequiredService())); - - private static void CreateAwakerService(StandardComponents standardComponents) { - var awakeReaderService = new AwakeService(); - standardComponents.MainBus.Subscribe(awakeReaderService); - standardComponents.MainBus.Subscribe(awakeReaderService); - standardComponents.MainBus.Subscribe(awakeReaderService); - standardComponents.MainBus.Subscribe(awakeReaderService); - } - - public void Handle(SystemMessage.SystemCoreReady message) { - if (_subsystemState != SubsystemState.NotReady) return; - _subsystemState = SubsystemState.Ready; - if (_nodeState == VNodeState.Leader) { - StartComponents(); - return; - } - if (_nodeState == VNodeState.Follower || _nodeState == VNodeState.ReadOnlyReplica) { - PublishInitialized(); - } - } - - public void Handle(SystemMessage.StateChangeMessage message) { - _nodeState = message.State; - if (_subsystemState == SubsystemState.NotReady) return; - - if (_nodeState == VNodeState.Leader) { - StartComponents(); - return; - } - - if (_nodeState == VNodeState.Follower || _nodeState == VNodeState.ReadOnlyReplica) { - PublishInitialized(); - } - StopComponents(); - } - - private void StartComponents() { - if (_nodeState != VNodeState.Leader) { - Logger.Debug("PROJECTIONS SUBSYSTEM: Not starting because node is not leader. Current node state: {nodeState}", - _nodeState); - return; - } - if (_subsystemState != SubsystemState.Ready && _subsystemState != SubsystemState.Stopped) { - Logger.Debug("PROJECTIONS SUBSYSTEM: Not starting because system is not ready or stopped. Current Subsystem state: {subsystemState}", - _subsystemState); - return; - } - if (_runningComponentCount > 0) { - Logger.Warning("PROJECTIONS SUBSYSTEM: Subsystem is stopped, but components are still running."); - return; - } - - _subsystemState = SubsystemState.Starting; - _restarting = false; - _instanceCorrelationId = Guid.NewGuid(); - Logger.Information("PROJECTIONS SUBSYSTEM: Starting components for Instance: {instanceCorrelationId}", _instanceCorrelationId); - _pendingComponentStarts = _componentCount; - LeaderInputQueue.Publish(new ProjectionSubsystemMessage.StartComponents(_instanceCorrelationId)); - } - - private void StopComponents() { - if (_subsystemState != SubsystemState.Started) { - Logger.Debug("PROJECTIONS SUBSYSTEM: Not stopping because subsystem is not in a started state. Current Subsystem state: {state}", _subsystemState); - return; - } - - Logger.Information("PROJECTIONS SUBSYSTEM: Stopping components for Instance: {instanceCorrelationId}", _instanceCorrelationId); - _subsystemState = SubsystemState.Stopping; - LeaderInputQueue.Publish(new ProjectionSubsystemMessage.StopComponents(_instanceCorrelationId)); - } - - public void Handle(ProjectionSubsystemMessage.RestartSubsystem message) { - if (_restarting) { - var info = "PROJECTIONS SUBSYSTEM: Not restarting because the subsystem is already being restarted."; - Logger.Information(info); - message.ReplyEnvelope.ReplyWith(new ProjectionSubsystemMessage.InvalidSubsystemRestart("Restarting", info)); - return; - } - - if (_subsystemState != SubsystemState.Started) { - var info = - $"PROJECTIONS SUBSYSTEM: Not restarting because the subsystem is not started. Current subsystem state: {_subsystemState}"; - Logger.Information(info); - message.ReplyEnvelope.ReplyWith(new ProjectionSubsystemMessage.InvalidSubsystemRestart(_subsystemState.ToString(), info)); - return; - } - - Logger.Information("PROJECTIONS SUBSYSTEM: Restarting subsystem."); - _restarting = true; - StopComponents(); - message.ReplyEnvelope.ReplyWith(new ProjectionSubsystemMessage.SubsystemRestarting()); - } - - public void Handle(ProjectionSubsystemMessage.ComponentStarted message) { - if (message.InstanceCorrelationId != _instanceCorrelationId) { - Logger.Debug( - "PROJECTIONS SUBSYSTEM: Received component started for incorrect instance id. " + - "Requested: {requestedCorrelationId} | Current: {instanceCorrelationId}", - message.InstanceCorrelationId, _instanceCorrelationId); - return; - } - - if (_pendingComponentStarts <= 0 || _subsystemState != SubsystemState.Starting) - return; - - Logger.Debug("PROJECTIONS SUBSYSTEM: Component '{componentName}' started for Instance: {instanceCorrelationId}", - message.ComponentName, message.InstanceCorrelationId); - _pendingComponentStarts--; - _runningComponentCount++; - - if (_pendingComponentStarts == 0) { - AllComponentsStarted(); - } - } - - public void Handle(ProjectionSubsystemMessage.IODispatcherDrained message) { - _runningDispatchers--; - Logger.Information( - "PROJECTIONS SUBSYSTEM: IO Dispatcher from {componentName} has been drained. {runningCount} of {totalCount} queues empty.", - message.ComponentName, _runningDispatchers, _dispatcherCount); - FinishStopping(); - } - - private void AllComponentsStarted() { - Logger.Information("PROJECTIONS SUBSYSTEM: All components started for Instance: {instanceCorrelationId}", - _instanceCorrelationId); - _subsystemState = SubsystemState.Started; - _runningDispatchers = _dispatcherCount; - - PublishInitialized(); - - if (_nodeState != VNodeState.Leader) { - Logger.Information("PROJECTIONS SUBSYSTEM: Node state is no longer Leader. Stopping projections. Current node state: {nodeState}", - _nodeState); - StopComponents(); - } - } - - public void Handle(ProjectionSubsystemMessage.ComponentStopped message) { - if (message.InstanceCorrelationId != _instanceCorrelationId) { - Logger.Debug( - "PROJECTIONS SUBSYSTEM: Received component stopped for incorrect correlation id. " + - "Requested: {requestedCorrelationId} | Instance: {instanceCorrelationId}", - message.InstanceCorrelationId, _instanceCorrelationId); - return; - } - - if (_subsystemState != SubsystemState.Stopping) - return; - - Logger.Debug("PROJECTIONS SUBSYSTEM: Component '{componentName}' stopped for Instance: {instanceCorrelationId}", - message.ComponentName, message.InstanceCorrelationId); - _runningComponentCount--; - if (_runningComponentCount < 0) { - Logger.Warning("PROJECTIONS SUBSYSTEM: Got more component stopped messages than running components."); - _runningComponentCount = 0; - } - - FinishStopping(); - } - - private void FinishStopping() { - if (_runningDispatchers > 0) return; - if (_runningComponentCount > 0) return; - - Logger.Information( - "PROJECTIONS SUBSYSTEM: All components stopped and dispatchers drained for Instance: {correlationId}", - _instanceCorrelationId); - _subsystemState = SubsystemState.Stopped; - - if (_restarting) { - StartComponents(); - return; - } - - if (_nodeState == VNodeState.Leader) { - Logger.Information("PROJECTIONS SUBSYSTEM: Node state has changed to Leader. Starting projections."); - StartComponents(); - } - } - - private void PublishInitialized() { - _subsystemInitialized.TrySetResult(); - } - - public Task Start() { - if (_subsystemStarted == false) { - _leaderInputQueue?.Start(); - _leaderOutputQueue?.Start(); - - foreach (var queue in _coreWorkers) - queue.Value.Start(); - } - - _subsystemStarted = true; - - return _subsystemInitialized.Task; - } - - public Task Stop() { - if (_subsystemStarted) { - if (_leaderInputQueue != null) - _leaderInputQueue.Stop(); - foreach (var queue in _coreWorkers) - queue.Value.Stop(); - } - - _subsystemStarted = false; - - return Task.CompletedTask; - } - - public void Handle(CoreProjectionStatusMessage.Stopped message) { - if (_startStandardProjections) { - if (_standardProjections.Contains(message.Name)) { - _standardProjections.Remove(message.Name); - var envelope = new NoopEnvelope(); - LeaderInputQueue.Publish(new ProjectionManagementMessage.Command.Enable(envelope, message.Name, - ProjectionManagementMessage.RunAs.System)); - } - } - } - - public void Handle(CoreProjectionStatusMessage.Started message) { - _standardProjections.Remove(message.Name); - } - - private enum SubsystemState { - NotReady, - Ready, - Starting, - Started, - Stopping, - Stopped - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Create.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Create.cs deleted file mode 100644 index 384214747..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Create.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; -using static EventStore.Client.Projections.CreateReq.Types.Options; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation CreateOperation = new Operation(Operations.Projections.Create); - - public override async Task Create(CreateReq request, ServerCallContext context) { - var createdSource = new TaskCompletionSource(); - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, CreateOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - const string handlerType = "JS"; - var name = options.ModeCase switch { - ModeOneofCase.Continuous => options.Continuous.Name, - ModeOneofCase.Transient => options.Transient.Name, - ModeOneofCase.OneTime => Guid.NewGuid().ToString("D"), - _ => throw new InvalidOperationException() - }; - var projectionMode = options.ModeCase switch { - ModeOneofCase.Continuous => ProjectionMode.Continuous, - ModeOneofCase.Transient => ProjectionMode.Transient, - ModeOneofCase.OneTime => ProjectionMode.OneTime, - _ => throw new InvalidOperationException() - }; - var emitEnabled = options.ModeCase switch { - ModeOneofCase.Continuous => options.Continuous.EmitEnabled, - _ => false - }; - var trackEmittedStreams = (options.ModeCase, emitEnabled, options.Continuous?.TrackEmittedStreams) switch { - (ModeOneofCase.Continuous, true, true) => true, - (ModeOneofCase.Continuous, false, true) => - throw new InvalidOperationException("EmitEnabled must be set to true to track emitted streams."), - _ => false - }; - var checkpointsEnabled = options.ModeCase switch { - ModeOneofCase.Continuous => true, - ModeOneofCase.OneTime => false, - ModeOneofCase.Transient => false, - _ => throw new InvalidOperationException() - }; - - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.Post(envelope, projectionMode, name, runAs, - handlerType, options.Query, true, checkpointsEnabled, emitEnabled, trackEmittedStreams, true)); - - await createdSource.Task; - - return new CreateResp(); - - void OnMessage(Message message) { - if (message is not ProjectionManagementMessage.Updated) { - createdSource.TrySetException(UnknownMessage(message)); - return; - } - - createdSource.TrySetResult(true); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Delete.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Delete.cs deleted file mode 100644 index 468b12a30..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Delete.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation DeleteOperation = new Operation(Operations.Projections.Delete); - public override async Task Delete(DeleteReq request, ServerCallContext context) { - var deletedSource = new TaskCompletionSource(); - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, DeleteOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - var name = options.Name; - var deleteCheckpointStream = options.DeleteCheckpointStream; - var deleteStateStream = options.DeleteStateStream; - var deleteEmittedStreams = options.DeleteEmittedStreams; - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.Delete(envelope, name, runAs, - deleteCheckpointStream, deleteStateStream, deleteEmittedStreams)); - - await deletedSource.Task; - - return new DeleteResp(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Updated: - deletedSource.TrySetResult(true); - break; - case ProjectionManagementMessage.NotFound: - deletedSource.TrySetException(ProjectionNotFound(name)); - break; - default: - deletedSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Disable.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Disable.cs deleted file mode 100644 index 3115575cf..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Disable.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation DisableOperation = new Operation(Operations.Projections.Disable); - public override async Task Disable(DisableReq request, ServerCallContext context) { - var disableSource = new TaskCompletionSource(); - - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, DisableOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - var name = options.Name; - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(options.WriteCheckpoint - ? new ProjectionManagementMessage.Command.Disable(envelope, name, runAs) - : (Message)new ProjectionManagementMessage.Command.Abort(envelope, name, runAs)); - - await disableSource.Task; - - return new DisableResp(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Updated: - disableSource.TrySetResult(true); - break; - case ProjectionManagementMessage.NotFound: - disableSource.TrySetException(ProjectionNotFound(name)); - break; - default: - disableSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Enable.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Enable.cs deleted file mode 100644 index e4322b8ec..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Enable.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation EnableOperation = new Operation(Operations.Projections.Enable); - public override async Task Enable(EnableReq request, ServerCallContext context) { - var enableSource = new TaskCompletionSource(); - - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, EnableOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - var name = options.Name; - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.Enable(envelope, name, runAs)); - - await enableSource.Task; - - return new EnableResp(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Updated: - enableSource.TrySetResult(true); - break; - case ProjectionManagementMessage.NotFound: - enableSource.TrySetException(ProjectionNotFound(name)); - break; - default: - enableSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Reset.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Reset.cs deleted file mode 100644 index f2e32c30d..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Reset.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation ResetOperation = new Operation(Operations.Projections.Create); - public override async Task Reset(ResetReq request, ServerCallContext context) { - var resetSource = new TaskCompletionSource(); - - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, ResetOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - var name = options.Name; - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.Reset(envelope, name, runAs)); - - await resetSource.Task; - - return new ResetResp(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Updated: - resetSource.TrySetResult(true); - break; - case ProjectionManagementMessage.NotFound: - resetSource.TrySetException(ProjectionNotFound(name)); - break; - default: - resetSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.RestartSubsystem.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.RestartSubsystem.cs deleted file mode 100644 index b3b78e176..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.RestartSubsystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation RestartOperation = new Operation(Operations.Projections.Restart); - - public override async Task RestartSubsystem(Empty empty, ServerCallContext context) { - var restart = new TaskCompletionSource(); - var envelope = new CallbackEnvelope(OnMessage); - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, RestartOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - - _publisher.Publish(new ProjectionSubsystemMessage.RestartSubsystem(envelope)); - - await restart.Task; - return new Empty(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionSubsystemMessage.SubsystemRestarting _: - restart.TrySetResult(true); - break; - case ProjectionSubsystemMessage.InvalidSubsystemRestart fail: - restart.TrySetException(InvalidSubsystemRestart(fail.SubsystemState)); - break; - default: - restart.TrySetException( - UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Result.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Result.cs deleted file mode 100644 index 66ef12c82..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Result.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.Text.Json; -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Google.Protobuf.WellKnownTypes; -using Grpc.Core; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation ResultOperation = new Operation(Operations.Projections.Result); - private static readonly Operation StateOperation = new Operation(Operations.Projections.State); - public override async Task Result(ResultReq request, ServerCallContext context) { - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, ResultOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - - var resultSource = new TaskCompletionSource(); - var options = request.Options; - - var name = options.Name; - var partition = options.Partition ?? string.Empty; - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.GetResult(envelope, name, partition)); - - return new ResultResp { - Result = await resultSource.Task - }; - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.ProjectionResult result: - if (string.IsNullOrEmpty(result.Result)) { - resultSource.TrySetResult(new Value { - StructValue = new Struct() - }); - } else { - var document = JsonDocument.Parse(result.Result); - resultSource.TrySetResult(GetProtoValue(document.RootElement)); - } - break; - case ProjectionManagementMessage.NotFound: - resultSource.TrySetException(ProjectionNotFound(name)); - break; - default: - resultSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - - public override async Task State(StateReq request, ServerCallContext context) { - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, StateOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - var resultSource = new TaskCompletionSource(); - - var options = request.Options; - - var name = options.Name; - var partition = options.Partition ?? string.Empty; - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.GetState(envelope, name, partition)); - - return new StateResp { - State = await resultSource.Task - }; - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.ProjectionState result: - if (string.IsNullOrEmpty(result.State)) { - resultSource.TrySetResult(new Value { - StructValue = new Struct() - }); - } else { - var document = JsonDocument.Parse(result.State); - resultSource.TrySetResult(GetProtoValue(document.RootElement)); - } - break; - case ProjectionManagementMessage.NotFound: - resultSource.TrySetException(ProjectionNotFound(name)); - break; - default: - resultSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Statistics.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Statistics.cs deleted file mode 100644 index dd5033d14..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Statistics.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; -using static EventStore.Client.Projections.StatisticsReq.Types.Options; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation StatisticsOperation = new Operation(Operations.Projections.Statistics); - public override async Task Statistics(StatisticsReq request, IServerStreamWriter responseStream, - ServerCallContext context) { - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, StatisticsOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - - var statsSource = new TaskCompletionSource(); - - var options = request.Options; - var name = string.IsNullOrEmpty(options.Name) ? null : options.Name; - var mode = options.ModeCase switch { - ModeOneofCase.Continuous => ProjectionMode.Continuous, - ModeOneofCase.Transient => ProjectionMode.Transient, - ModeOneofCase.OneTime => ProjectionMode.OneTime, - _ => default(Nullable) - }; - - var envelope = new CallbackEnvelope(OnMessage); - - _publisher.Publish(new ProjectionManagementMessage.Command.GetStatistics(envelope, mode, name, true)); - - foreach (var stats in Array.ConvertAll(await statsSource.Task, s => new StatisticsResp.Types.Details { - BufferedEvents = s.BufferedEvents, - CheckpointStatus = s.CheckpointStatus, - CoreProcessingTime = s.CoreProcessingTime, - EffectiveName = s.EffectiveName, - Epoch = s.Epoch, - EventsProcessedAfterRestart = s.EventsProcessedAfterRestart, - LastCheckpoint = s.LastCheckpoint, - Mode = s.Mode.ToString(), - Name = s.Name, - ReadsInProgress = s.ReadsInProgress, - PartitionsCached = s.PartitionsCached, - Position = s.Position, - Progress = s.Progress, - StateReason = s.StateReason, - Status = s.Status, - Version = s.Version, - WritePendingEventsAfterCheckpoint = s.WritePendingEventsAfterCheckpoint, - WritePendingEventsBeforeCheckpoint = s.WritePendingEventsBeforeCheckpoint, - WritesInProgress = s.WritesInProgress - })) { - await responseStream.WriteAsync(new StatisticsResp { Details = stats }); - } - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Statistics statistics: - statsSource.TrySetResult(statistics.Projections); - break; - case ProjectionManagementMessage.NotFound: - statsSource.TrySetException(ProjectionNotFound(name)); - break; - default: - statsSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Update.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Update.cs deleted file mode 100644 index 57f17fdef..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.Update.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Threading.Tasks; -using EventStore.Core.Messaging; -using EventStore.Client.Projections; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using Grpc.Core; -using static EventStore.Client.Projections.UpdateReq.Types.Options; - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement { - private static readonly Operation UpdateOperation = new Operation(Operations.Projections.Update); - public override async Task Update(UpdateReq request, ServerCallContext context) { - var updatedSource = new TaskCompletionSource(); - var options = request.Options; - - var user = context.GetHttpContext().User; - if (!await _authorizationProvider.CheckAccessAsync(user, UpdateOperation, context.CancellationToken)) { - throw RpcExceptions.AccessDenied(); - } - - var name = options.Name; - var query = options.Query; - bool? emitEnabled = (options.EmitOptionCase, options.EmitEnabled) switch { - (EmitOptionOneofCase.EmitEnabled, true) => true, - (EmitOptionOneofCase.EmitEnabled, false) => false, - (EmitOptionOneofCase.NoEmitOptions, _) => default, - _ => throw new InvalidOperationException() - }; - var runAs = new ProjectionManagementMessage.RunAs(user); - - var envelope = new CallbackEnvelope(OnMessage); - _publisher.Publish( - new ProjectionManagementMessage.Command.UpdateQuery(envelope, name, runAs, query, - emitEnabled)); - - await updatedSource.Task; - - return new UpdateResp(); - - void OnMessage(Message message) { - switch (message) { - case ProjectionManagementMessage.Updated: - updatedSource.TrySetResult(true); - break; - case ProjectionManagementMessage.NotFound: - updatedSource.TrySetException(ProjectionNotFound(name)); - break; - default: - updatedSource.TrySetException(UnknownMessage(message)); - break; - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.cs b/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.cs deleted file mode 100644 index 37463436c..000000000 --- a/src/EventStore.Projections.Core/Services/Grpc/ProjectionManagement.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Linq; -using System.Text.Json; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.Transport.Grpc; -using EventStore.Plugins.Authorization; -using Google.Protobuf.WellKnownTypes; -using Grpc.Core; - -namespace EventStore.Client.Projections { - partial class Projections { - partial class ProjectionsBase : ServiceBase { - } - } -} - -namespace EventStore.Projections.Core.Services.Grpc { - internal partial class ProjectionManagement : EventStore.Client.Projections.Projections.ProjectionsBase { - private readonly IPublisher _publisher; - private readonly IAuthorizationProvider _authorizationProvider; - - public ProjectionManagement(IPublisher publisher, IAuthorizationProvider authorizationProvider) { - if (publisher == null) throw new ArgumentNullException(nameof(publisher)); - if (authorizationProvider == null) throw new ArgumentNullException(nameof(authorizationProvider)); - _publisher = publisher; - _authorizationProvider = authorizationProvider; - } - - private static Exception UnknownMessage(Message message) where T : Message => - new RpcException( - new Status(StatusCode.Unknown, - $"Envelope callback expected {typeof(T).Name}, received {message.GetType().Name} instead")); - private static Exception InvalidSubsystemRestart(string state) => - new RpcException( - new Status(StatusCode.FailedPrecondition, - $"Projection Subsystem cannot be restarted as it is in the wrong state: {state}")); - - private static Exception ProjectionNotFound(string name) => - new RpcException(new Status(StatusCode.NotFound, $"Projection '{name}' not found")); - - private static Value GetProtoValue(JsonElement element) => - element.ValueKind switch { - JsonValueKind.Null => new Value {NullValue = NullValue.NullValue}, - JsonValueKind.Array => new Value { - ListValue = new ListValue { - Values = { - element.EnumerateArray().Select(GetProtoValue) - } - } - }, - JsonValueKind.False => new Value {BoolValue = false}, - JsonValueKind.True => new Value {BoolValue = true}, - JsonValueKind.String => new Value {StringValue = element.GetString()}, - JsonValueKind.Number => new Value {NumberValue = element.GetDouble()}, - JsonValueKind.Object => new Value {StructValue = GetProtoStruct(element)}, - JsonValueKind.Undefined => new Value(), - _ => throw new InvalidOperationException() - }; - - private static Struct GetProtoStruct(JsonElement element) { - var structValue = new Struct(); - foreach (var property in element.EnumerateObject()) { - structValue.Fields.Add(property.Name, GetProtoValue(property.Value)); - } - - return structValue; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Http/ProjectionStatisticsHttpFormatted.cs b/src/EventStore.Projections.Core/Services/Http/ProjectionStatisticsHttpFormatted.cs deleted file mode 100644 index 34b5928f9..000000000 --- a/src/EventStore.Projections.Core/Services/Http/ProjectionStatisticsHttpFormatted.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Http { - public class ProjectionStatisticsHttpFormatted { - public ProjectionStatisticsHttpFormatted(ProjectionStatistics source, Func makeAbsoluteUrl) { - this.Status = source.Status; - this.StateReason = source.StateReason; - this.Name = source.Name; - this.EffectiveName = source.Name; - this.Epoch = source.Epoch; - this.Version = source.Version; - this.Mode = source.Mode; - this.Position = (source.Position ?? (object)"").ToString(); - this.Progress = source.Progress; - this.LastCheckpoint = source.LastCheckpoint; - this.EventsProcessedAfterRestart = source.EventsProcessedAfterRestart; - this.BufferedEvents = source.BufferedEvents; - this.CheckpointStatus = source.CheckpointStatus; - this.WritePendingEventsBeforeCheckpoint = source.WritePendingEventsBeforeCheckpoint; - this.WritePendingEventsAfterCheckpoint = source.WritePendingEventsAfterCheckpoint; - this.ReadsInProgress = source.ReadsInProgress; - this.WritesInProgress = source.WritesInProgress; - this.CoreProcessingTime = source.CoreProcessingTime; - this.PartitionsCached = source.PartitionsCached; - var statusLocalUrl = "/projection/" + source.Name; - this.StatusUrl = makeAbsoluteUrl(statusLocalUrl); - this.StateUrl = makeAbsoluteUrl(statusLocalUrl + "/state"); - this.ResultUrl = makeAbsoluteUrl(statusLocalUrl + "/result"); - this.QueryUrl = makeAbsoluteUrl(statusLocalUrl + "/query?config=yes"); - if (!string.IsNullOrEmpty(source.ResultStreamName)) - this.ResultStreamUrl = makeAbsoluteUrl("/streams/" + Uri.EscapeDataString(source.ResultStreamName)); - this.DisableCommandUrl = makeAbsoluteUrl(statusLocalUrl + "/command/disable"); - this.EnableCommandUrl = makeAbsoluteUrl(statusLocalUrl + "/command/enable"); - } - - public long CoreProcessingTime { get; set; } - - public long Version { get; set; } - - public long Epoch { get; set; } - - public string EffectiveName { get; set; } - - public int WritesInProgress { get; set; } - - public int ReadsInProgress { get; set; } - - public int PartitionsCached { get; set; } - - public string Status { get; set; } - - public string StateReason { get; set; } - - public string Name { get; set; } - - public ProjectionMode Mode { get; set; } - - public string Position { get; set; } - - public float Progress { get; set; } - - public string LastCheckpoint { get; set; } - - public int EventsProcessedAfterRestart { get; set; } - - public string StatusUrl { get; set; } - - public string StateUrl { get; set; } - - public string ResultUrl { get; set; } - - public string QueryUrl { get; set; } - - public string ResultStreamUrl { get; set; } - - public string EnableCommandUrl { get; set; } - - public string DisableCommandUrl { get; set; } - - public string CheckpointStatus { get; set; } - - public int BufferedEvents { get; set; } - - public int WritePendingEventsBeforeCheckpoint { get; set; } - - public int WritePendingEventsAfterCheckpoint { get; set; } - } -} diff --git a/src/EventStore.Projections.Core/Services/Http/ProjectionsController.cs b/src/EventStore.Projections.Core/Services/Http/ProjectionsController.cs deleted file mode 100644 index 99f82250c..000000000 --- a/src/EventStore.Projections.Core/Services/Http/ProjectionsController.cs +++ /dev/null @@ -1,663 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Services.Transport.Http; -using EventStore.Core.Services.Transport.Http.Controllers; -using EventStore.Core.Util; -using EventStore.Plugins.Authorization; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messages.EventReaders.Feeds; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Transport.Http; -using EventStore.Transport.Http.Codecs; -using EventStore.Transport.Http.EntityManagement; -using Newtonsoft.Json.Linq; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Http { - public class ProjectionsController : CommunicationController { - private static readonly ILogger Log = Serilog.Log.ForContext(); - - private static readonly ICodec[] SupportedCodecs = {Codec.Json}; - - private readonly MiniWeb _clusterNodeJs; - private readonly MiniWeb _miniWebPrelude; - private readonly IHttpForwarder _httpForwarder; - private readonly IPublisher _networkSendQueue; - - public ProjectionsController(IHttpForwarder httpForwarder, IPublisher publisher, IPublisher networkSendQueue) - : base(publisher) { - _httpForwarder = httpForwarder; - - _clusterNodeJs = new MiniWeb("/web/es/js/projections", Locations.ProjectionsDirectory); - - _networkSendQueue = networkSendQueue; - _miniWebPrelude = new MiniWeb("/web/es/js/projections/v8/Prelude", Locations.PreludeDirectory); - } - - protected override void SubscribeCore(IHttpService service) { - _clusterNodeJs.RegisterControllerActions(service); - - _miniWebPrelude.RegisterControllerActions(service); - - HttpHelpers.RegisterRedirectAction(service, "/web/projections", "/web/projections.htm"); - - Register(service, "/projections", - HttpMethod.Get, OnProjections, Codec.NoCodecs, new ICodec[] {Codec.ManualEncoding}, new Operation(Operations.Projections.List)); - Register(service, "/projections/restart", - HttpMethod.Post, OnProjectionsRestart, new ICodec[] { Codec.ManualEncoding}, SupportedCodecs, new Operation(Operations.Projections.Restart)); - Register(service, "/projections/any", - HttpMethod.Get, OnProjectionsGetAny, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.List)); - Register(service, "/projections/all-non-transient", - HttpMethod.Get, OnProjectionsGetAllNonTransient, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.List)); - Register(service, "/projections/transient", - HttpMethod.Get, OnProjectionsGetTransient, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.List)); - Register(service, "/projections/onetime", - HttpMethod.Get, OnProjectionsGetOneTime, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.List)); - Register(service, "/projections/continuous", - HttpMethod.Get, OnProjectionsGetContinuous, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.List)); - Register(service, "/projections/transient?name={name}&type={type}&enabled={enabled}", - HttpMethod.Post, OnProjectionsPostTransient, new ICodec[] {Codec.ManualEncoding}, SupportedCodecs, new Operation(Operations.Projections.Create).WithParameter(Operations.Projections.Parameters.Query)); - Register(service, - "/projections/onetime?name={name}&type={type}&enabled={enabled}&checkpoints={checkpoints}&emit={emit}&trackemittedstreams={trackemittedstreams}", - HttpMethod.Post, OnProjectionsPostOneTime, new ICodec[] {Codec.ManualEncoding}, SupportedCodecs, new Operation(Operations.Projections.Create).WithParameter(Operations.Projections.Parameters.OneTime)); - Register(service, - "/projections/continuous?name={name}&type={type}&enabled={enabled}&emit={emit}&trackemittedstreams={trackemittedstreams}", - HttpMethod.Post, OnProjectionsPostContinuous, new ICodec[] {Codec.ManualEncoding}, SupportedCodecs, new Operation(Operations.Projections.Create).WithParameter(Operations.Projections.Parameters.Continuous)); - Register(service, "/projection/{name}/query?config={config}", - HttpMethod.Get, OnProjectionQueryGet, Codec.NoCodecs, new ICodec[] {Codec.ManualEncoding}, new Operation(Operations.Projections.Read)); - Register(service, "/projection/{name}/query?type={type}&emit={emit}", - HttpMethod.Put, OnProjectionQueryPut, new ICodec[] {Codec.ManualEncoding}, SupportedCodecs, new Operation(Operations.Projections.Update)); /* source of transient projections can be set by a normal user. Authorization checks are done internally for non-transient projections. */ - Register(service, "/projection/{name}", - HttpMethod.Get, OnProjectionStatusGet, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Status)); - Register(service, - "/projection/{name}?deleteStateStream={deleteStateStream}&deleteCheckpointStream={deleteCheckpointStream}&deleteEmittedStreams={deleteEmittedStreams}", - HttpMethod.Delete, OnProjectionDelete, Codec.NoCodecs, SupportedCodecs,new Operation(Operations.Projections.Delete)); - Register(service, "/projection/{name}/statistics", - HttpMethod.Get, OnProjectionStatisticsGet, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Statistics)); - Register(service, "/projections/read-events", - HttpMethod.Post, OnProjectionsReadEvents, SupportedCodecs, SupportedCodecs, new Operation(Operations.Projections.DebugProjection)); - Register(service, "/projection/{name}/state?partition={partition}", - HttpMethod.Get, OnProjectionStateGet, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.State)); - Register(service, "/projection/{name}/result?partition={partition}", - HttpMethod.Get, OnProjectionResultGet, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Result)); - Register(service, "/projection/{name}/command/disable?enableRunAs={enableRunAs}", - HttpMethod.Post, OnProjectionCommandDisable, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Disable)); /* transient projections can be stopped by a normal user. Authorization checks are done internally for non-transient projections.*/ - Register(service, "/projection/{name}/command/enable?enableRunAs={enableRunAs}", - HttpMethod.Post, OnProjectionCommandEnable, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Enable)); /* transient projections can be enabled by a normal user. Authorization checks are done internally for non-transient projections.*/ - Register(service, "/projection/{name}/command/reset?enableRunAs={enableRunAs}", - HttpMethod.Post, OnProjectionCommandReset, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Reset)); /* transient projections can be reset by a normal user (when debugging). Authorization checks are done internally for non-transient projections.*/ - Register(service, "/projection/{name}/command/abort?enableRunAs={enableRunAs}", - HttpMethod.Post, OnProjectionCommandAbort, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.Abort)); /* transient projections can be aborted by a normal user. Authorization checks are done internally for non-transient projections.*/ - Register(service, "/projection/{name}/config", - HttpMethod.Get, OnProjectionConfigGet, Codec.NoCodecs, SupportedCodecs, new Operation(Operations.Projections.ReadConfiguration)); - Register(service, "/projection/{name}/config", - HttpMethod.Put, OnProjectionConfigPut, SupportedCodecs, SupportedCodecs, new Operation(Operations.Projections.UpdateConfiguration)); - } - - private void OnProjections(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - http.ReplyTextContent( - "Moved", 302, "Found", "text/plain", - new[] { - new KeyValuePair( - "Location", new Uri(match.BaseUri, "/web/projections.htm").AbsoluteUri) - }, x => Log.Debug(x, "Reply Text Content Failed.")); - } - - private void OnProjectionsRestart(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope(_networkSendQueue, http, - (e, message) => e.To("Restarting"), - (e, message) => { - switch (message) { - case ProjectionSubsystemMessage.SubsystemRestarting _: - return Configure.Ok(e.ContentType); - default: - return Configure.InternalServerError(); - } - }, CreateErrorEnvelope(http) - ); - - Publish(new ProjectionSubsystemMessage.RestartSubsystem(envelope)); - } - - private void OnProjectionsGetAny(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsGet(http, match, null); - } - - private void OnProjectionsGetAllNonTransient(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsGet(http, match, ProjectionMode.AllNonTransient); - } - - private void OnProjectionsGetTransient(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsGet(http, match, ProjectionMode.Transient); - } - - private void OnProjectionsGetOneTime(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsGet(http, match, ProjectionMode.OneTime); - } - - private void OnProjectionsGetContinuous(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsGet(http, match, ProjectionMode.Continuous); - } - - private void OnProjectionsPostTransient(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsPost(http, match, ProjectionMode.Transient, match.BoundVariables["name"]); - } - - private void OnProjectionsPostOneTime(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsPost(http, match, ProjectionMode.OneTime, match.BoundVariables["name"]); - } - - private void OnProjectionsPostContinuous(HttpEntityManager http, UriTemplateMatch match) { - ProjectionsPost(http, match, ProjectionMode.Continuous, match.BoundVariables["name"]); - } - - private void OnProjectionQueryGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - SendToHttpEnvelope envelope; - var withConfig = IsOn(match, "config", false); - if (withConfig) - envelope = new SendToHttpEnvelope( - _networkSendQueue, http, QueryConfigFormatter, QueryConfigConfigurator, CreateErrorEnvelope(http)); - else - envelope = new SendToHttpEnvelope( - _networkSendQueue, http, QueryFormatter, QueryConfigurator, CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.GetQuery(envelope, match.BoundVariables["name"], - GetRunAs(http, match))); - } - - private void OnProjectionQueryPut(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - var emitEnabled = IsOn(match, "emit", null); - http.ReadTextRequestAsync( - (o, s) => - Publish( - new ProjectionManagementMessage.Command.UpdateQuery( - envelope, match.BoundVariables["name"], GetRunAs(http, match), - s, emitEnabled: emitEnabled)), Console.WriteLine); - } - - private void OnProjectionConfigGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, ProjectionConfigFormatter, ProjectionConfigConfigurator, CreateErrorEnvelope(http)); - Publish( - new ProjectionManagementMessage.Command.GetConfig( - envelope, match.BoundVariables["name"], GetRunAs(http, match))); - } - - private void OnProjectionConfigPut(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - http.ReadTextRequestAsync( - (o, s) => { - var config = http.RequestCodec.From(s); - if (config == null) { - SendBadRequest(o, "Failed to parse the projection config"); - return; - } - - if (config.ProjectionExecutionTimeout is not null && config.ProjectionExecutionTimeout <= 0) { - SendBadRequest(o, $"projectionExecutionTimeout should be positive. Found : {config.ProjectionExecutionTimeout}"); - return; - } - var message = new ProjectionManagementMessage.Command.UpdateConfig( - envelope, match.BoundVariables["name"], config.EmitEnabled, config.TrackEmittedStreams, - config.CheckpointAfterMs, config.CheckpointHandledThreshold, - config.CheckpointUnhandledBytesThreshold, config.PendingEventsThreshold, - config.MaxWriteBatchLength, config.MaxAllowedWritesInFlight, GetRunAs(http, match), config.ProjectionExecutionTimeout); - Publish(message); - }, ex => Log.Debug("Failed to update projection configuration. Error: {e}", ex)); - } - - private void OnProjectionCommandDisable(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.Disable(envelope, match.BoundVariables["name"], - GetRunAs(http, match))); - } - - private void OnProjectionCommandEnable(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - var name = match.BoundVariables["name"]; - Publish(new ProjectionManagementMessage.Command.Enable(envelope, name, GetRunAs(http, match))); - } - - private void OnProjectionCommandReset(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.Reset(envelope, match.BoundVariables["name"], - GetRunAs(http, match))); - } - - private void OnProjectionCommandAbort(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.Abort(envelope, match.BoundVariables["name"], - GetRunAs(http, match))); - } - - private void OnProjectionStatusGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = - new SendToHttpWithConversionEnvelope - ( - _networkSendQueue, http, DefaultFormatter, OkNoCacheResponseConfigurator, - status => new ProjectionStatisticsHttpFormatted(status.Projections[0], s => MakeUrl(http, s)), - CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.GetStatistics(envelope, null, match.BoundVariables["name"], - true)); - } - - private void OnProjectionDelete(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, OkResponseConfigurator, CreateErrorEnvelope(http)); - Publish( - new ProjectionManagementMessage.Command.Delete( - envelope, match.BoundVariables["name"], GetRunAs(http, match), - IsOn(match, "deleteCheckpointStream", false), - IsOn(match, "deleteStateStream", false), - IsOn(match, "deleteEmittedStreams", false))); - } - - private void OnProjectionStatisticsGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = - new SendToHttpWithConversionEnvelope - ( - _networkSendQueue, http, DefaultFormatter, OkNoCacheResponseConfigurator, - status => new ProjectionsStatisticsHttpFormatted(status, s => MakeUrl(http, s)), - CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.GetStatistics(envelope, null, match.BoundVariables["name"], - true)); - } - - private void OnProjectionStateGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, StateFormatter, StateConfigurator, CreateErrorEnvelope(http)); - Publish( - new ProjectionManagementMessage.Command.GetState( - envelope, match.BoundVariables["name"], match.BoundVariables["partition"] ?? "")); - } - - private void OnProjectionResultGet(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, ResultFormatter, ResultConfigurator, CreateErrorEnvelope(http)); - Publish( - new ProjectionManagementMessage.Command.GetResult( - envelope, match.BoundVariables["name"], match.BoundVariables["partition"] ?? "")); - } - - public class ReadEventsBody { - public QuerySourcesDefinition Query { get; set; } - public JObject Position { get; set; } - public int? MaxEvents { get; set; } - } - - private void OnProjectionsReadEvents(HttpEntityManager http, UriTemplateMatch match) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, FeedPageFormatter, FeedPageConfigurator, CreateErrorEnvelope(http)); - - http.ReadTextRequestAsync( - (o, body) => { - var bodyParsed = body.ParseJson(); - var fromPosition = CheckpointTag.FromJson( - new JTokenReader(bodyParsed.Position), new ProjectionVersion(0, 0, 0)); - - - Publish( - new FeedReaderMessage.ReadPage( - Guid.NewGuid(), - envelope, - http.User, - bodyParsed.Query, - fromPosition.Tag, - bodyParsed.MaxEvents ?? 10)); - }, - x => Log.Debug(x, "Read Request Body Failed.")); - } - - private void ProjectionsGet(HttpEntityManager http, UriTemplateMatch match, ProjectionMode? mode) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = - new SendToHttpWithConversionEnvelope( - _networkSendQueue, http, DefaultFormatter, OkNoCacheResponseConfigurator, - status => new ProjectionsStatisticsHttpFormatted(status, s => MakeUrl(http, s)), - CreateErrorEnvelope(http)); - Publish(new ProjectionManagementMessage.Command.GetStatistics(envelope, mode, null, true)); - } - - private void ProjectionsPost(HttpEntityManager http, UriTemplateMatch match, ProjectionMode mode, string name) { - if (_httpForwarder.ForwardRequest(http)) - return; - - var envelope = new SendToHttpEnvelope( - _networkSendQueue, http, DefaultFormatter, (codec, message) => { - var localPath = string.Format("/projection/{0}", message.Name); - var url = MakeUrl(http, localPath); - return new ResponseConfiguration( - 201, "Created", codec.ContentType, codec.Encoding, - new KeyValuePair("Location", url)); - }, CreateErrorEnvelope(http)); - http.ReadTextRequestAsync( - (o, s) => { - ProjectionManagementMessage.Command.Post postMessage; - string handlerType = match.BoundVariables["type"] ?? "JS"; - bool emitEnabled = IsOn(match, "emit", false); - bool checkpointsEnabled = mode >= ProjectionMode.Continuous || IsOn(match, "checkpoints", false); - bool enabled = IsOn(match, "enabled", def: true); - bool trackEmittedStreams = IsOn(match, "trackemittedstreams", def: false); - if (!emitEnabled) { - trackEmittedStreams = false; - } - - var runAs = GetRunAs(http, match); - if (mode <= ProjectionMode.OneTime && string.IsNullOrEmpty(name)) - postMessage = new ProjectionManagementMessage.Command.Post( - envelope, mode, Guid.NewGuid().ToString("D"), runAs, handlerType, s, enabled: enabled, - checkpointsEnabled: checkpointsEnabled, emitEnabled: emitEnabled, - trackEmittedStreams: trackEmittedStreams, enableRunAs: true); - else - postMessage = new ProjectionManagementMessage.Command.Post( - envelope, mode, name, runAs, handlerType, s, enabled: enabled, - checkpointsEnabled: checkpointsEnabled, emitEnabled: emitEnabled, - trackEmittedStreams: trackEmittedStreams, enableRunAs: true); - Publish(postMessage); - }, x => Log.Debug(x, "Reply Text Body Failed.")); - } - - private ResponseConfiguration - StateConfigurator(ICodec codec, ProjectionManagementMessage.ProjectionState state) { - if (state.Exception != null) - return Configure.InternalServerError(); - else - return state.Position != null - ? Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false, - new KeyValuePair(SystemHeaders.ProjectionPosition, - state.Position.ToJsonString())) - : Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false); - } - - private ResponseConfiguration ResultConfigurator(ICodec codec, - ProjectionManagementMessage.ProjectionResult state) { - if (state.Exception != null) - return Configure.InternalServerError(); - else - return state.Position != null - ? Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false, - new KeyValuePair(SystemHeaders.ProjectionPosition, - state.Position.ToJsonString())) - : Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false); - } - - private ResponseConfiguration FeedPageConfigurator(ICodec codec, FeedReaderMessage.FeedPage page) { - if (page.Error == FeedReaderMessage.FeedPage.ErrorStatus.NotAuthorized) - return Configure.Unauthorized(); - return Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false); - } - - private string StateFormatter(ICodec codec, ProjectionManagementMessage.ProjectionState state) { - if (state.Exception != null) - return state.Exception.ToString(); - else - return state.State; - } - - private string ResultFormatter(ICodec codec, ProjectionManagementMessage.ProjectionResult state) { - if (state.Exception != null) - return state.Exception.ToString(); - else - return state.Result; - } - - private string FeedPageFormatter(ICodec codec, FeedReaderMessage.FeedPage page) { - if (page.Error != FeedReaderMessage.FeedPage.ErrorStatus.Success) - return null; - - return new { - CorrelationId = page.CorrelationId, - ReaderPosition = page.LastReaderPosition.ToJsonRaw(), - Events = (from e in page.Events - let resolvedEvent = e.ResolvedEvent - let isJson = resolvedEvent.IsJson - let data = isJson - ? EatException(() => (object)(resolvedEvent.Data.ParseJson()), resolvedEvent.Data) - : resolvedEvent.Data - let metadata = isJson - ? EatException(() => (object)(resolvedEvent.Metadata.ParseJson()), - resolvedEvent.Metadata) - : resolvedEvent.Metadata - let linkMetadata = isJson - ? EatException(() => (object)(resolvedEvent.PositionMetadata.ParseJson()), - resolvedEvent.PositionMetadata) - : resolvedEvent.PositionMetadata - select new { - EventStreamId = resolvedEvent.EventStreamId, - EventNumber = resolvedEvent.EventSequenceNumber, - EventType = resolvedEvent.EventType, - Data = data, - Metadata = metadata, - LinkMetadata = linkMetadata, - IsJson = isJson, - ReaderPosition = e.ReaderPosition.ToJsonRaw(), - }).ToArray() - }.ToJson(); - } - - private ResponseConfiguration - QueryConfigurator(ICodec codec, ProjectionManagementMessage.ProjectionQuery state) { - return Configure.Ok("application/javascript", Helper.UTF8NoBom, null, null, false); - } - - private string QueryFormatter(ICodec codec, ProjectionManagementMessage.ProjectionQuery state) { - return state.Query; - } - - private string QueryConfigFormatter(ICodec codec, ProjectionManagementMessage.ProjectionQuery state) { - return state.ToJson(); - } - - private ResponseConfiguration QueryConfigConfigurator(ICodec codec, - ProjectionManagementMessage.ProjectionQuery state) { - return Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false); - } - - private string ProjectionConfigFormatter(ICodec codec, ProjectionManagementMessage.ProjectionConfig config) { - return config.ToJson(); - } - - private ResponseConfiguration ProjectionConfigConfigurator(ICodec codec, - ProjectionManagementMessage.ProjectionConfig state) { - return Configure.Ok("application/json", Helper.UTF8NoBom, null, null, false); - } - - private ResponseConfiguration OkResponseConfigurator(ICodec codec, T message) { - return new ResponseConfiguration(200, "OK", codec.ContentType, Helper.UTF8NoBom); - } - - private ResponseConfiguration OkNoCacheResponseConfigurator(ICodec codec, T message) { - return Configure.Ok(codec.ContentType, codec.Encoding, null, null, false); - } - - private IEnvelope CreateErrorEnvelope(HttpEntityManager http) { - return new SendToHttpEnvelope( - _networkSendQueue, - http, - NotFoundFormatter, - NotFoundConfigurator, - new SendToHttpEnvelope( - _networkSendQueue, - http, - NotAuthorizedFormatter, - NotAuthorizedConfigurator, - new SendToHttpEnvelope( - _networkSendQueue, - http, - ConflictFormatter, - ConflictConfigurator, - new SendToHttpEnvelope( - _networkSendQueue, - http, - OperationFailedFormatter, - OperationFailedConfigurator, - new SendToHttpEnvelope( - _networkSendQueue, - http, - InvalidSubsystemRestartFormatter, - InvalidSubsystemRestartConfigurator, - null))))); - } - - private ResponseConfiguration NotFoundConfigurator(ICodec codec, ProjectionManagementMessage.NotFound message) { - return new ResponseConfiguration(404, "Not Found", "text/plain", Helper.UTF8NoBom); - } - - private string NotFoundFormatter(ICodec codec, ProjectionManagementMessage.NotFound message) { - return message.Reason; - } - - private ResponseConfiguration NotAuthorizedConfigurator( - ICodec codec, ProjectionManagementMessage.NotAuthorized message) { - return new ResponseConfiguration(401, "Not Authorized", "text/plain", Encoding.UTF8); - } - - private string NotAuthorizedFormatter(ICodec codec, ProjectionManagementMessage.NotAuthorized message) { - return message.Reason; - } - - private ResponseConfiguration OperationFailedConfigurator( - ICodec codec, ProjectionManagementMessage.OperationFailed message) { - return new ResponseConfiguration(500, "Failed", "text/plain", Helper.UTF8NoBom); - } - - private string OperationFailedFormatter(ICodec codec, ProjectionManagementMessage.OperationFailed message) { - return message.Reason; - } - - private ResponseConfiguration ConflictConfigurator( - ICodec codec, ProjectionManagementMessage.OperationFailed message) { - return new ResponseConfiguration(409, "Conflict", "text/plain", Helper.UTF8NoBom); - } - - private string ConflictFormatter(ICodec codec, ProjectionManagementMessage.OperationFailed message) { - return message.Reason; - } - - private static string DefaultFormatter(ICodec codec, T message) { - return codec.To(message); - } - - private ResponseConfiguration InvalidSubsystemRestartConfigurator(ICodec codec, ProjectionSubsystemMessage.InvalidSubsystemRestart message) { - return new ResponseConfiguration(HttpStatusCode.BadRequest, "Bad Request", "text/plain", - Helper.UTF8NoBom); - } - - private string InvalidSubsystemRestartFormatter(ICodec codec, ProjectionSubsystemMessage.InvalidSubsystemRestart message) { - return message.Reason; - } - - - private static ProjectionManagementMessage.RunAs GetRunAs(HttpEntityManager http, UriTemplateMatch match) { - return new ProjectionManagementMessage.RunAs(http.User); - } - - private static bool? IsOn(UriTemplateMatch match, string option, bool? def) { - var rawValue = match.BoundVariables[option]; - if (string.IsNullOrEmpty(rawValue)) - return def; - var value = rawValue.ToLowerInvariant(); - if ("yes" == value || "true" == value || "1" == value) - return true; - if ("no" == value || "false" == value || "0" == value) - return false; - //TODO: throw? - return def; - } - - private static bool IsOn(UriTemplateMatch match, string option, bool def) { - var rawValue = match.BoundVariables[option]; - if (string.IsNullOrEmpty(rawValue)) - return def; - var value = rawValue.ToLowerInvariant(); - return "yes" == value || "true" == value || "1" == value; - } - - public static T EatException(Func func, T defaultValue = default(T)) { - Ensure.NotNull(func, "func"); - try { - return func(); - } catch (Exception) { - return defaultValue; - } - } - - public class ProjectionConfigData { - public bool EmitEnabled { get; set; } - public bool TrackEmittedStreams { get; set; } - public int CheckpointAfterMs { get; set; } - public int CheckpointHandledThreshold { get; set; } - public int CheckpointUnhandledBytesThreshold { get; set; } - public int PendingEventsThreshold { get; set; } - public int MaxWriteBatchLength { get; set; } - public int MaxAllowedWritesInFlight { get; set; } - - public int? ProjectionExecutionTimeout { get; set; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Http/ProjectionsStatisticsHttpFormatted.cs b/src/EventStore.Projections.Core/Services/Http/ProjectionsStatisticsHttpFormatted.cs deleted file mode 100644 index 0006d6a52..000000000 --- a/src/EventStore.Projections.Core/Services/Http/ProjectionsStatisticsHttpFormatted.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Http { - public class ProjectionsStatisticsHttpFormatted { - private readonly ProjectionStatisticsHttpFormatted[] _projections; - - public ProjectionsStatisticsHttpFormatted( - ProjectionManagementMessage.Statistics source, Func makeAbsouteUrl) { - _projections = - source.Projections.Select(v => new ProjectionStatisticsHttpFormatted(v, makeAbsouteUrl)).ToArray(); - } - - public ProjectionStatisticsHttpFormatted[] Projections { - get { return _projections; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/IProjectionStateHandler.cs b/src/EventStore.Projections.Core/Services/IProjectionStateHandler.cs deleted file mode 100644 index 3f63782c5..000000000 --- a/src/EventStore.Projections.Core/Services/IProjectionStateHandler.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Services { - public interface ISourceDefinitionSource { - IQuerySources GetSourceDefinition(); - } - - - public interface IProjectionStateHandler : IDisposable, ISourceDefinitionSource { - void Load(string state); - void LoadShared(string state); - void Initialize(); - void InitializeShared(); - - /// - /// Get state partition from the event - /// - /// partition name - string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data); - - /// - /// Processes event and updates internal state if necessary. - /// - /// true - if event was processed (new state must be returned) - bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category, ResolvedEvent @event, out string newState, - out string newSharedState, out EmittedEventEnvelope[] emittedEvents); - - /// - /// Processes partition created notification and updates internal state if necessary. - /// - /// - /// - /// - /// - /// true - if notification was processed (new state must be returned) - bool ProcessPartitionCreated( - string partition, CheckpointTag createPosition, ResolvedEvent @event, - out EmittedEventEnvelope[] emittedEvents); - - /// - /// Processes partition deleted notification and updates internal state if necessary. - /// - /// true - if event was processed (new state must be returned) - bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState); - - /// - /// Transforms current state into a projection result. Should not call any emit/linkTo etc - /// - /// result JSON or NULL if current state has been skipped - string TransformStateToResult(); - } - - public interface IProjectionCheckpointHandler { - void ProcessNewCheckpoint(CheckpointTag checkpointPosition, out EmittedEventEnvelope[] emittedEvents); - } - - public static class ProjectionStateHandlerTestExtensions { - public static bool ProcessEvent( - this IProjectionStateHandler self, string partition, CheckpointTag eventPosition, string streamId, - string eventType, string category, Guid eventId, long eventSequenceNumber, string metadata, string data, - out string state, out EmittedEventEnvelope[] emittedEvents, bool isJson = true) { - string ignoredSharedState; - return self.ProcessEvent( - partition, eventPosition, category, - new ResolvedEvent( - streamId, eventSequenceNumber, streamId, eventSequenceNumber, false, new TFPos(0, -1), eventId, - eventType, isJson, data, metadata), out state, out ignoredSharedState, out emittedEvents); - } - - public static bool ProcessEvent( - this IProjectionStateHandler self, string partition, CheckpointTag eventPosition, string streamId, - string eventType, string category, Guid eventId, long eventSequenceNumber, string metadata, string data, - out string state, out string sharedState, out EmittedEventEnvelope[] emittedEvents, bool isJson = true) { - return self.ProcessEvent( - partition, eventPosition, category, - new ResolvedEvent( - streamId, eventSequenceNumber, streamId, eventSequenceNumber, false, new TFPos(0, -1), eventId, - eventType, isJson, data, metadata), out state, out sharedState, out emittedEvents); - } - - public static string GetNativeHandlerName(this Type handlerType) { - return "native:" + handlerType.Namespace + "." + handlerType.Name; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Interpreted/JintProjectionStateHandler.cs b/src/EventStore.Projections.Core/Services/Interpreted/JintProjectionStateHandler.cs deleted file mode 100644 index c7e7c334a..000000000 --- a/src/EventStore.Projections.Core/Services/Interpreted/JintProjectionStateHandler.cs +++ /dev/null @@ -1,1227 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.Json; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Jint; -using Jint.Native; -using Jint.Native.Array; -using Jint.Native.Function; -using Jint.Native.Json; -using Jint.Native.Object; -using Jint.Runtime; -using Jint.Runtime.Descriptors; -using Jint.Runtime.Interop; -using ILogger = Serilog.ILogger; - - -#nullable enable -namespace EventStore.Projections.Core.Services.Interpreted { - public class JintProjectionStateHandler : IProjectionStateHandler { - private readonly ILogger _logger = Serilog.Log.ForContext(); - private readonly bool _enableContentTypeValidation; - private static readonly Stopwatch _sw = Stopwatch.StartNew(); - private readonly Engine _engine; - private readonly SourceDefinitionBuilder _definitionBuilder; - private readonly List _emitted; - private readonly InterpreterRuntime _interpreterRuntime; - private readonly JsonParser _parser; - private CheckpointTag? _currentPosition; - - private JsValue _state; - private JsValue _sharedState; - - public JintProjectionStateHandler(string source, bool enableContentTypeValidation, TimeSpan compilationTimeout, TimeSpan executionTimeout) { - - _enableContentTypeValidation = enableContentTypeValidation; - _definitionBuilder = new SourceDefinitionBuilder(); - _definitionBuilder.NoWhen(); - _definitionBuilder.AllEvents(); - TimeConstraint timeConstraint = new(compilationTimeout, executionTimeout); - _engine = new Engine(opts => opts.Constraint(timeConstraint).DisableStringCompilation()); - _state = JsValue.Undefined; - _sharedState = JsValue.Undefined; - _interpreterRuntime = new InterpreterRuntime(_engine, _definitionBuilder); - _engine.Global.FastAddProperty("log", new ClrFunction(_engine, "log", Log), false, false, false); - - timeConstraint.Compiling(); - _engine.Execute(source); - timeConstraint.Executing(); - _parser = _interpreterRuntime.SwitchToExecutionMode(); - - - _engine.Global.FastAddProperty("emit", new ClrFunction(_engine, "emit", Emit, 4), true, false, true); - _engine.Global.FastAddProperty("linkTo", new ClrFunction(_engine, "linkTo", LinkTo, 3), true, false, true); - _engine.Global.FastAddProperty("linkStreamTo", new ClrFunction(_engine, "linkStreamTo", LinkStreamTo, 3), true, false, true); - _engine.Global.FastAddProperty("copyTo", new ClrFunction(_engine, "copyTo", CopyTo, 3), true, false, true); - _emitted = new List(); - } - - public void Dispose() { - _engine.Dispose(); - } - - public IQuerySources GetSourceDefinition() { - _engine.Constraints.Reset(); - return _definitionBuilder.Build(); - } - - public void Load(string? state) { - _engine.Constraints.Reset(); - if (state != null) { - var jsValue = _parser.Parse(state); - LoadCurrentState(jsValue); - } else { - LoadCurrentState(JsValue.Null); - } - } - - private void LoadCurrentState(JsValue jsValue) { - if (_definitionBuilder.IsBiState) { - if (_state == null || _state == JsValue.Undefined) - _state = new JsArray(_engine, new[] - { - JsValue.Undefined, JsValue.Undefined - }); - - _state.AsArray()[0] = jsValue; - } else { - _state = jsValue; - } - } - - public void LoadShared(string? state) { - _engine.Constraints.Reset(); - if (state != null) { - var jsValue = _parser.Parse(state); - LoadCurrentSharedState(jsValue); - } else { - LoadCurrentSharedState(JsValue.Null); - } - } - - private void LoadCurrentSharedState(JsValue jsValue) { - if (_definitionBuilder.IsBiState) { - if (_state == null || _state == JsValue.Undefined) - _state = new JsArray(_engine, new[] - { - JsValue.Undefined, JsValue.Undefined, - }); - - _state.AsArray()[1] = jsValue; - } else { - _state = jsValue; - } - } - - public void Initialize() { - _engine.Constraints.Reset(); - var state = _interpreterRuntime.InitializeState(); - LoadCurrentState(state); - - } - - public void InitializeShared() { - _engine.Constraints.Reset(); - _sharedState = _interpreterRuntime.InitializeSharedState(); - LoadCurrentSharedState(_sharedState); - } - - public string? GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - _currentPosition = eventPosition; - _engine.Constraints.Reset(); - var envelope = CreateEnvelope("", data, category); - var partition = _interpreterRuntime.GetPartition(envelope); - if (partition == JsValue.Null || partition == JsValue.Undefined || !(partition.IsString() || partition.IsNumber())) - return null; - - return partition.IsNumber() ? partition.AsNumber().ToString() : partition.AsString(); - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent @event, - out EmittedEventEnvelope[]? emittedEvents) { - _engine.Constraints.Reset(); - _currentPosition = createPosition; - var envelope = CreateEnvelope(partition, @event, ""); - _interpreterRuntime.HandleCreated(_state, envelope); - - emittedEvents = _emitted.Count > 0 ? _emitted.ToArray() : null; - _emitted.Clear(); - return true; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string? newState) { - _engine.Constraints.Reset(); - _currentPosition = deletePosition; - - _interpreterRuntime.HandleDeleted(_state, partition, false); - newState = ConvertToStringHandlingNulls(_state); - return true; - } - - public string? TransformStateToResult() { - _engine.Constraints.Reset(); - var result = _interpreterRuntime.TransformStateToResult(_state); - if (result == JsValue.Null || result == JsValue.Undefined) - return null; - return Serialize(result); - } - - public bool ProcessEvent(string partition, CheckpointTag eventPosition, string category, ResolvedEvent @event, - out string? newState, out string? newSharedState, out EmittedEventEnvelope[]? emittedEvents) { - _currentPosition = eventPosition; - _engine.Constraints.Reset(); - if ((@event.IsJson && string.IsNullOrWhiteSpace(@event.Data)) || - (!_enableContentTypeValidation && !@event.IsJson && string.IsNullOrEmpty(@event.Data))) { - PrepareOutput(out newState, out newSharedState, out emittedEvents); - return true; - } - - var envelope = CreateEnvelope(partition, @event, category); - _state = _interpreterRuntime.Handle(_state, envelope); - PrepareOutput(out newState, out newSharedState, out emittedEvents); - return true; - } - - private void PrepareOutput(out string? newState, out string? newSharedState, out EmittedEventEnvelope[]? emittedEvents) { - emittedEvents = _emitted.Count > 0 ? _emitted.ToArray() : null; - _emitted.Clear(); - if (_definitionBuilder.IsBiState && _state.IsArray()) { - var arr = _state.AsArray(); - if (arr.TryGetValue(0, out var state)) { - if (_state.IsString()) { - newState = _state.AsString(); - } else { - newState = ConvertToStringHandlingNulls(state); - } - } else { - newState = ""; - } - - if (arr.TryGetValue(1, out var sharedState)) { - newSharedState = ConvertToStringHandlingNulls(sharedState); - } else { - newSharedState = null; - } - - } else if (_state.IsString()) { - newState = _state.AsString(); - newSharedState = null; - } else { - newState = ConvertToStringHandlingNulls(_state); - newSharedState = null; - } - } - - private string? ConvertToStringHandlingNulls(JsValue value) { - if (value.IsNull() || value.IsUndefined()) - return null; - return Serialize(value); - } - - JsValue Emit(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length < 3) - throw new ArgumentException("invalid number of parameters"); - - string stream = EnsureNonNullStringValue(parameters.At(0), "streamId"); - var eventType = EnsureNonNullStringValue(parameters.At(1), "eventName"); - var eventBody = EnsureNonNullObjectValue(parameters.At(2), "eventBody"); - - if (parameters.Length == 4 && !parameters.At(3).IsObject()) -#pragma warning disable CA2208 // ReSharper disable once NotResolvedInText - throw new ArgumentException("object expected", "metadata"); -#pragma warning restore CA2208 - - var data = Serialize(eventBody); - ExtraMetaData? metadata = null; - if (parameters.Length == 4) { - var md = parameters.At(3).AsObject(); - var d = new Dictionary(); - foreach (var kvp in md.GetOwnProperties()) { - if (kvp.Value.Value.Type is Types.Empty or Types.Undefined) - continue; - d.Add(kvp.Key.AsString(), Serialize(kvp.Value.Value)); - } - - metadata = new ExtraMetaData(d); - } - _emitted.Add(new EmittedEventEnvelope(new EmittedDataEvent(stream, Guid.NewGuid(), eventType, true, data, metadata, _currentPosition, null))); - return JsValue.Undefined; - } - - private static ObjectInstance EnsureNonNullObjectValue(JsValue parameter, string parameterName) { - if (parameter == JsValue.Null || parameter == JsValue.Undefined) - throw new ArgumentNullException(parameterName); - if (!parameter.IsObject()) - throw new ArgumentException("object expected", parameterName); - return parameter.AsObject(); - } - - private static string EnsureNonNullStringValue(JsValue parameter, string parameterName) { - if (parameter != JsValue.Null && - parameter.IsString() && - (parameter.AsString() is { } value && - !string.IsNullOrWhiteSpace(value))) - return value; - - if (parameter == JsValue.Null || parameter == JsValue.Undefined || parameter.IsString()) - throw new ArgumentNullException(parameterName); - - throw new ArgumentException("string expected", parameterName); - } - - string? AsString(JsValue? value, bool formatForRaw) { - return value switch { - JsBoolean b => b.AsBoolean() ? "true" : "false", - JsString s => formatForRaw ? $"\"{s.AsString()}\"" : s.AsString(), - JsNumber n => n.AsNumber().ToString(CultureInfo.InvariantCulture), - JsNull => null, - JsUndefined => null, { } v => Serialize(value), - _ => null - }; - } - - JsValue LinkTo(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length != 2 && parameters.Length != 3) - throw new ArgumentException("wrong number of parameters"); - var stream = EnsureNonNullStringValue(parameters.At(0), "streamId"); - var @event = EnsureNonNullObjectValue(parameters.At(1), "event"); - - if (!@event.TryGetValue("sequenceNumber", out var numberValue) | !@event.TryGetValue("streamId", out var sourceValue) || !numberValue.IsNumber() - || !sourceValue.IsString()) { - throw new Exception($"Invalid link to event {numberValue}@{sourceValue}"); - } - - var number = (long)numberValue.AsNumber(); - var source = sourceValue.AsString(); - ExtraMetaData? metadata = null; - if (parameters.Length == 3) { - var md = EnsureNonNullObjectValue(parameters.At(2), "metaData"); - var d = new Dictionary(); - foreach (var kvp in md.GetOwnProperties()) { - d.Add(kvp.Key.AsString(), AsString(kvp.Value.Value, true)); - } - metadata = new ExtraMetaData(d); - } - - _emitted.Add(new EmittedEventEnvelope( - new EmittedDataEvent(stream, Guid.NewGuid(), SystemEventTypes.LinkTo, false, $"{number}@{source}", metadata, _currentPosition, null))); - return JsValue.Undefined; - } - - JsValue LinkStreamTo(JsValue thisValue, JsValue[] parameters) { - - var stream = EnsureNonNullStringValue(parameters.At(0), "streamId"); - var linkedStreamId = EnsureNonNullStringValue(parameters.At(1), "linkedStreamId"); - if (parameters.Length == 3) { - - } - - ExtraMetaData? metadata = null; - if (parameters.Length == 3) { - var md = parameters.At(4).AsObject(); - var d = new Dictionary(); - foreach (var kvp in md.GetOwnProperties()) { - d.Add(kvp.Key.AsString(), AsString(kvp.Value.Value, true)); - } - metadata = new ExtraMetaData(d); - } - _emitted.Add(new EmittedEventEnvelope( - new EmittedDataEvent(stream, Guid.NewGuid(), SystemEventTypes.StreamReference, false, linkedStreamId, metadata, _currentPosition, null))); - return JsValue.Undefined; - } - - JsValue CopyTo(JsValue thisValue, JsValue[] parameters) { - return JsValue.Undefined; - } - - void Log(string message) { - _logger.Debug(message, Array.Empty()); - } - - private JsValue Log(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length == 0) - return JsValue.Undefined; - if (parameters.Length == 1) { - var p0 = parameters.At(0); - if (p0 != null && p0.IsPrimitive()) - Log(p0.ToString()); - if (p0 is ObjectInstance oi) - Log(Serialize(oi)); - return JsValue.Undefined; - } - - - if (parameters.Length > 1) { - var sb = new StringBuilder(); - for (int i = 0; i < parameters.Length; i++) { - if (i > 1) - sb.Append(" ,"); - var p = parameters.At(i); - if (p != null && p.IsPrimitive()) - Log(p.ToString()); - if (p is ObjectInstance oi) - sb.Append(Serialize(oi)); - } - - Log(sb.ToString()); - } - return JsValue.Undefined; - } - - class TimeConstraint : Constraint { - private readonly TimeSpan _compilationTimeout; - private readonly TimeSpan _executionTimeout; - private TimeSpan _start; - private TimeSpan _timeout; - private bool _executing; - - public TimeConstraint(TimeSpan compilationTimeout, TimeSpan executionTimeout) { - _compilationTimeout = compilationTimeout; - _executionTimeout = executionTimeout; - _timeout = _compilationTimeout; - } - - public void Compiling() { - _timeout = _compilationTimeout; - _executing = false; - } - - public void Executing() { - _timeout = _executionTimeout; - _executing = true; - - } - public override void Reset() { - _start = _sw.Elapsed; - } - - public override void Check() { - if (_sw.Elapsed - _start >= _timeout) { - if (Debugger.IsAttached) - return; - var action = _executing ? "execute" : "compile"; - throw new TimeoutException($"Projection script took too long to {action} (took: {_sw.Elapsed - _start:c}, allowed: {_timeout:c}"); - } - } - } - - class InterpreterRuntime : ObjectInstance { - - private readonly Dictionary _handlers; - private readonly List<(TransformType, ScriptFunction)> _transforms; - private readonly List _createdHandlers; - private ScriptFunction? _init; - private ScriptFunction? _initShared; - private ScriptFunction? _any; - private ScriptFunction? _deleted; - private ScriptFunction? _partitionFunction; - - private readonly JsValue _whenInstance; - private readonly JsValue _partitionByInstance; - private readonly JsValue _outputStateInstance; - private readonly JsValue _foreachStreamInstance; - private readonly JsValue _transformByInstance; - private readonly JsValue _filterByInstance; - private readonly JsValue _outputToInstance; - private readonly JsValue _definesStateTransformInstance; - - private readonly SourceDefinitionBuilder _definitionBuilder; - private readonly JsonParser _parser; - - private static readonly Dictionary> _possibleProperties = new Dictionary>() { - ["when"] = i => i.FastAddProperty("when", i._whenInstance, true, false, true), - ["partitionBy"] = i => i.FastAddProperty("partitionBy", i._partitionByInstance, true, false, true), - ["outputState"] = i => i.FastAddProperty("outputState", i._outputStateInstance, true, false, true), - ["foreachStream"] = i => i.FastAddProperty("foreachStream", i._foreachStreamInstance, true, false, true), - ["transformBy"] = i => i.FastAddProperty("transformBy", i._transformByInstance, true, false, true), - ["filterBy"] = i => i.FastAddProperty("filterBy", i._filterByInstance, true, false, true), - ["outputTo"] = i => i.FastAddProperty("outputTo", i._outputToInstance, true, false, true), - ["$defines_state_transform"] = i => i.FastAddProperty("$defines_state_transform", i._definesStateTransformInstance, true, false, true), - }; - - private static readonly Dictionary _availableProperties = new Dictionary() { - ["fromStream"] = new[] { "when", "partitionBy", "outputState" }, - ["fromAll"] = new[] { "when", "partitionBy", "outputState", "foreachStream" }, - ["fromStreams"] = new[] { "when", "partitionBy", "outputState" }, - ["fromCategory"] = new[] { "when", "partitionBy", "outputState", "foreachStream" }, - ["when"] = new[] { "transformBy", "filterBy", "outputState", "outputTo", "$defines_state_transform" }, - ["foreachStream"] = new[] { "when" }, - ["outputState"] = new[] { "transformBy", "filterBy", "outputTo" }, - ["partitionBy"] = new[] { "when" }, - ["transformBy"] = new[] { "transformBy", "filterBy", "outputState", "outputTo" }, - ["filterBy"] = new[] { "transformBy", "filterBy", "outputState", "outputTo" }, - ["outputTo"] = Array.Empty(), - ["execution"] = Array.Empty() - }; - - private static readonly Dictionary> _setters = - new Dictionary>(StringComparer.OrdinalIgnoreCase) { - {"$includeLinks", (options, value) => options.SetIncludeLinks(value.IsBoolean()? value.AsBoolean() : throw new Exception("Invalid value"))}, - {"reorderEvents", (options, value) => options.SetReorderEvents(value.IsBoolean()? value.AsBoolean(): throw new Exception("Invalid value"))}, - {"processingLag", (options, value) => options.SetProcessingLag(value.IsNumber() ? (int)value.AsNumber() : throw new Exception("Invalid value"))}, - {"resultStreamName", (options, value) => options.SetResultStreamNameOption(value.IsString() ? value.AsString() : throw new Exception("Invalid value"))}, - {"biState", (options, value) => options.SetIsBiState(value.IsBoolean()? value.AsBoolean() : throw new Exception("Invalid value"))}, - }; - - private readonly List _definitionFunctions; - - public InterpreterRuntime(Engine engine, SourceDefinitionBuilder builder) : base(engine) { - - _definitionBuilder = builder; - _handlers = new Dictionary(StringComparer.Ordinal); - _createdHandlers = new List(); - _transforms = new List<(TransformType, ScriptFunction)>(); - _parser = new JsonParser(engine); - _definitionFunctions = new List(); - AddDefinitionFunction("options", SetOptions, 1); - AddDefinitionFunction("fromStream", FromStream, 1); - AddDefinitionFunction("fromCategory", FromCategory, 4); - AddDefinitionFunction("fromCategories", FromCategory, 4); - AddDefinitionFunction("fromAll", FromAll, 0); - AddDefinitionFunction("fromStreams", FromStreams, 1); - AddDefinitionFunction("on_event", OnEvent, 1); - AddDefinitionFunction("on_any", OnAny, 1); - _whenInstance = new ClrFunction(engine, "when", When, 1); - _partitionByInstance = new ClrFunction(engine, "partitionBy", PartitionBy, 1); - _outputStateInstance = new ClrFunction(engine, "outputState", OutputState, 1); - _foreachStreamInstance = new ClrFunction(engine, "foreachStream", ForEachStream, 1); - _transformByInstance = new ClrFunction(engine, "transformBy", TransformBy, 1); - _filterByInstance = new ClrFunction(engine, "filterBy", FilterBy, 1); - _outputToInstance = new ClrFunction(engine, "outputTo", OutputTo, 1); - _definesStateTransformInstance = new ClrFunction(engine, "$defines_state_transform", DefinesStateTransform); - - } - - private void AddDefinitionFunction(string name, Func func, int length) { - _definitionFunctions.Add(name); - _engine.Global.FastAddProperty(name, new ClrFunction(_engine, name, func, length), true, false, true); - } - - private JsValue FromStream(JsValue _, JsValue[] parameters) { - var stream = parameters.At(0); - if (stream is not JsString) - throw new ArgumentException("stream"); - _definitionBuilder.FromStream(stream.AsString()); - RestrictProperties("fromStream"); - - return this; - } - - private JsValue FromCategory(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length == 0) - return this; - if (parameters.Length == 1 && parameters.At(0).IsArray()) { - foreach (var cat in parameters.At(0).AsArray()) { - if (cat is not JsString s) { - throw new ArgumentException("categories"); - } - _definitionBuilder.FromStream($"$ce-{s.AsString()}"); - } - } else if (parameters.Length > 1) { - foreach (var cat in parameters) { - if (cat is not JsString s) { - throw new ArgumentException("categories"); - } - _definitionBuilder.FromStream($"$ce-{s.AsString()}"); - } - } else { - var p0 = parameters.At(0); - if (p0 is not JsString s) - throw new ArgumentException("category"); - _definitionBuilder.FromCategory(s.AsString()); - } - - RestrictProperties("fromCategory"); - - return this; - } - - private JsValue When(JsValue thisValue, JsValue[] parameters) { - if (parameters.At(0) is ObjectInstance handlers) { - foreach (var kvp in handlers.GetOwnProperties()) { - if (kvp.Key.IsString() && kvp.Value.Value is ScriptFunction) { - var key = kvp.Key.AsString(); - AddHandler(key, (ScriptFunction)kvp.Value.Value); - } - } - } - _definitionBuilder.SetDefinesFold(); - RestrictProperties("when"); - return this; - } - - private JsValue PartitionBy(JsValue thisValue, JsValue[] parameters) { - if (parameters.At(0) is ScriptFunction partitionFunction) { - _definitionBuilder.SetByCustomPartitions(); - - - _partitionFunction = partitionFunction; - RestrictProperties("partitionBy"); - return this; - } - - throw new ArgumentException("partitionBy"); - } - - private JsValue ForEachStream(JsValue thisValue, JsValue[] parameters) { - _definitionBuilder.SetByStream(); - RestrictProperties("foreachStream"); - return this; - } - - private JsValue OutputState(JsValue thisValue, JsValue[] parameters) { - RestrictProperties("outputState"); - _definitionBuilder.SetOutputState(); - return this; - } - - private JsValue OutputTo(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length != 1 && parameters.Length != 2) - throw new ArgumentException("invalid number of parameters"); - if (!parameters.At(0).IsString()) -#pragma warning disable CA2208 // ReSharper disable NotResolvedInText - throw new ArgumentException("expected string value", "resultStream"); - if (parameters.Length == 2 && !parameters.At(1).IsString()) - throw new ArgumentException("expected string value", "partitionResultStreamPattern"); -#pragma warning restore CA2208 // ReSharper restore NotResolvedInText - _definitionBuilder.SetResultStreamNameOption(parameters.At(0).AsString()); - if (parameters.Length == 2) - _definitionBuilder.SetPartitionResultStreamNamePatternOption(parameters.At(1).AsString()); - RestrictProperties("outputTo"); - return this; - } - - private JsValue DefinesStateTransform(JsValue thisValue, JsValue[] parameters) { - _definitionBuilder.SetDefinesStateTransform(); - _definitionBuilder.SetOutputState(); - return Undefined; - } - - private JsValue FilterBy(JsValue thisValue, JsValue[] parameters) { - if (parameters.At(0) is ScriptFunction fi) { - _definitionBuilder.SetDefinesStateTransform(); - _definitionBuilder.SetOutputState(); - _transforms.Add((TransformType.Filter, fi)); - RestrictProperties("filterBy"); - return this; - } - - throw new ArgumentException("expected function"); - } - - private JsValue TransformBy(JsValue thisValue, JsValue[] parameters) { - if (parameters.At(0) is ScriptFunction fi) { - _definitionBuilder.SetDefinesStateTransform(); - _definitionBuilder.SetOutputState(); - _transforms.Add((TransformType.Transform, fi)); - RestrictProperties("transformBy"); - return this; - } - - throw new ArgumentException("expected function"); - } - - private JsValue OnEvent(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length != 2) - throw new ArgumentException("invalid number of parameters"); - var eventName = parameters.At(0); - var handler = parameters.At(1); - if (!eventName.IsString()) - throw new ArgumentException("eventName"); - if (handler is not ScriptFunction fi) - throw new ArgumentException("eventHandler"); - AddHandler(eventName.AsString(), fi); - return Undefined; - } - - private JsValue OnAny(JsValue thisValue, JsValue[] parameters) { - if (parameters.Length != 1) - throw new ArgumentException("invalid number of parameters"); - if (parameters.At(0) is not ScriptFunction fi) - throw new ArgumentException("eventHandler"); - AddHandler("$any", fi); - return Undefined; - } - - private void AddHandler(string name, ScriptFunction handler) { - switch (name) { - case "$init": - _init = handler; - break; - case "$initShared": - _definitionBuilder.SetIsBiState(true); - _initShared = handler; - break; - case "$any": - _any = handler; - _definitionBuilder.AllEvents(); - break; - case "$created": - _createdHandlers.Add(handler); - break; - case "$deleted" when !_definitionBuilder.IsBiState: - _definitionBuilder.SetHandlesStreamDeletedNotifications(); - _deleted = handler; - break; - case "$deleted" when _definitionBuilder.IsBiState: - throw new Exception("Cannot handle deletes in bi-state projections"); - default: - _definitionBuilder.NotAllEvents(); - _definitionBuilder.IncludeEvent(name); - _handlers.Add(name, handler); - break; - } - } - - private void RestrictProperties(string state) { - var allowed = _availableProperties[state]; - var current = GetOwnPropertyKeys(); - foreach (var p in current) { - if (!allowed.Contains(p.AsString())) { - RemoveOwnProperty(p); - } - } - - foreach (var p in allowed) { - if (!HasOwnProperty(p)) { - _possibleProperties[p](this); - } - } - } - - public JsValue InitializeState() { - return _init == null ? new JsObject(Engine) : _init.Call(); - } - - public JsValue InitializeSharedState() { - return _initShared == null ? new JsObject(Engine) : _initShared.Call(); - } - - public JsValue Handle(JsValue state, EventEnvelope eventEnvelope) { - JsValue newState; - if (_handlers.TryGetValue(eventEnvelope.EventType, out var handler)) { - newState = handler.Call(state, FromObject(Engine, eventEnvelope)); - } else if (_any != null) { - newState = _any.Call(state, FromObject(Engine, eventEnvelope)); - } else { - newState = eventEnvelope.BodyRaw; - } - return newState == Undefined ? state : newState; - } - - public JsValue TransformStateToResult(JsValue state) { - foreach (var (type, transform) in _transforms) { - switch (type) { - case TransformType.Transform: - state = transform.Call(state); - break; - case TransformType.Filter: { - var result = transform.Call(state); - if (!(result.IsBoolean() && result.AsBoolean()) || result == Null || result == Undefined) { - return Null; - } - break; - } - case TransformType.None: - throw new InvalidOperationException("Unknown transform type"); - } - - if (state == Null || state == Undefined) - return Null; - } - - return state; - } - - JsValue FromAll(JsValue _, JsValue[] __) { - _definitionBuilder.FromAll(); - RestrictProperties("fromAll"); - return this; - } - - JsValue FromStreams(JsValue _, JsValue[] parameters) { - IEnumerator? streams = null; - try { - streams = parameters.At(0).IsArray() ? parameters.At(0).AsArray().GetEnumerator() : parameters.AsEnumerable().GetEnumerator(); - while (streams.MoveNext()) { - if (!streams.Current.IsString()) - throw new ArgumentException("streams"); - _definitionBuilder.FromStream(streams.Current.AsString()); - } - } finally { - streams?.Dispose(); - } - - RestrictProperties("fromStreams"); - return this; - } - - - JsValue SetOptions(JsValue thisValue, JsValue[] parameters) { - var p0 = parameters.At(0); - if (p0 is ObjectInstance opts) { - foreach (var kvp in opts.GetOwnProperties()) { - if (_setters.TryGetValue(kvp.Key.AsString(), out var setter)) { - setter(_definitionBuilder, kvp.Value.Value); - } else { - throw new Exception($"Unrecognized option: {kvp.Key}"); - } - } - } - - return Undefined; - } - - public JsValue GetPartition(EventEnvelope envelope) { - if (_partitionFunction != null) - return _partitionFunction.Call(envelope); - return Null; - } - - public void HandleCreated(JsValue state, EventEnvelope envelope) { - for (int i = 0; i < _createdHandlers.Count; i++) { - _createdHandlers[i].Call(Undefined, new[] { state, envelope }); - } - } - - enum TransformType { - None, - Filter, - Transform - } - - public JsonParser SwitchToExecutionMode() { - RestrictProperties("execution"); - foreach (var globalProp in _definitionFunctions) { - _engine.Global.RemoveOwnProperty(globalProp); - } - return _parser; - } - - - public void HandleDeleted(JsValue state, string partition, bool isSoftDelete) { - if (_deleted != null) { - _deleted.Call(this, new JsValue[] { state, Null, partition, isSoftDelete }); - } - } - } - - EventEnvelope CreateEnvelope(string partition, ResolvedEvent @event, string category) { - var envelope = new EventEnvelope(_engine, _parser, this); - envelope.Partition = partition; - envelope.BodyRaw = @event.Data; - envelope.MetadataRaw = @event.Metadata; - envelope.StreamId = @event.EventStreamId; - envelope.EventId = @event.EventId.ToString("D"); - envelope.EventType = @event.EventType; - envelope.LinkMetadataRaw = @event.PositionMetadata; - envelope.IsJson = @event.IsJson; - envelope.Category = category; - envelope.SequenceNumber = @event.EventSequenceNumber; - return envelope; - } - sealed class EventEnvelope : ObjectInstance { - private readonly JsonParser _parser; - private readonly JintProjectionStateHandler _parent; - - public string StreamId { - set => SetOwnProperty("streamId", new PropertyDescriptor(value, false, true, false)); - } - public long SequenceNumber { - set => SetOwnProperty("sequenceNumber", new PropertyDescriptor(value, false, true, false)); - } - - public string EventType { - get => _parent.AsString(Get("eventType"), false) ?? ""; - set => SetOwnProperty("eventType", new PropertyDescriptor(value, false, true, false)); - } - - public JsValue Body { - get { - if (TryGetValue("body", out var value) && value is ObjectInstance oi) - return oi; - if (EnsureBody(out JsValue objectInstance)) - return objectInstance; - - return Undefined; - } - } - - private bool EnsureBody(out JsValue objectInstance) { - if (IsJson && TryGetValue("bodyRaw", out var raw) && raw is not JsUndefined) { - var body = raw.IsNull() ? raw : _parser.Parse(raw.AsString()); - var pd = new PropertyDescriptor(body, false, true, false); - SetOwnProperty("body", pd); - SetOwnProperty("data", pd); - objectInstance = (ObjectInstance)body; - return true; - } - - objectInstance = Undefined; - return false; - } - - public bool IsJson { - get => Get("isJson").AsBoolean(); - set => SetOwnProperty("isJson", new PropertyDescriptor(value, false, true, false)); - } - - public string? BodyRaw { - get => _parent.AsString(Get("bodyRaw"), false); - set => SetOwnProperty("bodyRaw", new PropertyDescriptor(value, false, true, false)); - } - - private JsValue Metadata { - get { - if (TryGetValue("metadata", out var value) && value is ObjectInstance oi) - return oi; - if (EnsureMetadata(out value)) - return value; - - return Undefined; - } - } - - private bool EnsureMetadata(out JsValue value) { - if (TryGetValue("metadataRaw", out var raw) && raw is not JsUndefined) { - var metadata = raw.IsNull() ? raw : _parser.Parse(raw.AsString()); - SetOwnProperty("metadata", new PropertyDescriptor(metadata, false, true, false)); - { - value = metadata; - return true; - } - } - - value = Undefined; - return false; - } - - public string MetadataRaw { - set => FastSetProperty("metadataRaw", new PropertyDescriptor(value, false, true, false)); - } - - private JsValue LinkMetadata { - get { - if (TryGetValue("linkMetadata", out var value) && value is ObjectInstance oi) - return oi; - if (EnsureLinkMetadata(out value)) - return value; - - return Undefined; - } - } - - private bool EnsureLinkMetadata(out JsValue value) { - if (TryGetValue("linkMetadataRaw", out var raw) && raw is not JsUndefined) { - var metadata = raw.IsNull() ? raw : _parser.Parse(raw.AsString()); - SetOwnProperty("linkMetadata", new PropertyDescriptor(metadata, false, true, false)); - { - value = metadata; - return true; - } - } - - value = Undefined; - return false; - } - - public string LinkMetadataRaw { - set => SetOwnProperty("linkMetadataRaw", new PropertyDescriptor(value, false, true, false)); - } - - public string Partition { - set => SetOwnProperty("partition", new PropertyDescriptor(value, false, true, false)); - } - - public string Category { - set => SetOwnProperty("category", new PropertyDescriptor(value, false, true, false)); - } - - public string EventId { - set => SetOwnProperty("eventId", new PropertyDescriptor(value, false, true, false)); - } - - public EventEnvelope(Engine engine, JsonParser parser, JintProjectionStateHandler parent) : base(engine) { - _parser = parser; - _parent = parent; - } - - public override JsValue Get(JsValue property, JsValue receiver) { - if (property == "body" || property == "data") { - return Body; - } - - if (property == "metadata") { - return Metadata; - } - - if (property == "linkMetadata") { - return LinkMetadata; - } - return base.Get(property, receiver); - } - - public override List GetOwnPropertyKeys(Types types = Types.String | Types.Symbol) { - var list = base.GetOwnPropertyKeys(types); - return list; - } - - public override IEnumerable> GetOwnProperties() { - if (!HasOwnProperty("body")) { - EnsureBody(out _); - } - - if (!HasOwnProperty("metadata")) { - EnsureMetadata(out _); - } - - if (!HasOwnProperty("linkMetadata")) { - EnsureLinkMetadata(out _); - } - - var list = base.GetOwnProperties(); - - return list; - } - } - - private readonly Serializer _serializer = new Serializer(); - public string Serialize(JsValue value) { - var serialized = _serializer.Serialize(value); - return Encoding.UTF8.GetString(serialized.Span); - } - - private class Serializer { - private readonly WriteState[] _iterators; - private readonly ArrayBufferWriter _bufferWriter; - private readonly Utf8JsonWriter _writer; - private readonly Dictionary _knownPropertyNames; - private int _depth; - - public Serializer() { - _iterators = new WriteState[64]; - _bufferWriter = new ArrayBufferWriter(1024 * 1024); - _writer = new Utf8JsonWriter( - _bufferWriter, - new JsonWriterOptions { - Indented = false, - SkipValidation = true, - Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); - _knownPropertyNames = new Dictionary(); - } - - public ReadOnlyMemory Serialize(JsValue value) { - _depth = 0; - _bufferWriter.Clear(); - _writer.Reset(); - - if (value is JsArray array) { - _iterators[_depth] = new WriteState(array); - } else if (value is ObjectInstance oi) { - _iterators[_depth] = new WriteState(oi); - } else { - _iterators[_depth] = new WriteState(value); - } - ref var current = ref _iterators[0]; - - while (current.Write(_writer, ref _depth, _iterators, _knownPropertyNames)) { - current = ref _iterators[_depth]; - } - _writer.Flush(); - return _bufferWriter.WrittenMemory; - - } - - struct WriteState { - private enum Type { - Complete, - Array, - Object, - Primitive, - } - - private static readonly IEnumerator> _emptyIterator = - new NoopIterator(); - - class NoopIterator : IEnumerator> { - public KeyValuePair Current => default; - - object? IEnumerator.Current => default; - - public void Dispose() { - } - - public bool MoveNext() { - return false; - } - - public void Reset() { - } - } - - public WriteState(JsArray instance) { - _position = -1; - _length = (int)instance.Length; - _instance = instance; - _type = Type.Array; - _started = false; - _iterator = _emptyIterator; - } - - public WriteState(ObjectInstance instance) { - _position = -1; - _length = -1; - _instance = JsValue.Null; - _type = Type.Object; - _started = false; - _iterator = instance.GetOwnProperties().GetEnumerator(); - } - - public WriteState(JsValue instance) { - if (instance.Type == Types.Object) - throw new ArgumentException("Primitive overload called for object instance"); - _position = -1; - _length = -1; - _instance = instance; - _type = Type.Primitive; - _started = false; - _iterator = _emptyIterator; - } - - private readonly JsValue _instance; - private readonly IEnumerator> _iterator; - private readonly Type _type; - private readonly int _length; - private int _position; - private bool _started; - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public bool Write( - Utf8JsonWriter writer, - ref int depth, - WriteState[] writeStates, - Dictionary knownPropertyNames) { - - switch (_type) { - case Type.Array: - if (_position == -1) { - writer.WriteStartArray(); - _position++; - } - var instance = (JsArray)_instance; - for (; _position < _length; _position++) { - var value = instance[(uint)_position]; - if (value.Type == Types.Object) { - if (value is JsArray ai) { - writeStates[++depth] = new WriteState(ai); - } else { - writeStates[++depth] = new WriteState(value.AsObject()); - } - _position++; - return true; - } - SerializePrimitive(value, writer); - } - writer.WriteEndArray(); - break; - case Type.Object: - if (!_started) { - writer.WriteStartObject(); - _started = true; - } - while (_iterator.MoveNext()) { - var (name, propertyDescriptor) = _iterator.Current; - var value = propertyDescriptor.Value; - if (value.Type == Types.Undefined) - continue; - - WriteMaybeCachedPropertyName(name.AsString(), knownPropertyNames, writer); - if (value.Type == Types.Object) { - if (value is JsArray ai) { - writeStates[++depth] = new WriteState(ai); - } else { - writeStates[++depth] = new WriteState(value.AsObject()); - } - _position++; - return true; - } else { - SerializePrimitive(value, writer); - } - - } - - writer.WriteEndObject(); - break; - case Type.Primitive: - SerializePrimitive(_instance, writer); - break; - } - writeStates[depth] = default; - depth--; - return depth >= 0; - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - private static void WriteMaybeCachedPropertyName(string name, Dictionary knownPropertyNames, Utf8JsonWriter writer) { - if (!knownPropertyNames.TryGetValue(name, out var propertyName)) { - propertyName = JsonEncodedText.Encode(name); - if (knownPropertyNames.Count < 1000) { - knownPropertyNames.Add(name, propertyName); - } - } - writer.WritePropertyName(propertyName); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - static void SerializePrimitive(JsValue value, Utf8JsonWriter writer) { - - switch (value.Type) { - case Types.Null: - case Types.Undefined: - case Types.Empty: - writer.WriteNullValue(); - break; - case Types.Boolean: - if (ReferenceEquals(value, JsBoolean.False)) - writer.WriteBooleanValue(false); - else - writer.WriteBooleanValue(true); - break; - case Types.Number: - writer.WriteNumberValue(value.AsNumber()); - break; - case Types.BigInt: - writer.WriteStringValue(value.ToString()); - break; - case Types.String: - writer.WriteStringValue(value.AsString()); - break; - default: - throw new Exception($"Cannot serialize {value.Type} as primitive"); - } - } - } - } -} - -internal static class ObjectInstanceExtensions { - public static void FastAddProperty(this ObjectInstance target, string name, JsValue value, bool writable, bool enumerable, bool configurable) { - target.FastSetProperty(name, new PropertyDescriptor(value, writable, enumerable, configurable)); - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjection.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjection.cs deleted file mode 100644 index 1b10dacb4..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjection.cs +++ /dev/null @@ -1,1113 +0,0 @@ -using System; -using System.Linq; -using System.Security.Claims; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management.ManagedProjectionStates; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Utils; -using ReadStreamResult = EventStore.Core.Data.ReadStreamResult; -using System.Threading; -using EventStore.Core; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Services.Processing.Emitting; -using FastSerialization; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Management { - - public static class PersistedStateExtensions { - public static Boolean CheckpointStreamNeedsDeleted(this ManagedProjection.PersistedState persistedState) { - return persistedState.DeleteCheckpointStream && persistedState.CheckpointsDisabled.GetValueOrDefault() == false; - } - - public static Boolean EmitStreamNeedsDeleted(this ManagedProjection.PersistedState persistedState) { - return (persistedState.DeleteEmittedStreams && persistedState.EmitEnabled.GetValueOrDefault()); - } - } - - /// - /// managed projection controls start/stop/create/update/delete lifecycle of the projection. - /// - public class ManagedProjection : IDisposable { - public class PersistedState { - public string HandlerType { get; set; } - public string Query { get; set; } - public ProjectionMode Mode { get; set; } - public bool Enabled { get; set; } - public bool Deleted { get; set; } - public bool Deleting { get; set; } - public bool DeleteEmittedStreams { get; set; } - public bool DeleteCheckpointStream { get; set; } - public bool DeleteStateStream { get; set; } - public int NumberOfPrequisitesMetForDeletion; - public string Message { get; set; } - - public ProjectionSourceDefinition SourceDefinition { get; set; } - public bool? EmitEnabled { get; set; } - public bool? CreateTempStreams { get; set; } - public bool? CheckpointsDisabled { get; set; } - public bool? TrackEmittedStreams { get; set; } - public long? Epoch { get; set; } - public long? Version { get; set; } - public SerializedRunAs RunAs { get; set; } - public int CheckpointHandledThreshold { get; set; } - public int CheckpointAfterMs { get; set; } - public int CheckpointUnhandledBytesThreshold { get; set; } - public int PendingEventsThreshold { get; set; } - public int MaxWriteBatchLength { get; set; } - public int MaxAllowedWritesInFlight { get; set; } - public int? ProjectionSubsystemVersion { get; set; } - - public int? ProjectionExecutionTimeout { get; set; } - - public PersistedState() { - CheckpointHandledThreshold = ProjectionConsts.CheckpointHandledThreshold; - CheckpointAfterMs = (int)ProjectionConsts.CheckpointAfterMs.TotalMilliseconds; - CheckpointUnhandledBytesThreshold = ProjectionConsts.CheckpointUnhandledBytesThreshold; - PendingEventsThreshold = ProjectionConsts.PendingEventsThreshold; - MaxWriteBatchLength = ProjectionConsts.MaxWriteBatchLength; - MaxAllowedWritesInFlight = ProjectionConsts.MaxAllowedWritesInFlight; - } - } - - private readonly IPublisher _output; - - private readonly RequestResponseDispatcher - _streamDispatcher; - - private readonly RequestResponseDispatcher - _writeDispatcher; - - private readonly ReadDispatcher _readDispatcher; - - private readonly - RequestResponseDispatcher - - _getStateDispatcher; - - private readonly - RequestResponseDispatcher - - _getResultDispatcher; - - - private readonly Serilog.ILogger _logger; - private readonly ITimeProvider _timeProvider; - private readonly Guid _workerId; - private readonly Guid _id; - private readonly long _projectionId; - private readonly string _name; - private readonly bool _enabledToRun; - private ManagedProjectionState _state; - internal PersistedState PersistedProjectionState = new PersistedState(); - - private bool _persistedStateLoaded = false; - - private string _faultedReason; - - private ProjectionStatistics _lastReceivedStatistics; - private DateTime _lastAccessed; - private long _lastWrittenVersion = -1; - - private ClaimsPrincipal _runAs; - internal bool Prepared; - internal bool Created; - private bool _pendingWritePersistedState; - private readonly TimeSpan _projectionsQueryExpiry; - - private ManagedProjectionStateBase _stateHandler; - private IEnvelope _lastReplyEnvelope; - private bool _writing; - private IODispatcher _ioDispatcher; - private ProjectionConfig _projectionConfig; - private IEmittedStreamsDeleter _emittedStreamsDeleter; - - public ManagedProjection( - Guid workerId, - Guid id, - long projectionId, - string name, - bool enabledToRun, - ILogger logger, - RequestResponseDispatcher streamDispatcher, - RequestResponseDispatcher writeDispatcher, - ReadDispatcher readDispatcher, - IPublisher output, - ITimeProvider timeProvider, - RequestResponseDispatcher - getStateDispatcher, - RequestResponseDispatcher - - getResultDispatcher, - IODispatcher ioDispatcher, - TimeSpan projectionQueryExpiry) { - if (id == Guid.Empty) throw new ArgumentException("id"); - if (name == null) throw new ArgumentNullException("name"); - if (output == null) throw new ArgumentNullException("output"); - if (getStateDispatcher == null) throw new ArgumentNullException("getStateDispatcher"); - if (getResultDispatcher == null) throw new ArgumentNullException("getResultDispatcher"); - if (name == "") throw new ArgumentException("name"); - _workerId = workerId; - _id = id; - _projectionId = projectionId; - _name = name; - _enabledToRun = enabledToRun; - _logger = logger ?? Serilog.Log.ForContext(); - _streamDispatcher = streamDispatcher; - _writeDispatcher = writeDispatcher; - _readDispatcher = readDispatcher; - _output = output; - _timeProvider = timeProvider; - _getStateDispatcher = getStateDispatcher; - _getResultDispatcher = getResultDispatcher; - _lastAccessed = _timeProvider.UtcNow; - _ioDispatcher = ioDispatcher; - _projectionsQueryExpiry = projectionQueryExpiry; - } - - private string HandlerType { - get { return PersistedProjectionState.HandlerType; } - } - - private string Query { - get { return PersistedProjectionState.Query; } - } - - private bool Enabled { - get { return PersistedProjectionState.Enabled; } - set { PersistedProjectionState.Enabled = value; } - } - - private bool IsMultiStream { - get { - return PersistedProjectionState.SourceDefinition != null && - PersistedProjectionState.SourceDefinition.Streams != null && - PersistedProjectionState.SourceDefinition.Streams.Length > 1; - } - } - - public bool Deleted { - get { return PersistedProjectionState.Deleted; } - private set { PersistedProjectionState.Deleted = value; } - } - - public bool Deleting { - get { return PersistedProjectionState.Deleting; } - private set { PersistedProjectionState.Deleting = value; } - } - - public Guid Id { - get { return _id; } - } - - public ProjectionMode Mode { - get { return PersistedProjectionState.Mode; } - } - - public ClaimsPrincipal RunAs { - get { return _runAs; } - } - - public bool EnableContentTypeValidation { - get { - return PersistedProjectionState.ProjectionSubsystemVersion >= - ProjectionsSubsystem.CONTENT_TYPE_VALIDATION_VERSION; - } - } - - internal void SetState(ManagedProjectionState value) { - _state = value; - switch (value) { - case ManagedProjectionState.Aborted: - _stateHandler = new AbortedState(this); - break; - case ManagedProjectionState.Aborting: - _stateHandler = new AbortingState(this); - break; - case ManagedProjectionState.Completed: - _stateHandler = new CompletedState(this); - break; - case ManagedProjectionState.Creating: - case ManagedProjectionState.Loading: - case ManagedProjectionState.Loaded: - _stateHandler = new CreatingLoadingLoadedState(this); - break; - case ManagedProjectionState.Faulted: - _stateHandler = new FaultedState(this); - break; - case ManagedProjectionState.LoadingStopped: - _stateHandler = new LoadingStateState(this); - break; - case ManagedProjectionState.Prepared: - _stateHandler = new PreparedState(this); - break; - case ManagedProjectionState.Preparing: - _stateHandler = new PreparingState(this); - break; - case ManagedProjectionState.Running: - _stateHandler = new RunningState(this); - break; - case ManagedProjectionState.Starting: - _stateHandler = new StartingState(this); - break; - case ManagedProjectionState.Stopped: - _stateHandler = new StoppedState(this); - break; - case ManagedProjectionState.Stopping: - _stateHandler = new StoppingState(this); - break; - case ManagedProjectionState.Deleting: - _stateHandler = new DeletingState(this); - break; - default: - throw InvalidProjectionState(value); - } - } - - public void Dispose() { - DisposeCoreProjection(); - } - - public ProjectionStatistics GetStatistics() { - ProjectionStatistics status; - if (_lastReceivedStatistics == null) { - status = new ProjectionStatistics { - Name = _name, - ProjectionId = _projectionId, - Epoch = -1, - Version = -1, - Mode = Mode, - Status = _state.EnumValueName(), - LeaderStatus = _state - }; - } else { - status = _lastReceivedStatistics.Clone(); - status.Mode = Mode; - status.Name = _name; - status.ProjectionId = _projectionId; - var enabledSuffix = - ((_state == ManagedProjectionState.Stopped || _state == ManagedProjectionState.Faulted) && Enabled - ? " (Enabled)" - : ""); - status.Status = (status.Status == "Stopped" && _state == ManagedProjectionState.Completed - ? _state.EnumValueName() - : (!status.Status.StartsWith(_state.EnumValueName()) - ? _state.EnumValueName() + "/" + status.Status - : status.Status)) + enabledSuffix; - status.LeaderStatus = _state; - } - - if (_state == ManagedProjectionState.Faulted) - status.StateReason = _faultedReason; - status.Enabled = Enabled; - return status; - } - - public void Handle(ProjectionManagementMessage.Command.GetState message) { - _lastAccessed = _timeProvider.UtcNow; - if (_state >= ManagedProjectionState.Running) { - _getStateDispatcher.Publish( - new CoreProjectionManagementMessage.GetState(Guid.NewGuid(), Id, message.Partition, _workerId), - m => - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionState(_name, m.Partition, m.State, m.Position))); - } else { - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionState( - message.Name, message.Partition, "", position: null)); - } - } - - public void Handle(ProjectionManagementMessage.Command.GetResult message) { - _lastAccessed = _timeProvider.UtcNow; - if (_state >= ManagedProjectionState.Running) { - _getResultDispatcher.Publish( - new CoreProjectionManagementMessage.GetResult(Guid.NewGuid(), Id, message.Partition, _workerId), - m => - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionResult(_name, m.Partition, m.Result, - m.Position))); - } else { - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionResult( - message.Name, message.Partition, "", position: null)); - } - } - - public void Handle(ProjectionManagementMessage.Command.GetQuery message) { - _lastAccessed = _timeProvider.UtcNow; - - var emitEnabled = PersistedProjectionState.EmitEnabled ?? false; - - var projectionOutputConfig = new ProjectionOutputConfig { - ResultStreamName = - PersistedProjectionState.SourceDefinition == null - ? "" - : new ProjectionNamesBuilder(_name, PersistedProjectionState.SourceDefinition) - .GetResultStreamName() - }; - - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionQuery( - _name, - Query, - emitEnabled, - PersistedProjectionState.Mode.ToString(), - PersistedProjectionState.TrackEmittedStreams, - !PersistedProjectionState.CheckpointsDisabled, - PersistedProjectionState.SourceDefinition, - projectionOutputConfig)); - } - - public void Handle(ProjectionManagementMessage.Command.UpdateQuery message) { - _lastAccessed = _timeProvider.UtcNow; - - Prepared = false; - UpdateQuery(message); - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Command.Disable message) { - _lastAccessed = _timeProvider.UtcNow; - SetLastReplyEnvelope(message.Envelope); - Disable(); - UpdateProjectionVersion(); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Command.Abort message) { - _lastAccessed = _timeProvider.UtcNow; - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - Disable(); - Abort(); - } - - public void Handle(ProjectionManagementMessage.Command.Enable message) { - _lastAccessed = _timeProvider.UtcNow; - if (Enabled - && !(_state == ManagedProjectionState.Completed || _state == ManagedProjectionState.Faulted - || _state == ManagedProjectionState.Aborted || - _state == ManagedProjectionState.Loaded - || _state == ManagedProjectionState.Prepared || - _state == ManagedProjectionState.Stopped)) { - //Projection is probably Running - message.Envelope.ReplyWith(new ProjectionManagementMessage.Updated(message.Name)); - return; - } - - Enable(); - _pendingWritePersistedState = true; - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Command.SetRunAs message) { - _lastAccessed = _timeProvider.UtcNow; - Prepared = false; - SetRunAs(message); - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Command.Delete message) { - if ((_state != ManagedProjectionState.Stopped && _state != ManagedProjectionState.Faulted) && - Mode != ProjectionMode.Transient) - throw new InvalidOperationException("Cannot delete a projection that hasn't been stopped or faulted."); - _lastAccessed = _timeProvider.UtcNow; - - PersistedProjectionState.DeleteCheckpointStream = message.DeleteCheckpointStream; - PersistedProjectionState.DeleteStateStream = message.DeleteStateStream; - PersistedProjectionState.DeleteEmittedStreams = message.DeleteEmittedStreams; - - if (PersistedProjectionState.CheckpointStreamNeedsDeleted()) { - PersistedProjectionState.NumberOfPrequisitesMetForDeletion++; - } - - if ((PersistedProjectionState.EmitEnabled ?? false) && - ((PersistedProjectionState.TrackEmittedStreams ?? false) && - PersistedProjectionState.DeleteEmittedStreams)) { - PersistedProjectionState.NumberOfPrequisitesMetForDeletion++; - } - - if ((PersistedProjectionState.EmitEnabled ?? false) && IsMultiStream) { - PersistedProjectionState.NumberOfPrequisitesMetForDeletion++; - } - - Delete(); - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - SetState(ManagedProjectionState.Deleting); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Command.GetConfig message) { - _lastAccessed = _timeProvider.UtcNow; - - var emitEnabled = PersistedProjectionState.EmitEnabled ?? false; - var trackEmittedStreams = PersistedProjectionState.TrackEmittedStreams ?? false; - - message.Envelope.ReplyWith( - new ProjectionManagementMessage.ProjectionConfig(emitEnabled, trackEmittedStreams, - PersistedProjectionState.CheckpointAfterMs, - PersistedProjectionState.CheckpointHandledThreshold, - PersistedProjectionState.CheckpointUnhandledBytesThreshold, - PersistedProjectionState.PendingEventsThreshold, - PersistedProjectionState.MaxWriteBatchLength, - PersistedProjectionState.MaxAllowedWritesInFlight, - PersistedProjectionState.ProjectionExecutionTimeout)); - } - - public void Handle(ProjectionManagementMessage.Command.UpdateConfig message) { - if ((_state != ManagedProjectionState.Stopped && _state != ManagedProjectionState.Faulted) && - Mode != ProjectionMode.Transient) - throw new InvalidOperationException( - "Cannot update the config of a projection that hasn't been stopped or faulted."); - _lastAccessed = _timeProvider.UtcNow; - - PersistedProjectionState.EmitEnabled = message.EmitEnabled; - PersistedProjectionState.TrackEmittedStreams = message.TrackEmittedStreams; - PersistedProjectionState.CheckpointAfterMs = message.CheckpointAfterMs; - PersistedProjectionState.CheckpointHandledThreshold = message.CheckpointHandledThreshold; - PersistedProjectionState.CheckpointUnhandledBytesThreshold = message.CheckpointUnhandledBytesThreshold; - PersistedProjectionState.PendingEventsThreshold = message.PendingEventsThreshold; - PersistedProjectionState.MaxWriteBatchLength = message.MaxWriteBatchLength; - PersistedProjectionState.MaxAllowedWritesInFlight = message.MaxAllowedWritesInFlight; - PersistedProjectionState.ProjectionExecutionTimeout = message.ProjectionExecutionTimeout; - - UpdateProjectionVersion(); - _pendingWritePersistedState = true; - WritePersistedState(CreatePersistedStateEvent(Guid.NewGuid(), PersistedProjectionState, - ProjectionNamesBuilder.ProjectionsStreamPrefix + _name)); - - message.Envelope.ReplyWith(new ProjectionManagementMessage.Updated(message.Name)); - } - - public void DeleteProjectionStreams() { - var sourceDefinition = PersistedProjectionState.SourceDefinition ?? new ProjectionSourceDefinition(); - var projectionNamesBuilder = new ProjectionNamesBuilder(_name, sourceDefinition); - - if (PersistedProjectionState.EmitStreamNeedsDeleted() && IsMultiStream) { - DeleteStream(projectionNamesBuilder.GetOrderStreamName(), DeleteIfConditionsAreMet); - } - - if(PersistedProjectionState.CheckpointStreamNeedsDeleted()){ - DeleteStream(projectionNamesBuilder.MakeCheckpointStreamName(), DeleteIfConditionsAreMet); - } - - if (PersistedProjectionState.EmitStreamNeedsDeleted()) { - if (_emittedStreamsDeleter == null) { - _emittedStreamsDeleter = new EmittedStreamsDeleter(_ioDispatcher, projectionNamesBuilder.GetEmittedStreamsName(), projectionNamesBuilder.GetEmittedStreamsCheckpointName()); - } - - _emittedStreamsDeleter.DeleteEmittedStreams(DeleteIfConditionsAreMet); - } - - if (!PersistedProjectionState.CheckpointStreamNeedsDeleted() && - !PersistedProjectionState.EmitStreamNeedsDeleted()) { - DeleteIfConditionsAreMet(); - } - } - - private void DeleteIfConditionsAreMet() { - if (Interlocked.Decrement(ref PersistedProjectionState.NumberOfPrequisitesMetForDeletion) <= 0) { - Deleted = true; - Deleting = false; - Reply(); - } - } - - public void Handle(ProjectionManagementMessage.Command.Reset message) { - _lastAccessed = _timeProvider.UtcNow; - Prepared = false; - _pendingWritePersistedState = true; - Reset(); - UpdateProjectionVersion(); - SetLastReplyEnvelope(message.Envelope); - StopUnlessPreparedOrLoaded(); - } - - public void Handle(ProjectionManagementMessage.Internal.CleanupExpired message) { - if (IsExpiredProjection()) { - if (_state == ManagedProjectionState.Creating) { - // NOTE: workaround for stop not working on creating state (just ignore them) - return; - } - - _logger.Warning( - "Transient projection {projection} has expired and will be deleted. Last accessed at {lastAccessed}", - _name, _lastAccessed); - Handle( - new ProjectionManagementMessage.Command.Delete( - new NoopEnvelope(), - _name, - ProjectionManagementMessage.RunAs.System, - false, - false, - false)); - } - } - - public void Handle(CoreProjectionStatusMessage.Started message) { - _stateHandler.Started(); - } - - public void Handle(CoreProjectionStatusMessage.Stopped message) { - _stateHandler.Stopped(message); - if (Deleting) { - SetState(ManagedProjectionState.Deleting); - } - } - - public void Handle(CoreProjectionStatusMessage.Faulted message) { - _stateHandler.Faulted(message); - } - - public void Handle(CoreProjectionStatusMessage.Prepared message) { - _stateHandler.Prepared(message); - } - - public void Handle(CoreProjectionStatusMessage.StatisticsReport message) { - _lastReceivedStatistics = message.Statistics; - } - - private void SetRunAs(ProjectionManagementMessage.Command.SetRunAs message) { - PersistedProjectionState.RunAs = - message.Action == ProjectionManagementMessage.Command.SetRunAs.SetRemove.Set - ? SerializedRunAs.SerializePrincipal(message.RunAs) - : null; - _runAs = SerializedRunAs.DeserializePrincipal(PersistedProjectionState.RunAs); - _pendingWritePersistedState = true; - } - - private void SetLastReplyEnvelope(IEnvelope envelope) { - if (_lastReplyEnvelope != null) - _lastReplyEnvelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed("Aborted by subsequent operation")); - _lastReplyEnvelope = envelope; - } - - private void Reset() { - UpdateProjectionVersion(force: true); - PersistedProjectionState.Epoch = PersistedProjectionState.Version; - } - - private bool IsExpiredProjection() { - return Mode == ProjectionMode.Transient && - _lastAccessed.Add(_projectionsQueryExpiry) < _timeProvider.UtcNow && _persistedStateLoaded; - } - - public void InitializeNew(PersistedState persistedState, IEnvelope replyEnvelope) { - LoadPersistedState(persistedState); - UpdateProjectionVersion(); - _pendingWritePersistedState = true; - SetLastReplyEnvelope(replyEnvelope); - PrepareOrWriteStartOrLoadStopped(); - } - - public void InitializeExisting(string name) { - SetState(ManagedProjectionState.Loading); - ReadPersistedState(name); - } - - private void ReadPersistedState(string name) { - var corrId = Guid.NewGuid(); - _readDispatcher.Publish( - new ClientMessage.ReadStreamEventsBackward( - corrId, corrId, _readDispatcher.Envelope, ProjectionNamesBuilder.ProjectionsStreamPrefix + name, -1, - 1, - resolveLinkTos: false, requireLeader: false, validationStreamVersion: null, - user: SystemAccounts.System), - new ReadStreamEventsBackwardHandlers.Optimistic(PersistedStateReadCompleted)); - } - - private void PersistedStateReadCompleted(ClientMessage.ReadStreamEventsBackwardCompleted completed) { - if (completed.Result == ReadStreamResult.Success && completed.Events.Length == 1) { - var persistedState = completed.Events[0].Event.Data.ParseJson(); - - _lastWrittenVersion = completed.Events[0].Event.EventNumber; - FixUpOldFormat(completed, persistedState); - FixupOldProjectionModes(persistedState); - FixUpOldProjectionRunAs(persistedState); - - LoadPersistedState(persistedState); - //TODO: encapsulate this into managed projection - SetState(ManagedProjectionState.Loaded); - _pendingWritePersistedState = false; - SetLastReplyEnvelope(null); - PrepareOrWriteStartOrLoadStopped(); - return; - } - - SetState(ManagedProjectionState.Creating); - - _logger.Verbose( - "Projection manager did not find any projection configuration records in the {stream} stream. Projection stays in CREATING state", - completed.EventStreamId); - } - - private void FixUpOldProjectionRunAs(PersistedState persistedState) { - if (persistedState.RunAs == null || string.IsNullOrEmpty(persistedState.RunAs.Name)) { - _runAs = SystemAccounts.System; - persistedState.RunAs = SerializedRunAs.SerializePrincipal(ProjectionManagementMessage.RunAs.System); - } - } - - private void FixUpOldFormat(ClientMessage.ReadStreamEventsBackwardCompleted completed, - PersistedState persistedState) { - if (persistedState.Version == null) { - persistedState.Version = completed.Events[0].Event.EventNumber; - persistedState.Epoch = -1; - } - - if (_lastWrittenVersion > persistedState.Version) - persistedState.Version = _lastWrittenVersion; - } - - private void FixupOldProjectionModes(PersistedState persistedState) { - switch ((int)persistedState.Mode) { - case 2: // old continuous - persistedState.Mode = ProjectionMode.Continuous; - break; - case 3: // old persistent - persistedState.Mode = ProjectionMode.Continuous; - persistedState.EmitEnabled = persistedState.EmitEnabled ?? true; - break; - } - } - - private void LoadPersistedState(PersistedState persistedState) { - var handlerType = persistedState.HandlerType; - var query = persistedState.Query; - - if (handlerType == null) throw new ArgumentNullException("persistedState", "HandlerType"); - if (query == null) throw new ArgumentNullException("persistedState", "Query"); - if (handlerType == "") throw new ArgumentException("HandlerType", "persistedState"); - - if (_state != ManagedProjectionState.Creating && _state != ManagedProjectionState.Loading) - throw new InvalidOperationException("LoadPersistedState is now allowed in this state"); - - PersistedProjectionState = persistedState; - _runAs = SerializedRunAs.DeserializePrincipal(persistedState.RunAs); - _persistedStateLoaded = true; - } - - internal void WriteStartOrLoadStopped() { - if (_pendingWritePersistedState) - WritePersistedState(CreatePersistedStateEvent(Guid.NewGuid(), PersistedProjectionState, - ProjectionNamesBuilder.ProjectionsStreamPrefix + _name)); - else - StartOrLoadStopped(); - } - - internal void StartCompleted() { - Reply(); - } - - private ClientMessage.WriteEvents CreatePersistedStateEvent(Guid correlationId, PersistedState persistedState, - string eventStreamId) { - return new ClientMessage.WriteEvents( - correlationId, correlationId, _writeDispatcher.Envelope, true, eventStreamId, ExpectedVersion.Any, - new Event(Guid.NewGuid(), ProjectionEventTypes.ProjectionUpdated, true, persistedState.ToJsonBytes(), - Empty.ByteArray), - SystemAccounts.System); - } - - private void WritePersistedState(ClientMessage.WriteEvents persistedStateEvent) { - if (Mode == ProjectionMode.Transient) { - //TODO: move to common completion procedure - _lastWrittenVersion = PersistedProjectionState.Version ?? -1; - _pendingWritePersistedState = false; - StartOrLoadStopped(); - return; - } - - _writing = true; - _writeDispatcher.Publish( - persistedStateEvent, - m => WritePersistedStateCompleted(m, persistedStateEvent, persistedStateEvent.EventStreamId)); - } - - private void WritePersistedStateCompleted(ClientMessage.WriteEventsCompleted message, - ClientMessage.WriteEvents eventToRetry, string eventStreamId) { - if (!_writing) { - _logger.Error("Projection definition write completed in non writing state. ({projection})", _name); - } - - if (message.Result == OperationResult.Success) { - _logger.Information("'{projection}' projection source has been written", _name); - _pendingWritePersistedState = false; - var writtenEventNumber = message.FirstEventNumber; - if (writtenEventNumber != (PersistedProjectionState.Version ?? writtenEventNumber)) - throw new Exception("Projection version and event number mismatch"); - _lastWrittenVersion = (PersistedProjectionState.Version ?? writtenEventNumber); - StartOrLoadStopped(); - return; - } - - _logger.Information( - "Projection '{projection}' source has not been written to {stream}. Error: {e}", - _name, - eventStreamId, - Enum.GetName(typeof(OperationResult), message.Result)); - if (message.Result == OperationResult.CommitTimeout || message.Result == OperationResult.ForwardTimeout - || message.Result == OperationResult.PrepareTimeout - || message.Result == - OperationResult.WrongExpectedVersion) { - _logger.Information("Retrying write projection source for {projection}", _name); - WritePersistedState(eventToRetry); - } else - throw new NotSupportedException("Unsupported error code received"); - } - - private void DeleteStream(string streamId, Action completed) { - //delete checkpoint stream - var correlationId = Guid.NewGuid(); - _streamDispatcher.Publish(new ClientMessage.DeleteStream( - correlationId, - correlationId, - _writeDispatcher.Envelope, - true, - streamId, - ExpectedVersion.Any, - false, - SystemAccounts.System), m => DeleteStreamCompleted(m, streamId, completed)); - } - - private void DeleteStreamCompleted(ClientMessage.DeleteStreamCompleted message, string streamId, - Action completed) { - // currently, WrongExpectedVersion is returned when deleting non-existing streams, even when specifying ExpectedVersion.Any. - // it is not too intuitive but changing the response would break the contract and compatibility with TCP/gRPC/web clients or require adding a new error code to all clients. - // note: we don't need to check if CurrentVersion == -1 here to make sure it's a non-existing stream since the deletion is done with ExpectedVersion.Any - if (message.Result == OperationResult.WrongExpectedVersion) { - // stream was never created - _logger.Information("PROJECTIONS: Projection Stream '{stream}' was not deleted since it does not exist", streamId); - completed(); - return; - } - if (message.Result == OperationResult.Success || message.Result == OperationResult.StreamDeleted) { - _logger.Information("PROJECTIONS: Projection Stream '{stream}' deleted", streamId); - completed(); - return; - } - - _logger.Information( - "PROJECTIONS: Projection stream '{stream}' could not be deleted. Error: {e}", - streamId, - Enum.GetName(typeof(OperationResult), message.Result)); - if (message.Result == OperationResult.CommitTimeout || - message.Result == OperationResult.ForwardTimeout) { - DeleteStream(streamId, completed); - } else - throw new NotSupportedException("Unsupported error code received"); - } - - private void Prepare(Message message) { - if (_state >= ManagedProjectionState.Preparing) { - DisposeCoreProjection(); - SetState(ManagedProjectionState.Loaded); - } - - //note: set running before start as coreProjection.start() can respond with faulted - SetState(ManagedProjectionState.Preparing); - _output.Publish(message); - } - - private void Start() { - if (!Enabled) - throw new InvalidOperationException("Projection is disabled"); - SetState(ManagedProjectionState.Starting); - _output.Publish(new CoreProjectionManagementMessage.Start(Id, _workerId)); - } - - private void LoadStopped() { - SetState(ManagedProjectionState.LoadingStopped); - _output.Publish(new CoreProjectionManagementMessage.LoadStopped(Id, _workerId)); - } - - private void DisposeCoreProjection() { - Created = false; - _output.Publish(new CoreProjectionManagementMessage.Dispose(Id, _workerId)); - } - - private void Enable() { - Enabled = true; - } - - private Message CreateCreateAndPrepareMessage(ProjectionConfig config) { - return new CoreProjectionManagementMessage.CreateAndPrepare( - Id, - _workerId, - _name, - new ProjectionVersion(_projectionId, PersistedProjectionState.Epoch ?? 0, - PersistedProjectionState.Version ?? 0), - config, - HandlerType, - Query, - EnableContentTypeValidation); - } - - private CoreProjectionManagementMessage.CreatePrepared CreatePreparedMessage(ProjectionConfig config) { - if (PersistedProjectionState.SourceDefinition == null) - throw new Exception( - "The projection cannot be loaded as stopped as it was stored in the old format. Update the projection query text to force prepare"); - - var createProjectionMessage = new CoreProjectionManagementMessage.CreatePrepared( - Id, - _workerId, - _name, - new ProjectionVersion(_projectionId, PersistedProjectionState.Epoch ?? 0, - PersistedProjectionState.Version ?? 1), - config, - QuerySourcesDefinition.From(PersistedProjectionState.SourceDefinition), - HandlerType, - Query, - EnableContentTypeValidation); - return createProjectionMessage; - } - - private void StopUnlessPreparedOrLoaded() { - switch (_state) { - case ManagedProjectionState.Prepared: - case ManagedProjectionState.Loaded: - PrepareOrWriteStartOrLoadStopped(); - break; - case ManagedProjectionState.Stopped: - case ManagedProjectionState.Completed: - case ManagedProjectionState.Aborted: - case ManagedProjectionState.Faulted: - SetState(ManagedProjectionState.Stopped); - PrepareOrWriteStartOrLoadStopped(); - return; - case ManagedProjectionState.Deleting: - PrepareOrWriteStartOrLoadStopped(); - break; - case ManagedProjectionState.Loading: - case ManagedProjectionState.Creating: - throw new InvalidOperationException( - string.Format( - "Cannot stop a projection in the '{0}' state", - Enum.GetName(typeof(ManagedProjectionState), _state))); - case ManagedProjectionState.Stopping: - case ManagedProjectionState.Aborting: - return; - case ManagedProjectionState.Running: - case ManagedProjectionState.Starting: - SetState(ManagedProjectionState.Stopping); - _output.Publish(new CoreProjectionManagementMessage.Stop(Id, _workerId)); - break; - default: - throw InvalidProjectionState(_state); - } - } - - private void Abort() { - switch (_state) { - case ManagedProjectionState.Stopped: - case ManagedProjectionState.Completed: - case ManagedProjectionState.Aborted: - case ManagedProjectionState.Faulted: - case ManagedProjectionState.Loaded: - PrepareOrWriteStartOrLoadStopped(); - return; - case ManagedProjectionState.Loading: - case ManagedProjectionState.Creating: - throw new InvalidOperationException( - string.Format( - "Cannot stop a projection in the '{0}' state", - Enum.GetName(typeof(ManagedProjectionState), _state))); - case ManagedProjectionState.Stopping: - SetState(ManagedProjectionState.Aborting); - _output.Publish(new CoreProjectionManagementMessage.Kill(Id, _workerId)); - return; - case ManagedProjectionState.Aborting: - return; - case ManagedProjectionState.Running: - case ManagedProjectionState.Starting: - SetState(ManagedProjectionState.Aborting); - _output.Publish(new CoreProjectionManagementMessage.Kill(Id, _workerId)); - break; - default: - throw InvalidProjectionState(_state); - } - } - - - public void Fault(string reason) { - _logger.Error("The '{projection}' projection faulted due to '{e}'", _name, reason); - SetState(ManagedProjectionState.Faulted); - _faultedReason = reason; - } - - private ProjectionConfig CreateDefaultProjectionConfiguration() { - var checkpointsEnabled = PersistedProjectionState.CheckpointsDisabled != true; - var trackEmittedStreams = PersistedProjectionState.TrackEmittedStreams == true; - var maximumCheckpointCount = checkpointsEnabled ? PersistedProjectionState.CheckpointHandledThreshold : 0; - var checkpointAfterMs = checkpointsEnabled ? PersistedProjectionState.CheckpointAfterMs : 0; - var checkpointUnhandledBytesThreshold = - checkpointsEnabled ? PersistedProjectionState.CheckpointUnhandledBytesThreshold : 0; - var pendingEventsThreshold = PersistedProjectionState.PendingEventsThreshold; - var maxWriteBatchLength = PersistedProjectionState.MaxWriteBatchLength; - var maximumAllowedWritesInFlight = PersistedProjectionState.MaxAllowedWritesInFlight; - var emitEventEnabled = PersistedProjectionState.EmitEnabled == true; - var createTempStreams = PersistedProjectionState.CreateTempStreams == true; - var stopOnEof = PersistedProjectionState.Mode <= ProjectionMode.OneTime; - var projectionExecutionTimeout = PersistedProjectionState.ProjectionExecutionTimeout; - - var projectionConfig = new ProjectionConfig( - _runAs, - maximumCheckpointCount, - checkpointUnhandledBytesThreshold, - pendingEventsThreshold, - maxWriteBatchLength, - emitEventEnabled, - checkpointsEnabled, - createTempStreams, - stopOnEof, - trackEmittedStreams, - checkpointAfterMs, - maximumAllowedWritesInFlight, - projectionExecutionTimeout); - return projectionConfig; - } - - private void StartOrLoadStopped() { - if (_state == ManagedProjectionState.Prepared) { - if (Enabled && _enabledToRun) - Start(); - else { - LoadStopped(); - } - } else if (_state == ManagedProjectionState.Aborted || - _state == ManagedProjectionState.Completed || - _state == ManagedProjectionState.Faulted || - _state == ManagedProjectionState.Stopped || - _state == ManagedProjectionState.Deleting) - Reply(); - else - throw InvalidProjectionState(_state); - } - - private void UpdateQuery(ProjectionManagementMessage.Command.UpdateQuery message) { - PersistedProjectionState.Query = message.Query; - PersistedProjectionState.EmitEnabled = message.EmitEnabled ?? PersistedProjectionState.EmitEnabled; - _pendingWritePersistedState = true; - if (_state == ManagedProjectionState.Completed) { - Reset(); - } - } - - private void Disable() { - Enabled = false; - _pendingWritePersistedState = true; - } - - public void PrepareOrWriteStartOrLoadStopped() { - if (_state == ManagedProjectionState.Prepared) { - WriteStartOrLoadStopped(); - return; - } - - if (Prepared && Created && !(Enabled && _enabledToRun)) { - WriteStartOrLoadStopped(); - return; - } - - _projectionConfig = CreateDefaultProjectionConfiguration(); - - var prepareMessage = !(Enabled && _enabledToRun) && !_pendingWritePersistedState - ? CreatePreparedMessage(_projectionConfig) - : CreateCreateAndPrepareMessage(_projectionConfig); - - Prepare(prepareMessage); - } - - private void Reply() { - if (_lastReplyEnvelope != null) - _lastReplyEnvelope.ReplyWith(new ProjectionManagementMessage.Updated(_name)); - _lastReplyEnvelope = null; - if (Deleted && !_pendingWritePersistedState) { - DisposeCoreProjection(); - _output.Publish(new ProjectionManagementMessage.Internal.Deleted(_name, Id)); - } - } - - private void Delete() { - Enabled = false; - Deleted = false; - Deleting = true; - _pendingWritePersistedState = true; - } - - private void UpdateProjectionVersion(bool force = false) { - if (_lastWrittenVersion == PersistedProjectionState.Version) { - PersistedProjectionState.Version++; - PersistedProjectionState.ProjectionSubsystemVersion = ProjectionsSubsystem.VERSION; - } else if (force) - throw new ApplicationException( - "Internal error: projection definition must be saved before forced updating version"); - } - - private static InvalidOperationException InvalidProjectionState(ManagedProjectionState state) => - new InvalidOperationException($"Did not expect {nameof(ManagedProjectionState)} in state {state}."); - } - - public class SerializedRunAs { - public string Name { get; set; } - public string[] Roles { get; set; } - - public static implicit operator SerializedRunAs(ProjectionManagementMessage.RunAs runAs) { - return runAs == null ? null : SerializePrincipal(runAs); - } - - public static implicit operator ProjectionManagementMessage.RunAs(SerializedRunAs runAs) { - return new ProjectionManagementMessage.RunAs(DeserializePrincipal(runAs)); - } - - public static SerializedRunAs SerializePrincipal(ProjectionManagementMessage.RunAs runAs) { - if (runAs?.Principal == null || runAs.Principal.HasClaim(x=>x.Type == ClaimTypes.Anonymous)) - return null; // anonymous - if (runAs.Principal == SystemAccounts.System) - return new SerializedRunAs {Name = "$system"}; - - var principal = runAs.Principal; - var roles = principal.Claims - .Where(x => x.Type == ClaimTypes.Role) - .Select(c => $"{c.Type}$$${c.Value}").ToArray(); - return new SerializedRunAs {Name = runAs.Principal.Identity.Name, Roles = roles}; - } - - public static ClaimsPrincipal DeserializePrincipal(SerializedRunAs runAs) { - if (runAs?.Name == null) - return SystemAccounts.Anonymous; - if (runAs.Name == "$system") //TODO: make sure nobody else uses it - return SystemAccounts.System; - var claims = runAs.Roles.Select(x => x.Split("$$$")).Select(x => { - return x.Length switch - { - 1 => new Claim(ClaimTypes.Role, x[0]), - 2 => new Claim(x[0], x[1]), - _ =>throw new SerializationException("Could not deserialize run as") - }; - - }).ToList(); - if (!claims.Exists(x => x.Type == ClaimTypes.Name)) { - claims.Add(new Claim(ClaimTypes.Name, runAs.Name)); - } - - return new ClaimsPrincipal(new ClaimsIdentity(claims, "ES-Projections")); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionState.cs deleted file mode 100644 index edcd643aa..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionState.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management { - public enum ManagedProjectionState { - Creating, - Loading, - Loaded, - Preparing, - Prepared, - Starting, - LoadingStopped, - Running, - Stopping, - Aborting, - Stopped, - Completed, - Aborted, - Faulted, - Deleting, - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortedState.cs deleted file mode 100644 index 3a489a565..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class AbortedState : ManagedProjectionStateBase { - public AbortedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortingState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortingState.cs deleted file mode 100644 index bafe478af..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/AbortingState.cs +++ /dev/null @@ -1,19 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class AbortingState : ManagedProjectionStateBase { - public AbortingState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Stopped(CoreProjectionStatusMessage.Stopped message) { - _managedProjection.SetState(ManagedProjectionState.Aborted); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - _managedProjection.SetState(ManagedProjectionState.Aborted); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CompletedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CompletedState.cs deleted file mode 100644 index 7e102928f..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CompletedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class CompletedState : ManagedProjectionStateBase { - public CompletedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CreatingLoadingLoadedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CreatingLoadingLoadedState.cs deleted file mode 100644 index c3dd0d148..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/CreatingLoadingLoadedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class CreatingLoadingLoadedState : ManagedProjectionStateBase { - public CreatingLoadingLoadedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/DeletingState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/DeletingState.cs deleted file mode 100644 index 7dd04cc09..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/DeletingState.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class DeletingState : ManagedProjectionStateBase { - public DeletingState(ManagedProjection managedProjection) - : base(managedProjection) { - managedProjection.DeleteProjectionStreams(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/FaultedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/FaultedState.cs deleted file mode 100644 index 3d74c54c2..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/FaultedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class FaultedState : ManagedProjectionStateBase { - public FaultedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/LoadingStateState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/LoadingStateState.cs deleted file mode 100644 index 45a80cd0e..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/LoadingStateState.cs +++ /dev/null @@ -1,19 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class LoadingStateState : ManagedProjectionStateBase { - public LoadingStateState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Stopped(CoreProjectionStatusMessage.Stopped message) { - _managedProjection.SetState(ManagedProjectionState.Stopped); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - SetFaulted(message.FaultedReason); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/ManagedProjectionStateBase.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/ManagedProjectionStateBase.cs deleted file mode 100644 index e6c4ae561..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/ManagedProjectionStateBase.cs +++ /dev/null @@ -1,35 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - internal abstract class ManagedProjectionStateBase { - protected readonly ManagedProjection _managedProjection; - - protected ManagedProjectionStateBase(ManagedProjection managedProjection) { - _managedProjection = managedProjection; - } - - private void Unexpected(string message) { - _managedProjection.Fault(message + " in " + this.GetType().Name); - } - - protected void SetFaulted(string reason) { - _managedProjection.Fault(reason); - } - - protected internal virtual void Started() { - Unexpected("Unexpected 'STARTED' message"); - } - - protected internal virtual void Stopped(CoreProjectionStatusMessage.Stopped message) { - Unexpected("Unexpected 'STOPPED' message"); - } - - protected internal virtual void Faulted(CoreProjectionStatusMessage.Faulted message) { - Unexpected("Unexpected 'FAULTED' message"); - } - - protected internal virtual void Prepared(CoreProjectionStatusMessage.Prepared message) { - Unexpected("Unexpected 'PREPARED' message"); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparedState.cs deleted file mode 100644 index 5a4cd19b2..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class PreparedState : ManagedProjectionStateBase { - public PreparedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparingState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparingState.cs deleted file mode 100644 index 2c5e86da1..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/PreparingState.cs +++ /dev/null @@ -1,23 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class PreparingState : ManagedProjectionStateBase { - public PreparingState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - SetFaulted(message.FaultedReason); - _managedProjection.PersistedProjectionState.SourceDefinition = null; - _managedProjection.WriteStartOrLoadStopped(); - } - - protected internal override void Prepared(CoreProjectionStatusMessage.Prepared message) { - _managedProjection.SetState(ManagedProjectionState.Prepared); - _managedProjection.PersistedProjectionState.SourceDefinition = message.SourceDefinition; - _managedProjection.Prepared = true; - _managedProjection.Created = true; - _managedProjection.WriteStartOrLoadStopped(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/RunningState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/RunningState.cs deleted file mode 100644 index 34851c1f3..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/RunningState.cs +++ /dev/null @@ -1,25 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class RunningState : ManagedProjectionStateBase { - public RunningState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - SetFaulted(message.FaultedReason); - } - - protected internal override void Started() { - // do nothing - may mean second pahse started - //TODO: stop sending second Started - } - - protected internal override void Stopped(CoreProjectionStatusMessage.Stopped message) { - if (message.Completed) - _managedProjection.SetState(ManagedProjectionState.Completed); - else - base.Stopped(message); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StartingState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StartingState.cs deleted file mode 100644 index 487ad978d..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StartingState.cs +++ /dev/null @@ -1,19 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class StartingState : ManagedProjectionStateBase { - public StartingState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Started() { - _managedProjection.SetState(ManagedProjectionState.Running); - _managedProjection.StartCompleted(); - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - SetFaulted(message.FaultedReason); - _managedProjection.StartCompleted(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppedState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppedState.cs deleted file mode 100644 index 5744ba165..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppedState.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class StoppedState : ManagedProjectionStateBase { - public StoppedState(ManagedProjection managedProjection) - : base(managedProjection) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppingState.cs b/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppingState.cs deleted file mode 100644 index 9d34b20b1..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ManagedProjectionStates/StoppingState.cs +++ /dev/null @@ -1,20 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Management.ManagedProjectionStates { - class StoppingState : ManagedProjectionStateBase { - public StoppingState(ManagedProjection managedProjection) - : base(managedProjection) { - } - - protected internal override void Stopped(CoreProjectionStatusMessage.Stopped message) { - _managedProjection.SetState( - message.Completed ? ManagedProjectionState.Completed : ManagedProjectionState.Stopped); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - - protected internal override void Faulted(CoreProjectionStatusMessage.Faulted message) { - SetFaulted(message.FaultedReason); - _managedProjection.PrepareOrWriteStartOrLoadStopped(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ProjectionCoreCoordinator.cs b/src/EventStore.Projections.Core/Services/Management/ProjectionCoreCoordinator.cs deleted file mode 100644 index fbc44d9d4..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ProjectionCoreCoordinator.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Common.Options; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing; -using Serilog; - -namespace EventStore.Projections.Core.Services.Management { - public class ProjectionCoreCoordinator - : IHandle, - IHandle, - IHandle, - IHandle { - public const string ComponentName = "ProjectionCoreCoordinator"; - - private readonly ILogger Log = Serilog.Log.ForContext(); - private readonly ProjectionType _runProjections; - - private readonly Dictionary _queues = new Dictionary(); - private readonly IPublisher _publisher; - - private int _pendingSubComponentsStarts; - private int _activeSubComponents; - - private Guid _instanceCorrelationId = Guid.Empty; - private CoreCoordinatorState _currentState = CoreCoordinatorState.Stopped; - - public ProjectionCoreCoordinator( - ProjectionType runProjections, - IReadOnlyList queues, - IPublisher publisher){ - _runProjections = runProjections; - _queues = queues.ToDictionary(_ => Guid.NewGuid(), q => q); - _publisher = publisher; - } - - public void Handle(ProjectionSubsystemMessage.StartComponents message) { - if (_currentState != CoreCoordinatorState.Stopped) { - Log.Debug("PROJECTIONS: Projection Core Coordinator cannot start components as it's not stopped. Correlation: {correlation}", - message.InstanceCorrelationId); - return; - } - _instanceCorrelationId = message.InstanceCorrelationId; - Log.Debug("PROJECTIONS: Projection Core Coordinator component starting. Correlation: {correlation}", - _instanceCorrelationId); - Start(); - } - - public void Handle(ProjectionSubsystemMessage.StopComponents message) { - if (_currentState != CoreCoordinatorState.Started) { - Log.Debug("PROJECTIONS: Projection Core Coordinator cannot stop components as it's not started. Correlation: {correlation}", - message.InstanceCorrelationId); - return; - } - if (_instanceCorrelationId != message.InstanceCorrelationId) { - Log.Debug("PROJECTIONS: Projection Core Coordinator received stop request for incorrect correlation id." + - "Current: {correlationId}. Requested: {requestedCorrelationId}", _instanceCorrelationId, message.InstanceCorrelationId); - return; - } - Stop(message); - } - - private void Start() { - if (_currentState != CoreCoordinatorState.Stopped) { - Log.Warning("PROJECTIONS: Projection Core Coordinated tried to start when not stopped."); - return; - } - Log.Debug("PROJECTIONS: Starting Projections Core Coordinator"); - _pendingSubComponentsStarts = 0; - _activeSubComponents = 0; - _currentState = CoreCoordinatorState.Starting; - - foreach (var queue in _queues.Values) { - queue.Publish(new ReaderCoreServiceMessage.StartReader(_instanceCorrelationId)); - _pendingSubComponentsStarts += 1 /*EventReaderCoreService*/; - - if (_runProjections >= ProjectionType.System) { - queue.Publish(new ProjectionCoreServiceMessage.StartCore(_instanceCorrelationId)); - _pendingSubComponentsStarts += 1; /*ProjectionCoreService*/ - } - } - } - - private void Stop(ProjectionSubsystemMessage.StopComponents message) { - if (_currentState != CoreCoordinatorState.Started) { - Log.Debug("PROJECTIONS: Projections Core Coordinator trying to stop when not started. " + - "Current state: {currentState}. StopCorrelation: {correlation}", _currentState, - message.InstanceCorrelationId); - return; - } - - Log.Debug("PROJECTIONS: Stopping Projections Core Coordinator"); - _currentState = CoreCoordinatorState.Stopping; - foreach (var queue in _queues) { - if (_runProjections >= ProjectionType.System) { - queue.Value.Publish(new ProjectionCoreServiceMessage.StopCore(queue.Key)); - } else { - // TODO: Find out why projections still run even when ProjectionType.None - queue.Value.Publish(new ReaderCoreServiceMessage.StopReader(queue.Key)); - } - } - } - - public void Handle(ProjectionCoreServiceMessage.SubComponentStarted message) { - if (_currentState != CoreCoordinatorState.Starting) { - Log.Debug("PROJECTIONS: Projection Core Coordinator received SubComponent Started when not starting. " + - "SubComponent: {subComponent}, InstanceCorrelationId: {correlationId}, CurrentState: {currentState}", - message.SubComponent, message.InstanceCorrelationId, _currentState); - return; - } - if (message.InstanceCorrelationId != _instanceCorrelationId) { - Log.Debug("PROJECTIONS: Projection Core Coordinator received SubComponent Started for wrong correlation id. " + - "SubComponent: {subComponent}, RequestedCorrelation: {requestedCorrelation}, InstanceCorrelationId: {correlationId}", - message.SubComponent, message.InstanceCorrelationId, _instanceCorrelationId); - return; - } - _pendingSubComponentsStarts--; - _activeSubComponents++; - Log.Debug("PROJECTIONS: SubComponent Started: {subComponent}", message.SubComponent); - - if (_pendingSubComponentsStarts == 0) { - _publisher.Publish( - new ProjectionSubsystemMessage.ComponentStarted(ComponentName, _instanceCorrelationId)); - _currentState = CoreCoordinatorState.Started; - } - } - - public void Handle(ProjectionCoreServiceMessage.SubComponentStopped message) { - if (_currentState != CoreCoordinatorState.Stopping) { - Log.Debug("PROJECTIONS: Projection Core Coordinator received SubComponent Stopped when not stopping. " + - "SubComponent: {subComponent}, CurrentState: {currentState}", - message.SubComponent, _currentState); - return; - } - _activeSubComponents--; - Log.Debug("PROJECTIONS: SubComponent Stopped: {subComponent}", message.SubComponent); - - if (message.SubComponent == ProjectionCoreService.SubComponentName) { - if (!_queues.TryGetValue(message.QueueId, out var queue)) - return; - queue.Publish(new ReaderCoreServiceMessage.StopReader(message.QueueId)); - } - - if (_activeSubComponents == 0) { - _publisher.Publish( - new ProjectionSubsystemMessage.ComponentStopped(ComponentName, _instanceCorrelationId)); - _currentState = CoreCoordinatorState.Stopped; - } - } - - public void SetupMessaging(ISubscriber bus) { - bus.Subscribe(this); - bus.Subscribe(this); - bus.Subscribe(this); - bus.Subscribe(this); - } - - private enum CoreCoordinatorState { - Stopped, - Stopping, - Starting, - Started - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ProjectionManager.cs b/src/EventStore.Projections.Core/Services/Management/ProjectionManager.cs deleted file mode 100644 index ffbb43c8b..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ProjectionManager.cs +++ /dev/null @@ -1,1356 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json.Nodes; -using EventStore.Common.Options; -using EventStore.Common.Utils; -using EventStore.Core; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Core.Helpers; -using EventStore.Core.Telemetry; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Standard; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Metrics; -using ILogger = Serilog.ILogger; -using OperationResult = EventStore.Core.Messages.OperationResult; - -namespace EventStore.Projections.Core.Services.Management { - public class ProjectionManager - : IDisposable, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - public const int ProjectionQueryId = -2; - public const int ProjectionCreationRetryCount = 1; - public const string ServiceName = "ProjectionManager"; - - private readonly ILogger _logger = Serilog.Log.ForContext(); - - private readonly IPublisher _inputQueue; - private readonly IPublisher _publisher; - private readonly Tuple[] _queues; - private readonly Guid[] _workers; - private readonly TimeSpan _projectionsQueryExpiry; - - private readonly ITimeProvider _timeProvider; - private readonly ProjectionType _runProjections; - private readonly bool _initializeSystemProjections; - private readonly Dictionary _projections; - private readonly Dictionary _projectionsMap; - - private readonly RequestResponseDispatcher - _writeDispatcher; - - private readonly RequestResponseDispatcher - _streamDispatcher; - - private readonly - RequestResponseDispatcher - - _readForwardDispatcher; - - private readonly ReadDispatcher _readDispatcher; - - private int _readEventsBatchSize = 100; - - private int _lastUsedQueue = 0; - private bool _started; - private bool _projectionsStarted; - private long _projectionsRegistrationExpectedVersion = 0; - private bool _isWritePending = false; - private HashSet _projectionsRegistrationState = new HashSet(); - private readonly IEnvelope _publishEnvelope; - - private readonly - RequestResponseDispatcher - _getStateDispatcher; - - private readonly - RequestResponseDispatcher - - _getResultDispatcher; - - private readonly IODispatcher _ioDispatcher; - - private Guid _instanceCorrelationId = Guid.Empty; - private IProjectionTracker _projectionTracker; - private readonly TimeSpan _interval = TimeSpan.FromMilliseconds(2000); - private readonly TimerMessage.Schedule _getStats; - - public ProjectionManager( - IPublisher inputQueue, - IPublisher publisher, - IDictionary queueMap, - ITimeProvider timeProvider, - ProjectionType runProjections, - IODispatcher ioDispatcher, - TimeSpan projectionQueryExpiry, - IProjectionTracker projectionTracker, - bool initializeSystemProjections = true) { - if (inputQueue == null) throw new ArgumentNullException("inputQueue"); - if (publisher == null) throw new ArgumentNullException("publisher"); - if (queueMap == null) throw new ArgumentNullException("queueMap"); - if (queueMap.Count == 0) throw new ArgumentException("At least one queue is required", "queueMap"); - - _inputQueue = inputQueue; - _publisher = publisher; - _queues = queueMap.Select(v => Tuple.Create(v.Key, v.Value)).ToArray(); - _workers = _queues.Select(v => v.Item1).ToArray(); - - _timeProvider = timeProvider; - _runProjections = runProjections; - _initializeSystemProjections = initializeSystemProjections; - _ioDispatcher = ioDispatcher; - _projectionsQueryExpiry = projectionQueryExpiry; - _projectionTracker = projectionTracker; - - _writeDispatcher = - new RequestResponseDispatcher( - publisher, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - _readDispatcher = new ReadDispatcher( - publisher, - v => v.CorrelationId, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - _readForwardDispatcher = - new RequestResponseDispatcher - ( - publisher, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - _streamDispatcher = - new RequestResponseDispatcher( - publisher, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - - _projections = new Dictionary(); - _projectionsMap = new Dictionary(); - _publishEnvelope = _inputQueue; - _getStateDispatcher = - new RequestResponseDispatcher - ( - _publisher, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - _getResultDispatcher = - new RequestResponseDispatcher - ( - _publisher, - v => v.CorrelationId, - v => v.CorrelationId, - _inputQueue); - _getStats = TimerMessage.Schedule.Create(_interval, _inputQueue, - new ProjectionManagementMessage.Command.GetStatistics(new CallbackEnvelope(PushStatsToProjectionTracker), ProjectionMode.AllNonTransient, null, true)); - } - - private void PushStatsToProjectionTracker(Message message) { - if (message is ProjectionManagementMessage.Statistics stats) { - _projectionTracker.OnNewStats(stats.Projections); - } - _publisher.Publish(_getStats); - } - - public void Handle(ProjectionSubsystemMessage.StartComponents message) { - if (_started) { - _logger.Debug("PROJECTIONS: Projection manager already started. Correlation: {correlation}", - message.InstanceCorrelationId); - return; - } - - _instanceCorrelationId = message.InstanceCorrelationId; - _logger.Debug("PROJECTIONS: Starting Projections Manager. Correlation: {correlation}", _instanceCorrelationId); - - _started = true; - if (_runProjections >= ProjectionType.System) - StartExistingProjections( - () => { - _projectionsStarted = true; - _publisher.Publish(_getStats); - ScheduleExpire(); - }); - _publisher.Publish(new ProjectionSubsystemMessage.ComponentStarted(ServiceName, _instanceCorrelationId)); - } - - public void Handle(ProjectionSubsystemMessage.StopComponents message) { - if (!_started) { - _logger.Debug("PROJECTIONS: Projection manager already stopped. Correlation: {correlation}", - message.InstanceCorrelationId); - return; - } - - if (_instanceCorrelationId != message.InstanceCorrelationId) { - _logger.Debug("PROJECTIONS: Projection Manager received stop request for incorrect correlation id." + - "Current: {correlationId}. Requested: {requestedCorrelationId}", _instanceCorrelationId, message.InstanceCorrelationId); - return; - } - _logger.Debug("PROJECTIONS: Stopping Projections Manager. Correlation {correlation}", _instanceCorrelationId); - Stop(); - } - - private void ScheduleExpire() { - if (!_projectionsStarted) - return; - _publisher.Publish( - TimerMessage.Schedule.Create( - TimeSpan.FromSeconds(60), - _publishEnvelope, - new ProjectionManagementMessage.Internal.CleanupExpired())); - } - - private void Stop() { - _started = false; - _projectionsStarted = false; - _ioDispatcher.StartDraining(() => - _publisher.Publish(new ProjectionSubsystemMessage.IODispatcherDrained(ServiceName))); - - _projections.Clear(); - _projectionsMap.Clear(); - - _publisher.Publish(new ProjectionSubsystemMessage.ComponentStopped(ServiceName, _instanceCorrelationId)); - } - - public void Handle(ProjectionManagementMessage.Command.Post message) { - if (!_projectionsStarted) - return; - - if (message.Mode == ProjectionMode.Transient) { - var transientProjection = new PendingProjection(ProjectionQueryId, message); - if (!ValidateProjections(new [] {transientProjection}, message)) return; - - PostNewTransientProjection(transientProjection, message.Envelope); - } else { - if (_isWritePending) { - DelayMessage(message); - } else { - var expectedVersion = _projectionsRegistrationExpectedVersion; - var pendingProjections = new Dictionary { - {message.Name, new PendingProjection(expectedVersion + 1, message)} - }; - if (!ValidateProjections(pendingProjections.Values.ToArray(), message)) return; - - PostNewProjections(pendingProjections, expectedVersion, message.Envelope); - } - } - } - - public void Handle(ProjectionManagementMessage.Command.PostBatch message) { - if (!_projectionsStarted || !message.Projections.Any()) - return; - - if (message.Projections.Any(p => p.Mode == ProjectionMode.Transient)) { - message.Envelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed( - "Transient projections in batches are not supported.")); - return; - } - if (_isWritePending) { - DelayMessage(message); - } else { - var expectedVersion = _projectionsRegistrationExpectedVersion; - var pendingProjections = new Dictionary(); - - var projectionId = expectedVersion + 1; - foreach (var projection in message.Projections) { - pendingProjections.Add(projection.Name, new PendingProjection(projectionId, projection)); - projectionId++; - } - - if (!ValidateProjections(pendingProjections.Values.ToArray(), message)) return; - - PostNewProjections(pendingProjections, expectedVersion, message.Envelope); - } - } - - private bool ValidateProjections( - PendingProjection[] projections, - ProjectionManagementMessage.Command.ControlMessage message) { - var duplicateNames = new List(); - - foreach (var projection in projections) { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs( - projection.Mode, - ReadWrite.Write, - null, - message, - replace: projection.EnableRunAs)) { - - _logger.Information("PROJECTIONS: Projections batch rejected due to invalid RunAs"); - message.Envelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed("Invalid RunAs")); - return false; - } - - if (string.IsNullOrWhiteSpace(projection.Name)) { - message.Envelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed("Projection name is required")); - return false; - } - - if (_projectionsRegistrationState.Contains(projection.Name)) { - duplicateNames.Add(projection.Name); - } - } - - if (duplicateNames.Any()) { - var duplicatesMsg = $"Duplicate projection names : {string.Join(", ", duplicateNames)}"; - _logger.Debug($"PROJECTIONS: Conflict. {duplicatesMsg}"); - message.Envelope.ReplyWith( - new ProjectionManagementMessage.Conflict(duplicatesMsg)); - return false; - } - - return true; - } - - public void Handle(ProjectionManagementMessage.Command.Delete message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) { - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - return; - } - - if (IsSystemProjection(message.Name)) { - message.Envelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed( - "We currently don't allow for the deletion of System Projections.")); - return; - } - - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - try { - projection.Handle(message); - } catch (InvalidOperationException ex) { - message.Envelope.ReplyWith(new ProjectionManagementMessage.OperationFailed(ex.Message)); - } - } - - private bool IsSystemProjection(string name) { - return name == ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection || - name == ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection || - name == ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection || - name == ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection || - name == ProjectionNamesBuilder.StandardProjections.EventByCorrIdStandardProjection; - } - - public void Handle(ProjectionManagementMessage.Command.GetQuery message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Read, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.UpdateQuery message) { - if (!_projectionsStarted) - return; - _logger.Information( - "Updating '{projection}' projection source to '{source}`", - message.Name, - message.Query); - var projection = GetProjection(message.Name); - - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - projection.Handle(message); // update query text - } - } - - public void Handle(ProjectionManagementMessage.Command.Disable message) { - if (!_projectionsStarted) - return; - _logger.Information("Disabling '{projection}' projection", message.Name); - - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.Enable message) { - if (!_projectionsStarted) - return; - _logger.Information("Enabling '{projection}' projection", message.Name); - - var projection = GetProjection(message.Name); - if (projection == null) { - _logger.Error("DBG: PROJECTION *{projection}* NOT FOUND.", message.Name); - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - } else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.Abort message) { - if (!_projectionsStarted) - return; - _logger.Information("Aborting '{projection}' projection", message.Name); - - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.SetRunAs message) { - if (!_projectionsStarted) - return; - _logger.Information("Setting RunAs1 account for '{projection}' projection", message.Name); - - var projection = GetProjection(message.Name); - if (projection == null) { - _logger.Error("DBG: PROJECTION *{projection}* NOT FOUND.", message.Name); - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - } else { - if ( - !ProjectionManagementMessage.RunAs.ValidateRunAs( - projection.Mode, ReadWrite.Write, projection.RunAs, message, - message.Action == ProjectionManagementMessage.Command.SetRunAs.SetRemove.Set)) return; - - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.Reset message) { - if (!_projectionsStarted) - return; - _logger.Information("Resetting '{projection}' projection", message.Name); - - var projection = GetProjection(message.Name); - if (projection == null) { - _logger.Error("DBG: PROJECTION *{projection}* NOT FOUND.", message.Name); - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - } else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Write, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.GetStatistics message) { - if (!_projectionsStarted) - return; - if (!string.IsNullOrEmpty(message.Name)) { - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else - message.Envelope.ReplyWith( - new ProjectionManagementMessage.Statistics(new[] {projection.GetStatistics()})); - - } else { - var statuses = (from projectionNameValue in _projections - let projection = projectionNameValue.Value - where !projection.Deleted - where - message.Mode == null || message.Mode == projection.Mode - || (message.Mode.GetValueOrDefault() == ProjectionMode.AllNonTransient - && projection.Mode != ProjectionMode.Transient) - let status = projection.GetStatistics() - select status).ToArray(); - message.Envelope.ReplyWith(new ProjectionManagementMessage.Statistics(statuses)); - } - } - - public void Handle(ProjectionManagementMessage.Command.GetState message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else - projection.Handle(message); - } - - public void Handle(ProjectionManagementMessage.Command.GetResult message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else - projection.Handle(message); - } - - public void Handle(ProjectionManagementMessage.Command.GetConfig message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Read, projection.RunAs, - message)) return; - projection.Handle(message); - } - } - - public void Handle(ProjectionManagementMessage.Command.UpdateConfig message) { - if (!_projectionsStarted) - return; - var projection = GetProjection(message.Name); - if (projection == null) - message.Envelope.ReplyWith(new ProjectionManagementMessage.NotFound()); - else { - if (!ProjectionManagementMessage.RunAs.ValidateRunAs(projection.Mode, ReadWrite.Read, projection.RunAs, - message)) return; - try { - projection.Handle(message); - } catch (InvalidOperationException ex) { - message.Envelope.ReplyWith(new ProjectionManagementMessage.OperationFailed(ex.Message)); - return; - } - } - } - - public void Handle(ProjectionManagementMessage.Internal.CleanupExpired message) { - ScheduleExpire(); - CleanupExpired(); - } - - private void CleanupExpired() { - foreach (var managedProjection in _projections.ToArray()) { - managedProjection.Value.Handle(new ProjectionManagementMessage.Internal.CleanupExpired()); - } - } - - public void Handle(CoreProjectionStatusMessage.Started message) { - string name; - if (_projectionsMap.TryGetValue(message.ProjectionId, out name)) { - var projection = _projections[name]; - projection.Handle(message); - } - } - - public void Handle(CoreProjectionStatusMessage.Stopped message) { - string name; - if (_projectionsMap.TryGetValue(message.ProjectionId, out name)) { - var projection = _projections[name]; - projection.Handle(message); - } - } - - public void Handle(CoreProjectionStatusMessage.Faulted message) { - string name; - if (_projectionsMap.TryGetValue(message.ProjectionId, out name)) { - var projection = _projections[name]; - projection.Handle(message); - } - } - - public void Handle(CoreProjectionStatusMessage.Prepared message) { - string name; - if (_projectionsMap.TryGetValue(message.ProjectionId, out name)) { - var projection = _projections[name]; - projection.Handle(message); - } - } - - public void Handle(CoreProjectionStatusMessage.StateReport message) { - _getStateDispatcher.Handle(message); - } - - public void Handle(CoreProjectionStatusMessage.ResultReport message) { - _getResultDispatcher.Handle(message); - } - - public void Handle(CoreProjectionStatusMessage.StatisticsReport message) { - string name; - if (_projectionsMap.TryGetValue(message.ProjectionId, out name)) { - var projection = _projections[name]; - projection.Handle(message); - } - } - - public void Handle(ClientMessage.ReadStreamEventsBackwardCompleted message) { - _readDispatcher.Handle(message); - } - - public void Handle(ClientMessage.ReadStreamEventsForwardCompleted message) { - _readForwardDispatcher.Handle(message); - } - - public void Handle(ClientMessage.WriteEventsCompleted message) { - _writeDispatcher.Handle(message); - } - - public void Handle(ClientMessage.DeleteStreamCompleted message) { - _streamDispatcher.Handle(message); - } - - public void Handle(ProjectionManagementMessage.Internal.Deleted message) { - var projection = GetProjection(message.Name); - - if (projection == null) return; - - if (projection.Mode == ProjectionMode.Transient) { - // We don't need to write a delete, as transient projections don't write creations - _projections.Remove(message.Name); - _projectionsMap.Remove(message.Id); - _projectionsRegistrationState.Remove(message.Name); - return; - } - - if (_isWritePending) { - DelayMessage(message); - } else { - DeleteProjection(message, - expVer => { - _projections.Remove(message.Name); - _projectionsMap.Remove(message.Id); - _projectionsRegistrationState.Remove(message.Name); - _projectionsRegistrationExpectedVersion = expVer; - }); - } - } - - private void DeleteProjection( - ProjectionManagementMessage.Internal.Deleted message, Action completed, int retryCount = ProjectionCreationRetryCount) { - var corrId = Guid.NewGuid(); - var writeDelete = new ClientMessage.WriteEvents( - corrId, - corrId, - _writeDispatcher.Envelope, - true, - ProjectionNamesBuilder.ProjectionsRegistrationStream, - _projectionsRegistrationExpectedVersion, - new Event( - Guid.NewGuid(), - ProjectionEventTypes.ProjectionDeleted, - false, - Helper.UTF8NoBom.GetBytes(message.Name), - Empty.ByteArray), - SystemAccounts.System); - - _isWritePending = true; - _writeDispatcher.Publish( - writeDelete, - m => WriteProjectionDeletedCompleted(m, writeDelete, message, completed, retryCount)); - } - - public void Dispose() { - foreach (var projection in _projections.Values) - projection.Dispose(); - _projections.Clear(); - } - - private ManagedProjection GetProjection(string name) { - ManagedProjection result; - return _projections.TryGetValue(name, out result) ? result : null; - } - - private void StartExistingProjections(Action completed) { - var registeredProjections = new Dictionary(); - ReadProjectionsList( - registeredProjections, - r => StartRegisteredProjections(r, completed)); - } - - private void ReadProjectionsList( - IDictionary registeredProjections, - Action> completedAction, - long from = 0) { - - _logger.Debug("PROJECTIONS: Reading Existing Projections from {stream}", ProjectionNamesBuilder.ProjectionsRegistrationStream); - var corrId = Guid.NewGuid(); - _readForwardDispatcher.Publish( - new ClientMessage.ReadStreamEventsForward( - corrId, - corrId, - _readDispatcher.Envelope, - ProjectionNamesBuilder.ProjectionsRegistrationStream, - from, - _readEventsBatchSize, - resolveLinkTos: false, - requireLeader: false, - validationStreamVersion: null, - user: SystemAccounts.System, - replyOnExpired: false), - m => OnProjectionsListReadCompleted(m, registeredProjections, from, completedAction)); - } - - private void OnProjectionsListReadCompleted( - ClientMessage.ReadStreamEventsForwardCompleted msg, - IDictionary registeredProjections, - long requestedFrom, - Action> completedAction) { - switch (msg.Result) { - case ReadStreamResult.Success: - foreach (var evnt in msg.Events) { - var projectionId = evnt.Event.EventNumber; - if (projectionId == 0) - projectionId = Int32.MaxValue - 1; - if (evnt.Event.EventType == ProjectionEventTypes.ProjectionsInitialized) { - registeredProjections.Add(ProjectionEventTypes.ProjectionsInitialized, projectionId); - continue; - } - - var projectionName = Helper.UTF8NoBom.GetString(evnt.Event.Data.Span); - if (string.IsNullOrEmpty(projectionName) - || _projections.ContainsKey(projectionName)) { - _logger.Warning( - "PROJECTIONS: The following projection: {projection} has a duplicate registration event.", - projectionName); - continue; - } - - if (evnt.Event.EventType == ProjectionEventTypes.ProjectionCreated) { - if (registeredProjections.ContainsKey(projectionName)) { - registeredProjections[projectionName] = projectionId; - _logger.Warning( - "PROJECTIONS: The following projection: {projection} has a duplicate created event. Using projection Id {projectionId}", - projectionName, projectionId); - continue; - } - - registeredProjections.Add(projectionName, projectionId); - } else if (evnt.Event.EventType == ProjectionEventTypes.ProjectionDeleted) { - registeredProjections.Remove(projectionName); - } - } - _projectionsRegistrationExpectedVersion = msg.LastEventNumber; - - if (!msg.IsEndOfStream) { - ReadProjectionsList(registeredProjections, completedAction, @from: msg.NextEventNumber); - return; - } - - break; - case ReadStreamResult.StreamDeleted: - case ReadStreamResult.Error: - case ReadStreamResult.AccessDenied: - _logger.Fatal( - "There was an error reading the projections list due to {e}. Projections could not be loaded.", - msg.Result); - return; - } - completedAction(registeredProjections); - } - - private void StartRegisteredProjections(IDictionary registeredProjections, - Action completedAction) { - if (!registeredProjections.Any()) { - _logger.Debug("PROJECTIONS: No projections were found in {stream}, starting from empty stream", - ProjectionNamesBuilder.ProjectionsRegistrationStream); - WriteProjectionsInitialized( - () => { - completedAction(); - CreateSystemProjections(); - }, - Guid.NewGuid()); - return; - } - - List projections = registeredProjections - .Where(x => x.Key != ProjectionEventTypes.ProjectionsInitialized) - .Select(x => x.Key).ToList(); - - _logger.Debug( - "PROJECTIONS: Found the following projections in {stream}: {projections}", - ProjectionNamesBuilder.ProjectionsRegistrationStream, - projections); - - foreach(var projection in projections) - _projectionsRegistrationState.Add(projection); - - //create any missing system projections - CreateSystemProjections(registeredProjections.Select(x => x.Key).ToList()); - - foreach (var projectionRegistration in registeredProjections.Where(x => - x.Key != ProjectionEventTypes.ProjectionsInitialized)) { - int queueIndex = GetNextWorkerIndex(); - var managedProjection = CreateManagedProjectionInstance( - projectionRegistration.Key, - projectionRegistration.Value, - Guid.NewGuid(), - _workers[queueIndex]); - managedProjection.InitializeExisting(projectionRegistration.Key); - } - - completedAction(); - } - - private bool IsProjectionEnabledToRunByMode(string projectionName) { - return _runProjections >= ProjectionType.All - || _runProjections == ProjectionType.System && projectionName.StartsWith("$"); - } - - private void WriteProjectionsInitialized(Action action, Guid registrationEventId) { - var corrId = Guid.NewGuid(); - _writeDispatcher.Publish( - new ClientMessage.WriteEvents( - corrId, - corrId, - _writeDispatcher.Envelope, - true, - ProjectionNamesBuilder.ProjectionsRegistrationStream, - ExpectedVersion.NoStream, - new Event(registrationEventId, ProjectionEventTypes.ProjectionsInitialized, false, Empty.ByteArray, - Empty.ByteArray), - SystemAccounts.System), - completed => WriteProjectionsInitializedCompleted(completed, registrationEventId, action)); - } - - private void WriteProjectionsInitializedCompleted(ClientMessage.WriteEventsCompleted completed, - Guid registrationEventId, Action action) { - switch (completed.Result) { - case OperationResult.Success: - action(); - break; - case OperationResult.CommitTimeout: - case OperationResult.ForwardTimeout: - case OperationResult.PrepareTimeout: - WriteProjectionsInitialized(action, registrationEventId); - break; - default: - _logger.Fatal("Cannot initialize projections subsystem. Cannot write a fake projection"); - break; - } - } - - private void CreateSystemProjections() { - CreateSystemProjections(new List()); - } - - private void CreateSystemProjections(List existingSystemProjections) { - var systemProjections = new List(); - - if (!_initializeSystemProjections) { - return; - } - - if (!existingSystemProjections.Contains(ProjectionNamesBuilder.StandardProjections - .StreamsStandardProjection)) - systemProjections.Add(CreateSystemProjectionPost( - ProjectionNamesBuilder.StandardProjections.StreamsStandardProjection, - typeof(IndexStreams), - "")); - - if (!existingSystemProjections.Contains(ProjectionNamesBuilder.StandardProjections - .StreamByCategoryStandardProjection)) - systemProjections.Add(CreateSystemProjectionPost( - ProjectionNamesBuilder.StandardProjections.StreamByCategoryStandardProjection, - typeof(CategorizeStreamByPath), - "first\r\n-")); - - if (!existingSystemProjections.Contains(ProjectionNamesBuilder.StandardProjections - .EventByCategoryStandardProjection)) - systemProjections.Add(CreateSystemProjectionPost( - ProjectionNamesBuilder.StandardProjections.EventByCategoryStandardProjection, - typeof(CategorizeEventsByStreamPath), - "first\r\n-")); - - if (!existingSystemProjections.Contains(ProjectionNamesBuilder.StandardProjections - .EventByTypeStandardProjection)) - systemProjections.Add(CreateSystemProjectionPost( - ProjectionNamesBuilder.StandardProjections.EventByTypeStandardProjection, - typeof(IndexEventsByEventType), - "")); - - if (!existingSystemProjections.Contains(ProjectionNamesBuilder.StandardProjections - .EventByCorrIdStandardProjection)) - systemProjections.Add(CreateSystemProjectionPost( - ProjectionNamesBuilder.StandardProjections.EventByCorrIdStandardProjection, - typeof(ByCorrelationId), - "{\"correlationIdProperty\":\"$correlationId\"}")); - - IEnvelope envelope = new NoopEnvelope(); - var postBatchMessage = new ProjectionManagementMessage.Command.PostBatch( - envelope, ProjectionManagementMessage.RunAs.System, systemProjections.ToArray()); - _publisher.Publish(postBatchMessage); - } - - private ProjectionManagementMessage.Command.PostBatch.ProjectionPost CreateSystemProjectionPost - (string name, Type handlerType, string config) { - return new ProjectionManagementMessage.Command.PostBatch.ProjectionPost( - ProjectionMode.Continuous, - ProjectionManagementMessage.RunAs.System, - name, - "native:" + handlerType.Namespace + "." + handlerType.Name, - config, - enabled: false, - checkpointsEnabled: true, - emitEnabled: true, - trackEmittedStreams: false, - enableRunAs: true); - } - - private void PostNewTransientProjection(PendingProjection projection, IEnvelope replyEnvelope) { - var initializer = projection.CreateInitializer(replyEnvelope); - ReadProjectionPossibleStream(projection.Name, - m => ReadProjectionPossibleStreamCompleted - (m, initializer, replyEnvelope)); - } - - private void PostNewProjections - (IDictionary newProjections, long expectedVersion, IEnvelope replyEnvelope) { - var corrId = Guid.NewGuid(); - var events = new List(); - - foreach (var projection in newProjections.Values) { - if (projection.Mode >= ProjectionMode.OneTime) { - var eventId = Guid.NewGuid(); - events.Add(new Event( - eventId, - ProjectionEventTypes.ProjectionCreated, - false, - Helper.UTF8NoBom.GetBytes(projection.Name), - Empty.ByteArray)); - } else { - _logger.Warning("PROJECTIONS: Should not be processing transient projections here."); - } - } - - if (!events.Any()) return; - - var writeEvents = new ClientMessage.WriteEvents( - corrId, - corrId, - _writeDispatcher.Envelope, - true, - ProjectionNamesBuilder.ProjectionsRegistrationStream, - expectedVersion, - events.ToArray(), - SystemAccounts.System); - - _isWritePending = true; - _writeDispatcher.Publish( - writeEvents, - m => WriteNewProjectionsCompleted - (m, writeEvents, newProjections, replyEnvelope)); - } - - - private void WriteNewProjectionsCompleted(ClientMessage.WriteEventsCompleted completed, - ClientMessage.WriteEvents write, - IDictionary newProjections, - IEnvelope envelope, int retryCount = ProjectionCreationRetryCount) { - - _isWritePending = false; - if (completed.Result == OperationResult.Success) { - foreach (var name in newProjections.Keys) - _projectionsRegistrationState.Add(name); - - _projectionsRegistrationExpectedVersion = completed.LastEventNumber; - StartNewlyRegisteredProjections(newProjections, OnProjectionsRegistrationCaughtUp, envelope); - return; - } - - _logger.Information( - "PROJECTIONS: Created event for projections has not been written to {stream}: {projections}. Error: {error}", - ProjectionNamesBuilder.ProjectionsRegistrationStream, - newProjections.Keys, - Enum.GetName(typeof(OperationResult), completed.Result)); - - if (completed.Result == OperationResult.ForwardTimeout || - completed.Result == OperationResult.PrepareTimeout || - completed.Result == OperationResult.CommitTimeout) { - if (retryCount > 0) { - _logger.Information("PROJECTIONS: Retrying write projection creations for {projections}", - newProjections.Keys); - _isWritePending = true; - _writeDispatcher.Publish( - write, - m => WriteNewProjectionsCompleted - (m, write, newProjections, envelope, retryCount - 1)); - return; - } - } - - envelope.ReplyWith(new ProjectionManagementMessage.OperationFailed( - string.Format( - "The projections '{0}' could not be created because the registration could not be written due to {1}", - string.Join(", ", newProjections.Keys), completed.Result))); - } - - private void StartNewlyRegisteredProjections - (IDictionary newProjections, - Action completedAction, IEnvelope replyEnvelope) { - - if (!newProjections.Any()) { - replyEnvelope.ReplyWith( - new ProjectionManagementMessage.OperationFailed("Projections were invalid")); - return; - } - - _logger.Debug( - "PROJECTIONS: Found the following new projections in {stream}: {projections}", - ProjectionNamesBuilder.ProjectionsRegistrationStream, - newProjections.Keys); - - try { - foreach (var projection in newProjections.Values) { - var initializer = projection.CreateInitializer(replyEnvelope); - ReadProjectionPossibleStream(projection.Name, - m => ReadProjectionPossibleStreamCompleted - (m, initializer, replyEnvelope)); - } - } catch (Exception ex) { - replyEnvelope.ReplyWith(new ProjectionManagementMessage.OperationFailed(ex.Message)); - } - - completedAction(); - } - - private void ReadProjectionPossibleStream( - string projectionName, - Action onComplete) { - var corrId = Guid.NewGuid(); - _readDispatcher.Publish( - new ClientMessage.ReadStreamEventsBackward( - corrId, - corrId, - _readDispatcher.Envelope, - ProjectionNamesBuilder.ProjectionsStreamPrefix + projectionName, - 0, - _readEventsBatchSize, - resolveLinkTos: false, - requireLeader: false, - validationStreamVersion: null, - user: SystemAccounts.System), - new ReadStreamEventsBackwardHandlers.Optimistic(onComplete)); - } - - private void ReadProjectionPossibleStreamCompleted( - ClientMessage.ReadStreamEventsBackwardCompleted completed, - NewProjectionInitializer initializer, - IEnvelope replyEnvelope) { - - long version = -1; - if (completed.Result == ReadStreamResult.Success) { - version = completed.LastEventNumber + 1; - } - - try { - int queueIndex = GetNextWorkerIndex(); - initializer. - CreateAndInitializeNewProjection(this, Guid.NewGuid(), _workers[queueIndex], - version: version); - } catch (Exception ex) { - replyEnvelope.ReplyWith(new ProjectionManagementMessage.OperationFailed(ex.Message)); - } - } - - private void OnProjectionsRegistrationCaughtUp() { - _logger.Debug($"PROJECTIONS: Caught up with projections registration. Next expected version: {_projectionsRegistrationExpectedVersion}"); - } - - private void WriteProjectionDeletedCompleted(ClientMessage.WriteEventsCompleted writeCompleted, - ClientMessage.WriteEvents writeDelete, - ProjectionManagementMessage.Internal.Deleted message, - Action onCompleted, - int retryCount) { - - _isWritePending = false; - if (writeCompleted.Result == OperationResult.Success) { - onCompleted?.Invoke(writeCompleted.LastEventNumber); - return; - } - - _logger.Information( - "PROJECTIONS: Projection '{projection}' deletion has not been written to {stream}. Error: {e}", - message.Name, - ProjectionNamesBuilder.ProjectionsRegistrationStream, - Enum.GetName(typeof(OperationResult), writeCompleted.Result)); - - if (writeCompleted.Result == OperationResult.CommitTimeout || writeCompleted.Result == OperationResult.ForwardTimeout - || writeCompleted.Result == OperationResult.PrepareTimeout) { - if (retryCount > 0) { - _logger.Information("PROJECTIONS: Retrying write projection deletion for {projection}", message.Name); - _isWritePending = true; - _writeDispatcher.Publish( - writeDelete, - m => WriteProjectionDeletedCompleted(m, writeDelete, message, onCompleted, retryCount - 1)); - return; - } - } - - if (writeCompleted.Result == OperationResult.WrongExpectedVersion) { - _logger.Error("PROJECTIONS: Got wrong expected version writing projection deletion for {projection}.", - message.Name); - return; - } - - _logger.Error( - "PROJECTIONS: The projection '{0}' could not be deleted because the deletion event could not be written due to {1}", - message.Name, writeCompleted.Result); - } - - private void DelayMessage(Message messageToDelay) { - _publisher.Publish(TimerMessage.Schedule.Create(TimeSpan.FromSeconds(2), _inputQueue, messageToDelay)); - } - - public class NewProjectionInitializer { - private readonly long _projectionId; - private readonly bool _enabled; - private readonly string _handlerType; - private readonly string _query; - private readonly ProjectionMode _projectionMode; - private readonly bool _emitEnabled; - private readonly bool _checkpointsEnabled; - private readonly bool _trackEmittedStreams; - private readonly bool _enableRunAs; - private readonly ProjectionManagementMessage.RunAs _runAs; - private readonly IEnvelope _replyEnvelope; - private readonly string _name; - - public NewProjectionInitializer( - long projectionId, - string name, - ProjectionMode projectionMode, - string handlerType, - string query, - bool enabled, - bool emitEnabled, - bool checkpointsEnabled, - bool enableRunAs, - bool trackEmittedStreams, - ProjectionManagementMessage.RunAs runAs, - IEnvelope replyEnvelope) { - if (projectionMode >= ProjectionMode.Continuous && !checkpointsEnabled) - throw new InvalidOperationException("Continuous mode requires checkpoints"); - - if (emitEnabled && !checkpointsEnabled) - throw new InvalidOperationException("Emit requires checkpoints"); - - _projectionId = projectionId; - _enabled = enabled; - _handlerType = handlerType; - _query = query; - _projectionMode = projectionMode; - _emitEnabled = emitEnabled; - _checkpointsEnabled = checkpointsEnabled; - _trackEmittedStreams = trackEmittedStreams; - _enableRunAs = enableRunAs; - _runAs = runAs; - _replyEnvelope = replyEnvelope; - _name = name; - } - - public void CreateAndInitializeNewProjection( - ProjectionManager projectionManager, - Guid projectionCorrelationId, - Guid workerId, - long? version = -1) { - var projection = projectionManager.CreateManagedProjectionInstance( - _name, - _projectionId, - projectionCorrelationId, - workerId); - projection.InitializeNew( - new ManagedProjection.PersistedState { - Enabled = _enabled, - HandlerType = _handlerType, - Query = _query, - Mode = _projectionMode, - EmitEnabled = _emitEnabled, - CheckpointsDisabled = !_checkpointsEnabled, - TrackEmittedStreams = _trackEmittedStreams, - CheckpointHandledThreshold = ProjectionConsts.CheckpointHandledThreshold, - CheckpointAfterMs = (int)ProjectionConsts.CheckpointAfterMs.TotalMilliseconds, - MaxAllowedWritesInFlight = ProjectionConsts.MaxAllowedWritesInFlight, - Epoch = -1, - Version = version, - RunAs = _enableRunAs ? SerializedRunAs.SerializePrincipal(_runAs) : null, - ProjectionSubsystemVersion = ProjectionsSubsystem.VERSION, - ProjectionExecutionTimeout = null - }, - _replyEnvelope); - } - } - - private ManagedProjection CreateManagedProjectionInstance( - string name, - long projectionId, - Guid projectionCorrelationId, - Guid workerID) { - var enabledToRun = IsProjectionEnabledToRunByMode(name); - var workerId = workerID; - var managedProjectionInstance = new ManagedProjection( - workerId, - projectionCorrelationId, - projectionId, - name, - enabledToRun, - _logger, - _streamDispatcher, - _writeDispatcher, - _readDispatcher, - _publisher, - _timeProvider, - _getStateDispatcher, - _getResultDispatcher, - _ioDispatcher, - _projectionsQueryExpiry); - - _projectionsMap.Add(projectionCorrelationId, name); - _projections.Add(name, managedProjectionInstance); - _logger.Debug("Adding projection {projectionCorrelationId}@{projection} to list", projectionCorrelationId, - name); - return managedProjectionInstance; - } - - private int GetNextWorkerIndex() { - if (_lastUsedQueue >= _workers.Length) - _lastUsedQueue = 0; - var queueIndex = _lastUsedQueue; - _lastUsedQueue++; - return queueIndex; - } - - public class PendingProjection { - public ProjectionMode Mode { get; } - public SerializedRunAs RunAs { get; } - public string Name { get; } - public string HandlerType { get; } - public string Query { get; } - public bool Enabled { get; } - public bool CheckpointsEnabled { get; } - public bool EmitEnabled { get; } - public bool EnableRunAs { get; } - public bool TrackEmittedStreams { get; } - public long ProjectionId { get; } - - public PendingProjection( - long projectionId, ProjectionMode mode, SerializedRunAs runAs, string name, string handlerType, string query, - bool enabled, bool checkpointsEnabled, bool emitEnabled, bool enableRunAs, - bool trackEmittedStreams) { - ProjectionId = projectionId; - Mode = mode; - RunAs = runAs; - Name = name; - HandlerType = handlerType; - Query = query; - Enabled = enabled; - CheckpointsEnabled = checkpointsEnabled; - EmitEnabled = emitEnabled; - EnableRunAs = enableRunAs; - TrackEmittedStreams = trackEmittedStreams; - } - - public PendingProjection(long projectionId, ProjectionManagementMessage.Command.PostBatch.ProjectionPost projection) - : this(projectionId, projection.Mode, projection.RunAs, projection.Name, projection.HandlerType, - projection.Query, projection.Enabled, projection.CheckpointsEnabled, - projection.EmitEnabled, projection.EnableRunAs, projection.TrackEmittedStreams) { } - - public PendingProjection(long projectionId, ProjectionManagementMessage.Command.Post projection) - : this(projectionId, projection.Mode, projection.RunAs, projection.Name, projection.HandlerType, - projection.Query, projection.Enabled, projection.CheckpointsEnabled, - projection.EmitEnabled, projection.EnableRunAs, projection.TrackEmittedStreams) { } - - public NewProjectionInitializer CreateInitializer(IEnvelope replyEnvelope) { - return new NewProjectionInitializer( - ProjectionId, - Name, - Mode, - HandlerType, - Query, - Enabled, - EmitEnabled, - CheckpointsEnabled, - EnableRunAs, - TrackEmittedStreams, - RunAs, - replyEnvelope); - } - } - - public void Handle(TelemetryMessage.Request message) { - var customProjectionCount = 0; - var customProjectionRunningCount = 0; - var standardProjectionCount = 0; - var standardProjectionRunningCount = 0; - - foreach (var proj in _projections.Values) { - if (proj.Mode != ProjectionMode.Continuous) - continue; - - var stats = proj.GetStatistics(); - - if (stats.Name.StartsWith("$")) { - standardProjectionCount += 1; - - if (stats.Status.Contains("Running")) - standardProjectionRunningCount += 1; - } else { - customProjectionCount += 1; - - if (stats.Status.Contains("Running")) - customProjectionRunningCount += 1; - } - } - - message.Envelope.ReplyWith(new TelemetryMessage.Response("projections", new JsonObject { - ["customProjectionCount"] = customProjectionCount, - ["standardProjectionCount"] = standardProjectionCount, - ["customProjectionRunningCount"] = customProjectionRunningCount, - ["standardProjectionRunningCount"] = standardProjectionRunningCount, - ["totalCount"] = customProjectionCount + standardProjectionCount, - ["totalRunningCount"] = customProjectionRunningCount + standardProjectionRunningCount, - })); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ProjectionManagerMessageDispatcher.cs b/src/EventStore.Projections.Core/Services/Management/ProjectionManagerMessageDispatcher.cs deleted file mode 100644 index 65f1c50e5..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ProjectionManagerMessageDispatcher.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Messages; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Management { - public class ProjectionManagerMessageDispatcher - : IHandle { - private readonly ILogger _logger = Serilog.Log.ForContext(); - private readonly IDictionary _queueMap; - - public ProjectionManagerMessageDispatcher(IDictionary queueMap) { - _queueMap = queueMap; - } - - public void Handle(CoreProjectionManagementControlMessage message) { - DispatchWorkerMessage(message, message.WorkerId); - } - - private void DispatchWorkerMessage(Message message, Guid workerId) { - IPublisher worker; - if (_queueMap.TryGetValue(workerId, out worker)) - worker.Publish(message); - else - _logger.Information("Cannot find a worker with ID: {workerId}", workerId); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Management/ProjectionStateHandlerFactory.cs b/src/EventStore.Projections.Core/Services/Management/ProjectionStateHandlerFactory.cs deleted file mode 100644 index 24b72292a..000000000 --- a/src/EventStore.Projections.Core/Services/Management/ProjectionStateHandlerFactory.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Services.Interpreted; - -namespace EventStore.Projections.Core.Services.Management { - - - public class ProjectionStateHandlerFactory { - private readonly TimeSpan _javascriptCompilationTimeout; - private readonly TimeSpan _javascriptExecutionTimeout; - - public ProjectionStateHandlerFactory(TimeSpan javascriptCompilationTimeout, TimeSpan javascriptExecutionTimeout) { - _javascriptCompilationTimeout = javascriptCompilationTimeout; - _javascriptExecutionTimeout = javascriptExecutionTimeout; - } - public IProjectionStateHandler Create( - string factoryType, string source, - bool enableContentTypeValidation, - int? projectionExecutionTimeout, - Action logger = null) { - var colonPos = factoryType.IndexOf(':'); - string kind = null; - string rest = null; - if (colonPos > 0) { - kind = factoryType.Substring(0, colonPos); - rest = factoryType.Substring(colonPos + 1); - } else { - kind = factoryType; - } - - IProjectionStateHandler result; - var executionTimeout = projectionExecutionTimeout is > 0 - ? TimeSpan.FromMilliseconds(projectionExecutionTimeout.Value) - : _javascriptExecutionTimeout; - switch (kind.ToLowerInvariant()) { - case "js": - result = new JintProjectionStateHandler(source, enableContentTypeValidation, - _javascriptCompilationTimeout, executionTimeout); - break; - case "native": - var type = Type.GetType(rest); - if (type == null) { - //TODO: explicitly list all the assemblies to look for handlers - type = - AppDomain.CurrentDomain.GetAssemblies() - .Select(v => v.GetType(rest)) - .FirstOrDefault(v => v != null); - } - - var handler = Activator.CreateInstance(type, source, logger); - result = (IProjectionStateHandler)handler; - break; - default: - throw new NotSupportedException(string.Format("'{0}' handler type is not supported", factoryType)); - } - - return result; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTag.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTag.cs deleted file mode 100644 index d3baf4fed..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTag.cs +++ /dev/null @@ -1,778 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class CheckpointTag : IComparable { - public readonly int Phase; - - public readonly TFPos Position; - - //TODO: rename to StreamsOrEventTypes or just Positions - public readonly Dictionary Streams; - - public readonly string CatalogStream; - public readonly string DataStream; - public readonly long CatalogPosition; - public readonly long DataPosition; - - internal enum Mode { - Phase, - Position, - Stream, - MultiStream, - EventTypeIndex, - PreparePosition, - ByStream - } - - private CheckpointTag(int phase, bool completed) { - Phase = phase; - Position = completed ? new TFPos(long.MaxValue, long.MaxValue) : new TFPos(long.MinValue, long.MinValue); - Streams = null; - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, TFPos position, Dictionary streams) { - Phase = phase; - Position = position; - Streams = streams; - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, long preparePosition) { - Phase = phase; - Position = new TFPos(long.MinValue, preparePosition); - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, TFPos position) { - Phase = phase; - Position = position; - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, IDictionary streams) { - Phase = phase; - foreach (var stream in streams) { - if (stream.Key == "") throw new ArgumentException("Empty stream name", "streams"); - if (stream.Value < 0 && stream.Value != ExpectedVersion.NoStream) - throw new ArgumentException("Invalid sequence number", "streams"); - } - - Streams = new Dictionary(streams); // clone - Position = new TFPos(Int64.MinValue, Int64.MinValue); - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, IDictionary eventTypes, TFPos position) { - Phase = phase; - Position = position; - foreach (var stream in eventTypes) { - if (stream.Key == "") throw new ArgumentException("Empty stream name", "eventTypes"); - if (stream.Value < 0 && stream.Value != ExpectedVersion.NoStream) - throw new ArgumentException("Invalid sequence number", "eventTypes"); - } - - Streams = new Dictionary(eventTypes); // clone - Mode_ = CalculateMode(); - } - - private CheckpointTag(int phase, string stream, long sequenceNumber) { - Phase = phase; - if (stream == null) throw new ArgumentNullException("stream"); - if (stream == "") throw new ArgumentException("stream"); - if (sequenceNumber < 0 && sequenceNumber != ExpectedVersion.NoStream) - throw new ArgumentException("sequenceNumber"); - Position = new TFPos(Int64.MinValue, Int64.MinValue); - Streams = new Dictionary {{stream, sequenceNumber}}; - Mode_ = CalculateMode(); - } - - private CheckpointTag( - int phase, string catalogStream, long catalogPosition, string dataStream, long dataPosition, - long commitPosition) { - Phase = phase; - CatalogStream = catalogStream; - CatalogPosition = catalogPosition; - DataStream = dataStream; - DataPosition = dataPosition; - Position = new TFPos(commitPosition, Int64.MinValue); - Mode_ = Mode.ByStream; - } - - private Mode CalculateMode() { - if (Streams == null || Streams.Count == 0) - if (Position.CommitPosition == Int64.MinValue && Position.PreparePosition == Int64.MinValue) - return Mode.Phase; - else if (Position.CommitPosition == Int64.MaxValue && Position.PreparePosition == Int64.MaxValue) - return Mode.Phase; - else if (Position.CommitPosition == Int64.MinValue && Position.PreparePosition != Int64.MinValue) - return Mode.PreparePosition; - else - return Mode.Position; - if (Position != new TFPos(Int64.MinValue, Int64.MinValue)) - return Mode.EventTypeIndex; - if (Streams.Count == 1) - return Mode.Stream; - return Mode.MultiStream; - } - - public static bool operator >(CheckpointTag left, CheckpointTag right) { - if (ReferenceEquals(left, right)) - return false; - if (!ReferenceEquals(left, null) && ReferenceEquals(right, null)) - return true; - if (ReferenceEquals(left, null) && !ReferenceEquals(right, null)) - return false; - if (left.Phase > right.Phase) - return true; - if (left.Phase < right.Phase) - return false; - var leftMode = left.Mode_; - var rightMode = right.Mode_; - UpgradeModes(ref leftMode, ref rightMode); - if (leftMode != rightMode) - throw new NotSupportedException("Cannot compare checkpoint tags in different modes"); - switch (leftMode) { - case Mode.ByStream: - CheckCatalogCompatibility(left, right); - return left.CatalogPosition > right.CatalogPosition - || (left.CatalogPosition == right.CatalogPosition && left.DataPosition > right.DataPosition); - case Mode.Phase: - return left.Position > right.Position; - case Mode.Position: - case Mode.EventTypeIndex: - return left.Position > right.Position; - case Mode.PreparePosition: - return left.PreparePosition > right.PreparePosition; - case Mode.Stream: - if (left.Streams.Keys.First() != right.Streams.Keys.First()) - throw new InvalidOperationException("Cannot compare checkpoint tags across different streams"); - var result = left.Streams.Values.First() > right.Streams.Values.First(); - return result; - case Mode.MultiStream: - long rvalue; - bool anyLeftGreater = left.Streams.Any(l => - !right.Streams.TryGetValue(l.Key, out rvalue) || l.Value > rvalue); - - long lvalue; - bool anyRightGreater = right.Streams.Any(r => - !left.Streams.TryGetValue(r.Key, out lvalue) || r.Value > lvalue); - - if (anyLeftGreater && anyRightGreater) - ThrowIncomparable(left, right); - return anyLeftGreater; - default: - throw new NotSupportedException("Checkpoint tag mode is not supported in comparison"); - } - } - - private static void CheckCatalogCompatibility(CheckpointTag left, CheckpointTag right) { - if (left.CatalogStream != right.CatalogStream) - throw new Exception("Cannot compare tags with different catalog streams"); - } - - private static void ThrowIncomparable(CheckpointTag left, CheckpointTag right) { - throw new InvalidOperationException( - string.Format("Incomparable multi-stream checkpoint tags. '{0}' and '{1}'", left, right)); - } - - public static bool operator >=(CheckpointTag left, CheckpointTag right) { - if (ReferenceEquals(left, right)) - return true; - if (!ReferenceEquals(left, null) && ReferenceEquals(right, null)) - return true; - if (ReferenceEquals(left, null) && !ReferenceEquals(right, null)) - return false; - if (left.Phase > right.Phase) - return true; - if (left.Phase < right.Phase) - return false; - var leftMode = left.Mode_; - var rightMode = right.Mode_; - UpgradeModes(ref leftMode, ref rightMode); - if (leftMode != rightMode) - throw new NotSupportedException("Cannot compare checkpoint tags in different modes"); - switch (leftMode) { - case Mode.ByStream: - CheckCatalogCompatibility(left, right); - return left.CatalogPosition > right.CatalogPosition - || (left.CatalogPosition == right.CatalogPosition && - left.DataPosition >= right.DataPosition); - case Mode.Phase: - return left.Position >= right.Position; - case Mode.Position: - case Mode.EventTypeIndex: - return left.Position >= right.Position; - case Mode.PreparePosition: - return left.PreparePosition >= right.PreparePosition; - case Mode.Stream: - if (left.Streams.Keys.First() != right.Streams.Keys.First()) - throw new InvalidOperationException("Cannot compare checkpoint tags across different streams"); - var result = left.Streams.Values.First() >= right.Streams.Values.First(); - return result; - case Mode.MultiStream: - long rvalue; - bool anyLeftGreater = left.Streams.Any(l => - !right.Streams.TryGetValue(l.Key, out rvalue) || l.Value > rvalue); - - long lvalue; - bool anyRightGreater = right.Streams.Any(r => - !left.Streams.TryGetValue(r.Key, out lvalue) || r.Value > lvalue); - - if (anyLeftGreater && anyRightGreater) - ThrowIncomparable(left, right); - return !anyRightGreater; - default: - throw new NotSupportedException("Checkpoint tag mode is not supported in comparison"); - } - } - - public static bool operator <(CheckpointTag left, CheckpointTag right) { - return !(left >= right); - } - - public static bool operator <=(CheckpointTag left, CheckpointTag right) { - return !(left > right); - } - - public static bool operator ==(CheckpointTag left, CheckpointTag right) { - return Equals(left, right); - } - - public static bool operator !=(CheckpointTag left, CheckpointTag right) { - return !(left == right); - } - - protected bool Equals(CheckpointTag other) { - if (Phase != other.Phase) - return false; - var leftMode = Mode_; - var rightMode = other.Mode_; - if (leftMode != rightMode) - return false; - UpgradeModes(ref leftMode, ref rightMode); - switch (leftMode) { - case Mode.ByStream: - return CatalogStream == other.CatalogStream && CatalogPosition == other.CatalogPosition - && DataStream == other.DataStream && - DataPosition == other.DataPosition - && CommitPosition == other.CommitPosition; - case Mode.Phase: - return Position == other.Position; - case Mode.EventTypeIndex: - // NOTE: we ignore stream positions as they are only suggestion on - // where to start to gain better performance - goto case Mode.Position; - case Mode.Position: - return Position == other.Position; - case Mode.PreparePosition: - return PreparePosition == other.PreparePosition; - case Mode.Stream: - if (Streams.Keys.First() != other.Streams.Keys.First()) - return false; - var result = Streams.Values.First() == other.Streams.Values.First(); - return result; - case Mode.MultiStream: - long rvalue = 0; - return Streams.Count == other.Streams.Count - && Streams.All(l => other.Streams.TryGetValue(l.Key, out rvalue) && l.Value == rvalue); - default: - throw new NotSupportedException("Checkpoint tag mode is not supported in comparison"); - } - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != GetType()) return false; - return Equals((CheckpointTag)obj); - } - - public override int GetHashCode() { - return Position.GetHashCode(); - } - - - public long? CommitPosition { - get { - var commitPosition = Position.CommitPosition; - switch (Mode_) { - case Mode.ByStream: - return commitPosition == long.MinValue ? (long?)null : commitPosition; - case Mode.Position: - case Mode.EventTypeIndex: - return commitPosition; - default: - return null; - } - } - } - - public long? PreparePosition { - get { - switch (Mode_) { - case Mode.Position: - case Mode.PreparePosition: - case Mode.EventTypeIndex: - return Position.PreparePosition; - default: - return null; - } - } - } - - public static CheckpointTag Empty { - get { return _empty; } - } - - internal readonly Mode Mode_; - private static readonly CheckpointTag _empty = new CheckpointTag(-1, false); - - public static CheckpointTag FromPhase(int phase, bool completed) { - return new CheckpointTag(phase, completed); - } - - public static CheckpointTag FromPosition(int phase, long commitPosition, long preparePosition) { - return new CheckpointTag(phase, new TFPos(commitPosition, preparePosition)); - } - - public static CheckpointTag FromPosition(int phase, TFPos position) { - return new CheckpointTag(phase, position); - } - - public static CheckpointTag FromPreparePosition(int phase, long preparePosition) { - return new CheckpointTag(phase, preparePosition); - } - - public static CheckpointTag FromStreamPosition(int phase, string stream, long sequenceNumber) { - return new CheckpointTag(phase, stream, sequenceNumber); - } - - public static CheckpointTag FromStreamPositions(int phase, IDictionary streams) { - // streams cloned inside - return new CheckpointTag(phase, streams); - } - - public static CheckpointTag FromEventTypeIndexPositions(int phase, TFPos position, - IDictionary streams) { - // streams cloned inside - return new CheckpointTag(phase, streams, position); - } - - public static CheckpointTag FromByStreamPosition( - int phase, string catalogStream, long catalogPosition, string dataStream, long dataPosition, - long commitPosition) { - return new CheckpointTag(phase, catalogStream, catalogPosition, dataStream, dataPosition, commitPosition); - } - - public int CompareTo(CheckpointTag other) { - return this < other ? -1 : (this > other ? 1 : 0); - } - - public override string ToString() { - string result; - switch (Mode_) { - case Mode.Phase: - return "Phase: " + Phase + (Completed ? " (completed)" : ""); - case Mode.Position: - result = Position.ToString(); - break; - case Mode.PreparePosition: - result = PreparePosition.ToString(); - break; - case Mode.Stream: - result = Streams.Keys.First() + ": " + Streams.Values.First(); - break; - case Mode.MultiStream: - case Mode.EventTypeIndex: - var sb = new StringBuilder(); - if (Mode_ == Mode.EventTypeIndex) { - sb.Append(Position.ToString()); - sb.Append("; "); - } - - foreach (var stream in Streams) { - sb.AppendFormat("{0}: {1}; ", stream.Key, stream.Value); - } - - result = sb.ToString(); - break; - case Mode.ByStream: - result = string.Format( - "{0}:{1}/{2}:{3}/{4}", CatalogStream, CatalogPosition, DataStream, DataPosition, - CommitPosition); - break; - default: - return "Unsupported mode: " + Mode_.ToString(); - } - - if (Phase == 0) - return result; - else { - return "(" + Phase + ") " + result; - } - } - - public bool Completed { - get { return Position.CommitPosition == Int64.MaxValue; } - } - - private static void UpgradeModes(ref Mode leftMode, ref Mode rightMode) { - if (leftMode == Mode.Stream && rightMode == Mode.MultiStream) { - leftMode = Mode.MultiStream; - return; - } - - if (leftMode == Mode.MultiStream && rightMode == Mode.Stream) { - rightMode = Mode.MultiStream; - return; - } - - if (leftMode == Mode.Position && rightMode == Mode.EventTypeIndex) { - leftMode = Mode.EventTypeIndex; - return; - } - - if (leftMode == Mode.EventTypeIndex && rightMode == Mode.Position) { - rightMode = Mode.EventTypeIndex; - return; - } - } - - public CheckpointTag UpdateStreamPosition(string streamId, long eventSequenceNumber) { - if (Mode_ != Mode.MultiStream) - throw new ArgumentException("Invalid tag mode", "tag"); - var resultDictionary = PatchStreamsDictionary(streamId, eventSequenceNumber); - return FromStreamPositions(Phase, resultDictionary); - } - - public CheckpointTag UpdateEventTypeIndexPosition(TFPos position, string eventType, long eventSequenceNumber) { - if (Mode_ != Mode.EventTypeIndex) - throw new ArgumentException("Invalid tag mode", "tag"); - var resultDictionary = PatchStreamsDictionary(eventType, eventSequenceNumber); - return FromEventTypeIndexPositions(Phase, position, resultDictionary); - } - - public CheckpointTag UpdateEventTypeIndexPosition(TFPos position) { - if (Mode_ != Mode.EventTypeIndex) - throw new ArgumentException("Invalid tag mode", "tag"); - return FromEventTypeIndexPositions(Phase, position, Streams); - } - - private Dictionary PatchStreamsDictionary(string streamId, long eventSequenceNumber) { - var resultDictionary = new Dictionary(); - var was = false; - foreach (var stream in Streams) { - if (stream.Key == streamId) { - was = true; - if (eventSequenceNumber < stream.Value) - resultDictionary.Add(stream.Key, stream.Value); - else - resultDictionary.Add(stream.Key, eventSequenceNumber); - } else { - resultDictionary.Add(stream.Key, stream.Value); - } - } - - if (!was) - throw new ArgumentException("Key not found: " + streamId, "streamId"); - if (resultDictionary.Count < Streams.Count) - resultDictionary.Add(streamId, eventSequenceNumber); - return resultDictionary; - } - - public byte[] ToJsonBytes(ProjectionVersion projectionVersion, - IEnumerable> extraMetaData = null) { - if (projectionVersion.ProjectionId == -1) - throw new ArgumentException("projectionId is required", "projectionVersion"); - - using (var memoryStream = new MemoryStream()) { - using (var textWriter = new StreamWriter(memoryStream, Helper.UTF8NoBom)) - using (var jsonWriter = new JsonTextWriter(textWriter)) { - WriteTo(projectionVersion, extraMetaData, jsonWriter); - } - - return memoryStream.ToArray(); - } - } - - public string ToJsonString(ProjectionVersion projectionVersion, - IEnumerable> extraMetaData = null) { - if (projectionVersion.ProjectionId == -1) - throw new ArgumentException("projectionId is required", "projectionVersion"); - - using (var textWriter = new StringWriter()) { - using (var jsonWriter = new JsonTextWriter(textWriter)) { - WriteTo(projectionVersion, extraMetaData, jsonWriter); - } - - return textWriter.ToString(); - } - } - - public string ToJsonString(IEnumerable> extraMetaData = null) { - using (var textWriter = new StringWriter()) { - using (var jsonWriter = new JsonTextWriter(textWriter)) { - WriteTo(default(ProjectionVersion), extraMetaData, jsonWriter); - } - - return textWriter.ToString(); - } - } - - public JRaw ToJsonRaw(IEnumerable> extraMetaData = null) { - using (var textWriter = new StringWriter()) { - using (var jsonWriter = new JsonTextWriter(textWriter)) { - WriteTo(default(ProjectionVersion), extraMetaData, jsonWriter); - } - - return new JRaw(textWriter.ToString()); - } - } - - public void WriteTo(ProjectionVersion projectionVersion, - IEnumerable> extraMetaData, JsonWriter jsonWriter) { - jsonWriter.WriteStartObject(); - if (projectionVersion.ProjectionId > 0) { - jsonWriter.WritePropertyName("$v"); - WriteVersion(projectionVersion, jsonWriter); - } - - if (Phase != 0) { - jsonWriter.WritePropertyName("$ph"); - jsonWriter.WriteValue(Phase); - } - - switch (Mode_) { - case Mode.Phase: - jsonWriter.WritePropertyName("$cp"); - jsonWriter.WriteValue(Completed); - break; - case Mode.Position: - case Mode.EventTypeIndex: - jsonWriter.WritePropertyName("$c"); - jsonWriter.WriteValue(CommitPosition.GetValueOrDefault()); - jsonWriter.WritePropertyName("$p"); - jsonWriter.WriteValue(PreparePosition.GetValueOrDefault()); - if (Mode_ == Mode.EventTypeIndex) - goto case Mode.MultiStream; - break; - case Mode.PreparePosition: - jsonWriter.WritePropertyName("$p"); - jsonWriter.WriteValue(PreparePosition.GetValueOrDefault()); - break; - case Mode.Stream: - case Mode.MultiStream: - jsonWriter.WritePropertyName("$s"); - jsonWriter.WriteStartObject(); - foreach (var stream in Streams) { - jsonWriter.WritePropertyName(stream.Key); - jsonWriter.WriteValue(stream.Value); - } - - jsonWriter.WriteEndObject(); - break; - case Mode.ByStream: - jsonWriter.WritePropertyName("$m"); - jsonWriter.WriteValue("bs"); - jsonWriter.WritePropertyName("$c"); - jsonWriter.WriteValue(CommitPosition.GetValueOrDefault()); - jsonWriter.WritePropertyName("$s"); - jsonWriter.WriteStartArray(); - jsonWriter.WriteStartObject(); - jsonWriter.WritePropertyName(CatalogStream); - jsonWriter.WriteValue(CatalogPosition); - jsonWriter.WriteEndObject(); - if (!string.IsNullOrEmpty(DataStream)) { - jsonWriter.WriteStartObject(); - jsonWriter.WritePropertyName(DataStream); - jsonWriter.WriteValue(DataPosition); - jsonWriter.WriteEndObject(); - } - - jsonWriter.WriteEndArray(); - break; - } - - if (extraMetaData != null) { - foreach (var pair in extraMetaData) { - jsonWriter.WritePropertyName(pair.Key); - pair.Value.WriteTo(jsonWriter); - } - } - - jsonWriter.WriteEndObject(); - } - - private static void WriteVersion(ProjectionVersion projectionVersion, JsonWriter jsonWriter) { - jsonWriter.WriteValue( - projectionVersion.ProjectionId + ":" + projectionVersion.Epoch + ":" + projectionVersion.Version + ":" - + ProjectionsSubsystem.VERSION); - } - - public static CheckpointTagVersion FromJson(JsonReader reader, ProjectionVersion current, - bool skipStartObject = false) { - if (!skipStartObject) - Check(reader.Read(), reader); - Check(JsonToken.StartObject, reader); - long? commitPosition = null; - long? preparePosition = null; - string catalogStream = null; - string dataStream = null; - long? catalogPosition = null; - long? dataPosition = null; - bool byStreamMode = false; - Dictionary streams = null; - Dictionary extra = null; - var projectionId = current.ProjectionId; - var projectionEpoch = 0; - int projectionVersion = 0; - var projectionSystemVersion = 0; - int projectionPhase = 0; - while (true) { - Check(reader.Read(), reader); - if (reader.TokenType == JsonToken.EndObject) - break; - Check(JsonToken.PropertyName, reader); - var name = (string)reader.Value; - switch (name) { - case "$cp": - Check(reader.Read(), reader); - var completed = (bool)reader.Value; - commitPosition = completed ? Int64.MaxValue : Int64.MinValue; - preparePosition = completed ? Int64.MaxValue : Int64.MinValue; - break; - case "$v": - case "v": - Check(reader.Read(), reader); - if (reader.ValueType == typeof(long)) { - var v = (int)(long)reader.Value; - if (v > 0) // TODO: remove this if with time - projectionVersion = v; - } else { - //TODO: better handle errors - var v = (string)reader.Value; - string[] parts = v.Split(':'); - if (parts.Length == 2) { - projectionVersion = Int32.Parse(parts[1]); - } else { - projectionId = Int32.Parse(parts[0]); - projectionEpoch = Int32.Parse(parts[1]); - projectionVersion = Int32.Parse(parts[2]); - if (parts.Length >= 4) - projectionSystemVersion = Int32.Parse(parts[3]); - } - } - - break; - case "$c": - case "c": - case "commitPosition": - Check(reader.Read(), reader); - commitPosition = (long)reader.Value; - break; - case "$p": - case "p": - case "preparePosition": - Check(reader.Read(), reader); - preparePosition = (long)reader.Value; - break; - case "$s": - case "s": - case "streams": - Check(reader.Read(), reader); - if (reader.TokenType == JsonToken.StartArray) { - Check(reader.Read(), reader); - Check(JsonToken.StartObject, reader); - Check(reader.Read(), reader); - Check(JsonToken.PropertyName, reader); - catalogStream = (string)reader.Value; - Check(reader.Read(), reader); - catalogPosition = (long)reader.Value; - Check(reader.Read(), reader); - Check(JsonToken.EndObject, reader); - - Check(reader.Read(), reader); - if (reader.TokenType == JsonToken.StartObject) { - Check(reader.Read(), reader); - Check(JsonToken.PropertyName, reader); - dataStream = (string)reader.Value; - Check(reader.Read(), reader); - dataPosition = (long)reader.Value; - Check(reader.Read(), reader); - Check(JsonToken.EndObject, reader); - Check(reader.Read(), reader); - } - - Check(JsonToken.EndArray, reader); - } else { - Check(JsonToken.StartObject, reader); - streams = new Dictionary(); - while (true) { - Check(reader.Read(), reader); - if (reader.TokenType == JsonToken.EndObject) - break; - Check(JsonToken.PropertyName, reader); - var streamName = (string)reader.Value; - Check(reader.Read(), reader); - long position = (long)reader.Value; - streams.Add(streamName, position); - } - } - - break; - case "$ph": - Check(reader.Read(), reader); - projectionPhase = (int)(long)reader.Value; - break; - case "$m": - Check(reader.Read(), reader); - var readMode = (string)reader.Value; - if (readMode != "bs") - throw new ApplicationException("Unknown checkpoint tag mode: " + readMode); - byStreamMode = true; - break; - default: - if (extra == null) - extra = new Dictionary(); - Check(reader.Read(), reader); - var jToken = JToken.ReadFrom(reader); - extra.Add(name, jToken); - break; - } - } - - return new CheckpointTagVersion { - Tag = - byStreamMode - ? new CheckpointTag( - projectionPhase, catalogStream, catalogPosition.GetValueOrDefault(), dataStream, - dataPosition ?? -1, commitPosition.GetValueOrDefault()) - : new CheckpointTag( - projectionPhase, - new TFPos(commitPosition ?? Int64.MinValue, preparePosition ?? Int64.MinValue), streams), - Version = new ProjectionVersion(projectionId, projectionEpoch, projectionVersion), - SystemVersion = projectionSystemVersion, - ExtraMetadata = extra, - }; - } - - public static void Check(JsonToken type, JsonReader reader) { - if (reader.TokenType != type) - throw new Exception("Invalid JSON"); - } - - public static void Check(bool read, JsonReader reader) { - if (!read) - throw new Exception("Invalid JSON"); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagExtensions.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagExtensions.cs deleted file mode 100644 index 51eaa1997..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagExtensions.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public static class CheckpointTagExtensions { - public static CheckpointTag ParseCheckpointTagJson(this string source) { - if (string.IsNullOrEmpty(source)) - return null; - var reader = new JsonTextReader(new StringReader(source)); - return CheckpointTag.FromJson(reader, default(ProjectionVersion)).Tag; - } - - public static CheckpointTag ParseCheckpointTagJson(this byte[] source) { - if (source == null || source.Length == 0) - return null; - var reader = new JsonTextReader(new StreamReader(new MemoryStream(source))); - return CheckpointTag.FromJson(reader, default(ProjectionVersion)).Tag; - } - - public static CheckpointTag ParseCheckpointTagJson(this ReadOnlyMemory source) { - if (source.Length == 0) - return null; - var reader = new JsonTextReader(new StreamReader(new MemoryStream(source.ToArray()))); - return CheckpointTag.FromJson(reader, default(ProjectionVersion)).Tag; - } - - public static CheckpointTagVersion ParseCheckpointTagVersionExtraJson(this byte[] source, - ProjectionVersion current) { - if (source == null || source.Length == 0) - return new CheckpointTagVersion - {Version = new ProjectionVersion(current.ProjectionId, 0, 0), Tag = null}; - var reader = new JsonTextReader(new StreamReader(new MemoryStream(source))); - return CheckpointTag.FromJson(reader, current); - } - - public static CheckpointTagVersion ParseCheckpointTagVersionExtraJson(this ReadOnlyMemory source, - ProjectionVersion current) { - if (source.Length == 0) - return new CheckpointTagVersion { Version = new ProjectionVersion(current.ProjectionId, 0, 0), Tag = null }; - var reader = new JsonTextReader(new StreamReader(new MemoryStream(source.ToArray()))); - return CheckpointTag.FromJson(reader, current); - } - - public static CheckpointTagVersion ParseCheckpointTagVersionExtraJson(this string source, - ProjectionVersion current) { - if (string.IsNullOrEmpty(source)) - return new CheckpointTagVersion - {Version = new ProjectionVersion(current.ProjectionId, 0, 0), Tag = null}; - var reader = new JsonTextReader(new StringReader(source)); - return CheckpointTag.FromJson(reader, current); - } - - public static Dictionary ParseCheckpointExtraJson(this string source) { - if (string.IsNullOrEmpty(source)) - return null; - var reader = new JsonTextReader(new StringReader(source)); - return CheckpointTag.FromJson(reader, default(ProjectionVersion)).ExtraMetadata; - } - - public static string ParseCheckpointTagCorrelationId(this string source) { - try { - if (string.IsNullOrEmpty(source)) - return null; - var reader = new JsonTextReader(new StringReader(source)); - if (!reader.Read()) return null; - if (reader.TokenType != JsonToken.StartObject) return null; - while (true) { - CheckpointTag.Check(reader.Read(), reader); - if (reader.TokenType == JsonToken.EndObject) - break; - if (reader.TokenType != JsonToken.PropertyName) return null; - var name = (string)reader.Value; - switch (name) { - default: - if (!reader.Read()) return null; - var jToken = JToken.ReadFrom(reader); - if (name == "$correlationId") - return jToken.ToString(); - break; - } - } - - return null; - } catch (JsonReaderException) { - return null; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagVersion.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagVersion.cs deleted file mode 100644 index fea789507..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CheckpointTagVersion.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing; - -public struct CheckpointTagVersion { - public ProjectionVersion Version; - public int SystemVersion; - public CheckpointTag Tag; - public Dictionary ExtraMetadata; - - public CheckpointTag AdjustBy(PositionTagger tagger, ProjectionVersion version) { - if (SystemVersion == ProjectionsSubsystem.VERSION && Version.Version == version.Version - && Version.ProjectionId == version.ProjectionId) - return Tag; - - return tagger.AdjustTag(Tag); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointManager.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointManager.cs deleted file mode 100644 index 4b8995e49..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointManager.cs +++ /dev/null @@ -1,390 +0,0 @@ -using System; -using System.Diagnostics.Contracts; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using Serilog; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public abstract class CoreProjectionCheckpointManager : IProjectionCheckpointManager, - ICoreProjectionCheckpointManager, - IEmittedEventWriter { - protected readonly ProjectionNamesBuilder _namingBuilder; - protected readonly ProjectionConfig _projectionConfig; - protected readonly ILogger _logger; - - private readonly bool _usePersistentCheckpoints; - - protected readonly IPublisher _publisher; - private readonly Guid _projectionCorrelationId; - private readonly CheckpointTag _zeroTag; - - - protected ProjectionCheckpoint _currentCheckpoint; - private ProjectionCheckpoint _closingCheckpoint; - internal CheckpointTag _requestedCheckpointPosition; - private bool _inCheckpoint; - private PartitionState _requestedCheckpointState; - private CheckpointTag _lastCompletedCheckpointPosition; - private readonly PositionTracker _lastProcessedEventPosition; - private float _lastProcessedEventProgress; - - private int _eventsProcessedAfterRestart; - private bool _started; - protected bool _stopping; - protected bool _stopped; - - private PartitionState _currentProjectionState; - private bool _largeStateWarningLogged = false; - - protected CoreProjectionCheckpointManager( - IPublisher publisher, - Guid projectionCorrelationId, - ProjectionConfig projectionConfig, - string name, - PositionTagger positionTagger, - ProjectionNamesBuilder namingBuilder, - bool usePersistentCheckpoints) { - if (publisher == null) throw new ArgumentNullException("publisher"); - if (projectionConfig == null) throw new ArgumentNullException("projectionConfig"); - if (name == null) throw new ArgumentNullException("name"); - if (positionTagger == null) throw new ArgumentNullException("positionTagger"); - if (namingBuilder == null) throw new ArgumentNullException("namingBuilder"); - if (name == "") throw new ArgumentException("name"); - - _lastProcessedEventPosition = new PositionTracker(positionTagger); - _zeroTag = positionTagger.MakeZeroCheckpointTag(); - - _publisher = publisher; - _projectionCorrelationId = projectionCorrelationId; - _projectionConfig = projectionConfig; - _logger = Serilog.Log.ForContext(); - _namingBuilder = namingBuilder; - _usePersistentCheckpoints = usePersistentCheckpoints; - _requestedCheckpointState = new PartitionState("", null, _zeroTag); - _currentProjectionState = new PartitionState("", null, _zeroTag); - } - - protected abstract ProjectionCheckpoint CreateProjectionCheckpoint(CheckpointTag checkpointPosition); - - protected abstract void BeginWriteCheckpoint( - CheckpointTag requestedCheckpointPosition, string requestedCheckpointState); - - protected abstract void CapturePartitionStateUpdated(string partition, PartitionState oldState, - PartitionState newState); - - protected abstract void EmitPartitionCheckpoints(); - - public abstract void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, - Action committed); - - public abstract void BeginLoadPartitionStateAt( - string statePartition, CheckpointTag requestedStateCheckpointTag, Action loadCompleted); - - public abstract void PartitionCompleted(string partition); - - public virtual void Initialize() { - if (_currentCheckpoint != null) _currentCheckpoint.Dispose(); - if (_closingCheckpoint != null) _closingCheckpoint.Dispose(); - _currentCheckpoint = null; - _closingCheckpoint = null; - _requestedCheckpointPosition = null; - _inCheckpoint = false; - _requestedCheckpointState = new PartitionState("", null, _zeroTag); - _lastCompletedCheckpointPosition = null; - _lastProcessedEventPosition.Initialize(); - _lastProcessedEventProgress = -1; - - _eventsProcessedAfterRestart = 0; - _started = false; - _stopping = false; - _stopped = false; - _currentProjectionState = new PartitionState("", null, _zeroTag); - } - - public virtual void Start(CheckpointTag checkpointTag, PartitionState rootPartitionState) { - Contract.Requires(_currentCheckpoint == null); - if (_started) - throw new InvalidOperationException("Already started"); - _started = true; - - if (rootPartitionState != null) - _currentProjectionState = rootPartitionState; - - _lastProcessedEventPosition.UpdateByCheckpointTagInitial(checkpointTag); - _lastProcessedEventProgress = -1; - _lastCompletedCheckpointPosition = checkpointTag; - _requestedCheckpointPosition = null; - _currentCheckpoint = CreateProjectionCheckpoint(_lastProcessedEventPosition.LastTag); - _currentCheckpoint.Start(); - } - - public void Stopping() { - EnsureStarted(); - if (_stopping) - throw new InvalidOperationException("Already stopping"); - _stopping = true; - RequestCheckpointToStop(); - } - - public void Stopped() { - EnsureStarted(); - _started = false; - _stopped = true; - - if (_currentCheckpoint != null) _currentCheckpoint.Dispose(); - _currentCheckpoint = null; - - if (_closingCheckpoint != null) _closingCheckpoint.Dispose(); - _closingCheckpoint = null; - } - - public virtual void GetStatistics(ProjectionStatistics info) { - info.Position = (_lastProcessedEventPosition.LastTag ?? (object)"").ToString(); - info.Progress = _lastProcessedEventProgress; - info.LastCheckpoint = _lastCompletedCheckpointPosition != null - ? _lastCompletedCheckpointPosition.ToString() - : ""; - info.EventsProcessedAfterRestart = _eventsProcessedAfterRestart; - info.WritePendingEventsBeforeCheckpoint = _closingCheckpoint != null - ? _closingCheckpoint.GetWritePendingEvents() - : 0; - info.WritePendingEventsAfterCheckpoint = (_currentCheckpoint != null - ? _currentCheckpoint.GetWritePendingEvents() - : 0); - info.ReadsInProgress = /*_readDispatcher.ActiveRequestCount*/ - + +(_closingCheckpoint != null ? _closingCheckpoint.GetReadsInProgress() : 0) - + (_currentCheckpoint != null ? _currentCheckpoint.GetReadsInProgress() : 0); - info.WritesInProgress = (_closingCheckpoint != null ? _closingCheckpoint.GetWritesInProgress() : 0) - + (_currentCheckpoint != null ? _currentCheckpoint.GetWritesInProgress() : 0); - info.CheckpointStatus = _inCheckpoint ? "Requested" : ""; - } - - public void StateUpdated( - string partition, PartitionState oldState, PartitionState newState) { - if (_stopped) - return; - EnsureStarted(); - if (_stopping) - throw new InvalidOperationException("Stopping"); - - if (partition == "" && newState.State == null) // ignore non-root partitions and non-changed states - throw new NotSupportedException("Internal check"); - - CheckStateSize(newState , partition); - - if (_usePersistentCheckpoints && partition != "") - CapturePartitionStateUpdated(partition, oldState, newState); - - if (partition == "") - _currentProjectionState = newState; - } - - private void CheckStateSize(PartitionState result , string partition) { - if (!_largeStateWarningLogged && result.Size >= 8_000_000 && !partition.Equals("")) { - Log.Warning( - "State size for the Projection {projectionName} for Partition {partitionName} is greater than 8 MB. State size for a projection must be less than 16 MB. Current state size for Partition {partitionName} is {stateSize} MB.", - _namingBuilder.EffectiveProjectionName, partition, partition, - result.Size / Math.Pow(10, 6)); - _largeStateWarningLogged = true; - } - else if (!_largeStateWarningLogged && result.Size >= 8_000_000 && partition.Equals("") ) { - Log.Warning( - "State size for the Projection {projectionName} is greater than 8 MB. State size for a projection must be less than 16 MB. Current state size for Projection {projectionName} is {stateSize} MB.", - _namingBuilder.EffectiveProjectionName, _namingBuilder.EffectiveProjectionName, - result.Size / Math.Pow(10, 6)); - _largeStateWarningLogged = true; - } - } - - public void EventProcessed(CheckpointTag checkpointTag, float progress) { - if (_stopped) - return; - EnsureStarted(); - if (_stopping) - throw new InvalidOperationException("Stopping"); - _eventsProcessedAfterRestart++; - _lastProcessedEventPosition.UpdateByCheckpointTagForward(checkpointTag); - _lastProcessedEventProgress = progress; - // running state only - } - - public void EventsEmitted(EmittedEventEnvelope[] scheduledWrites, Guid causedBy, string correlationId) { - if (_stopped) - return; - EnsureStarted(); - if (_stopping) - throw new InvalidOperationException("Stopping"); - if (scheduledWrites != null) { - foreach (var @event in scheduledWrites) { - var emittedEvent = @event.Event; - if (string.IsNullOrEmpty(@event.Event.StreamId)) { - Failed("Cannot write to a null stream id"); - return; - } - - emittedEvent.SetCausedBy(causedBy); - emittedEvent.SetCorrelationId(correlationId); - } - - _currentCheckpoint.ValidateOrderAndEmitEvents(scheduledWrites); - } - } - - public bool CheckpointSuggested(CheckpointTag checkpointTag, float progress) { - if (!_usePersistentCheckpoints) - throw new InvalidOperationException("Checkpoints are not used"); - if (_stopped || _stopping) - return true; - EnsureStarted(); - if (checkpointTag != _lastProcessedEventPosition.LastTag) // allow checkpoint at the current position - _lastProcessedEventPosition.UpdateByCheckpointTagForward(checkpointTag); - _lastProcessedEventProgress = progress; - return RequestCheckpoint(_lastProcessedEventPosition); - } - - public void Progress(float progress) { - if (_stopping || _stopped) - return; - _lastProcessedEventProgress = progress < -1 ? -1 : progress; - } - - public CheckpointTag LastProcessedEventPosition { - get { return _lastProcessedEventPosition.LastTag; } - } - - - public void Handle(CoreProjectionProcessingMessage.ReadyForCheckpoint message) { - // ignore any messages - typically when faulted - if (_stopped) - return; - // ignore any messages from previous checkpoints probably before RestartRequested - if (message.Sender != _closingCheckpoint) - return; - if (!_inCheckpoint) - throw new InvalidOperationException(); - if (_usePersistentCheckpoints) - BeginWriteCheckpoint(_requestedCheckpointPosition, _requestedCheckpointState.Serialize()); - else - CheckpointWritten(_requestedCheckpointPosition); - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - if (_stopped) - return; - RequestRestart(message.Reason); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - if (_stopped) - return; - Failed(message.Reason); - } - - protected void PrerecordedEventsLoaded(CheckpointTag checkpointTag) { - _publisher.Publish( - new CoreProjectionProcessingMessage.PrerecordedEventsLoaded(_projectionCorrelationId, checkpointTag)); - } - - private void RequestCheckpointToStop() { - EnsureStarted(); - if (!_stopping) - throw new InvalidOperationException("Not stopping"); - if (_inCheckpoint) // checkpoint in progress. no other writes will happen, so we can stop here. - return; - // do not request checkpoint if no events were processed since last checkpoint - //NOTE: we ignore _usePersistentCheckpoints flag as we need to flush final writes before query object - // has been disposed - if ( /* _usePersistentCheckpoints && */ - _lastCompletedCheckpointPosition < _lastProcessedEventPosition.LastTag) { - RequestCheckpoint(_lastProcessedEventPosition, forcePrepareCheckpoint: true); - return; - } - - _publisher.Publish( - new CoreProjectionProcessingMessage.CheckpointCompleted( - _projectionCorrelationId, _lastCompletedCheckpointPosition)); - } - - protected void EnsureStarted() { - if (!_started) - throw new InvalidOperationException("Not started"); - } - - /// true - if checkpoint has beem completed in-sync - private bool RequestCheckpoint(PositionTracker lastProcessedEventPosition, - bool forcePrepareCheckpoint = false) { - if (!forcePrepareCheckpoint && !_usePersistentCheckpoints) - throw new InvalidOperationException("Checkpoints are not allowed"); - if (_inCheckpoint) - throw new InvalidOperationException("Checkpoint in progress"); - return StartCheckpoint(lastProcessedEventPosition, _currentProjectionState); - } - - /// true - if checkpoint has been completed in-sync - private bool StartCheckpoint(PositionTracker lastProcessedEventPosition, PartitionState projectionState) { - Contract.Requires(_closingCheckpoint == null); - if (projectionState == null) throw new ArgumentNullException("projectionState"); - - CheckpointTag requestedCheckpointPosition = lastProcessedEventPosition.LastTag; - if (requestedCheckpointPosition == _lastCompletedCheckpointPosition) - return true; // either suggested or requested to stop - - if (_usePersistentCheckpoints) // do not emit any events if we do not use persistent checkpoints - EmitPartitionCheckpoints(); - - _inCheckpoint = true; - _requestedCheckpointPosition = requestedCheckpointPosition; - _requestedCheckpointState = projectionState; - _closingCheckpoint = _currentCheckpoint; - _currentCheckpoint = CreateProjectionCheckpoint(requestedCheckpointPosition); - // checkpoint only after assigning new current checkpoint, as it may call back immediately - _closingCheckpoint.Prepare(requestedCheckpointPosition); - return false; // even if prepare completes in sync it notifies the world by a message - } - - protected void SendPrerecordedEvent( - EventStore.Core.Data.ResolvedEvent pair, CheckpointTag positionTag, - long prerecordedEventMessageSequenceNumber) { - var committedEvent = new ReaderSubscriptionMessage.CommittedEventDistributed( - Guid.Empty, new ResolvedEvent(pair, null), null, -1, source: this.GetType()); - _publisher.Publish( - EventReaderSubscriptionMessage.CommittedEventReceived.FromCommittedEventDistributed( - committedEvent, positionTag, null, _projectionCorrelationId, - prerecordedEventMessageSequenceNumber)); - } - - - protected void RequestRestart(string reason) { - _stopped = true; // ignore messages - _publisher.Publish(new CoreProjectionProcessingMessage.RestartRequested(_projectionCorrelationId, reason)); - } - - private void Failed(string reason) { - _stopped = true; // ignore messages - _publisher.Publish(new CoreProjectionProcessingMessage.Failed(_projectionCorrelationId, reason)); - } - - protected void CheckpointWritten(CheckpointTag lastCompletedCheckpointPosition) { - Contract.Requires(_closingCheckpoint != null); - _lastCompletedCheckpointPosition = lastCompletedCheckpointPosition; - _closingCheckpoint.Dispose(); - _closingCheckpoint = null; - if (!_stopping) - // ignore any writes pending in the current checkpoint (this is not the best, but they will never hit the storage, so it is safe) - _currentCheckpoint.Start(); - _inCheckpoint = false; - - //NOTE: the next checkpoint will start by completing checkpoint work item - _publisher.Publish( - new CoreProjectionProcessingMessage.CheckpointCompleted( - _projectionCorrelationId, _lastCompletedCheckpointPosition)); - } - - public virtual void BeginLoadPrerecordedEvents(CheckpointTag checkpointTag) { - PrerecordedEventsLoaded(checkpointTag); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointReader.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointReader.cs deleted file mode 100644 index 1ad9f0a23..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointReader.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.UserManagement; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class CoreProjectionCheckpointReader : ICoreProjectionCheckpointReader { - private readonly IPublisher _publisher; - private readonly Guid _projectionCorrelationId; - private readonly IODispatcher _ioDispatcher; - private readonly string _projectionCheckpointStreamId; - private readonly bool _useCheckpoints; - private readonly ILogger _logger = Serilog.Log.ForContext(); - - private bool _stateRequested; - - private long _nextStateIndexToRequest; - private ProjectionVersion _projectionVersion; - private Guid _readRequestId; - private long _lastWrittenCheckpointEventNumber; - - public CoreProjectionCheckpointReader( - IPublisher publisher, Guid projectionCorrelationId, IODispatcher ioDispatcher, - string projectionCheckpointStreamId, ProjectionVersion projectionVersion, bool useCheckpoints) { - _publisher = publisher; - _projectionCorrelationId = projectionCorrelationId; - _ioDispatcher = ioDispatcher; - _projectionCheckpointStreamId = projectionCheckpointStreamId; - _projectionVersion = projectionVersion; - _useCheckpoints = useCheckpoints; - } - - public void BeginLoadState() { - if (_stateRequested) - throw new InvalidOperationException("State has been already requested"); - BeforeBeginLoadState(); - _stateRequested = true; - if (_useCheckpoints) { - RequestLoadState(); - } else { - CheckpointLoaded(null, null); - } - } - - public void Initialize() { - _ioDispatcher.BackwardReader.Cancel(_readRequestId); - _readRequestId = Guid.Empty; - _stateRequested = false; - } - - protected void BeforeBeginLoadState() { - _lastWrittenCheckpointEventNumber = ExpectedVersion.NoStream; - _nextStateIndexToRequest = -1; // from the end - } - - protected void RequestLoadState() { - const int recordsToRequest = 10; - _readRequestId = Guid.NewGuid(); - _ioDispatcher.ReadBackward( - _projectionCheckpointStreamId, _nextStateIndexToRequest, recordsToRequest, false, - SystemAccounts.System, OnLoadStateReadRequestCompleted, - () => { - _logger.Warning("Read forward of stream {stream} timed out. Retrying.", _projectionCheckpointStreamId); - RequestLoadState(); - }, _readRequestId); - } - - - private void OnLoadStateReadRequestCompleted(ClientMessage.ReadStreamEventsBackwardCompleted message) { - if (message.Events.Length > 0) { - var checkpoint = message.Events - .Where(v => v.Event.EventType == ProjectionEventTypes.ProjectionCheckpoint).Select(x => x.Event) - .FirstOrDefault(); - if (checkpoint != null) { - var parsed = checkpoint.Metadata.ParseCheckpointTagVersionExtraJson(_projectionVersion); - if (parsed.Version.ProjectionId != _projectionVersion.ProjectionId - || _projectionVersion.Epoch > parsed.Version.Version) { - _lastWrittenCheckpointEventNumber = checkpoint.EventNumber; - CheckpointLoaded(null, null); - } else { - //TODO: check epoch and correctly set _lastWrittenCheckpointEventNumber - var checkpointData = Helper.UTF8NoBom.GetString(checkpoint.Data.Span); - _lastWrittenCheckpointEventNumber = checkpoint.EventNumber; - var adjustedTag = parsed.Tag; // the same projection and epoch, handle upgrades internally - CheckpointLoaded(adjustedTag, checkpointData); - } - - return; - } - } - - if (message.NextEventNumber != -1) { - _nextStateIndexToRequest = message.NextEventNumber; - RequestLoadState(); - return; - } - - _lastWrittenCheckpointEventNumber = message.LastEventNumber; - CheckpointLoaded(null, null); - } - - - protected void CheckpointLoaded(CheckpointTag checkpointTag, string checkpointData) { - if (checkpointTag == null) // no checkpoint data found - { - checkpointData = null; - } - - _publisher.Publish( - new CoreProjectionProcessingMessage.CheckpointLoaded( - _projectionCorrelationId, checkpointTag, checkpointData, _lastWrittenCheckpointEventNumber)); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointWriter.cs deleted file mode 100644 index 1c09905e7..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/CoreProjectionCheckpointWriter.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using Serilog; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class CoreProjectionCheckpointWriter { - private readonly string _projectionCheckpointStreamId; - private readonly ILogger _logger; - private readonly IODispatcher _ioDispatcher; - private readonly ProjectionVersion _projectionVersion; - private readonly string _name; - - private Guid _writeRequestId; - private int _inCheckpointWriteAttempt; - private long _lastWrittenCheckpointEventNumber; - private Event _checkpointEventToBePublished; - private CheckpointTag _requestedCheckpointPosition; - private IEnvelope _envelope; - private const int MaxNumberOfRetries = 12; - private const int MinAttemptWarnThreshold = 5; - private bool _metaStreamWritten; - private Random _random = new Random(); - private bool _largeCheckpointStateWarningLogged = false; - - public CoreProjectionCheckpointWriter( - string projectionCheckpointStreamId, IODispatcher ioDispatcher, ProjectionVersion projectionVersion, - string name) { - _projectionCheckpointStreamId = projectionCheckpointStreamId; - _logger = Serilog.Log.ForContext(); - _ioDispatcher = ioDispatcher; - _projectionVersion = projectionVersion; - _name = name; - } - - public void BeginWriteCheckpoint(IEnvelope envelope, - CheckpointTag requestedCheckpointPosition, string requestedCheckpointState) { - _envelope = envelope; - _requestedCheckpointPosition = requestedCheckpointPosition; - _inCheckpointWriteAttempt = 1; - //TODO: pass correct expected version - _checkpointEventToBePublished = new Event( - Guid.NewGuid(), ProjectionEventTypes.ProjectionCheckpoint, true, - requestedCheckpointState == null ? null : Helper.UTF8NoBom.GetBytes(requestedCheckpointState), - requestedCheckpointPosition.ToJsonBytes(projectionVersion: _projectionVersion)); - PublishWriteStreamMetadataAndCheckpointEventDelayed(); - } - - private void WriteCheckpointEventCompleted( - string eventStreamId, OperationResult operationResult, long firstWrittenEventNumber) { - if (_inCheckpointWriteAttempt == 0) - throw new InvalidOperationException(); - if (operationResult == OperationResult.Success) { - if (_logger != null) - _logger.Verbose( - "Checkpoint has been written for projection {projection} at sequence number {firstWrittenEventNumber} (current)", - _name, - firstWrittenEventNumber); - _lastWrittenCheckpointEventNumber = firstWrittenEventNumber; - - _inCheckpointWriteAttempt = 0; - _envelope.ReplyWith( - new CoreProjectionCheckpointWriterMessage.CheckpointWritten(_requestedCheckpointPosition)); - } else { - if (_logger != null) { - _logger.Information( - "Failed to write projection checkpoint to stream {stream}. Error: {e}", eventStreamId, - Enum.GetName(typeof(OperationResult), operationResult)); - } - - switch (operationResult) { - case OperationResult.WrongExpectedVersion: - _envelope.ReplyWith(new CoreProjectionProcessingMessage.Failed(Guid.Empty, - $"Checkpoint stream `{eventStreamId}` has been written to from the outside" - )); - break; - case OperationResult.PrepareTimeout: - case OperationResult.ForwardTimeout: - case OperationResult.CommitTimeout: - if (_inCheckpointWriteAttempt >= MaxNumberOfRetries) { - //The first parameter is not needed in this case as the CoreProjectionCheckpointManager takes care of filling in the projection id when it reconstructs the message - _envelope.ReplyWith(new CoreProjectionProcessingMessage.Failed(Guid.Empty, - string.Format( - "After retrying {0} times, we failed to write the checkpoint for {1} to {2} due to a {3}", - MaxNumberOfRetries, _name, eventStreamId, - Enum.GetName(typeof(OperationResult), operationResult)))); - _inCheckpointWriteAttempt = 0; - return; - } - - _inCheckpointWriteAttempt++; - PublishWriteStreamMetadataAndCheckpointEventDelayed(); - break; - default: - throw new NotSupportedException("Unsupported error code received"); - } - } - } - - private void PublishWriteStreamMetadataAndCheckpointEventDelayed() { - var attempt = _inCheckpointWriteAttempt; - var delayInSeconds = CalculateBackoffTimeSecs(attempt); - if(delayInSeconds == 0) - PublishWriteStreamMetadataAndCheckpointEvent(); - else { - if (attempt >= MinAttemptWarnThreshold && _logger != null) { - _logger.Warning("Attempt: {attempt} to write checkpoint for {projection} at {requestedCheckpointPosition} with expected version number {lastWrittenCheckpointEventNumber}. Backing off for {time} second(s).", - attempt, - _name, - _requestedCheckpointPosition, - _lastWrittenCheckpointEventNumber, - delayInSeconds); - } - _ioDispatcher.Delay( - TimeSpan.FromSeconds(delayInSeconds), - _ => PublishWriteStreamMetadataAndCheckpointEvent()); - } - } - - private void PublishWriteStreamMetadataAndCheckpointEvent() { - if (_logger != null) - _logger.Verbose( - "Writing checkpoint for {projection} at {requestedCheckpointPosition} with expected version number {lastWrittenCheckpointEventNumber}", - _name, _requestedCheckpointPosition, _lastWrittenCheckpointEventNumber); - if (!_metaStreamWritten) - PublishWriteStreamMetadata(); - else - PublishWriteCheckpointEvent(); - } - - private void PublishWriteStreamMetadata() { - var metaStreamId = SystemStreams.MetastreamOf(_projectionCheckpointStreamId); - _writeRequestId = _ioDispatcher.WriteEvent( - metaStreamId, ExpectedVersion.Any, CreateStreamMetadataEvent(), SystemAccounts.System, msg => { - switch (msg.Result) { - case OperationResult.Success: - _metaStreamWritten = true; - PublishWriteCheckpointEvent(); - break; - default: - WriteCheckpointEventCompleted(metaStreamId, msg.Result, ExpectedVersion.Invalid); - break; - } - }); - } - - private Event CreateStreamMetadataEvent() { - var eventId = Guid.NewGuid(); - var acl = new StreamAcl( - readRole: SystemRoles.Admins, writeRole: SystemRoles.Admins, - deleteRole: SystemRoles.Admins, metaReadRole: SystemRoles.All, - metaWriteRole: SystemRoles.Admins); - var metadata = new StreamMetadata(maxCount: 2, maxAge: null, cacheControl: null, acl: acl); - var dataBytes = metadata.ToJsonBytes(); - return new Event(eventId, SystemEventTypes.StreamMetadata, isJson: true, data: dataBytes, metadata: null); - } - - private void PublishWriteCheckpointEvent() { - CheckpointStateSizeCheck(); - _writeRequestId = _ioDispatcher.WriteEvent( - _projectionCheckpointStreamId, _lastWrittenCheckpointEventNumber, _checkpointEventToBePublished, - SystemAccounts.System, - msg => WriteCheckpointEventCompleted(_projectionCheckpointStreamId, msg.Result, msg.FirstEventNumber)); - } - - private void CheckpointStateSizeCheck() { - if (!_largeCheckpointStateWarningLogged && _checkpointEventToBePublished.Data.Length >= 8_000_000) { - Log.Warning( - "State size for the Projection {projectionName} is greater than 8 MB. State size for a projection should be less than 16 MB. Current state size for Projection {projectionName} is {stateSize} MB.", - _name, _name, - _checkpointEventToBePublished.Data.Length / Math.Pow(10, 6)); - _largeCheckpointStateWarningLogged = true; - } - } - - public void Initialize() { - _checkpointEventToBePublished = null; - _inCheckpointWriteAttempt = 0; - _ioDispatcher.Writer.Cancel(_writeRequestId); - _lastWrittenCheckpointEventNumber = ExpectedVersion.Invalid; - _metaStreamWritten = false; - } - - public void GetStatistics(ProjectionStatistics info) { - info.WritesInProgress = ((_inCheckpointWriteAttempt != 0) ? 1 : 0) + info.WritesInProgress; - info.CheckpointStatus = _inCheckpointWriteAttempt > 0 - ? "Writing (" + _inCheckpointWriteAttempt + ")" - : info.CheckpointStatus; - } - - public void StartFrom(CheckpointTag checkpointTag, long checkpointEventNumber) { - _lastWrittenCheckpointEventNumber = checkpointEventNumber; - _metaStreamWritten = checkpointEventNumber != ExpectedVersion.NoStream; - } - - private int CalculateBackoffTimeSecs(int attempt) { - attempt--; - if (attempt == 0) return 0; - var expBackoff = attempt < 9 ? (1 << attempt) : 256; - return _random.Next(1, expBackoff + 1); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/DefaultCheckpointManager.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/DefaultCheckpointManager.cs deleted file mode 100644 index 475e9c8a9..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/DefaultCheckpointManager.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class DefaultCheckpointManager : CoreProjectionCheckpointManager, - IHandle, - IHandle { - private readonly ClaimsPrincipal _runAs; - private readonly CheckpointTag _zeroTag; - private int _readRequestsInProgress; - private readonly HashSet _loadStateRequests = new HashSet(); - - protected readonly ProjectionVersion _projectionVersion; - protected readonly IODispatcher _ioDispatcher; - private readonly PositionTagger _positionTagger; - private readonly CoreProjectionCheckpointWriter _coreProjectionCheckpointWriter; - private PartitionStateUpdateManager _partitionStateUpdateManager; - - public DefaultCheckpointManager( - IPublisher publisher, Guid projectionCorrelationId, ProjectionVersion projectionVersion, ClaimsPrincipal runAs, - IODispatcher ioDispatcher, ProjectionConfig projectionConfig, string name, PositionTagger positionTagger, - ProjectionNamesBuilder namingBuilder, bool usePersistentCheckpoints, bool producesRunningResults, - bool definesFold, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter) - : base( - publisher, projectionCorrelationId, projectionConfig, name, positionTagger, namingBuilder, - usePersistentCheckpoints) { - if (ioDispatcher == null) throw new ArgumentNullException("ioDispatcher"); - _projectionVersion = projectionVersion; - _runAs = runAs; - _ioDispatcher = ioDispatcher; - _positionTagger = positionTagger; - _coreProjectionCheckpointWriter = coreProjectionCheckpointWriter; - _zeroTag = positionTagger.MakeZeroCheckpointTag(); - } - - protected override void BeginWriteCheckpoint( - CheckpointTag requestedCheckpointPosition, string requestedCheckpointState) { - _requestedCheckpointPosition = requestedCheckpointPosition; - _coreProjectionCheckpointWriter.BeginWriteCheckpoint( - new SendToThisEnvelope(this), requestedCheckpointPosition, requestedCheckpointState); - } - - public override void RecordEventOrder( - ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed) { - committed(); - } - - public override void PartitionCompleted(string partition) { - _partitionStateUpdateManager.PartitionCompleted(partition); - } - - public override void Initialize() { - base.Initialize(); - _partitionStateUpdateManager = null; - foreach (var requestId in _loadStateRequests) - _ioDispatcher.BackwardReader.Cancel(requestId); - _loadStateRequests.Clear(); - _coreProjectionCheckpointWriter.Initialize(); - _requestedCheckpointPosition = null; - _readRequestsInProgress = 0; - } - - public override void GetStatistics(ProjectionStatistics info) { - base.GetStatistics(info); - info.ReadsInProgress += _readRequestsInProgress; - _coreProjectionCheckpointWriter.GetStatistics(info); - } - - public override void BeginLoadPartitionStateAt( - string statePartition, CheckpointTag requestedStateCheckpointTag, Action loadCompleted) { - var stateEventType = ProjectionEventTypes.PartitionCheckpoint; - var partitionCheckpointStreamName = _namingBuilder.MakePartitionCheckpointStreamName(statePartition); - - ReadPartitionStream(partitionCheckpointStreamName, -1, requestedStateCheckpointTag, loadCompleted, - stateEventType); - } - - private void ReadPartitionStream(string partitionStreamName, long eventNumber, - CheckpointTag requestedStateCheckpointTag, - Action loadCompleted, string stateEventType) { - _readRequestsInProgress++; - var requestId = Guid.NewGuid(); - _ioDispatcher.ReadBackward( - partitionStreamName, eventNumber, 1, false, SystemAccounts.System, - m => - OnLoadPartitionStateReadStreamEventsBackwardCompleted( - m, requestedStateCheckpointTag, loadCompleted, partitionStreamName, stateEventType), - () => { - _logger.Warning("Read backward for stream {stream} timed out. Retrying", partitionStreamName); - _loadStateRequests.Remove(requestId); - _readRequestsInProgress--; - ReadPartitionStream(partitionStreamName, eventNumber, requestedStateCheckpointTag, loadCompleted, - stateEventType); - }, requestId); - if (requestId != Guid.Empty) - _loadStateRequests.Add(requestId); - } - - private void OnLoadPartitionStateReadStreamEventsBackwardCompleted( - ClientMessage.ReadStreamEventsBackwardCompleted message, CheckpointTag requestedStateCheckpointTag, - Action loadCompleted, string partitionStreamName, string stateEventType) { - _loadStateRequests.Remove(message.CorrelationId); - - _readRequestsInProgress--; - if (message.Events.Length == 1) { - EventRecord @event = message.Events[0].Event; - if (@event.EventType == stateEventType) { - var parsed = @event.Metadata.ParseCheckpointTagVersionExtraJson(_projectionVersion); - if (parsed.Version.ProjectionId != _projectionVersion.ProjectionId - || _projectionVersion.Epoch > parsed.Version.Version) { - var state = new PartitionState("", null, _zeroTag); - loadCompleted(state); - return; - } else { - var loadedStateCheckpointTag = parsed.AdjustBy(_positionTagger, _projectionVersion); - var state = PartitionState.Deserialize( - Helper.UTF8NoBom.GetString(@event.Data.Span), loadedStateCheckpointTag); - loadCompleted(state); - return; - } - } - } - - if (message.NextEventNumber == -1) { - var state = new PartitionState("", null, _zeroTag); - loadCompleted(state); - return; - } - - ReadPartitionStream(partitionStreamName, message.NextEventNumber, requestedStateCheckpointTag, - loadCompleted, stateEventType); - } - - protected override ProjectionCheckpoint CreateProjectionCheckpoint(CheckpointTag checkpointPosition) { - return new ProjectionCheckpoint( - _publisher, _ioDispatcher, _projectionVersion, _runAs, this, checkpointPosition, _positionTagger, - _projectionConfig.MaxWriteBatchLength, _projectionConfig.MaximumAllowedWritesInFlight, _logger); - } - - public void Handle(CoreProjectionCheckpointWriterMessage.CheckpointWritten message) { - CheckpointWritten(message.Position); - } - - public void Handle(CoreProjectionCheckpointWriterMessage.RestartRequested message) { - RequestRestart(message.Reason); - } - - protected override void CapturePartitionStateUpdated(string partition, PartitionState oldState, - PartitionState newState) { - if (_partitionStateUpdateManager == null) - _partitionStateUpdateManager = new PartitionStateUpdateManager(_namingBuilder); - _partitionStateUpdateManager.StateUpdated(partition, newState, oldState.CausedBy); - } - - protected override void EmitPartitionCheckpoints() { - if (_partitionStateUpdateManager != null) { - _partitionStateUpdateManager.EmitEvents(_currentCheckpoint); - _partitionStateUpdateManager = null; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointManager.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointManager.cs deleted file mode 100644 index 54168f761..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public interface ICoreProjectionCheckpointManager { - void Initialize(); - void Start(CheckpointTag checkpointTag, PartitionState rootPartitionState); - void Stopping(); - void Stopped(); - void GetStatistics(ProjectionStatistics info); - - - void StateUpdated(string partition, PartitionState oldState, PartitionState newState); - void PartitionCompleted(string partition); - void EventProcessed(CheckpointTag checkpointTag, float progress); - - /// - /// Suggests a checkpoint which may complete immediately or be delayed - /// - /// - /// - /// true - if checkpoint has been completed (or skipped) - bool CheckpointSuggested(CheckpointTag checkpointTag, float progress); - - void Progress(float progress); - - void BeginLoadPrerecordedEvents(CheckpointTag checkpointTag); - - void BeginLoadPartitionStateAt( - string statePartition, CheckpointTag requestedStateCheckpointTag, - Action loadCompleted); - - void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed); - CheckpointTag LastProcessedEventPosition { get; } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointReader.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointReader.cs deleted file mode 100644 index 3d05fd476..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ICoreProjectionCheckpointReader.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Checkpointing; - -public interface ICoreProjectionCheckpointReader { - void BeginLoadState(); - void Initialize(); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEmittedEventWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEmittedEventWriter.cs deleted file mode 100644 index 266476d75..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEmittedEventWriter.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing; - -public interface IEmittedEventWriter { - void EventsEmitted(EmittedEventEnvelope[] scheduledWrites, Guid causedBy, string correlationId); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEventWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEventWriter.cs deleted file mode 100644 index 21360a72c..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/IEventWriter.cs +++ /dev/null @@ -1,7 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public interface IEventWriter { - void ValidateOrderAndEmitEvents(EmittedEventEnvelope[] events); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTagger.cs deleted file mode 100644 index 0ecc88b5a..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTagger.cs +++ /dev/null @@ -1,29 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public abstract class PositionTagger { - public readonly int Phase; - - public PositionTagger(int phase) { - Phase = phase; - } - - public abstract bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent); - - public abstract CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent); - - public abstract CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof); - - public abstract CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted); - - public abstract CheckpointTag MakeZeroCheckpointTag(); - - public abstract bool IsCompatible(CheckpointTag checkpointTag); - - public abstract CheckpointTag AdjustTag(CheckpointTag tag); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTracker.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTracker.cs deleted file mode 100644 index e78004b8f..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/PositionTracker.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class PositionTracker { - private readonly PositionTagger _positionTagger; - private CheckpointTag _lastTag = null; - - public PositionTracker(PositionTagger positionTagger) { - _positionTagger = positionTagger; - } - - public CheckpointTag LastTag { - get { return _lastTag; } - } - - public void UpdateByCheckpointTagForward(CheckpointTag newTag) { - if (_lastTag == null) - throw new InvalidOperationException("Initial position was not set"); - if (newTag <= _lastTag) - throw new InvalidOperationException( - string.Format("Event at checkpoint tag {0} has been already processed", newTag)); - InternalUpdate(newTag); - } - - public void UpdateByCheckpointTagInitial(CheckpointTag checkpointTag) { - if (_lastTag != null) - throw new InvalidOperationException("Position tagger has be already updated"); - InternalUpdate(checkpointTag); - } - - private void InternalUpdate(CheckpointTag newTag) { - if (!_positionTagger.IsCompatible(newTag)) - throw new InvalidOperationException("Cannot update by incompatible checkpoint tag"); - _lastTag = newTag; - } - - public void Initialize() { - _lastTag = null; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ProjectionCheckpoint.cs b/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ProjectionCheckpoint.cs deleted file mode 100644 index f07d3de19..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Checkpointing/ProjectionCheckpoint.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Messaging; -using EventStore.Projections.Core.Common; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Checkpointing { - public class ProjectionCheckpoint : IDisposable, IEmittedStreamContainer, IEventWriter { - private readonly int _maxWriteBatchLength; - private readonly Serilog.ILogger _logger; - - private readonly Dictionary _emittedStreams = new Dictionary(); - private readonly ClaimsPrincipal _runAs; - private readonly CheckpointTag _from; - private CheckpointTag _last; - private readonly IProjectionCheckpointManager _readyHandler; - private readonly PositionTagger _positionTagger; - - private bool _checkpointRequested = false; - private int _requestedCheckpoints; - private bool _started = false; - - private readonly IODispatcher _ioDispatcher; - private readonly IPublisher _publisher; - - private readonly ProjectionVersion _projectionVersion; - - private List _awaitingStreams; - - private Guid[] _writeQueueIds; - private int _maximumAllowedWritesInFlight; - - public ProjectionCheckpoint( - IPublisher publisher, - IODispatcher ioDispatcher, - ProjectionVersion projectionVersion, - ClaimsPrincipal runAs, - IProjectionCheckpointManager readyHandler, - CheckpointTag from, - PositionTagger positionTagger, - int maxWriteBatchLength, - int maximumAllowedWritesInFlight, - ILogger logger = null) { - if (publisher == null) throw new ArgumentNullException("publisher"); - if (ioDispatcher == null) throw new ArgumentNullException("ioDispatcher"); - if (readyHandler == null) throw new ArgumentNullException("readyHandler"); - if (positionTagger == null) throw new ArgumentNullException("positionTagger"); - if (from.CommitPosition < from.PreparePosition) throw new ArgumentException("from"); - //NOTE: fromCommit can be equal fromPrepare on 0 position. Is it possible anytime later? Ignoring for now. - _maximumAllowedWritesInFlight = maximumAllowedWritesInFlight; - _publisher = publisher; - _ioDispatcher = ioDispatcher; - _projectionVersion = projectionVersion; - _runAs = runAs; - _readyHandler = readyHandler; - _positionTagger = positionTagger; - _from = _last = from; - _maxWriteBatchLength = maxWriteBatchLength; - _logger = logger; - _writeQueueIds = Enumerable.Range(0, _maximumAllowedWritesInFlight).Select(x => Guid.NewGuid()).ToArray(); - } - - public void Start() { - if (_started) - throw new InvalidOperationException("Projection has been already started"); - _started = true; - foreach (var stream in _emittedStreams.Values) { - stream.Start(); - } - } - - public void ValidateOrderAndEmitEvents(EmittedEventEnvelope[] events) { - UpdateLastPosition(events); - EnsureCheckpointNotRequested(); - - var groupedEvents = events.GroupBy(v => v.Event.StreamId); - foreach (var eventGroup in groupedEvents) { - EmitEventsToStream(eventGroup.Key, eventGroup.ToArray()); - } - } - - private void UpdateLastPosition(EmittedEventEnvelope[] events) { - foreach (var emittedEvent in events) { - if (emittedEvent.Event.CausedByTag > _last) - _last = emittedEvent.Event.CausedByTag; - } - } - - private void ValidateCheckpointPosition(CheckpointTag position) { - if (position <= _from) - throw new InvalidOperationException( - string.Format( - "Checkpoint position before or equal to the checkpoint start position. Requested: '{0}' Started: '{1}'", - position, _from)); - if (position < _last) - throw new InvalidOperationException( - string.Format( - "Checkpoint position before last handled position. Requested: '{0}' Last: '{1}'", position, - _last)); - } - - public void Prepare(CheckpointTag position) { - if (!_started) - throw new InvalidOperationException("Projection has not been started"); - ValidateCheckpointPosition(position); - _checkpointRequested = true; - _requestedCheckpoints = 1; // avoid multiple checkpoint ready messages if already ready - foreach (var emittedStream in _emittedStreams.Values) { - _requestedCheckpoints++; - emittedStream.Checkpoint(); - } - - _requestedCheckpoints--; - OnCheckpointCompleted(); - } - - private void EnsureCheckpointNotRequested() { - if (_checkpointRequested) - throw new InvalidOperationException("Checkpoint requested"); - } - - private void EmitEventsToStream(string streamId, EmittedEventEnvelope[] emittedEvents) { - if (string.IsNullOrEmpty(streamId)) - throw new ArgumentNullException("streamId"); - EmittedStream stream; - if (!_emittedStreams.TryGetValue(streamId, out stream)) { - var streamMetadata = emittedEvents.Length > 0 ? emittedEvents[0].StreamMetadata : null; - - var writeQueueId = _maximumAllowedWritesInFlight == AllowedWritesInFlight.Unbounded - ? (Guid?)null - : _writeQueueIds[_emittedStreams.Count % _maximumAllowedWritesInFlight]; - - IEmittedStreamsWriter writer; - if (writeQueueId == null) - writer = new EmittedStreamsWriter(_ioDispatcher); - else - writer = new QueuedEmittedStreamsWriter(_ioDispatcher, writeQueueId.Value); - - var writerConfiguration = new EmittedStream.WriterConfiguration( - writer, streamMetadata, _runAs, maxWriteBatchLength: _maxWriteBatchLength, logger: _logger); - - stream = new EmittedStream(streamId, writerConfiguration, _projectionVersion, _positionTagger, _from, - _publisher, _ioDispatcher, this); - - if (_started) - stream.Start(); - _emittedStreams.Add(streamId, stream); - } - - stream.EmitEvents(emittedEvents.Select(v => v.Event).ToArray()); - } - - public void Handle(CoreProjectionProcessingMessage.ReadyForCheckpoint message) { - _requestedCheckpoints--; - OnCheckpointCompleted(); - } - - private void OnCheckpointCompleted() { - if (_requestedCheckpoints == 0) { - _readyHandler.Handle(new CoreProjectionProcessingMessage.ReadyForCheckpoint(this)); - } - } - - public int GetWritePendingEvents() { - return _emittedStreams.Values.Sum(v => v.GetWritePendingEvents()); - } - - public int GetWritesInProgress() { - return _emittedStreams.Values.Sum(v => v.GetWritesInProgress()); - } - - public int GetReadsInProgress() { - return _emittedStreams.Values.Sum(v => v.GetReadsInProgress()); - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - _readyHandler.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - _readyHandler.Handle(message); - } - - public void Dispose() { - if (_emittedStreams != null) - foreach (var stream in _emittedStreams.Values) - stream.Dispose(); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamAwaiting message) { - if (_awaitingStreams == null) - _awaitingStreams = new List(); - _awaitingStreams.Add(message.Envelope); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamWriteCompleted message) { - var awaitingStreams = _awaitingStreams; - _awaitingStreams = null; // still awaiting will re-register - if (awaitingStreams != null) - foreach (var stream in awaitingStreams) - stream.ReplyWith(message); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/CoreProjection.cs b/src/EventStore.Projections.Core/Services/Processing/CoreProjection.cs deleted file mode 100644 index 00c3f2077..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/CoreProjection.cs +++ /dev/null @@ -1,628 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.WorkItems; -using EventStore.Projections.Core.Utils; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing { - - public class CoreProjection : IDisposable, - ICoreProjection, - ICoreProjectionForProcessingPhase, - IHandle, - IHandle { - [Flags] - private enum State : uint { - Initial = 0x80000000, - LoadStateRequested = 0x2, - StateLoaded = 0x4, - Subscribed = 0x8, - Running = 0x10, - Stopping = 0x40, - Stopped = 0x80, - FaultedStopping = 0x100, - Faulted = 0x200, - CompletingPhase = 0x400, - PhaseCompleted = 0x800, - Suspended = 0x900, - } - - private readonly string _name; - private readonly ProjectionVersion _version; - - private readonly IPublisher _publisher; - private readonly IODispatcher _ioDispatcher; - - private readonly ProjectionProcessingStrategy _projectionProcessingStrategy; - private readonly Guid _workerId; - internal readonly Guid _projectionCorrelationId; - private readonly IPublisher _inputQueue; - private readonly ClaimsPrincipal _runAs; - - private readonly Serilog.ILogger _logger; - - private State _state; - - private string _faultedReason; - - private readonly PartitionStateCache _partitionStateCache; - private ICoreProjectionCheckpointManager _checkpointManager; - private readonly ICoreProjectionCheckpointReader _checkpointReader; - - private bool _tickPending; - - private bool _startOnLoad; - private bool _completed; - - private CheckpointSuggestedWorkItem _checkpointSuggestedWorkItem; - private IProjectionProcessingPhase _projectionProcessingPhase; - private readonly bool _stopOnEof; - private readonly IProjectionProcessingPhase[] _projectionProcessingPhases; - private readonly CoreProjectionCheckpointWriter _coreProjectionCheckpointWriter; - private readonly bool _requiresRootPartition; - private readonly Action _enrichStatistics; - - private int _statisticsSequentialNumber; - private bool _disposed; - - public CoreProjection( - ProjectionProcessingStrategy projectionProcessingStrategy, - ProjectionVersion version, - Guid projectionCorrelationId, - IPublisher inputQueue, - Guid workerId, - ClaimsPrincipal runAs, - IPublisher publisher, - IODispatcher ioDispatcher, - ReaderSubscriptionDispatcher subscriptionDispatcher, - ILogger logger, - ProjectionNamesBuilder namingBuilder, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter, - PartitionStateCache partitionStateCache, - string effectiveProjectionName, - ITimeProvider timeProvider) { - if (publisher == null) throw new ArgumentNullException("publisher"); - if (ioDispatcher == null) throw new ArgumentNullException("ioDispatcher"); - if (subscriptionDispatcher == null) throw new ArgumentNullException("subscriptionDispatcher"); - - _projectionProcessingStrategy = projectionProcessingStrategy; - _projectionCorrelationId = projectionCorrelationId; - _inputQueue = inputQueue; - _workerId = workerId; - _runAs = runAs; - _name = effectiveProjectionName; - _version = version; - _stopOnEof = projectionProcessingStrategy.GetStopOnEof(); - _logger = logger ?? Serilog.Log.ForContext(); - _publisher = publisher; - _ioDispatcher = ioDispatcher; - _partitionStateCache = partitionStateCache; - _requiresRootPartition = projectionProcessingStrategy.GetRequiresRootPartition(); - var useCheckpoints = projectionProcessingStrategy.GetUseCheckpoints(); - - _coreProjectionCheckpointWriter = coreProjectionCheckpointWriter; - - _projectionProcessingPhases = projectionProcessingStrategy.CreateProcessingPhases( - publisher, - inputQueue, - projectionCorrelationId, - partitionStateCache, - UpdateStatistics, - this, - namingBuilder, - timeProvider, - ioDispatcher, - coreProjectionCheckpointWriter); - - - //NOTE: currently assuming the first checkpoint manager to be able to load any state - _checkpointReader = new CoreProjectionCheckpointReader( - publisher, - _projectionCorrelationId, - ioDispatcher, - namingBuilder.MakeCheckpointStreamName(), - _version, - useCheckpoints); - _enrichStatistics = projectionProcessingStrategy.EnrichStatistics; - GoToState(State.Initial); - } - - private void BeginPhase(IProjectionProcessingPhase processingPhase, CheckpointTag startFrom, - PartitionState rootPartitionState) { - _projectionProcessingPhase = processingPhase; - _projectionProcessingPhase.SetProjectionState(PhaseState.Starting); - _checkpointManager = processingPhase.CheckpointManager; - - _projectionProcessingPhase.InitializeFromCheckpoint(startFrom); - _checkpointManager.Start(startFrom, rootPartitionState); - } - - private void UpdateStatistics() { - if (_disposed) - return; - int sequentialNumber = _statisticsSequentialNumber++; - var info = new ProjectionStatistics(); - GetStatistics(info); - _publisher.Publish( - new CoreProjectionStatusMessage.StatisticsReport(_projectionCorrelationId, info, sequentialNumber)); - } - - public void Start() { - EnsureState(State.Initial); - _startOnLoad = true; - GoToState(State.LoadStateRequested); - } - - public void LoadStopped() { - _startOnLoad = false; - EnsureState(State.Initial); - GoToState(State.LoadStateRequested); - } - - public void Stop() { - EnsureState( - State.LoadStateRequested | State.StateLoaded | State.Subscribed | State.Running | State.PhaseCompleted - | State.CompletingPhase); - try { - if (_state == State.LoadStateRequested || _state == State.PhaseCompleted) - GoToState(State.Stopped); - else - GoToState(State.Stopping); - } catch (Exception ex) { - SetFaulted(ex); - } - } - - public void Kill() { - if (_state != State.Stopped) - GoToState(State.Stopped); - } - - public bool Suspend() { - if (_state == State.Stopped || _state == State.Suspended) - return false; - - GoToState(State.Suspended); - return true; - } - - private void EnterSuspended() { - EnsureUnsubscribed(); - _publisher.Publish(new CoreProjectionStatusMessage.Suspended(_projectionCorrelationId)); - } - - private void GetStatistics(ProjectionStatistics info) { - _checkpointManager.GetStatistics(info); - if (float.IsNaN(info.Progress) || float.IsNegativeInfinity(info.Progress) - || float.IsPositiveInfinity(info.Progress)) { - info.Progress = -2.0f; - } - - info.Status = _state.EnumValueName() + info.Status; - info.Name = _name; - info.EffectiveName = _name; - info.ProjectionId = _version.ProjectionId; - info.Epoch = _version.Epoch; - info.Version = _version.Version; - info.StateReason = ""; - info.BufferedEvents = 0; - info.PartitionsCached = _partitionStateCache.CachedItemCount; - _enrichStatistics(info); - if (_projectionProcessingPhase != null) - _projectionProcessingPhase.GetStatistics(info); - } - - public void CompletePhase() { - if (_state != State.Running) - return; - if (!_stopOnEof) - throw new InvalidOperationException("!_projectionConfig.StopOnEof"); - _completed = true; - _checkpointManager.Progress(100.0f); - GoToState(State.CompletingPhase); - } - - public void Handle(CoreProjectionManagementMessage.GetState message) { - if (_state == State.LoadStateRequested || _state == State.StateLoaded || - _projectionProcessingPhase == null) { - _publisher.Publish( - new CoreProjectionStatusMessage.StateReport( - message.CorrelationId, _projectionCorrelationId, message.Partition, state: null, - position: null)); - return; - } - - EnsureState( - State.Running | State.Stopping | State.Stopped | State.FaultedStopping | State.Faulted - | State.CompletingPhase | State.PhaseCompleted); - - _projectionProcessingPhase.Handle(message); - } - - public void Handle(CoreProjectionManagementMessage.GetResult message) { - if (_state == State.LoadStateRequested || _state == State.StateLoaded || - _projectionProcessingPhase == null) { - _publisher.Publish( - new CoreProjectionStatusMessage.ResultReport( - message.CorrelationId, _projectionCorrelationId, message.Partition, result: null, - position: null)); - return; - } - - EnsureState( - State.Running | State.Stopping | State.Stopped | State.FaultedStopping | State.Faulted - | State.CompletingPhase | State.PhaseCompleted); - - _projectionProcessingPhase.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointCompleted message) { - CheckpointCompleted(message.CheckpointTag); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - EnsureState(State.LoadStateRequested); - try { - var checkpointTag = message.CheckpointTag; - var phase = checkpointTag == null ? 0 : checkpointTag.Phase; - var projectionProcessingPhase = _projectionProcessingPhases[phase]; - if (checkpointTag == null) - checkpointTag = projectionProcessingPhase.MakeZeroCheckpointTag(); - checkpointTag = projectionProcessingPhase.AdjustTag(checkpointTag); - //TODO: initialize projection state here (test it) - //TODO: write test to ensure projection state is correctly loaded from a checkpoint and posted back when enough empty records processed - //TODO: handle errors - _coreProjectionCheckpointWriter.StartFrom(checkpointTag, message.CheckpointEventNumber); - - PartitionState rootPartitionState = null; - if (_requiresRootPartition) { - rootPartitionState = PartitionState.Deserialize(message.CheckpointData, checkpointTag); - _partitionStateCache.CacheAndLockPartitionState("", rootPartitionState, null); - } - - BeginPhase(projectionProcessingPhase, checkpointTag, rootPartitionState); - GoToState(State.StateLoaded); - if (_startOnLoad) { - _projectionProcessingPhase.Subscribe(checkpointTag, fromCheckpoint: true); - } else - GoToState(State.Stopped); - } catch (Exception ex) { - SetFaulted(ex); - } - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - EnsureState(State.StateLoaded); - try { - _projectionProcessingPhase.Handle(message); - } catch (Exception ex) { - SetFaulted(ex); - } - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - _logger.Information( - "Projection '{projection}'({projectionCorrelationId}) restart has been requested due to: '{reason}'", - _name, _projectionCorrelationId, - message.Reason); - if (_state != State.Running) { - SetFaulted( - string.Format( - "A concurrency violation was detected, but the projection is not running. Current state is: {0}. The reason for the restart is: '{1}' ", - _state, message.Reason)); - return; - } - - CompleteCheckpointSuggestedWorkItem(); - EnsureUnsubscribed(); - GoToState(State.Initial); - Start(); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - SetFaulted(message.Reason); - } - - public void EnsureUnsubscribed() { - if (_projectionProcessingPhase != null) - _projectionProcessingPhase.EnsureUnsubscribed(); - } - - private void GoToState(State state) { - if (_state == State.Suspended) { - _logger.Debug($"Projection {_name} has been suspended for a subsystem restart. Cannot go to state {state}"); - return; - } -// _logger.Trace("CP: {projection} {stateFrom} => {stateTo}", _name, _state, state); - var wasStopped = _state == State.Stopped || _state == State.Faulted || _state == State.PhaseCompleted; - var wasStopping = _state == State.Stopping || _state == State.FaultedStopping - || _state == State.CompletingPhase; - var wasStarting = _state == State.LoadStateRequested || _state == State.StateLoaded - || _state == State.Subscribed; - var wasStarted = _state == State.Subscribed || _state == State.Running || _state == State.Stopping - || _state == State.FaultedStopping || _state == State.CompletingPhase; - var wasRunning = _state == State.Running; - var stateChanged = _state != state; - _state = state; // set state before transition to allow further state change - switch (state) { - case State.Stopped: - case State.Faulted: - case State.PhaseCompleted: - if (wasStarted && !wasStopped) - _checkpointManager.Stopped(); - break; - case State.Stopping: - case State.FaultedStopping: - case State.CompletingPhase: - if (wasStarted && !wasStopping) - _checkpointManager.Stopping(); - break; - } - - - if (_projectionProcessingPhase != null) // null while loading state - switch (state) { - case State.LoadStateRequested: - case State.StateLoaded: - case State.Subscribed: - if (!wasStarting) - _projectionProcessingPhase.SetProjectionState(PhaseState.Starting); - break; - case State.Running: - if (!wasRunning) - _projectionProcessingPhase.SetProjectionState(PhaseState.Running); - break; - case State.Faulted: - case State.FaultedStopping: - if (wasRunning) - _projectionProcessingPhase.SetProjectionState(PhaseState.Stopped); - break; - case State.Stopped: - case State.Stopping: - case State.CompletingPhase: - case State.PhaseCompleted: - if (wasRunning) - _projectionProcessingPhase.SetProjectionState(PhaseState.Stopped); - break; - default: - _projectionProcessingPhase.SetProjectionState(PhaseState.Unknown); - break; - } - switch (state) { - case State.Initial: - EnterInitial(); - break; - case State.LoadStateRequested: - EnterLoadStateRequested(); - break; - case State.StateLoaded: - EnterStateLoaded(); - break; - case State.Subscribed: - EnterSubscribed(); - break; - case State.Running: - EnterRunning(); - break; - case State.Stopping: - EnterStopping(); - break; - case State.Stopped: - EnterStopped(); - break; - case State.FaultedStopping: - EnterFaultedStopping(); - break; - case State.Faulted: - EnterFaulted(); - break; - case State.CompletingPhase: - EnterCompletingPhase(); - break; - case State.PhaseCompleted: - EnterPhaseCompleted(); - break; - case State.Suspended: - EnterSuspended(); - break; - default: - throw new Exception(); - } - - if (stateChanged) - UpdateStatistics(); - } - - private void EnterInitial() { - _completed = false; - _partitionStateCache.Initialize(); - _projectionProcessingPhase = null; - _checkpointManager = _projectionProcessingPhases[0].CheckpointManager; - var emittedStreamsTracker = _projectionProcessingPhases[0].EmittedStreamsTracker; - emittedStreamsTracker.Initialize(); - _checkpointManager.Initialize(); - _checkpointReader.Initialize(); - _tickPending = false; - if (_requiresRootPartition) - _partitionStateCache.CacheAndLockPartitionState("", new PartitionState("", null, CheckpointTag.Empty), - null); - // NOTE: this is to workaround exception in GetState requests submitted by client - } - - private void EnterLoadStateRequested() { - _checkpointReader.BeginLoadState(); - } - - private void EnterStateLoaded() { - } - - private void EnterSubscribed() { - if (_startOnLoad) { - GoToState(State.Running); - } else - GoToState(State.Stopped); - } - - private void EnterRunning() { - try { - _publisher.Publish( - new CoreProjectionStatusMessage.Started(_projectionCorrelationId, _name)); - _projectionProcessingPhase.ProcessEvent(); - } catch (Exception ex) { - SetFaulted(ex); - } - } - - private void EnterStopping() { - EnsureUnsubscribed(); - } - - private void EnterStopped() { - EnsureUnsubscribed(); - _publisher.Publish(new CoreProjectionStatusMessage.Stopped(_projectionCorrelationId, _name, _completed)); - } - - private void EnterFaultedStopping() { - EnsureUnsubscribed(); - } - - private void EnterFaulted() { - EnsureUnsubscribed(); - _publisher.Publish( - new CoreProjectionStatusMessage.Faulted(_projectionCorrelationId, _faultedReason)); - } - - private void EnterCompletingPhase() { - } - - private void EnterPhaseCompleted() { - var completedPhaseIndex = _checkpointManager.LastProcessedEventPosition.Phase; - if (completedPhaseIndex == _projectionProcessingPhases.Length - 1) { - Stop(); - } else { - var nextPhase = _projectionProcessingPhases[completedPhaseIndex + 1]; - var nextPhaseZeroPosition = nextPhase.MakeZeroCheckpointTag(); - BeginPhase(nextPhase, nextPhaseZeroPosition, null); - _projectionProcessingPhase.Subscribe(nextPhaseZeroPosition, fromCheckpoint: false); - } - } - - private void EnsureState(State expectedStates) { - if ((_state & expectedStates) == 0) { - throw new Exception( - string.Format("Current state is {0}. Expected states are: {1}", _state, expectedStates)); - } - } - - private void Tick() { - // ignore any ticks received when not pending. this may happen when restart requested - if (!_tickPending) - return; - // process messages in almost all states as we now ignore work items when processing - if (_state == State.LoadStateRequested) { - _tickPending = false; - return; - } - - EnsureState( - State.Running | State.Stopping | State.Stopped | State.FaultedStopping | State.Faulted - | State.CompletingPhase | State.PhaseCompleted); - - try { - _tickPending = false; - _projectionProcessingPhase.ProcessEvent(); - } catch (Exception ex) { - SetFaulted(ex); - } - } - - - public void Dispose() { - _disposed = true; - EnsureUnsubscribed(); - if (_projectionProcessingPhase != null) - _projectionProcessingPhase.Dispose(); - } - - public void EnsureTickPending() { - // ticks are requested when an async operation is completed or when an item is being processed - // thus, the tick message is removed from the queue when it does not process any work item (and - // it is renewed therefore) - if (_tickPending) - return; - _tickPending = true; - _publisher.Publish(new ProjectionCoreServiceMessage.CoreTick(Tick)); - } - - public void SetFaulted(Exception ex) { - SetFaulted(ex.Message + "\r\n" + (ex.StackTrace ?? "").ToString()); - } - - public void SetFaulted(string reason) { - if (_state != State.FaultedStopping && _state != State.Faulted) - _faultedReason = reason; - if (_state != State.Faulted) - GoToState(State.Faulted); - } - - public void SetFaulting(string reason) { - if (_state != State.FaultedStopping && _state != State.Faulted) { - _faultedReason = reason; - GoToState(State.FaultedStopping); - } - } - - private void CheckpointCompleted(CheckpointTag lastCompletedCheckpointPosition) { - CompleteCheckpointSuggestedWorkItem(); - // all emitted events caused by events before the checkpoint position have been written - // unlock states, so the cache can be clean up as they can now be safely reloaded from the ES - _partitionStateCache.Unlock(lastCompletedCheckpointPosition); - - switch (_state) { - case State.Stopping: - GoToState(State.Stopped); - break; - case State.FaultedStopping: - GoToState(State.Faulted); - break; - case State.CompletingPhase: - GoToState(State.PhaseCompleted); - break; - } - } - - public void SetCurrentCheckpointSuggestedWorkItem(CheckpointSuggestedWorkItem checkpointSuggestedWorkItem) { - if (_checkpointSuggestedWorkItem != null && checkpointSuggestedWorkItem != null) - throw new InvalidOperationException("Checkpoint in progress"); - if (_checkpointSuggestedWorkItem == null && checkpointSuggestedWorkItem == null) - throw new InvalidOperationException("No checkpoint in progress"); - _checkpointSuggestedWorkItem = checkpointSuggestedWorkItem; - } - - private void CompleteCheckpointSuggestedWorkItem() { - var workItem = _checkpointSuggestedWorkItem; - if (workItem != null) { - _checkpointSuggestedWorkItem = null; - workItem.CheckpointCompleted(); - EnsureTickPending(); - } - } - - - public CheckpointTag LastProcessedEventPosition { - get { return _checkpointManager.LastProcessedEventPosition; } - } - - public void Subscribed() { - GoToState(State.Subscribed); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/CoreProjectionQueue.cs b/src/EventStore.Projections.Core/Services/Processing/CoreProjectionQueue.cs deleted file mode 100644 index 0fc7467cb..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/CoreProjectionQueue.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.WorkItems; - -namespace EventStore.Projections.Core.Services.Processing { - public class CoreProjectionQueue { - private readonly StagedProcessingQueue _queuePendingEvents; - - private readonly IPublisher _publisher; - private readonly int _pendingEventsThreshold; - - private CheckpointTag _lastEnqueuedEventTag; - private bool _justInitialized; - private bool _subscriptionPaused; - - public event Action EnsureTickPending { - add { _queuePendingEvents.EnsureTickPending += value; } - remove { _queuePendingEvents.EnsureTickPending -= value; } - } - - public CoreProjectionQueue(IPublisher publisher, int pendingEventsThreshold, bool orderedPartitionProcessing) { - _queuePendingEvents = - new StagedProcessingQueue( - new[] { - true /* record event order - async with ordered output*/, true - /* get state partition - ordered as it may change correlation id - sync */, - false - /* load foreach state - async- unordered completion*/, - orderedPartitionProcessing - /* process Js - unordered/ordered - inherently unordered/ordered completion*/, - true - /* write emits - ordered - async ordered completion*/, - false /* complete item */ - }); - _publisher = publisher; - _pendingEventsThreshold = pendingEventsThreshold; - } - - public bool IsRunning { - get { return _isRunning; } - } - - public bool ProcessEvent() { - var processed = false; - if (_queuePendingEvents.Count > 0) { - processed = ProcessOneEventBatch(); - } else if (_queuePendingEvents.Count == 0 && _subscriptionPaused && !_unsubscribed) { - ResumeSubscription(); - } - - return processed; - } - - public int GetBufferedEventCount() { - return _queuePendingEvents.Count; - } - - public void EnqueueTask(WorkItem workItem, CheckpointTag workItemCheckpointTag, - bool allowCurrentPosition = false) { - ValidateQueueingOrder(workItemCheckpointTag, allowCurrentPosition); - workItem.SetProjectionQueue(this); - workItem.SetCheckpointTag(workItemCheckpointTag); - _queuePendingEvents.Enqueue(workItem); - } - - public void EnqueueOutOfOrderTask(WorkItem workItem) { - if (_lastEnqueuedEventTag == null) - throw new InvalidOperationException( - "Cannot enqueue an out-of-order task. The projection position is currently unknown."); - workItem.SetProjectionQueue(this); - workItem.SetCheckpointTag(_lastEnqueuedEventTag); - _queuePendingEvents.Enqueue(workItem); - } - - public void InitializeQueue(CheckpointTag startingPosition) { - _subscriptionPaused = false; - _unsubscribed = false; - _subscriptionId = Guid.Empty; - - _queuePendingEvents.Initialize(); - - _lastEnqueuedEventTag = startingPosition; - _justInitialized = true; - } - - public string GetStatus() { - return (_subscriptionPaused ? "/Paused" : ""); - } - - private void ValidateQueueingOrder(CheckpointTag eventTag, bool allowCurrentPosition = false) { - if (eventTag < _lastEnqueuedEventTag || - (!(allowCurrentPosition || _justInitialized) && eventTag <= _lastEnqueuedEventTag)) - throw new InvalidOperationException( - string.Format( - "Invalid order. Last known tag is: '{0}'. Current tag is: '{1}'", _lastEnqueuedEventTag, - eventTag)); - _justInitialized = _justInitialized && (eventTag == _lastEnqueuedEventTag); - _lastEnqueuedEventTag = eventTag; - } - - private void PauseSubscription() { - if (_subscriptionId == Guid.Empty) - throw new InvalidOperationException("Not subscribed"); - if (!_subscriptionPaused && !_unsubscribed) { - _subscriptionPaused = true; - _publisher.Publish( - new ReaderSubscriptionManagement.Pause(_subscriptionId)); - } - } - - private void ResumeSubscription() { - if (_subscriptionId == Guid.Empty) - throw new InvalidOperationException("Not subscribed"); - if (_subscriptionPaused && !_unsubscribed) { - _subscriptionPaused = false; - _publisher.Publish( - new ReaderSubscriptionManagement.Resume(_subscriptionId)); - } - } - - private bool _unsubscribed; - private Guid _subscriptionId; - private bool _isRunning; - - private bool ProcessOneEventBatch() { - if (_queuePendingEvents.Count > _pendingEventsThreshold) - PauseSubscription(); - var processed = _queuePendingEvents.Process(max: 30); - if (_subscriptionPaused && _queuePendingEvents.Count < _pendingEventsThreshold / 2) - ResumeSubscription(); - - return processed; - } - - public void Unsubscribed() { - _unsubscribed = true; - } - - public void Subscribed(Guid currentSubscriptionId) { - if (_unsubscribed) - throw new InvalidOperationException("Unsubscribed"); - if (_subscriptionId != Guid.Empty) - throw new InvalidOperationException("Already subscribed"); - _subscriptionId = currentSubscriptionId; - } - - public void SetIsRunning(bool isRunning) { - _isRunning = isRunning; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedDataEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedDataEvent.cs deleted file mode 100644 index 518a7afc7..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedDataEvent.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public class EmittedDataEvent : EmittedEvent { - private readonly string _data; - private readonly ExtraMetaData _metadata; - private readonly bool _isJson; - - public EmittedDataEvent( - string streamId, Guid eventId, - string eventType, bool isJson, string data, ExtraMetaData metadata, CheckpointTag causedByTag, - CheckpointTag expectedTag, - Action onCommitted = null) - : base(streamId, eventId, eventType, causedByTag, expectedTag, onCommitted) { - _isJson = isJson; - _data = data; - _metadata = metadata; - } - - public override string Data { - get { return _data; } - } - - public ExtraMetaData Metadata { - get { return _metadata; } - } - - public override bool IsJson { - get { return _isJson; } - } - - public override bool IsReady() { - return true; - } - - public override IEnumerable> ExtraMetaData() { - return _metadata == null ? null : _metadata.Metadata; - } - - public override string ToString() { - return string.Format("Event Id: {0}, Event Type: {1}, Data: {2}", EventId, EventType, Data); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEvent.cs deleted file mode 100644 index 061e2ca02..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEvent.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public abstract class EmittedEvent { - public readonly string StreamId; - public readonly Guid EventId; - public readonly string EventType; - private readonly CheckpointTag _causedByTag; - private readonly CheckpointTag _expectedTag; - private readonly Action _onCommitted; - private Guid _causedBy; - private string _correlationId; - - protected EmittedEvent( - string streamId, Guid eventId, - string eventType, CheckpointTag causedByTag, CheckpointTag expectedTag, Action onCommitted = null) { - if (causedByTag == null) throw new ArgumentNullException("causedByTag"); - StreamId = streamId; - EventId = eventId; - EventType = eventType; - _causedByTag = causedByTag; - _expectedTag = expectedTag; - _onCommitted = onCommitted; - } - - public abstract string Data { get; } - - public CheckpointTag CausedByTag { - get { return _causedByTag; } - } - - public CheckpointTag ExpectedTag { - get { return _expectedTag; } - } - - public Action OnCommitted { - get { return _onCommitted; } - } - - public Guid CausedBy { - get { return _causedBy; } - } - - public string CorrelationId { - get { return _correlationId; } - } - - public abstract bool IsJson { get; } - - public abstract bool IsReady(); - - public virtual IEnumerable> ExtraMetaData() { - return null; - } - - public void SetCausedBy(Guid causedBy) { - _causedBy = causedBy; - } - - public void SetCorrelationId(string correlationId) { - _correlationId = correlationId; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventEnvelope.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventEnvelope.cs deleted file mode 100644 index 0be115c43..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventEnvelope.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public sealed class EmittedEventEnvelope { - public readonly EmittedEvent Event; - public readonly EmittedStream.WriterConfiguration.StreamMetadata StreamMetadata; - - public EmittedEventEnvelope( - EmittedEvent @event, EmittedStream.WriterConfiguration.StreamMetadata streamMetadata = null) { - Event = @event; - StreamMetadata = streamMetadata; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventResolutionNeeded.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventResolutionNeeded.cs deleted file mode 100644 index 88857c087..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedEventResolutionNeeded.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -sealed class EmittedEventResolutionNeeded : IValidatedEmittedEvent { - public string StreamId { get; } - public long Revision { get; } - public Tuple TopCommitted { get; } - - public EmittedEventResolutionNeeded(string streamId, long revision, Tuple topCommitted) { - StreamId = streamId; - Revision = revision; - TopCommitted = topCommitted; - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkTo.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkTo.cs deleted file mode 100644 index 60d078ac5..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkTo.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Globalization; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public class EmittedLinkTo : EmittedEvent { - private readonly string _targetStreamId; - private long? _eventNumber; - - public EmittedLinkTo( - string streamId, Guid eventId, - string targetStreamId, CheckpointTag causedByTag, CheckpointTag expectedTag, - Action onCommitted = null) - : base(streamId, eventId, "$>", causedByTag, expectedTag, onCommitted) { - _targetStreamId = targetStreamId; - } - - public EmittedLinkTo( - string streamId, Guid eventId, - string targetStreamId, int targetEventNumber, CheckpointTag causedByTag, CheckpointTag expectedTag, - string originalStreamId = null) - : base(streamId, eventId, "$>", causedByTag, expectedTag, null) { - _eventNumber = targetEventNumber; - _targetStreamId = targetStreamId; - } - - public override string Data { - get { - if (!IsReady()) - throw new InvalidOperationException("Link target has not been yet committed"); - return - _eventNumber.Value.ToString(CultureInfo.InvariantCulture) + "@" + _targetStreamId; - } - } - - public override bool IsJson { - get { return false; } - } - - public override bool IsReady() { - return _eventNumber != null; - } - - public void SetTargetEventNumber(long eventNumber) { - if (_eventNumber != null) - throw new InvalidOperationException("Target event number has been already set"); - _eventNumber = eventNumber; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkToWithRecategorization.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkToWithRecategorization.cs deleted file mode 100644 index 9e441b691..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/EmittedLinkToWithRecategorization.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public class EmittedLinkToWithRecategorization : EmittedEvent { - private readonly string _target; - private readonly string _originalStreamId; - private readonly int? _streamDeletedAt; - - public EmittedLinkToWithRecategorization( - string streamId, Guid eventId, string target, CheckpointTag causedByTag, CheckpointTag expectedTag, - string originalStreamId, int? streamDeletedAt) - : base(streamId, eventId, "$>", causedByTag, expectedTag, null) { - _target = target; - _originalStreamId = originalStreamId; - _streamDeletedAt = streamDeletedAt; - } - - public override string Data { - get { return _target; } - } - - public override bool IsJson { - get { return false; } - } - - public override bool IsReady() { - return true; - } - - public override IEnumerable> ExtraMetaData() { - if (!string.IsNullOrEmpty(_originalStreamId)) - yield return new KeyValuePair("$o", JsonConvert.ToString(_originalStreamId)); - if (_streamDeletedAt != null) - yield return new KeyValuePair("$deleted", JsonConvert.ToString(_streamDeletedAt.Value)); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ErroredEmittedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ErroredEmittedEvent.cs deleted file mode 100644 index 91c99e7ba..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ErroredEmittedEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -sealed class ErroredEmittedEvent : IValidatedEmittedEvent { - public Exception Exception { get; private set; } - - public ErroredEmittedEvent(InvalidEmittedEventSequenceException exception) { - Exception = exception; - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ExtraMetaData.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ExtraMetaData.cs deleted file mode 100644 index 78ed384ed..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ExtraMetaData.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents { - public class ExtraMetaData { - private readonly Dictionary _metadata; - - public ExtraMetaData(Dictionary metadata) { - _metadata = metadata.ToDictionary(v => v.Key, v => v.Value.ToString()); - } - - public ExtraMetaData(Dictionary metadata) { - _metadata = metadata.ToDictionary(v => v.Key, v => v.Value); - } - - public Dictionary Metadata { - get { return _metadata; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IValidatedEmittedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IValidatedEmittedEvent.cs deleted file mode 100644 index 7ee092656..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IValidatedEmittedEvent.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -interface IValidatedEmittedEvent {} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IgnoredEmittedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IgnoredEmittedEvent.cs deleted file mode 100644 index ca79c36b5..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/IgnoredEmittedEvent.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -sealed class IgnoredEmittedEvent : IValidatedEmittedEvent { -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ValidEmittedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ValidEmittedEvent.cs deleted file mode 100644 index 2d8204192..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedEvents/ValidEmittedEvent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -sealed class ValidEmittedEvent : IValidatedEmittedEvent { - public CheckpointTag Checkpoint { get; private set; } - public string EventType { get; private set; } - public long Revision { get; private set; } - - public ValidEmittedEvent(CheckpointTag checkpoint, string eventType, long revision) { - Checkpoint = checkpoint; - EventType = eventType; - Revision = revision; - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.WriterConfiguration.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.WriterConfiguration.cs deleted file mode 100644 index 5657866fd..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.WriterConfiguration.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Security.Claims; -using Serilog; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public partial class EmittedStream -{ - public class WriterConfiguration { - private readonly ClaimsPrincipal _writeAs; - private readonly int _maxWriteBatchLength; - private readonly ILogger _logger; - - private readonly int? maxCount; - private readonly TimeSpan? maxAge; - - private readonly IEmittedStreamsWriter _writer; - - public class StreamMetadata { - private readonly int? _maxCount; - private readonly TimeSpan? _maxAge; - - public StreamMetadata(int? maxCount = null, TimeSpan? maxAge = null) { - _maxCount = maxCount; - _maxAge = maxAge; - } - - public int? MaxCount { - get { return _maxCount; } - } - - public TimeSpan? MaxAge { - get { return _maxAge; } - } - } - - public WriterConfiguration( - IEmittedStreamsWriter writer, StreamMetadata streamMetadata, ClaimsPrincipal writeAs, - int maxWriteBatchLength, ILogger logger = null) { - _writer = writer; - _writeAs = writeAs; - _maxWriteBatchLength = maxWriteBatchLength; - _logger = logger; - if (streamMetadata != null) { - this.maxCount = streamMetadata.MaxCount; - this.maxAge = streamMetadata.MaxAge; - } - } - - public ClaimsPrincipal WriteAs { - get { return _writeAs; } - } - - public int MaxWriteBatchLength { - get { return _maxWriteBatchLength; } - } - - public ILogger Logger { - get { return _logger; } - } - - public int? MaxCount { - get { return maxCount; } - } - - public TimeSpan? MaxAge { - get { return maxAge; } - } - - public IEmittedStreamsWriter Writer { - get { return _writer; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.cs deleted file mode 100644 index a296e42bf..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStream.cs +++ /dev/null @@ -1,719 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Newtonsoft.Json.Linq; -using Serilog; - -namespace EventStore.Projections.Core.Services.Processing.Emitting { - public partial class EmittedStream : IDisposable, - IHandle { - private readonly IODispatcher _ioDispatcher; - private readonly IPublisher _publisher; - - private readonly ILogger _logger; - private readonly string _streamId; - private readonly string _metadataStreamId; - private readonly WriterConfiguration _writerConfiguration; - private readonly ProjectionVersion _projectionVersion; - private readonly ClaimsPrincipal _writeAs; - private readonly PositionTagger _positionTagger; - private readonly CheckpointTag _zeroPosition; - private readonly CheckpointTag _fromCheckpointPosition; - private readonly IEmittedStreamContainer _readyHandler; - private static readonly string LinkEventType = "$>"; - private static readonly char[] LinkToSeparator = new[] {'@'}; - - private readonly Stack> _alreadyCommittedEvents = - new Stack>(); - - private readonly Queue _pendingWrites = new Queue(); - - private bool _checkpointRequested; - private bool _awaitingWriteCompleted; - private bool _awaitingMetadataWriteCompleted; - private bool _awaitingReady; - private bool _awaitingListEventsCompleted; - private bool _started; - private bool _awaitingLinkToResolution; - - private readonly int _maxWriteBatchLength; - private CheckpointTag _lastCommittedOrSubmittedEventPosition; // TODO: rename - private bool _metadataStreamCreated; - private CheckpointTag _lastQueuedEventPosition; - private Event[] _submittedToWriteEvents; - private EmittedEvent[] _submittedToWriteEmittedEvents; - private long _lastKnownEventNumber = ExpectedVersion.Invalid; - private long _retrievedNextEventNumber = ExpectedVersion.Invalid; - private readonly bool _noCheckpoints; - private bool _disposed; - private bool _recoveryCompleted; - private Event _submittedWriteMetaStreamEvent; - private const int MaxRetryCount = 12; - private const int MinAttemptWarnThreshold = 5; - private Guid _pendingRequestCorrelationId; - private Random _random = new Random(); - - public EmittedStream( - string streamId, WriterConfiguration writerConfiguration, ProjectionVersion projectionVersion, - PositionTagger positionTagger, CheckpointTag fromCheckpointPosition, IPublisher publisher, - IODispatcher ioDispatcher, - IEmittedStreamContainer readyHandler, bool noCheckpoints = false) { - if (string.IsNullOrEmpty(streamId)) throw new ArgumentNullException("streamId"); - if (writerConfiguration == null) throw new ArgumentNullException("writerConfiguration"); - if (positionTagger == null) throw new ArgumentNullException("positionTagger"); - if (fromCheckpointPosition == null) throw new ArgumentNullException("fromCheckpointPosition"); - if (publisher == null) throw new ArgumentNullException("publisher"); - if (ioDispatcher == null) throw new ArgumentNullException("ioDispatcher"); - if (readyHandler == null) throw new ArgumentNullException("readyHandler"); - _streamId = streamId; - _metadataStreamId = SystemStreams.MetastreamOf(streamId); - _writerConfiguration = writerConfiguration; - _projectionVersion = projectionVersion; - _writeAs = writerConfiguration.WriteAs; - _positionTagger = positionTagger; - _zeroPosition = positionTagger.MakeZeroCheckpointTag(); - _fromCheckpointPosition = fromCheckpointPosition; - _lastQueuedEventPosition = null; - _publisher = publisher; - _ioDispatcher = ioDispatcher; - _readyHandler = readyHandler; - _maxWriteBatchLength = writerConfiguration.MaxWriteBatchLength; - _logger = writerConfiguration.Logger; - _noCheckpoints = noCheckpoints; - } - - public void EmitEvents(EmittedEvent[] events) { - if (events == null) throw new ArgumentNullException("events"); - CheckpointTag groupCausedBy = null; - foreach (var @event in events) { - if (groupCausedBy == null) { - groupCausedBy = @event.CausedByTag; - if (!(_lastQueuedEventPosition != null && groupCausedBy > _lastQueuedEventPosition) && - !(_lastQueuedEventPosition == null && groupCausedBy >= _fromCheckpointPosition)) - throw new InvalidOperationException( - string.Format("Invalid event order. '{0}' goes after '{1}'", @event.CausedByTag, - _lastQueuedEventPosition)); - _lastQueuedEventPosition = groupCausedBy; - } else if (@event.CausedByTag != groupCausedBy) - throw new ArgumentException("events must share the same CausedByTag"); - - if (@event.StreamId != _streamId) - throw new ArgumentException("Invalid streamId", "events"); - } - - EnsureCheckpointNotRequested(); - foreach (var @event in events) - _pendingWrites.Enqueue(@event); - ProcessWrites(); - } - - public void Checkpoint() { - EnsureCheckpointsEnabled(); - EnsureStreamStarted(); - EnsureCheckpointNotRequested(); - _checkpointRequested = true; - ProcessRequestedCheckpoint(); - } - - public void Start() { - EnsureCheckpointNotRequested(); - if (_started) - throw new InvalidOperationException("Stream is already started"); - _started = true; - ProcessWrites(); - } - - public int GetWritePendingEvents() { - return _pendingWrites.Count; - } - - public int GetWritesInProgress() { - return (_awaitingWriteCompleted ? 1 : 0) + (_awaitingMetadataWriteCompleted ? 1 : 0); - } - - public int GetReadsInProgress() { - return _awaitingListEventsCompleted ? 1 : 0; - } - - private void HandleWriteEventsCompleted(ClientMessage.WriteEventsCompleted message, int retryCount) { - if (!_awaitingWriteCompleted) - throw new InvalidOperationException("WriteEvents has not been submitted"); - if (_disposed) - return; - _awaitingWriteCompleted = false; - if (message.Result == OperationResult.Success) { - _lastKnownEventNumber = message.FirstEventNumber + _submittedToWriteEvents.Length - 1; - NotifyEventsCommitted(_submittedToWriteEmittedEvents, message.FirstEventNumber); - OnWriteCompleted(); - return; - } - - if (_logger != null) { - _logger.Information("Failed to write events to stream {stream}. Error: {e}", - _streamId, - Enum.GetName(typeof(OperationResult), message.Result)); - } - - switch (message.Result) { - case OperationResult.WrongExpectedVersion: - RequestRestart(string.Format( - "The '{0}' stream has been written to from the outside. Expected Version: {1}, Current Version: {2}. Checkpoint: {3}.", - _streamId, _lastKnownEventNumber, message.CurrentVersion, _fromCheckpointPosition)); - break; - case OperationResult.PrepareTimeout: - case OperationResult.ForwardTimeout: - case OperationResult.CommitTimeout: - if (retryCount > 0) { - PublishWriteEvents(--retryCount); - } else { - Failed(string.Format( - "Failed to write events to {0}. Retry limit of {1} reached. Reason: {2}. Checkpoint: {3}.", - _streamId, MaxRetryCount, message.Result, _fromCheckpointPosition)); - } - - break; - default: - throw new NotSupportedException("Unsupported error code received"); - } - } - - private void RequestRestart(string reason) { - _readyHandler.Handle(new CoreProjectionProcessingMessage.RestartRequested(Guid.Empty, reason)); - } - - private void Failed(string reason) { - _readyHandler.Handle(new CoreProjectionProcessingMessage.Failed(Guid.Empty, reason)); - } - - private void ReadStreamEventsBackwardCompleted(ClientMessage.ReadStreamEventsBackwardCompleted message, - CheckpointTag lastCheckpointPosition) { - if (!_awaitingListEventsCompleted) - throw new InvalidOperationException("ReadStreamEventsBackward has not been requested"); - if (_disposed) - return; - if (message.CorrelationId != _pendingRequestCorrelationId) - return; - if (message.Result == ReadStreamResult.StreamDeleted) { - Failed($"Stream : {_streamId} is deleted. Cannot emit events to it"); - return; - } - - _pendingRequestCorrelationId = Guid.Empty; - _awaitingListEventsCompleted = false; - - var newPhysicalStream = message.LastEventNumber == ExpectedVersion.NoStream; - _retrievedNextEventNumber = newPhysicalStream - ? (message.StreamMetadata != null ? (message.StreamMetadata.TruncateBefore ?? 0) : 0) - : message.LastEventNumber + 1; - - if (_lastCommittedOrSubmittedEventPosition == null) { - var parsed = default(CheckpointTagVersion); - if (!newPhysicalStream && message.Events.Length > 0) { - parsed = message.Events[0].Event.Metadata.ParseCheckpointTagVersionExtraJson(_projectionVersion); - if (parsed.Tag == null) { - Failed(string.Format( - "The '{0}' stream managed by projection {1} has been written to from the outside.", - _streamId, _projectionVersion.ProjectionId)); - return; - } - - if (_projectionVersion.ProjectionId != parsed.Version.ProjectionId) { - Failed( - string.Format( - "Multiple projections emitting to the same stream detected. Stream: '{0}'. Last event projection: '{1}'. Emitting projection: '{2}'", - _streamId, parsed.Version.ProjectionId, _projectionVersion.ProjectionId)); - return; - } - } - - var newLogicalStream = newPhysicalStream - || (_projectionVersion.ProjectionId != parsed.Version.ProjectionId || - _projectionVersion.Epoch > parsed.Version.Version); - - _lastKnownEventNumber = newPhysicalStream ? ExpectedVersion.NoStream : message.LastEventNumber; - - if (newLogicalStream) { - _lastCommittedOrSubmittedEventPosition = _zeroPosition; - _metadataStreamCreated = false; - } else { - //TODO: verify order - as we are reading backward - try { - _lastCommittedOrSubmittedEventPosition = parsed.AdjustBy(_positionTagger, _projectionVersion); - _metadataStreamCreated = true; // should exist or no need to create - } catch (NotSupportedException ex) { - Failed(ex.Message); - } - } - } - - var stop = CollectAlreadyCommittedEvents(message, lastCheckpointPosition); - - if (stop) - try { - SubmitWriteEventsInRecovery(); - } catch (InvalidEmittedEventSequenceException ex) { - Failed(ex.Message); - } - else - SubmitListEvents(lastCheckpointPosition, message.NextEventNumber); - } - - private bool CollectAlreadyCommittedEvents( - ClientMessage.ReadStreamEventsBackwardCompleted message, CheckpointTag lastCheckpointPosition) { - var stop = false; - foreach (var e in message.Events) { - var checkpointTagVersion = e.Event.Metadata.ParseCheckpointTagVersionExtraJson(_projectionVersion); - var ourEpoch = checkpointTagVersion.Version.ProjectionId == _projectionVersion.ProjectionId - && checkpointTagVersion.Version.Version >= _projectionVersion.Epoch; - - if (IsV1StreamCreatedEvent(e)) - continue; - - if (checkpointTagVersion.Tag == null) { - Failed( - string.Format( - "A unstamped event found. Stream: '{0}'. EventNumber: '{1}'", message.EventStreamId, - e.OriginalEventNumber)); - return true; - } - - var doStop = !ourEpoch; - if (!doStop) { - //NOTE: may need to compare with last pre-recorded event - // but should not push to alreadyCommitted if source changed (must be at checkpoint) - var adjustedTag = checkpointTagVersion.AdjustBy(_positionTagger, _projectionVersion); - doStop = adjustedTag <= lastCheckpointPosition; - } - - if (doStop) - // ignore any events prior to the requested lastCheckpointPosition (== first emitted event position) - { - stop = true; - break; - } - - var eventType = e.Event.EventType; - _alreadyCommittedEvents.Push(Tuple.Create(checkpointTagVersion.Tag, eventType, e.Event.EventNumber)); - } - - return stop || message.IsEndOfStream; - } - - private static bool IsV1StreamCreatedEvent(EventStore.Core.Data.ResolvedEvent e) { - return e.Link == null && e.OriginalEventNumber == 0 - && (e.OriginalEvent.EventType == SystemEventTypes.V1__StreamCreatedImplicit__ - || e.OriginalEvent.EventType == SystemEventTypes.V1__StreamCreated__); - } - - private void ProcessWrites() { - if (_started && !_awaitingListEventsCompleted && !_awaitingWriteCompleted - && !_awaitingMetadataWriteCompleted && _pendingWrites.Count > 0) { - if (_lastCommittedOrSubmittedEventPosition == null) - SubmitListEvents(_fromCheckpointPosition); - else - SubmitWriteEventsInRecovery(); - } - } - - private void SubmitListEvents(CheckpointTag upTo, long fromEventNumber = -1) { - if (_awaitingWriteCompleted || _awaitingMetadataWriteCompleted || _awaitingListEventsCompleted) - throw new Exception(); - _awaitingListEventsCompleted = true; - _pendingRequestCorrelationId = Guid.NewGuid(); - _ioDispatcher.ReadBackward( - _streamId, fromEventNumber, 1, resolveLinks: false, principal: SystemAccounts.System, - action: completed => ReadStreamEventsBackwardCompleted(completed, upTo), - corrId: _pendingRequestCorrelationId, - timeoutAction: CreateReadTimeoutAction(_pendingRequestCorrelationId, upTo, fromEventNumber)); - } - - private Action CreateReadTimeoutAction(Guid correlationId, CheckpointTag upTo, long fromEventNumber) { - return () => { - if (correlationId != _pendingRequestCorrelationId) return; - _pendingRequestCorrelationId = Guid.Empty; - _awaitingListEventsCompleted = false; - SubmitListEvents(upTo, fromEventNumber); - }; - } - - private void SubmitWriteMetadata() { - if (_awaitingWriteCompleted || _awaitingMetadataWriteCompleted || _awaitingListEventsCompleted) - throw new Exception(); - var streamAcl = _streamId.StartsWith("$") - ? new StreamAcl(SystemRoles.All, null, null, SystemRoles.All, null) - : new StreamAcl((string)null, null, null, null, null); - - var streamMetadata = new StreamMetadata( - _writerConfiguration.MaxCount, _writerConfiguration.MaxAge, acl: streamAcl, - truncateBefore: _retrievedNextEventNumber == 0 ? (long?)null : _retrievedNextEventNumber); - - _submittedWriteMetaStreamEvent = new Event( - Guid.NewGuid(), SystemEventTypes.StreamMetadata, true, streamMetadata.ToJsonBytes(), null); - - _awaitingMetadataWriteCompleted = true; - - PublishWriteMetaStream(MaxRetryCount); - } - - private void PublishWriteMetaStream(int retryCount) { - int attempt = MaxRetryCount - retryCount + 1; - var delayInSeconds = CalculateBackoffTimeSecs(attempt); - if (attempt >= MinAttemptWarnThreshold && _logger != null) { - _logger.Warning("Attempt: {attempt} to write events to stream {stream}. Backing off for {time} second(s).", - attempt, - _metadataStreamId, - delayInSeconds); - } - - if (delayInSeconds == 0) { - _writerConfiguration.Writer.WriteEvents( - _metadataStreamId, ExpectedVersion.Any, new Event[] {_submittedWriteMetaStreamEvent}, _writeAs, - m => HandleMetadataWriteCompleted(m, retryCount)); - } else { - _ioDispatcher.Delay(TimeSpan.FromSeconds(delayInSeconds), - _ => _writerConfiguration.Writer.WriteEvents( - _metadataStreamId, ExpectedVersion.Any, new Event[] {_submittedWriteMetaStreamEvent}, _writeAs, - m => HandleMetadataWriteCompleted(m, retryCount))); - } - } - - private void HandleMetadataWriteCompleted(ClientMessage.WriteEventsCompleted message, int retryCount) { - if (!_awaitingMetadataWriteCompleted) - throw new InvalidOperationException("WriteEvents to metadata stream has not been submitted"); - if (_disposed) - return; - if (message.Result == OperationResult.Success) { - _metadataStreamCreated = true; - _awaitingMetadataWriteCompleted = false; - PublishWriteEvents(MaxRetryCount); - return; - } - - if (_logger != null) { - _logger.Information("Failed to write events to stream {stream}. Error: {e}", - _metadataStreamId, - Enum.GetName(typeof(OperationResult), message.Result)); - } - - switch (message.Result) { - case OperationResult.WrongExpectedVersion: - RequestRestart(string.Format("The '{0}' stream has been written to from the outside", - _metadataStreamId)); - break; - case OperationResult.PrepareTimeout: - case OperationResult.ForwardTimeout: - case OperationResult.CommitTimeout: - if (retryCount > 0) { - PublishWriteMetaStream(--retryCount); - } else { - Failed(string.Format( - "Failed to write an events to {0}. Retry limit of {1} reached. Reason: {2}", - _metadataStreamId, MaxRetryCount, message.Result)); - } - - break; - default: - throw new NotSupportedException("Unsupported error code received"); - } - } - - private void SubmitWriteEvents() { - if (_awaitingWriteCompleted || _awaitingMetadataWriteCompleted || _awaitingListEventsCompleted) - throw new Exception(); - if (!_metadataStreamCreated) - if (_lastCommittedOrSubmittedEventPosition != _zeroPosition) - throw new Exception("Internal error"); - var events = new List(); - var emittedEvents = new List(); - while (_pendingWrites.Count > 0 && events.Count < _maxWriteBatchLength) { - var e = _pendingWrites.Peek(); - if (!e.IsReady()) { - _readyHandler.Handle( - new CoreProjectionProcessingMessage.EmittedStreamAwaiting( - _streamId, new SendToThisEnvelope(this))); - _awaitingReady = true; - break; - } - - _pendingWrites.Dequeue(); - - var expectedTag = e.ExpectedTag; - var causedByTag = e.CausedByTag; - if (expectedTag != null) - if (DetectConcurrencyViolations(expectedTag)) { - RequestRestart( - string.Format( - "Wrong expected tag while submitting write event request to the '{0}' stream. The last known stream tag is: '{1}' the expected tag is: '{2}'", - _streamId, _lastCommittedOrSubmittedEventPosition, expectedTag)); - return; - } - - _lastCommittedOrSubmittedEventPosition = causedByTag; - try { - events.Add( - new Event( - e.EventId, e.EventType, e.IsJson, e.Data != null ? Helper.UTF8NoBom.GetBytes(e.Data) : null, - e.CausedByTag.ToJsonBytes(_projectionVersion, MetadataWithCausedByAndCorrelationId(e)))); - } catch (ArgumentException ex) { - Failed(string.Format("Failed to write the event: {0} to stream: {1} failed. Reason: {2}.", e, - _streamId, ex.Message)); - return; - } - - emittedEvents.Add(e); - } - - _submittedToWriteEvents = events.ToArray(); - _submittedToWriteEmittedEvents = emittedEvents.ToArray(); - - if (_submittedToWriteEvents.Length > 0) - PublishWriteEvents(MaxRetryCount); - } - - private IEnumerable> MetadataWithCausedByAndCorrelationId( - EmittedEvent emittedEvent) { - var extraMetaData = emittedEvent.ExtraMetaData(); - var correlationIdFound = false; - if (extraMetaData != null) - foreach (var valuePair in from pair in extraMetaData - where pair.Key != "$causedBy" - select pair) { - if (valuePair.Key == "$correlationId") - correlationIdFound = true; - yield return new KeyValuePair(valuePair.Key, new JRaw(valuePair.Value)); - } - - if (emittedEvent.CausedBy != Guid.Empty) - yield return - new KeyValuePair( - "$causedBy", JValue.CreateString(emittedEvent.CausedBy.ToString("D"))); - if (!correlationIdFound && !string.IsNullOrEmpty(emittedEvent.CorrelationId)) - yield return - new KeyValuePair("$correlationId", JValue.CreateString(emittedEvent.CorrelationId)); - } - - private bool DetectConcurrencyViolations(CheckpointTag expectedTag) { - //NOTE: the comment below is not longer actual - // Keeping it for reference only - // We do back-read all the streams when loading state, so we know exactly which version to expect - - //TODO: if the following statement is about event order stream - let write null event into this stream - //NOTE: the following condition is only meant to detect concurrency violations when - // another instance of the projection (running in the another node etc) has been writing to - // the same stream. However, the expected tag sometimes can be greater than last actually written tag - // This happens when a projection is restarted from a checkpoint and the checkpoint has been made at - // position not updating the projection state - return expectedTag != _lastCommittedOrSubmittedEventPosition; - } - - private void PublishWriteEvents(int retryCount) { - if (!_metadataStreamCreated) { - SubmitWriteMetadata(); - return; - } - - _awaitingWriteCompleted = true; - int attempt = MaxRetryCount - retryCount + 1; - var delayInSeconds = CalculateBackoffTimeSecs(attempt); - if (attempt >= MinAttemptWarnThreshold && _logger != null) { - _logger.Warning("Attempt: {attempt} to write events to stream {stream}. Backing off for {time} second(s).", - attempt, - _streamId, - delayInSeconds); - } - - if (delayInSeconds == 0) { - _writerConfiguration.Writer.WriteEvents( - _streamId, _lastKnownEventNumber, _submittedToWriteEvents, _writeAs, - m => HandleWriteEventsCompleted(m, retryCount)); - } else { - _ioDispatcher.Delay(TimeSpan.FromSeconds(delayInSeconds), - _ => _writerConfiguration.Writer.WriteEvents( - _streamId, _lastKnownEventNumber, _submittedToWriteEvents, _writeAs, - m => HandleWriteEventsCompleted(m, retryCount))); - } - } - - private int CalculateBackoffTimeSecs(int attempt) { - attempt--; - if (attempt == 0) return 0; - var expBackoff = attempt < 9 ? (1 << attempt) : 256; - return _random.Next(1, expBackoff + 1); - } - - private void EnsureCheckpointNotRequested() { - if (_checkpointRequested) - throw new InvalidOperationException("Checkpoint requested"); - } - - private void EnsureStreamStarted() { - if (!_started) - throw new InvalidOperationException("Not started"); - } - - private void OnWriteCompleted() { - NotifyWriteCompleted(); - ProcessWrites(); - ProcessRequestedCheckpoint(); - } - - private void NotifyWriteCompleted() { - _readyHandler.Handle(new CoreProjectionProcessingMessage.EmittedStreamWriteCompleted(_streamId)); - } - - private void ProcessRequestedCheckpoint() { - if (_checkpointRequested && !_awaitingWriteCompleted && !_awaitingMetadataWriteCompleted - && _pendingWrites.Count == 0) { - EnsureCheckpointsEnabled(); - _readyHandler.Handle(new CoreProjectionProcessingMessage.ReadyForCheckpoint(this)); - } - } - - private void EnsureCheckpointsEnabled() { - if (_noCheckpoints) - throw new InvalidOperationException("Checkpoints disabled"); - } - - private void SubmitWriteEventsInRecovery() { - SubmitWriteEventsInRecoveryLoop(false); - } - - private void SubmitWriteEventsInRecoveryLoop(bool anyFound) { - if (_awaitingLinkToResolution) - return; - - while (_pendingWrites.Count > 0) { - var eventToWrite = _pendingWrites.Peek(); - if (eventToWrite.CausedByTag > _lastCommittedOrSubmittedEventPosition || - _alreadyCommittedEvents.Count == 0) - RecoveryCompleted(); - if (_recoveryCompleted) { - if (anyFound) - NotifyWriteCompleted(); // unlock pending write-resolves if any - SubmitWriteEvents(); - return; - } - - var report = ValidateEmittedEventInRecoveryMode(eventToWrite); - - if (report is IgnoredEmittedEvent) { - Log.Verbose($"Emitted event ignored because it links to an event that no longer exists: eventId: {eventToWrite.EventId}, eventType: {eventToWrite.EventId}, checkpoint: {eventToWrite.CorrelationId}, causedBy: {eventToWrite.CausedBy}"); - continue; - } - - if (report is ErroredEmittedEvent error) - throw error.Exception; - - if (report is ValidEmittedEvent valid) { - anyFound = true; - NotifyEventCommitted(eventToWrite, valid.Revision); - _pendingWrites.Dequeue(); - } - - if (report is EmittedEventResolutionNeeded resolution) { - _awaitingLinkToResolution = true; - _ioDispatcher.ReadEvent(resolution.StreamId, resolution.Revision, _writeAs, resp => { - OnEmittedLinkEventResolved(anyFound, eventToWrite, resolution.TopCommitted, resp); - }, () => { - Log.Warning( - "Timed out reading original event for emitted event at revision {eventNumber} in stream '{streamName}'.", - resolution.Revision, resolution.StreamId); - }, Guid.NewGuid()); - break; - } - } - - if (_pendingWrites.Count == 0) - OnWriteCompleted(); - } - - private IValidatedEmittedEvent ValidateEmittedEventInRecoveryMode(EmittedEvent eventToWrite) { - var topAlreadyCommitted = _alreadyCommittedEvents.Pop(); - - if (topAlreadyCommitted.Item1 < eventToWrite.CausedByTag) - return new IgnoredEmittedEvent(); - - var failed = topAlreadyCommitted.Item1 != eventToWrite.CausedByTag || - topAlreadyCommitted.Item2 != eventToWrite.EventType; - - if (failed && eventToWrite.EventType.Equals(LinkEventType)) { - // We check if the linked event still exists. If not, we skip that emitted event. - var parts = eventToWrite.Data.Split(LinkToSeparator, 2); - var streamId = parts[1]; - if (!long.TryParse(parts[0], out long eventNumber)) - throw new Exception($"Unexpected exception: Emitted event is an invalid link event: Body ({eventToWrite.Data}) CausedByTag ({eventToWrite.CausedByTag}) StreamId ({eventToWrite.StreamId})"); - - return new EmittedEventResolutionNeeded(streamId, eventNumber, topAlreadyCommitted); - } - - if (failed) { - var error = CreateSequenceException(topAlreadyCommitted, eventToWrite); - return new ErroredEmittedEvent(error); - } - - return new ValidEmittedEvent(topAlreadyCommitted.Item1, topAlreadyCommitted.Item2, topAlreadyCommitted.Item3); - } - - // Used when we need to resolve a link event to see if it points to an event that no longer exists. If that - // event no longer exists, we skip it and resume the recovery process. - private void OnEmittedLinkEventResolved(bool anyFound, EmittedEvent eventToWrite, Tuple topAlreadyCommitted, ClientMessage.ReadEventCompleted resp) { - if (resp.Result != ReadEventResult.StreamDeleted && resp.Result != ReadEventResult.NotFound && resp.Result != ReadEventResult.NoStream && resp.Result != ReadEventResult.Success) { - throw CreateSequenceException(topAlreadyCommitted, eventToWrite); - } - - if (resp.Result == ReadEventResult.Success) { - anyFound = true; - NotifyEventCommitted(eventToWrite, topAlreadyCommitted.Item3); - } else { - Log.Verbose($"Emitted event ignored after resolution because it links to an event that no longer exists: eventId: {eventToWrite.EventId}, eventType: {eventToWrite.EventId}, checkpoint: {eventToWrite.CorrelationId}, causedBy: {eventToWrite.CausedBy}"); - } - _pendingWrites.Dequeue(); - _awaitingLinkToResolution = false; - SubmitWriteEventsInRecoveryLoop(anyFound); - } - - private InvalidEmittedEventSequenceException CreateSequenceException( - Tuple committed, EmittedEvent eventToWrite) { - return new InvalidEmittedEventSequenceException( - $"An event emitted in recovery for stream {_streamId} differs from the originally emitted event. Existing('{committed.Item2}', '{committed.Item1}'). New('{eventToWrite.EventType}', '{eventToWrite.CausedByTag}')" - ); - } - - private void RecoveryCompleted() { - _recoveryCompleted = true; - } - - private static void NotifyEventsCommitted(EmittedEvent[] events, long firstEventNumber) { - var sequenceNumber = firstEventNumber; - foreach (var e in events) - NotifyEventCommitted(e, sequenceNumber++); - } - - private static void NotifyEventCommitted(EmittedEvent @event, long eventNumber) { - if (@event.OnCommitted != null) - @event.OnCommitted(eventNumber); - } - - public void Dispose() { - _disposed = true; - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamWriteCompleted message) { - if (!_awaitingReady) - throw new InvalidOperationException("AwaitingReady state required"); - ProcessWrites(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsDeleter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsDeleter.cs deleted file mode 100644 index 99afea2bd..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsDeleter.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Linq; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.UserManagement; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Emitting { - public class EmittedStreamsDeleter : IEmittedStreamsDeleter { - private static readonly ILogger Log = Serilog.Log.ForContext(); - private readonly IODispatcher _ioDispatcher; - private readonly int _checkPointThreshold = 4000; - private int _numberOfEventsProcessed = 0; - private const int RetryLimit = 3; - private int _retryCount = RetryLimit; - private readonly string _emittedStreamsId; - private readonly string _emittedStreamsCheckpointStreamId; - - public EmittedStreamsDeleter(IODispatcher ioDispatcher, string emittedStreamsId, - string emittedStreamsCheckpointStreamId) { - _ioDispatcher = ioDispatcher; - _emittedStreamsId = emittedStreamsId; - _emittedStreamsCheckpointStreamId = emittedStreamsCheckpointStreamId; - } - - public void DeleteEmittedStreams(Action onEmittedStreamsDeleted) { - _ioDispatcher.ReadBackward(_emittedStreamsCheckpointStreamId, -1, 1, false, SystemAccounts.System, - result => { - var deleteFromPosition = GetPositionToDeleteFrom(result); - DeleteEmittedStreamsFrom(deleteFromPosition, onEmittedStreamsDeleted); - }, - () => DeleteEmittedStreams(onEmittedStreamsDeleted), - Guid.NewGuid()); - } - - private int GetPositionToDeleteFrom(ClientMessage.ReadStreamEventsBackwardCompleted onReadCompleted) { - int deleteFromPosition = 0; - if (onReadCompleted.Result == ReadStreamResult.Success) { - if (onReadCompleted.Events.Length > 0) { - var checkpoint = onReadCompleted.Events - .Where(v => v.Event.EventType == ProjectionEventTypes.ProjectionCheckpoint).Select(x => x.Event) - .FirstOrDefault(); - if (checkpoint != null) { - deleteFromPosition = checkpoint.Data.ParseJson(); - } - } - } - - return deleteFromPosition; - } - - private void DeleteEmittedStreamsFrom(long fromPosition, Action onEmittedStreamsDeleted) { - _ioDispatcher.ReadForward(_emittedStreamsId, fromPosition, 1, false, SystemAccounts.System, - x => ReadCompleted(x, onEmittedStreamsDeleted), - () => DeleteEmittedStreamsFrom(fromPosition, onEmittedStreamsDeleted), - Guid.NewGuid()); - } - - private void ReadCompleted(ClientMessage.ReadStreamEventsForwardCompleted onReadCompleted, - Action onEmittedStreamsDeleted) { - if (onReadCompleted.Result == ReadStreamResult.Success || - onReadCompleted.Result == ReadStreamResult.NoStream) { - if (onReadCompleted.Events.Length == 0 && !onReadCompleted.IsEndOfStream) { - DeleteEmittedStreamsFrom(onReadCompleted.NextEventNumber, onEmittedStreamsDeleted); - return; - } - - if (onReadCompleted.Events.Length == 0) { - _ioDispatcher.DeleteStream(_emittedStreamsCheckpointStreamId, ExpectedVersion.Any, false, - SystemAccounts.System, x => { - // currently, WrongExpectedVersion is returned when deleting non-existing streams, even when specifying ExpectedVersion.Any. - // it is not too intuitive but changing the response would break the contract and compatibility with TCP/gRPC/web clients or require adding a new error code to all clients. - // note: we don't need to check if CurrentVersion == -1 here to make sure it's a non-existing stream since the deletion is done with ExpectedVersion.Any - if (x.Result == OperationResult.WrongExpectedVersion) { - // stream was never created - Log.Information("PROJECTIONS: Projection Stream '{stream}' was not deleted since it does not exist", _emittedStreamsCheckpointStreamId); - } else if (x.Result == OperationResult.Success || x.Result == OperationResult.StreamDeleted) { - Log.Information("PROJECTIONS: Projection Stream '{stream}' deleted", - _emittedStreamsCheckpointStreamId); - } else { - Log.Error("PROJECTIONS: Failed to delete projection stream '{stream}'. Reason: {e}", - _emittedStreamsCheckpointStreamId, x.Result); - } - - _ioDispatcher.DeleteStream(_emittedStreamsId, ExpectedVersion.Any, false, - SystemAccounts.System, y => { - // currently, WrongExpectedVersion is returned when deleting non-existing streams, even when specifying ExpectedVersion.Any. - // it is not too intuitive but changing the response would break the contract and compatibility with TCP/gRPC/web clients or require adding a new error code to all clients. - // note: we don't need to check if CurrentVersion == -1 here to make sure it's a non-existing stream since the deletion is done with ExpectedVersion.Any - if (x.Result == OperationResult.WrongExpectedVersion) { - // stream was never created - Log.Information("PROJECTIONS: Projection Stream '{stream}' was not deleted since it does not exist", _emittedStreamsId); - } else if (y.Result == OperationResult.Success || - y.Result == OperationResult.StreamDeleted) { - Log.Information("PROJECTIONS: Projection Stream '{stream}' deleted", - _emittedStreamsId); - } else { - Log.Error( - "PROJECTIONS: Failed to delete projection stream '{stream}'. Reason: {e}", - _emittedStreamsId, y.Result); - } - - onEmittedStreamsDeleted(); - }); - }); - } else { - var streamId = Helper.UTF8NoBom.GetString(onReadCompleted.Events[0].Event.Data.Span); - _ioDispatcher.DeleteStream(streamId, ExpectedVersion.Any, false, SystemAccounts.System, - x => DeleteStreamCompleted(x, onEmittedStreamsDeleted, streamId, - onReadCompleted.Events[0].OriginalEventNumber)); - } - } - } - - private void DeleteStreamCompleted(ClientMessage.DeleteStreamCompleted deleteStreamCompleted, - Action onEmittedStreamsDeleted, string streamId, long eventNumber) { - if (deleteStreamCompleted.Result == OperationResult.Success || - deleteStreamCompleted.Result == OperationResult.StreamDeleted) { - _retryCount = RetryLimit; - _numberOfEventsProcessed++; - if (_numberOfEventsProcessed >= _checkPointThreshold) { - _numberOfEventsProcessed = 0; - TryMarkCheckpoint(eventNumber); - } - - DeleteEmittedStreamsFrom(eventNumber + 1, onEmittedStreamsDeleted); - } else { - if (_retryCount == 0) { - Log.Error( - "PROJECTIONS: Retry limit reached, could not delete stream: {stream}. Manual intervention is required and you may need to delete this stream manually", - streamId); - _retryCount = RetryLimit; - DeleteEmittedStreamsFrom(eventNumber + 1, onEmittedStreamsDeleted); - return; - } - - Log.Error( - "PROJECTIONS: Failed to delete emitted stream {stream}, Retrying ({retryCount}/{maxRetryCount}). Reason: {reason}", - streamId, (RetryLimit - _retryCount) + 1, RetryLimit, deleteStreamCompleted.Result); - _retryCount--; - DeleteEmittedStreamsFrom(eventNumber, onEmittedStreamsDeleted); - } - } - - private void TryMarkCheckpoint(long eventNumber) { - _ioDispatcher.WriteEvent(_emittedStreamsCheckpointStreamId, ExpectedVersion.Any, - new Event(Guid.NewGuid(), ProjectionEventTypes.PartitionCheckpoint, true, eventNumber.ToJson(), null), - SystemAccounts.System, x => { - if (x.Result == OperationResult.Success) { - Log.Debug("PROJECTIONS: Emitted Stream Deletion Checkpoint written at {eventNumber}", - eventNumber); - } else { - Log.Debug( - "PROJECTIONS: Emitted Stream Deletion Checkpoint Failed to be written at {eventNumber}", - eventNumber); - } - }); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsTracker.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsTracker.cs deleted file mode 100644 index c57acb9e0..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsTracker.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.Storage.ReaderIndex; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Emitting { - public class EmittedStreamsTracker : IEmittedStreamsTracker { - private static readonly ILogger Log = Serilog.Log.ForContext(); - private readonly IODispatcher _ioDispatcher; - private readonly ProjectionConfig _projectionConfig; - private readonly ProjectionNamesBuilder _projectionNamesBuilder; - - private readonly BoundedCache _streamIdCache = new BoundedCache(int.MaxValue, - ESConsts.CommitedEventsMemCacheLimit, x => 16 + 4 + IntPtr.Size + 2 * x.Length); - - private const int MaxRetryCount = 3; - private readonly object _locker = new object(); - - public EmittedStreamsTracker(IODispatcher ioDispatcher, ProjectionConfig projectionConfig, - ProjectionNamesBuilder projectionNamesBuilder) { - _ioDispatcher = ioDispatcher; - _projectionConfig = projectionConfig; - _projectionNamesBuilder = projectionNamesBuilder; - } - - public void Initialize() { - ReadEmittedStreamStreamIdsIntoCache(0); //start from the beginning - } - - private void ReadEmittedStreamStreamIdsIntoCache(long position) { - _ioDispatcher.ReadForward(_projectionNamesBuilder.GetEmittedStreamsName(), position, 1, false, - SystemAccounts.System, x => { - if (x.Events.Length > 0) { - for (int i = 0; i < x.Events.Length; i++) { - var streamId = Helper.UTF8NoBom.GetString(x.Events[i].Event.Data.Span); - lock (_locker) { - _streamIdCache.PutRecord(streamId, streamId, false); - } - } - } - - if (!x.IsEndOfStream) { - ReadEmittedStreamStreamIdsIntoCache(x.NextEventNumber); - } - }, () => { - Log.Error( - "Timed out reading emitted stream ids into cache from {streamName} at position {position}.", - _projectionNamesBuilder.GetEmittedStreamsName(), position); - }, Guid.NewGuid()); - } - - public void TrackEmittedStream(EmittedEvent[] emittedEvents) { - if (!_projectionConfig.TrackEmittedStreams) return; - foreach (var emittedEvent in emittedEvents) { - string streamId; - if (!_streamIdCache.TryGetRecord(emittedEvent.StreamId, out streamId)) { - var trackEvent = new Event(Guid.NewGuid(), ProjectionEventTypes.StreamTracked, false, - Helper.UTF8NoBom.GetBytes(emittedEvent.StreamId), null); - lock (_locker) { - _streamIdCache.PutRecord(emittedEvent.StreamId, emittedEvent.StreamId, false); - } - - WriteEvent(trackEvent, MaxRetryCount); - } - } - } - - private void WriteEvent(Event evnt, int retryCount) { - _ioDispatcher.WriteEvent(_projectionNamesBuilder.GetEmittedStreamsName(), ExpectedVersion.Any, evnt, - SystemAccounts.System, - x => OnWriteComplete(x, evnt, Helper.UTF8NoBom.GetString(evnt.Data), retryCount)); - } - - private void OnWriteComplete(ClientMessage.WriteEventsCompleted completed, Event evnt, string streamId, - int retryCount) { - if (completed.Result != OperationResult.Success) { - if (retryCount > 0) { - WriteEvent(evnt, retryCount - 1); - } else { - Log.Error( - "PROJECTIONS: Failed to write a tracked stream id of {stream} to the {emittedStream} stream. Retry limit of {maxRetryCount} reached. Reason: {e}", - streamId, _projectionNamesBuilder.GetEmittedStreamsName(), MaxRetryCount, completed.Result); - } - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsWriter.cs deleted file mode 100644 index 638cc8580..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/EmittedStreamsWriter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Emitting { - public class EmittedStreamsWriter : IEmittedStreamsWriter { - private IODispatcher _ioDispatcher; - - public EmittedStreamsWriter(IODispatcher ioDispatcher) { - _ioDispatcher = ioDispatcher; - } - - public void WriteEvents(string streamId, long expectedVersion, Event[] events, ClaimsPrincipal writeAs, - Action complete) { - _ioDispatcher.WriteEvents(streamId, expectedVersion, events, writeAs, complete); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsDeleter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsDeleter.cs deleted file mode 100644 index 3299a8741..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsDeleter.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public interface IEmittedStreamsDeleter { - void DeleteEmittedStreams(Action onEmittedStreamsDeleted); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsTracker.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsTracker.cs deleted file mode 100644 index ee1ab93ae..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsTracker.cs +++ /dev/null @@ -1,8 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public interface IEmittedStreamsTracker { - void TrackEmittedStream(EmittedEvent[] emittedEvents); - void Initialize(); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsWriter.cs deleted file mode 100644 index cab81899b..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/IEmittedStreamsWriter.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Data; -using EventStore.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public interface IEmittedStreamsWriter { - void WriteEvents(string streamId, long expectedVersion, Event[] events, ClaimsPrincipal writeAs, - Action complete); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/IResultEventEmitter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/IResultEventEmitter.cs deleted file mode 100644 index 7815c2c69..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/IResultEventEmitter.cs +++ /dev/null @@ -1,8 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public interface IResultEventEmitter { - EmittedEventEnvelope[] ResultUpdated(string partition, string result, CheckpointTag at); -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/InvalidEmittedEventSequenceException.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/InvalidEmittedEventSequenceException.cs deleted file mode 100644 index ff4269916..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/InvalidEmittedEventSequenceException.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -class InvalidEmittedEventSequenceException : Exception { - public InvalidEmittedEventSequenceException(string message) - : base(message) { - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/NoopResultEventEmitter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/NoopResultEventEmitter.cs deleted file mode 100644 index 411006f81..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/NoopResultEventEmitter.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public class NoopResultEventEmitter : IResultEventEmitter { - public EmittedEventEnvelope[] ResultUpdated(string partition, string result, CheckpointTag at) { - throw new NotSupportedException("No results are expected from the projection"); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/QueuedEmittedStreamsWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/QueuedEmittedStreamsWriter.cs deleted file mode 100644 index 08e8300ca..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/QueuedEmittedStreamsWriter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Emitting; - -public class QueuedEmittedStreamsWriter : IEmittedStreamsWriter { - private IODispatcher _ioDispatcher; - private Guid _writeQueueId; - - public QueuedEmittedStreamsWriter(IODispatcher ioDispatcher, Guid writeQueueId) { - _ioDispatcher = ioDispatcher; - _writeQueueId = writeQueueId; - } - - public void WriteEvents(string streamId, long expectedVersion, Event[] events, ClaimsPrincipal writeAs, - Action complete) { - _ioDispatcher.QueueWriteEvents(_writeQueueId, streamId, expectedVersion, events, writeAs, complete); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Emitting/ResultEventEmitter.cs b/src/EventStore.Projections.Core/Services/Processing/Emitting/ResultEventEmitter.cs deleted file mode 100644 index 2271a02d5..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Emitting/ResultEventEmitter.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Emitting { - public class ResultEventEmitter : IResultEventEmitter { - private readonly ProjectionNamesBuilder _namesBuilder; - - private readonly EmittedStream.WriterConfiguration.StreamMetadata _resultStreamMetadata = - new EmittedStream.WriterConfiguration.StreamMetadata( /* TBD */); - - public ResultEventEmitter(ProjectionNamesBuilder namesBuilder) { - if (namesBuilder == null) throw new ArgumentNullException("namesBuilder"); - _namesBuilder = namesBuilder; - } - - public EmittedEventEnvelope[] ResultUpdated(string partition, string result, CheckpointTag at) { - return CreateResultUpdatedEvents(partition, result, at); - } - - private EmittedEventEnvelope[] CreateResultUpdatedEvents(string partition, string projectionResult, - CheckpointTag at) { - var streamId = _namesBuilder.MakePartitionResultStreamName(partition); - var allResultsStreamId = _namesBuilder.GetResultStreamName(); - if (string.IsNullOrEmpty(partition)) { - var result = - new EmittedEventEnvelope( - projectionResult == null - ? new EmittedDataEvent( - streamId, Guid.NewGuid(), "ResultRemoved", true, null, null, at, null) - : new EmittedDataEvent( - streamId, Guid.NewGuid(), "Result", true, projectionResult, null, at, null), - _resultStreamMetadata); - - return new[] {result}; - } else { - var linkTo = new EmittedLinkTo(allResultsStreamId, Guid.NewGuid(), streamId, at, null); - var linkToEnvelope = new EmittedEventEnvelope(linkTo, _resultStreamMetadata); - var result = - new EmittedEventEnvelope( - projectionResult == null - ? new EmittedDataEvent( - streamId, Guid.NewGuid(), "ResultRemoved", true, null, null, at, null, - linkTo.SetTargetEventNumber) - : new EmittedDataEvent( - streamId, Guid.NewGuid(), "Result", true, projectionResult, null, at, null, - linkTo.SetTargetEventNumber), _resultStreamMetadata); - return new[] {result, linkToEnvelope}; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventFilter.cs deleted file mode 100644 index ffd9111b5..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventFilter.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Services; - -namespace EventStore.Projections.Core.Services.Processing.EventByType { - public class EventByTypeIndexEventFilter : EventFilter { - private readonly HashSet _streams; - - public EventByTypeIndexEventFilter(HashSet events) - : base(false, false, events) { - _streams = new HashSet(from eventType in events - select "$et-" + eventType); - } - - protected override bool DeletedNotificationPasses(string positionStreamId) { - return true; - } - - public override bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType) { - if (_streams.Contains(positionStreamId)) return true; - return !resolvedFromLinkTo && !SystemStreams.IsSystemStream(positionStreamId); - } - - public override string GetCategory(string positionStreamId) { - return null; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.IndexBased.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.IndexBased.cs deleted file mode 100644 index 81408b1ec..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.IndexBased.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.EventByType; - -public partial class EventByTypeIndexEventReader -{ - private class IndexBased : State, - IHandle, - IHandle, - IHandle { - private readonly Dictionary _streamToEventType; - private readonly HashSet _eventsRequested = new HashSet(); - private readonly HashSet _validRequests = new HashSet(); - private bool _indexCheckpointStreamRequested; - private long _lastKnownIndexCheckpointEventNumber = -1; - private TFPos? _lastKnownIndexCheckpointPosition = null; - - private readonly Dictionary> _buffers = - new Dictionary>(); - - private readonly Dictionary _eofs; - private bool _disposed; - private bool _indexStreamEof = false; - private readonly IPublisher _publisher; - - private readonly Dictionary _pendingRequests; - private readonly object _lock = new object(); - - public IndexBased(HashSet eventTypes, EventByTypeIndexEventReader reader, ClaimsPrincipal readAs) - : base(reader, readAs) { - _streamToEventType = eventTypes.ToDictionary(v => "$et-" + v, v => v); - _eofs = _streamToEventType.Keys.ToDictionary(v => v, v => false); - // whatever the first event returned is (even if we start from the same position as the last processed event - // let subscription handle this - _publisher = _reader._publisher; - - _pendingRequests = new Dictionary(); - _pendingRequests.Add("$et", Guid.Empty); - foreach (var stream in _streamToEventType.Keys) { - _pendingRequests.Add(stream, Guid.Empty); - } - } - - - private TFPos GetTargetEventPosition(PendingEvent head) { - return head.TfPosition; - } - - public void Handle(ClientMessage.ReadStreamEventsForwardCompleted message) { - if (_disposed) - return; - if (message.Result == ReadStreamResult.AccessDenied) { - SendNotAuthorized(); - return; - } - - //we may receive read replies in any order (we read multiple streams) - if (message.TfLastCommitPosition > _reader._lastPosition) - _reader._lastPosition = message.TfLastCommitPosition; - if (message.EventStreamId == "$et") { - ReadIndexCheckpointStreamCompleted(message.Result, message.Events); - return; - } - - if (!_validRequests.Contains(message.CorrelationId)) - return; - - lock (_lock) { - if (!_pendingRequests.Values.Any(x => x == message.CorrelationId)) return; - } - - if (!_streamToEventType.ContainsKey(message.EventStreamId)) - throw new InvalidOperationException( - String.Format("Invalid stream name: {0}", message.EventStreamId)); - if (!_eventsRequested.Contains(message.EventStreamId)) - throw new InvalidOperationException("Read events has not been requested"); - if (_reader.Paused) - throw new InvalidOperationException("Paused"); - switch (message.Result) { - case ReadStreamResult.NoStream: - _eofs[message.EventStreamId] = true; - ProcessBuffersAndContinue(eventStreamId: message.EventStreamId); - break; - case ReadStreamResult.Success: - _reader.UpdateNextStreamPosition(message.EventStreamId, message.NextEventNumber); - _eofs[message.EventStreamId] = (message.Events.Length == 0) && message.IsEndOfStream; - EnqueueEvents(message); - ProcessBuffersAndContinue(eventStreamId: message.EventStreamId); - break; - default: - throw new NotSupportedException( - String.Format("ReadEvents result code was not recognized. Code: {0}", message.Result)); - } - } - - public void Handle(ProjectionManagementMessage.Internal.ReadTimeout message) { - if (_disposed) return; - if (_reader.Paused) return; - lock (_lock) { - if (!_pendingRequests.Values.Any(x => x == message.CorrelationId)) return; - } - - if (message.StreamId == "$et") { - _indexCheckpointStreamRequested = false; - } - - _eventsRequested.Remove(message.StreamId); - _reader.PauseOrContinueProcessing(); - } - - private void ProcessBuffersAndContinue(string eventStreamId) { - ProcessBuffers(); - if (eventStreamId != null) - _eventsRequested.Remove(eventStreamId); - _reader.PauseOrContinueProcessing(); - CheckSwitch(); - } - - private void CheckSwitch() { - if (ShouldSwitch()) { - Dispose(); - _reader.DoSwitch(_lastKnownIndexCheckpointPosition.Value); - } - } - - public void Handle(ClientMessage.ReadStreamEventsBackwardCompleted message) { - if (_disposed) - return; - //we may receive read replies in any order (we read multiple streams) - if (message.TfLastCommitPosition > _reader._lastPosition) - _reader._lastPosition = message.TfLastCommitPosition; - if (message.Result == ReadStreamResult.AccessDenied) { - SendNotAuthorized(); - return; - } - - ReadIndexCheckpointStreamCompleted(message.Result, message.Events); - } - - private void EnqueueEvents(ClientMessage.ReadStreamEventsForwardCompleted message) { - for (int index = 0; index < message.Events.Length; index++) { - var @event = message.Events[index].Event; - var @link = message.Events[index].Link; - EventRecord positionEvent = (link ?? @event); - var queue = GetStreamQueue(positionEvent); - //TODO: progress calculation below is incorrect. sum(current)/sum(last_event) where sum by all streams - var tfPosition = - positionEvent.Metadata.ParseCheckpointTagJson().Position; - var progress = 100.0f * (link ?? @event).EventNumber / message.LastEventNumber; - var pendingEvent = new PendingEvent(message.Events[index], tfPosition, progress); - queue.Enqueue(pendingEvent); - } - } - - private Queue GetStreamQueue(EventRecord positionEvent) { - Queue queue; - if (!_buffers.TryGetValue(positionEvent.EventStreamId, out queue)) { - queue = new Queue(); - _buffers.Add(positionEvent.EventStreamId, queue); - } - - return queue; - } - - private bool BeforeTheLastKnownIndexCheckpoint(TFPos tfPosition) { - return _lastKnownIndexCheckpointPosition != null && tfPosition <= _lastKnownIndexCheckpointPosition; - } - - private void ReadIndexCheckpointStreamCompleted( - ReadStreamResult result, EventStore.Core.Data.ResolvedEvent[] events) { - if (_disposed) - return; - - if (!_indexCheckpointStreamRequested) - throw new InvalidOperationException("Read index checkpoint has not been requested"); - if (_reader.Paused) - throw new InvalidOperationException("Paused"); - _indexCheckpointStreamRequested = false; - switch (result) { - case ReadStreamResult.NoStream: - _indexStreamEof = true; - _lastKnownIndexCheckpointPosition = default(TFPos); - ProcessBuffersAndContinue(null); - break; - case ReadStreamResult.Success: - if (events.Length == 0) { - _indexStreamEof = true; - if (_lastKnownIndexCheckpointPosition == null) - _lastKnownIndexCheckpointPosition = default(TFPos); - } else { - _indexStreamEof = false; - //NOTE: only one event if backward order was requested - foreach (var @event in events) { - var data = @event.Event.Data.ParseCheckpointTagJson(); - _lastKnownIndexCheckpointEventNumber = @event.Event.EventNumber; - _lastKnownIndexCheckpointPosition = data.Position; - // reset eofs before this point - probably some where updated so we cannot go - // forward with this position without making sure nothing appeared - // NOTE: performance is not very good, but we should switch to TF mode shortly - - - foreach (var corrId in _validRequests) { - _publisher.Publish(new AwakeServiceMessage.UnsubscribeAwake(corrId)); - } - - _validRequests.Clear(); - _eventsRequested.Clear(); - //TODO: cancel subscribeAwake - //TODO: reissue read requests - //TODO: make sure async completions of awake do not work - - foreach (var key in _eofs.Keys.ToArray()) - _eofs[key] = false; - } - } - - ProcessBuffersAndContinue(null); - break; - default: - throw new NotSupportedException( - String.Format("ReadEvents result code was not recognized. Code: {0}", result)); - } - } - - private void ProcessBuffers() { - if (_disposed) // max N reached - return; - while (true) { - var minStreamId = ""; - var minPosition = new TFPos(Int64.MaxValue, Int64.MaxValue); - var any = false; - var anyEof = false; - foreach (var streamId in _streamToEventType.Keys) { - Queue buffer; - _buffers.TryGetValue(streamId, out buffer); - - if ((buffer == null || buffer.Count == 0)) - if (_eofs[streamId]) { - anyEof = true; - continue; // eof - will check if it was safe later - } else - return; // still reading - - var head = buffer.Peek(); - var targetEventPosition = GetTargetEventPosition(head); - - if (targetEventPosition < minPosition) { - minPosition = targetEventPosition; - minStreamId = streamId; - any = true; - } - } - - if (!any) - break; - - if (!anyEof || BeforeTheLastKnownIndexCheckpoint(minPosition)) { - var minHead = _buffers[minStreamId].Dequeue(); - DeliverEventRetrievedByIndex(minHead.ResolvedEvent, minHead.Progress, minPosition); - } else - return; // no safe events to deliver - - if (_buffers[minStreamId].Count == 0) - _reader.PauseOrContinueProcessing(); - } - } - - private void RequestCheckpointStream(bool delay) { - if (_disposed) - throw new InvalidOperationException("Disposed"); - if (_reader.PauseRequested || _reader.Paused) - throw new InvalidOperationException("Paused or pause requested"); - if (_indexCheckpointStreamRequested) - return; - - _indexCheckpointStreamRequested = true; - - var pendingRequestCorrelationId = Guid.NewGuid(); - lock (_lock) { - _pendingRequests["$et"] = pendingRequestCorrelationId; - } - - Message readRequest; - if (_lastKnownIndexCheckpointEventNumber == -1) { - readRequest = new ClientMessage.ReadStreamEventsBackward( - pendingRequestCorrelationId, pendingRequestCorrelationId, new SendToThisEnvelope(this), "$et", - -1, 1, false, false, null, - _readAs); - } else { - readRequest = new ClientMessage.ReadStreamEventsForward( - pendingRequestCorrelationId, pendingRequestCorrelationId, new SendToThisEnvelope(this), "$et", - _lastKnownIndexCheckpointEventNumber + 1, 100, false, false, null, _readAs, replyOnExpired: false); - } - - var timeoutMessage = TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(pendingRequestCorrelationId, "$et")); - - _reader.PublishIORequest(delay, readRequest, timeoutMessage, pendingRequestCorrelationId); - } - - private void RequestEvents(string stream, bool delay) { - if (_disposed) - throw new InvalidOperationException("Disposed"); - if (_reader.PauseRequested || _reader.Paused) - throw new InvalidOperationException("Paused or pause requested"); - - if (_eventsRequested.Contains(stream)) - return; - Queue queue; - if (_buffers.TryGetValue(stream, out queue) && queue.Count > 0) - return; - _eventsRequested.Add(stream); - - var corrId = Guid.NewGuid(); - _validRequests.Add(corrId); - - lock (_lock) { - _pendingRequests[stream] = corrId; - } - - var readEventsForward = new ClientMessage.ReadStreamEventsForward( - corrId, corrId, new SendToThisEnvelope(this), stream, - _reader._fromPositions[stream], EventByTypeIndexEventReader.MaxReadCount, _reader._resolveLinkTos, - false, null, - _readAs, - replyOnExpired: false); - - var timeoutMessage = TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(corrId, stream)); - - _reader.PublishIORequest(delay, readEventsForward, timeoutMessage, corrId); - } - - private void DeliverEventRetrievedByIndex(EventStore.Core.Data.ResolvedEvent pair, float progress, - TFPos position) { - //TODO: add event sequence validation for inside the index stream - var resolvedEvent = new ResolvedEvent(pair, null); - DeliverEvent(progress, resolvedEvent, position, pair); - } - - public override bool AreEventsRequested() { - return _eventsRequested.Count != 0 || _indexCheckpointStreamRequested; - } - - public override void Dispose() { - _disposed = true; - } - - public override void RequestEvents() { - foreach (var stream in _streamToEventType.Keys) - RequestEvents(stream, delay: _eofs[stream]); - RequestCheckpointStream(delay: _indexStreamEof); - } - - private bool ShouldSwitch() { - if (_disposed) - return false; - if (_reader.Paused || _reader.PauseRequested) - return false; - Queue q; - var shouldSwitch = _lastKnownIndexCheckpointPosition != null - && _streamToEventType.Keys.All( - v => - _eofs[v] - || _buffers.TryGetValue(v, out q) && q.Count > 0 - && - !BeforeTheLastKnownIndexCheckpoint( - q.Peek().TfPosition)); - return shouldSwitch; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.PendingEvent.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.PendingEvent.cs deleted file mode 100644 index 53c1c2345..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.PendingEvent.cs +++ /dev/null @@ -1,18 +0,0 @@ -using EventStore.Core.Data; - -namespace EventStore.Projections.Core.Services.Processing.EventByType; - -public partial class EventByTypeIndexEventReader -{ - private class PendingEvent { - public readonly EventStore.Core.Data.ResolvedEvent ResolvedEvent; - public readonly float Progress; - public readonly TFPos TfPosition; - - public PendingEvent(EventStore.Core.Data.ResolvedEvent resolvedEvent, TFPos tfPosition, float progress) { - ResolvedEvent = resolvedEvent; - Progress = progress; - TfPosition = tfPosition; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.State.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.State.cs deleted file mode 100644 index a2f04e429..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.State.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Standard; - -namespace EventStore.Projections.Core.Services.Processing.EventByType; - -public partial class EventByTypeIndexEventReader -{ - private abstract class State : IDisposable { - public abstract void RequestEvents(); - public abstract bool AreEventsRequested(); - public abstract void Dispose(); - - protected readonly EventByTypeIndexEventReader _reader; - protected readonly ClaimsPrincipal _readAs; - - protected State(EventByTypeIndexEventReader reader, ClaimsPrincipal readAs) { - _reader = reader; - _readAs = readAs; - } - - protected void DeliverEvent(float progress, ResolvedEvent resolvedEvent, TFPos position, - EventStore.Core.Data.ResolvedEvent pair) { - if (resolvedEvent.EventOrLinkTargetPosition <= _reader._lastEventPosition) - return; - _reader._lastEventPosition = resolvedEvent.EventOrLinkTargetPosition; - //TODO: this is incomplete. where reading from TF we need to handle actual deletes - - string deletedPartitionStreamId; - - - if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone) - return; - - bool isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEventOrLinkToStreamDeletedEvent( - resolvedEvent, pair.ResolveResult, out deletedPartitionStreamId); - if (isDeletedStreamEvent) { - var deletedPartition = deletedPartitionStreamId; - - if (_reader._includeDeletedStreamNotification) - _reader._publisher.Publish( - //TODO: publish both link and event data - new ReaderSubscriptionMessage.EventReaderPartitionDeleted( - _reader.EventReaderCorrelationId, deletedPartition, source: this.GetType(), - lastEventNumber: -1, deleteEventOrLinkTargetPosition: position, - deleteLinkOrEventPosition: resolvedEvent.EventOrLinkTargetPosition, - positionStreamId: resolvedEvent.PositionStreamId, - positionEventNumber: resolvedEvent.PositionSequenceNumber)); - } else - _reader._publisher.Publish( - //TODO: publish both link and event data - new ReaderSubscriptionMessage.CommittedEventDistributed( - _reader.EventReaderCorrelationId, resolvedEvent, - _reader._stopOnEof ? (long?)null : position.PreparePosition, progress, - source: this.GetType())); - } - - protected void SendNotAuthorized() { - _reader.SendNotAuthorized(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.TfBased.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.TfBased.cs deleted file mode 100644 index f4a6eefee..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.TfBased.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.EventByType; - -public partial class EventByTypeIndexEventReader -{ - private class TfBased : State, - IHandle, - IHandle { - private readonly HashSet _eventTypes; - private readonly ITimeProvider _timeProvider; - private bool _tfEventsRequested; - private bool _disposed; - private readonly Dictionary _streamToEventType; - private readonly IPublisher _publisher; - private TFPos _fromTfPosition; - private bool _eof; - private Guid _pendingRequestCorrelationId; - - public TfBased( - ITimeProvider timeProvider, EventByTypeIndexEventReader reader, TFPos fromTfPosition, - IPublisher publisher, ClaimsPrincipal readAs) - : base(reader, readAs) { - _timeProvider = timeProvider; - _eventTypes = reader._eventTypes; - _streamToEventType = _eventTypes.ToDictionary(v => "$et-" + v, v => v); - _publisher = publisher; - _fromTfPosition = fromTfPosition; - } - - public void Handle(ClientMessage.ReadAllEventsForwardCompleted message) { - if (_disposed) - return; - if (message.CorrelationId != _pendingRequestCorrelationId) { - return; - } - - if (message.Result == ReadAllResult.AccessDenied) { - SendNotAuthorized(); - return; - } - - if (!_tfEventsRequested) - throw new InvalidOperationException("TF events has not been requested"); - if (_reader.Paused) - throw new InvalidOperationException("Paused"); - _reader._lastPosition = message.TfLastCommitPosition; - _tfEventsRequested = false; - switch (message.Result) { - case ReadAllResult.Success: - var eof = message.Events.Length == 0; - _eof = eof; - var willDispose = _reader._stopOnEof && eof; - _fromTfPosition = message.NextPos; - - if (!willDispose) { - _reader.PauseOrContinueProcessing(); - } - - if (eof) { - // the end - //TODO: is it safe to pass NEXT as last commit position here - DeliverLastCommitPosition(message.NextPos); - // allow joining heading distribution - SendIdle(); - _reader.SendEof(); - } else { - foreach (var @event in message.Events) { - var link = @event.Link; - var data = @event.Event; - var byStream = link != null && _streamToEventType.ContainsKey(link.EventStreamId); - if (data == null) - continue; - var originalTfPosition = @event.OriginalPosition.Value; - if (byStream) { - // ignore data just update positions - _reader.UpdateNextStreamPosition(link.EventStreamId, link.EventNumber + 1); - // recover unresolved link event - var unresolvedLinkEvent = - EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent(link, - originalTfPosition.CommitPosition); - DeliverEventRetrievedFromTf( - unresolvedLinkEvent, 100.0f * link.LogPosition / message.TfLastCommitPosition, - originalTfPosition); - } else { - DeliverEventRetrievedFromTf( - @event, 100.0f * data.LogPosition / message.TfLastCommitPosition, - originalTfPosition); - } - } - } - - if (_disposed) - return; - - break; - default: - throw new NotSupportedException( - String.Format("ReadEvents result code was not recognized. Code: {0}", message.Result)); - } - } - - public void Handle(ProjectionManagementMessage.Internal.ReadTimeout message) { - if (_disposed) return; - if (_reader.Paused) return; - if (message.CorrelationId != _pendingRequestCorrelationId) return; - - _tfEventsRequested = false; - _reader.PauseOrContinueProcessing(); - } - - private void RequestTfEvents(bool delay) { - if (_disposed) - throw new InvalidOperationException("Disposed"); - if (_reader.PauseRequested || _reader.Paused) - throw new InvalidOperationException("Paused or pause requested"); - if (_tfEventsRequested) - return; - - _tfEventsRequested = true; - _pendingRequestCorrelationId = Guid.NewGuid(); - //TODO: we do not need resolve links, but lets check first with - var readRequest = new ClientMessage.ReadAllEventsForward( - _pendingRequestCorrelationId, _pendingRequestCorrelationId, new SendToThisEnvelope(this), - _fromTfPosition.CommitPosition, - _fromTfPosition.PreparePosition == -1 ? 0 : _fromTfPosition.PreparePosition, - EventByTypeIndexEventReader.MaxReadCount, - true, false, null, _readAs, replyOnExpired: false); - - var timeoutMessage = TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(_pendingRequestCorrelationId, "$all")); - - _reader.PublishIORequest(delay, readRequest, timeoutMessage, _pendingRequestCorrelationId); - } - - private void DeliverLastCommitPosition(TFPos lastPosition) { - if (_reader._stopOnEof) - return; - _publisher.Publish( - new ReaderSubscriptionMessage.CommittedEventDistributed( - _reader.EventReaderCorrelationId, null, lastPosition.PreparePosition, 100.0f, - source: this.GetType())); - //TODO: check was is passed here - } - - private void DeliverEventRetrievedFromTf(EventStore.Core.Data.ResolvedEvent pair, float progress, - TFPos position) { - var resolvedEvent = new ResolvedEvent(pair, null); - - DeliverEvent(progress, resolvedEvent, position, pair); - } - - private void SendIdle() { - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderIdle(_reader.EventReaderCorrelationId, _timeProvider.UtcNow)); - } - - public override void Dispose() { - _disposed = true; - } - - public override void RequestEvents() { - RequestTfEvents(delay: _eof); - } - - public override bool AreEventsRequested() { - return _tfEventsRequested; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.cs deleted file mode 100644 index 7f4685e4f..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexEventReader.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; - -namespace EventStore.Projections.Core.Services.Processing.EventByType { - public partial class EventByTypeIndexEventReader : EventReader { - public const int MaxReadCount = 50; - private readonly HashSet _eventTypes; - private readonly bool _resolveLinkTos; - private readonly bool _includeDeletedStreamNotification; - private readonly ITimeProvider _timeProvider; - - private State _state; - private TFPos _lastEventPosition; - private readonly Dictionary _fromPositions; - private readonly Dictionary _streamToEventType; - private long _lastPosition; - - public EventByTypeIndexEventReader( - IPublisher publisher, - Guid eventReaderCorrelationId, - ClaimsPrincipal readAs, - string[] eventTypes, - bool includeDeletedStreamNotification, - TFPos fromTfPosition, - Dictionary fromPositions, - bool resolveLinkTos, - ITimeProvider timeProvider, - bool stopOnEof = false) - : base(publisher, eventReaderCorrelationId, readAs, stopOnEof) { - if (eventTypes == null) throw new ArgumentNullException("eventTypes"); - if (timeProvider == null) throw new ArgumentNullException("timeProvider"); - if (eventTypes.Length == 0) throw new ArgumentException("empty", "eventTypes"); - - _includeDeletedStreamNotification = includeDeletedStreamNotification; - _timeProvider = timeProvider; - _eventTypes = new HashSet(eventTypes); - if (includeDeletedStreamNotification) - _eventTypes.Add("$deleted"); - _streamToEventType = eventTypes.ToDictionary(v => "$et-" + v, v => v); - _lastEventPosition = fromTfPosition; - _resolveLinkTos = resolveLinkTos; - - ValidateTag(fromPositions); - - _fromPositions = fromPositions; - _state = new IndexBased(_eventTypes, this, readAs); - } - - private void ValidateTag(Dictionary fromPositions) { - if (_eventTypes.Count != fromPositions.Count) - throw new ArgumentException("Number of streams does not match", "fromPositions"); - - foreach (var stream in _streamToEventType.Keys.Where(stream => !fromPositions.ContainsKey(stream))) { - throw new ArgumentException( - String.Format("The '{0}' stream position has not been set", stream), "fromPositions"); - } - } - - - public override void Dispose() { - _state.Dispose(); - base.Dispose(); - } - - protected override void RequestEvents() { - if (_disposed || PauseRequested || Paused) - return; - _state.RequestEvents(); - } - - protected override bool AreEventsRequested() { - return _state.AreEventsRequested(); - } - - private void PublishIORequest(bool delay, Message readEventsForward, Message timeoutMessage, - Guid correlationId) { - if (delay) { - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, correlationId, null, - new TFPos(_lastPosition, _lastPosition), readEventsForward)); - } else { - _publisher.Publish(readEventsForward); - _publisher.Publish(timeoutMessage); - } - } - - private void UpdateNextStreamPosition(string eventStreamId, long nextPosition) { - long streamPosition; - if (!_fromPositions.TryGetValue(eventStreamId, out streamPosition)) - streamPosition = -1; - if (nextPosition > streamPosition) - _fromPositions[eventStreamId] = nextPosition; - } - - private void DoSwitch(TFPos lastKnownIndexCheckpointPosition) { - if (Paused || PauseRequested || _disposed) - throw new InvalidOperationException("_paused || _pauseRequested || _disposed"); - - // skip reading TF up to last know index checkpoint position - // as we could only gethere if there is no more indexed events before this point - if (lastKnownIndexCheckpointPosition > _lastEventPosition) - _lastEventPosition = lastKnownIndexCheckpointPosition; - - _state = new TfBased(_timeProvider, this, _lastEventPosition, this._publisher, ReadAs); - _state.RequestEvents(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexPositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexPositionTagger.cs deleted file mode 100644 index fa15d3a2d..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventByType/EventByTypeIndexPositionTagger.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.EventByType { - public class EventByTypeIndexPositionTagger : PositionTagger { - private readonly HashSet _streams; - private readonly HashSet _eventTypes; - private readonly Dictionary _streamToEventType; - - public EventByTypeIndexPositionTagger( - int phase, string[] eventTypes, bool includeStreamDeletedNotification = false) - : base(phase) { - if (eventTypes == null) throw new ArgumentNullException("eventTypes"); - if (eventTypes.Length == 0) throw new ArgumentException("eventTypes"); - _eventTypes = new HashSet(eventTypes); - if (includeStreamDeletedNotification) - _eventTypes.Add("$deleted"); - _streams = new HashSet(from eventType in eventTypes - select "$et-" + eventType); - _streamToEventType = eventTypes.ToDictionary(v => "$et-" + v, v => v); - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase < Phase) - return true; - if (previous.Mode_ != CheckpointTag.Mode.EventTypeIndex) - throw new ArgumentException("Mode.EventTypeIndex expected", "previous"); - if (committedEvent.Data.EventOrLinkTargetPosition.CommitPosition <= 0) - throw new ArgumentException("complete TF position required", "committedEvent"); - - return committedEvent.Data.EventOrLinkTargetPosition > previous.Position; - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (committedEvent.Data.EventOrLinkTargetPosition < previous.Position) - throw new InvalidOperationException( - string.Format( - "Cannot make a checkpoint tag at earlier position. '{0}' < '{1}'", - committedEvent.Data.EventOrLinkTargetPosition, previous.Position)); - var byIndex = _streams.Contains(committedEvent.Data.PositionStreamId); - return byIndex - ? previous.UpdateEventTypeIndexPosition( - committedEvent.Data.EventOrLinkTargetPosition, - _streamToEventType[committedEvent.Data.PositionStreamId], - committedEvent.Data.PositionSequenceNumber) - : previous.UpdateEventTypeIndexPosition(committedEvent.Data.EventOrLinkTargetPosition); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (partitionDeleted.DeleteEventOrLinkTargetPosition < previous.Position) - throw new InvalidOperationException( - string.Format( - "Cannot make a checkpoint tag at earlier position. '{0}' < '{1}'", - partitionDeleted.DeleteEventOrLinkTargetPosition, previous.Position)); - var byIndex = _streams.Contains(partitionDeleted.PositionStreamId); - //TODO: handle invalid partition deleted messages without required values - return byIndex - ? previous.UpdateEventTypeIndexPosition( - partitionDeleted.DeleteEventOrLinkTargetPosition.Value, - _streamToEventType[partitionDeleted.PositionStreamId], - partitionDeleted.PositionEventNumber.Value) - : previous.UpdateEventTypeIndexPosition(partitionDeleted.DeleteEventOrLinkTargetPosition.Value); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromEventTypeIndexPositions( - Phase, new TFPos(0, -1), _eventTypes.ToDictionary(v => v, v => ExpectedVersion.NoStream)); - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - //TODO: should Stream be supported here as well if in the set? - return checkpointTag.Mode_ == CheckpointTag.Mode.EventTypeIndex - && checkpointTag.Streams.All(v => _eventTypes.Contains(v.Key)); - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, - tag.Phase), "tag"); - - if (tag.Mode_ == CheckpointTag.Mode.EventTypeIndex) { - long p; - return CheckpointTag.FromEventTypeIndexPositions( - tag.Phase, tag.Position, - _eventTypes.ToDictionary(v => v, v => tag.Streams.TryGetValue(v, out p) ? p : -1)); - } - - switch (tag.Mode_) { - case CheckpointTag.Mode.MultiStream: - throw new NotSupportedException( - "Conversion from MultiStream to EventTypeIndex position tag is not supported"); - case CheckpointTag.Mode.Stream: - throw new NotSupportedException( - "Conversion from Stream to EventTypeIndex position tag is not supported"); - case CheckpointTag.Mode.PreparePosition: - throw new NotSupportedException( - "Conversion from PreparePosition to EventTypeIndex position tag is not supported"); - case CheckpointTag.Mode.Position: - return CheckpointTag.FromEventTypeIndexPositions( - tag.Phase, tag.Position, _eventTypes.ToDictionary(v => v, v => (long)-1)); - default: - throw new NotSupportedException(string.Format( - "The given checkpoint is invalid. Possible causes might include having written an event to the projection's managed stream. The bad checkpoint: {0}", - tag.ToString())); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/EventFilter.cs deleted file mode 100644 index 4cbc79c6e..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventFilter.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using EventStore.Common.Utils; - -namespace EventStore.Projections.Core.Services.Processing { - public abstract class EventFilter { - private readonly bool _allEvents; - private readonly bool _includeDeletedStreamEvents; - private readonly HashSet _events; - - /// - /// - /// - /// - /// indicates whether non-link stream tombstone or - /// metastream stream deleted events should be included. Links resolved into metastream - /// stream deleted events are not restricted - /// - protected EventFilter(bool allEvents, bool includeDeletedStreamEvents, HashSet events) { - _allEvents = allEvents; - _includeDeletedStreamEvents = includeDeletedStreamEvents; - _events = events; - } - - public bool Passes( - bool resolvedFromLinkTo, string eventStreamId, string eventName, bool isStreamDeletedEvent = false) { - return (PassesSource(resolvedFromLinkTo, eventStreamId, eventName)) - && ((_allEvents || _events != null && _events.Contains(eventName)) - && (!isStreamDeletedEvent || _includeDeletedStreamEvents)); - } - - public bool PassesValidation(bool isJson, string data) { - if (!isJson) return true; - if (data is null) { - return false; - } - return data.IsValidJson(); - } - - protected abstract bool DeletedNotificationPasses(string positionStreamId); - public abstract bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType); - public abstract string GetCategory(string positionStreamId); - - public bool PassesDeleteNotification(string positionStreamId) { - return !_includeDeletedStreamEvents && DeletedNotificationPasses(positionStreamId); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventProcessedResult.cs b/src/EventStore.Projections.Core/Services/Processing/EventProcessedResult.cs deleted file mode 100644 index 0f1887d2f..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventProcessedResult.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing { - public class EventProcessedResult { - private readonly EmittedEventEnvelope[] _emittedEvents; - private readonly PartitionState _oldState; - private readonly PartitionState _newState; - private readonly PartitionState _oldSharedState; - private readonly PartitionState _newSharedState; - private readonly string _partition; - private readonly CheckpointTag _checkpointTag; - private readonly Guid _causedBy; - private readonly string _correlationId; - private readonly bool _isPartitionTombstone; - - public EventProcessedResult( - string partition, CheckpointTag checkpointTag, PartitionState oldState, PartitionState newState, - PartitionState oldSharedState, PartitionState newSharedState, EmittedEventEnvelope[] emittedEvents, - Guid causedBy, string correlationId, bool isPartitionTombstone = false) { - if (partition == null) throw new ArgumentNullException("partition"); - if (checkpointTag == null) throw new ArgumentNullException("checkpointTag"); - _emittedEvents = emittedEvents; - _causedBy = causedBy; - _correlationId = correlationId; - _isPartitionTombstone = isPartitionTombstone; - _oldState = oldState; - _newState = newState; - _oldSharedState = oldSharedState; - _newSharedState = newSharedState; - _partition = partition; - _checkpointTag = checkpointTag; - } - - public EmittedEventEnvelope[] EmittedEvents { - get { return _emittedEvents; } - } - - public PartitionState OldState { - get { return _oldState; } - } - - /// - /// null - means no state change - /// - public PartitionState NewState { - get { return _newState; } - } - - public PartitionState OldSharedState { - get { return _oldSharedState; } - } - - /// - /// null - means no state change - /// - public PartitionState NewSharedState { - get { return _newSharedState; } - } - - public string Partition { - get { return _partition; } - } - - public CheckpointTag CheckpointTag { - get { return _checkpointTag; } - } - - public Guid CausedBy { - get { return _causedBy; } - } - - public string CorrelationId { - get { return _correlationId; } - } - - public bool IsPartitionTombstone { - get { return _isPartitionTombstone; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventReader.cs b/src/EventStore.Projections.Core/Services/Processing/EventReader.cs deleted file mode 100644 index b1072b50c..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventReader.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing { - public abstract class EventReader : IEventReader { - protected readonly Guid EventReaderCorrelationId; - private readonly ClaimsPrincipal _readAs; - protected readonly IPublisher _publisher; - - protected readonly bool _stopOnEof; - private bool _paused = true; - private bool _pauseRequested = true; - protected bool _disposed; - private bool _startingSent; - - protected EventReader(IPublisher publisher, Guid eventReaderCorrelationId, ClaimsPrincipal readAs, bool stopOnEof) { - if (publisher == null) throw new ArgumentNullException("publisher"); - if (eventReaderCorrelationId == Guid.Empty) - throw new ArgumentException("eventReaderCorrelationId"); - _publisher = publisher; - EventReaderCorrelationId = eventReaderCorrelationId; - _readAs = readAs; - _stopOnEof = stopOnEof; - } - - protected bool PauseRequested { - get { return _pauseRequested; } - } - - protected bool Paused { - get { return _paused; } - } - - protected ClaimsPrincipal ReadAs { - get { return _readAs; } - } - - public void Resume() { - if (_disposed) throw new InvalidOperationException("Disposed"); - if (!_pauseRequested) - throw new InvalidOperationException("Is not paused"); - if (!_paused) { - _pauseRequested = false; - return; - } - - _paused = false; - _pauseRequested = false; -// _logger.Trace("Resuming event distribution {eventReaderCorrelationId} at '{at}'", EventReaderCorrelationId, FromAsText()); - RequestEvents(); - } - - public void Pause() { - if (_disposed) - return; // due to possible self disposed - - if (_pauseRequested) - throw new InvalidOperationException("Pause has been already requested"); - _pauseRequested = true; - if (!AreEventsRequested()) - _paused = true; -// _logger.Trace("Pausing event distribution {eventReaderCorrelationId} at '{at}'", EventReaderCorrelationId, FromAsText()); - } - - public virtual void Dispose() { - _disposed = true; - } - - protected abstract bool AreEventsRequested(); - protected abstract void RequestEvents(); - - protected void SendEof() { - if (_stopOnEof) { - _publisher.Publish(new ReaderSubscriptionMessage.EventReaderEof(EventReaderCorrelationId)); - Dispose(); - } - } - - protected void SendPartitionEof(string partition, CheckpointTag preTagged) { - if (_disposed) - return; - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderPartitionEof(EventReaderCorrelationId, partition, preTagged)); - } - - protected void SendPartitionDeleted_WhenReadingDataStream( - string partition, long? lastEventNumber, TFPos? deletedLinkOrEventPosition, TFPos? deletedEventPosition, - string positionStreamId, - int? positionEventNumber, CheckpointTag preTagged = null) { - if (_disposed) - return; - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderPartitionDeleted( - EventReaderCorrelationId, partition, lastEventNumber, deletedLinkOrEventPosition, - deletedEventPosition, positionStreamId, positionEventNumber, preTagged)); - } - - public void SendNotAuthorized() { - if (_disposed) - return; - _publisher.Publish(new ReaderSubscriptionMessage.EventReaderNotAuthorized(EventReaderCorrelationId)); - Dispose(); - } - - protected static long? GetLastCommitPositionFrom(ClientMessage.ReadStreamEventsForwardCompleted msg) { - return (msg.IsEndOfStream - || msg.Result == ReadStreamResult.NoStream - || msg.Result == ReadStreamResult.StreamDeleted) - ? (msg.TfLastCommitPosition == -1 ? (long?)null : msg.TfLastCommitPosition) - : (long?)null; - } - - protected void PauseOrContinueProcessing() { - if (_disposed) - return; - if (_pauseRequested) - _paused = !AreEventsRequested(); - else - RequestEvents(); - } - - private void SendStarting(long startingLastCommitPosition) { - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderStarting(EventReaderCorrelationId, - startingLastCommitPosition)); - } - - protected void NotifyIfStarting(long startingLastCommitPosition) { - if (!_startingSent) { - _startingSent = true; - SendStarting(startingLastCommitPosition); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/EventReaderCoreService.cs b/src/EventStore.Projections.Core/Services/Processing/EventReaderCoreService.cs deleted file mode 100644 index e4fa34a65..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/EventReaderCoreService.cs +++ /dev/null @@ -1,365 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Services.UserManagement; -using EventStore.Core.TransactionLog.Checkpoint; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using HeadingEventReader = EventStore.Projections.Core.Services.Processing.TransactionFile.HeadingEventReader; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing { - public class EventReaderCoreService : - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - public const string SubComponentName = "EventReaderCoreService"; - - private readonly IPublisher _publisher; - private readonly IODispatcher _ioDispatcher; - private readonly ILogger _logger = Serilog.Log.ForContext(); - private bool _stopped = true; - - private readonly Dictionary _subscriptions = - new Dictionary(); - - private readonly Dictionary _eventReaders = new Dictionary(); - - private readonly Dictionary _subscriptionEventReaders = new Dictionary(); - private readonly Dictionary _eventReaderSubscriptions = new Dictionary(); - private readonly HashSet _pausedSubscriptions = new HashSet(); - private readonly HeadingEventReader _headingEventReader; - private readonly ICheckpoint _writerCheckpoint; - private readonly bool _runHeadingReader; - private readonly bool _faultOutOfOrderProjections; - private readonly IEnvelope _publishEnvelope; - private Guid _defaultEventReaderId; - private Guid _reportProgressId; - - public EventReaderCoreService( - IPublisher publisher, IODispatcher ioDispatcher, int eventCacheSize, - ICheckpoint writerCheckpoint, bool runHeadingReader, bool faultOutOfOrderProjections) { - _publisher = publisher; - _ioDispatcher = ioDispatcher; - if (runHeadingReader) - _headingEventReader = new HeadingEventReader(eventCacheSize, _publisher); - _writerCheckpoint = writerCheckpoint; - _runHeadingReader = runHeadingReader; - _faultOutOfOrderProjections = faultOutOfOrderProjections; - _publishEnvelope = publisher; - } - - public void Handle(ReaderSubscriptionManagement.Pause message) { - if (!_pausedSubscriptions.Add(message.SubscriptionId)) - throw new InvalidOperationException("Already paused projection"); - - IReaderSubscription projectionSubscription; - if (!_subscriptions.TryGetValue(message.SubscriptionId, out projectionSubscription)) - return; // may be already unsubscribed when self-unsubscribing - - var eventReaderId = _subscriptionEventReaders[message.SubscriptionId]; - if (eventReaderId == Guid.Empty) // head - { - _subscriptionEventReaders.Remove(message.SubscriptionId); - _headingEventReader.Unsubscribe(message.SubscriptionId); - var forkedEventReaderId = Guid.NewGuid(); - var forkedEventReader = projectionSubscription.CreatePausedEventReader( - _publisher, _ioDispatcher, forkedEventReaderId); - _subscriptionEventReaders.Add(message.SubscriptionId, forkedEventReaderId); - _eventReaderSubscriptions.Add(forkedEventReaderId, message.SubscriptionId); - _eventReaders.Add(forkedEventReaderId, forkedEventReader); - _publisher.Publish( - new EventReaderSubscriptionMessage.ReaderAssignedReader( - message.SubscriptionId, forkedEventReaderId)); - } else { - _eventReaders[eventReaderId].Pause(); - } - } - - public void Handle(ReaderSubscriptionManagement.Resume message) { - if (!_pausedSubscriptions.Remove(message.SubscriptionId)) - throw new InvalidOperationException("Not a paused projection"); - var eventReader = _subscriptionEventReaders[message.SubscriptionId]; - _eventReaders[eventReader].Resume(); - } - - public void Handle(ReaderSubscriptionManagement.Subscribe message) { - if (_stopped) { - _publisher.Publish( - new EventReaderSubscriptionMessage.Failed( - message.SubscriptionId, $"{nameof(EventReaderCoreService)} is stopped")); - return; - } - - var fromCheckpointTag = message.FromPosition; - var subscriptionId = message.SubscriptionId; - try { - var projectionSubscription = message.ReaderStrategy.CreateReaderSubscription( - _publisher, fromCheckpointTag, message.SubscriptionId, message.Options); - _subscriptions.Add(subscriptionId, projectionSubscription); - - var distributionPointCorrelationId = Guid.NewGuid(); - var eventReader = projectionSubscription.CreatePausedEventReader( - _publisher, _ioDispatcher, distributionPointCorrelationId); - _eventReaders.Add(distributionPointCorrelationId, eventReader); - _subscriptionEventReaders.Add(subscriptionId, distributionPointCorrelationId); - _eventReaderSubscriptions.Add(distributionPointCorrelationId, subscriptionId); - _publisher.Publish( - new EventReaderSubscriptionMessage.ReaderAssignedReader( - subscriptionId, distributionPointCorrelationId)); - eventReader.Resume(); - } catch (Exception ex) { - _publisher.Publish(new EventReaderSubscriptionMessage.Failed( - subscriptionId, ex.ToString())); - } - } - - public void Handle(ReaderSubscriptionManagement.Unsubscribe message) { - if (!_pausedSubscriptions.Contains(message.SubscriptionId)) - Handle(new ReaderSubscriptionManagement.Pause(message.SubscriptionId)); - var eventReaderId = Guid.Empty; - _subscriptionEventReaders.TryGetValue(message.SubscriptionId, out eventReaderId); - if (eventReaderId != Guid.Empty) { - _eventReaders[eventReaderId].Dispose(); - _eventReaders.Remove(eventReaderId); - _eventReaderSubscriptions.Remove(eventReaderId); - _publisher.Publish( - new EventReaderSubscriptionMessage.ReaderAssignedReader(message.SubscriptionId, Guid.Empty)); - } - - _pausedSubscriptions.Remove(message.SubscriptionId); - _subscriptionEventReaders.Remove(message.SubscriptionId); - _subscriptions.Remove(message.SubscriptionId); - } - - public void Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - Guid projectionId; - if (_stopped) - return; - if (_runHeadingReader && _headingEventReader.Handle(message)) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - - if (TrySubscribeHeadingEventReader(message, projectionId)) - return; - if (message.Data != null) { - try { - _subscriptions[projectionId].Handle(message); - } catch (Exception ex) { - var subscription = _subscriptions[projectionId]; - Handle(new ReaderSubscriptionManagement.Unsubscribe(subscription.SubscriptionId)); - _publisher.Publish(new EventReaderSubscriptionMessage.Failed(subscription.SubscriptionId, - string.Format("The subscription failed to handle an event {0}:{1}@{2} because {3}", - message.Data.EventStreamId, message.Data.EventType, message.Data.EventSequenceNumber, - ex.Message))); - } - } - } - - public void Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - Guid projectionId; - if (_stopped) - return; - if (_runHeadingReader && _headingEventReader.Handle(message)) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderStarting message) { - Guid projectionId; - if (_stopped) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderEof message) { - Guid projectionId; - if (_stopped) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - -// _pausedSubscriptions.Add(projectionId); // it is actually disposed -- workaround -// Handle(new ReaderSubscriptionManagement.Unsubscribe(projectionId)); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionEof message) { - Guid projectionId; - if (_stopped) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - Guid projectionId; - if (_stopped) - return; - if (_runHeadingReader && _headingEventReader.Handle(message)) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderNotAuthorized message) { - Guid projectionId; - if (_stopped) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - _subscriptions[projectionId].Handle(message); - - _pausedSubscriptions.Add(projectionId); // it is actually disposed -- workaround - Handle(new ReaderSubscriptionManagement.Unsubscribe(projectionId)); - } - - public void Handle(ReaderSubscriptionMessage.Faulted message) { - Guid projectionId; - if (_stopped) - return; - if (!_eventReaderSubscriptions.TryGetValue(message.CorrelationId, out projectionId)) - return; // unsubscribed - - if (!_faultOutOfOrderProjections && message.Reason.Contains("was expected in the stream")) { - // Log without fault the projection - _logger.Verbose(message.Reason); - return; - } - - var subscription = _subscriptions[projectionId]; - Handle(new ReaderSubscriptionManagement.Unsubscribe(subscription.SubscriptionId)); - _publisher.Publish(new EventReaderSubscriptionMessage.Failed(subscription.SubscriptionId, message.Reason)); - } - - public void Handle(ReaderSubscriptionMessage.ReportProgress message) { - if (_stopped || message.CorrelationId != _reportProgressId) - return; - - foreach (var subscription in _subscriptions.Values) { - subscription.Handle(message); - } - - _reportProgressId = Guid.NewGuid(); - _publisher.Publish(TimerMessage.Schedule.Create(TimeSpan.FromMilliseconds(500), _publishEnvelope, new ReaderSubscriptionMessage.ReportProgress(_reportProgressId))); - } - - private void StartReaders() { - //TODO: do we need to clear subscribed projections here? - //TODO: do we need to clear subscribed distribution points here? - _stopped = false; - _defaultEventReaderId = Guid.NewGuid(); - var transactionFileReader = new TransactionFileEventReader( - _publisher, - _defaultEventReaderId, - SystemAccounts.System, - new TFPos(_writerCheckpoint.Read(), -1), - new RealTimeProvider(), - deliverEndOfTFPosition: false); - - _eventReaders.Add(_defaultEventReaderId, transactionFileReader); - if (_runHeadingReader) - _headingEventReader.Start(_defaultEventReaderId, transactionFileReader); - } - - private void StopReaders(ReaderCoreServiceMessage.StopReader message) { - if (_eventReaders.TryGetValue(_defaultEventReaderId, out var eventReader)) { - eventReader.Dispose(); - _eventReaders.Remove(_defaultEventReaderId); - _eventReaderSubscriptions.Remove(_defaultEventReaderId); - } - _defaultEventReaderId = Guid.Empty; - - if (_subscriptions.Count > 0) { - _logger.Information("_subscriptions is not empty after all the projections have been killed"); - _subscriptions.Clear(); - } - - if (_eventReaders.Count > 0) { - _logger.Information("_eventReaders is not empty after all the projections have been killed"); - _eventReaders.Clear(); - } - - if (_subscriptionEventReaders.Count > 0) { - _logger.Information("_subscriptionEventReaders is not empty after all the projections have been killed"); - _subscriptionEventReaders.Clear(); - } - - if (_eventReaderSubscriptions.Count > 0) { - _logger.Information("_eventReaderSubscriptions is not empty after all the projections have been killed"); - _eventReaderSubscriptions.Clear(); - } - - if (_runHeadingReader) - _headingEventReader.Stop(); - _stopped = true; - - _publisher.Publish( - new ProjectionCoreServiceMessage.SubComponentStopped(SubComponentName, message.QueueId)); - } - - private bool TrySubscribeHeadingEventReader( - ReaderSubscriptionMessage.CommittedEventDistributed message, Guid projectionId) { - if (message.SafeTransactionFileReaderJoinPosition == null) - return false; - - if (!_runHeadingReader) - return false; - - if (_pausedSubscriptions.Contains(projectionId)) - return false; - - var projectionSubscription = _subscriptions[projectionId]; - - if ( - !_headingEventReader.TrySubscribe( - projectionId, projectionSubscription, message.SafeTransactionFileReaderJoinPosition.Value)) - return false; - - Guid eventReaderId = message.CorrelationId; - _eventReaders[eventReaderId].Dispose(); - _eventReaders.Remove(eventReaderId); - _eventReaderSubscriptions.Remove(eventReaderId); - _subscriptionEventReaders[projectionId] = Guid.Empty; - _publisher.Publish( - new EventReaderSubscriptionMessage.ReaderAssignedReader(message.CorrelationId, Guid.Empty)); - return true; - } - - public void Handle(ReaderCoreServiceMessage.StartReader message) { - StartReaders(); - _publisher.Publish(new ProjectionCoreServiceMessage.SubComponentStarted( - SubComponentName, message.InstanceCorrelationId)); - _reportProgressId = Guid.NewGuid(); - _publisher.Publish(TimerMessage.Schedule.Create(TimeSpan.FromMilliseconds(500), _publishEnvelope, new ReaderSubscriptionMessage.ReportProgress(_reportProgressId))); - } - - public void Handle(ReaderCoreServiceMessage.StopReader message) { - StopReaders(message); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/IEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/IEventReader.cs deleted file mode 100644 index d21bd1b81..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/IEventReader.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing { - public interface IEventReader : IDisposable { - void Resume(); - void Pause(); - void SendNotAuthorized(); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventFilter.cs deleted file mode 100644 index 31ee33616..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventFilter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Services.Processing.MultiStream { - public class MultiStreamEventFilter : EventFilter { - private readonly HashSet _streams; - - public MultiStreamEventFilter(HashSet streams, bool allEvents, HashSet events) - : base(allEvents, false, events) { - _streams = streams; - } - - protected override bool DeletedNotificationPasses(string positionStreamId) { - return false; - } - - public override bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType) { - return _streams.Contains(positionStreamId); - } - - public override string GetCategory(string positionStreamId) { - return null; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventReader.cs deleted file mode 100644 index 9dcf518d9..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamEventReader.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.MultiStream { - public class MultiStreamEventReader : EventReader, - IHandle, - IHandle { - private readonly HashSet _streams; - private CheckpointTag _fromPositions; - private readonly bool _resolveLinkTos; - private readonly ITimeProvider _timeProvider; - - private readonly HashSet _eventsRequested = new HashSet(); - private readonly Dictionary _preparePositions = new Dictionary(); - - // event, link, progress - // null element in a queue means stream deleted - private readonly Dictionary>> _buffers = - new Dictionary>>(); - - private const int _maxReadCount = 111; - private long? _safePositionToJoin; - private readonly ConcurrentDictionary _eofs; - private int _deliveredEvents; - private long _lastPosition; - - private readonly ConcurrentDictionary _pendingRequests; - - public MultiStreamEventReader( - IODispatcher ioDispatcher, IPublisher publisher, Guid eventReaderCorrelationId, ClaimsPrincipal readAs, - int phase, - string[] streams, Dictionary fromPositions, bool resolveLinkTos, ITimeProvider timeProvider, - bool stopOnEof = false, int? stopAfterNEvents = null) - : base(publisher, eventReaderCorrelationId, readAs, stopOnEof) { - if (streams == null) throw new ArgumentNullException("streams"); - if (timeProvider == null) throw new ArgumentNullException("timeProvider"); - if (streams.Length == 0) throw new ArgumentException("streams"); - _streams = new HashSet(streams); - _eofs = new ConcurrentDictionary(_streams.ToDictionary(v => v, v => false)); - var positions = CheckpointTag.FromStreamPositions(phase, fromPositions); - ValidateTag(positions); - _fromPositions = positions; - _resolveLinkTos = resolveLinkTos; - _timeProvider = timeProvider; - _pendingRequests = new ConcurrentDictionary(); - foreach (var stream in streams) { - _pendingRequests[stream] = Guid.Empty; - _preparePositions.Add(stream, null); - } - } - - private void ValidateTag(CheckpointTag fromPositions) { - if (_streams.Count != fromPositions.Streams.Count) - throw new ArgumentException("Number of streams does not match", "fromPositions"); - - foreach (var stream in _streams) { - if (!fromPositions.Streams.ContainsKey(stream)) - throw new ArgumentException( - string.Format("The '{0}' stream position has not been set", stream), "fromPositions"); - } - } - - protected override void RequestEvents() { - if (PauseRequested || Paused) - return; - if (_eofs.Any(v => v.Value)) - _publisher.Publish( - TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(250), _publisher, - new UnwrapEnvelopeMessage(ProcessBuffers2))); - foreach (var stream in _streams) - RequestEvents(stream, delay: _eofs[stream]); - } - - private void ProcessBuffers2() { - ProcessBuffers(); - CheckIdle(); - } - - protected override bool AreEventsRequested() { - return _eventsRequested.Count != 0; - } - - public void Handle(ClientMessage.ReadStreamEventsForwardCompleted message) { - if (_disposed) - return; - if (!_streams.Contains(message.EventStreamId)) - throw new InvalidOperationException(string.Format("Invalid stream name: {0}", message.EventStreamId)); - if (!_eventsRequested.Contains(message.EventStreamId)) - throw new InvalidOperationException("Read events has not been requested"); - if (Paused) - throw new InvalidOperationException("Paused"); - if (!_pendingRequests.Values.Any(x => x == message.CorrelationId)) return; - - _lastPosition = message.TfLastCommitPosition; - switch (message.Result) { - case ReadStreamResult.StreamDeleted: - case ReadStreamResult.NoStream: - _eofs[message.EventStreamId] = true; - UpdateSafePositionToJoin(message.EventStreamId, MessageToLastCommitPosition(message)); - if (message.Result == ReadStreamResult.StreamDeleted - || (message.Result == ReadStreamResult.NoStream && message.LastEventNumber >= 0)) - EnqueueItem(null, message.EventStreamId); - ProcessBuffers(); - _eventsRequested.Remove(message.EventStreamId); - PauseOrContinueProcessing(); - CheckIdle(); - CheckEof(); - break; - case ReadStreamResult.Success: - if ((message.Events.Length == 0) && message.IsEndOfStream) { - // the end - _eofs[message.EventStreamId] = true; - UpdateSafePositionToJoin(message.EventStreamId, MessageToLastCommitPosition(message)); - CheckIdle(); - CheckEof(); - } else { - _eofs[message.EventStreamId] = false; - if (message.Events.Length == 0) { - _fromPositions.Streams[message.EventStreamId] = message.NextEventNumber; - } - for (int index = 0; index < message.Events.Length; index++) { - var @event = message.Events[index].Event; - var @link = message.Events[index].Link; - EventRecord positionEvent = (link ?? @event); - UpdateSafePositionToJoin( - positionEvent.EventStreamId, EventPairToPosition(message.Events[index])); - Tuple itemToEnqueue = Tuple.Create( - message.Events[index], - 100.0f * (link ?? @event).EventNumber / message.LastEventNumber); - EnqueueItem(itemToEnqueue, positionEvent.EventStreamId); - } - } - - ProcessBuffers(); - _eventsRequested.Remove(message.EventStreamId); - PauseOrContinueProcessing(); - break; - case ReadStreamResult.AccessDenied: - SendNotAuthorized(); - return; - default: - throw new NotSupportedException( - string.Format("ReadEvents result code was not recognized. Code: {0}", message.Result)); - } - } - - public void Handle(ProjectionManagementMessage.Internal.ReadTimeout message) { - if (_disposed) return; - if (Paused) return; - if (!_pendingRequests.Values.Any(x => x == message.CorrelationId)) return; - - _eventsRequested.Remove(message.StreamId); - PauseOrContinueProcessing(); - } - - private void EnqueueItem(Tuple itemToEnqueue, string streamId) { - Queue> queue; - if (!_buffers.TryGetValue(streamId, out queue)) { - queue = new Queue>(); - _buffers.Add(streamId, queue); - } - - //TODO: progress calculation below is incorrect. sum(current)/sum(last_event) where sum by all streams - queue.Enqueue(itemToEnqueue); - } - - private void CheckEof() { - if (_eofs.All(v => v.Value)) - SendEof(); - } - - private void CheckIdle() { - if (_eofs.All(v => v.Value)) - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderIdle(EventReaderCorrelationId, _timeProvider.UtcNow)); - } - - private void ProcessBuffers() { - if (_disposed) - return; - if (_safePositionToJoin == null) - return; - while (true) { - var anyNonEmpty = false; - - var anyEvent = false; - var minStreamId = ""; - var minPosition = GetMaxPosition(); - - var anyDeletedStream = false; - var deletedStreamId = ""; - - foreach (var buffer in _buffers) { - if (buffer.Value.Count == 0) - continue; - anyNonEmpty = true; - var head = buffer.Value.Peek(); - - var currentStreamId = buffer.Key; - - if (head != null) { - var itemPosition = GetItemPosition(head); - if (_safePositionToJoin != null - && itemPosition.CompareTo(_safePositionToJoin.GetValueOrDefault()) <= 0 - && itemPosition.CompareTo(minPosition) < 0) { - minPosition = itemPosition; - minStreamId = currentStreamId; - anyEvent = true; - } - } else { - anyDeletedStream = true; - deletedStreamId = currentStreamId; - } - } - - if (!anyEvent && !anyDeletedStream) { - if (!anyNonEmpty) - DeliverSafePositionToJoin(); - break; - } - - if (anyEvent) { - var minHead = _buffers[minStreamId].Dequeue(); - DeliverEvent(minHead.Item1, minHead.Item2); - - if (_buffers[minStreamId].Count == 0) - PauseOrContinueProcessing(); - } - - if (anyDeletedStream) { - _buffers[deletedStreamId].Dequeue(); - SendPartitionDeleted_WhenReadingDataStream(deletedStreamId, -1, null, null, null, null); - } - } - } - - private void RequestEvents(string stream, bool delay) { - if (_disposed) throw new InvalidOperationException("Disposed"); - if (PauseRequested || Paused) - throw new InvalidOperationException("Paused or pause requested"); - - if (_eventsRequested.Contains(stream)) - return; - Queue> queue; - if (_buffers.TryGetValue(stream, out queue) && queue.Count > 0) - return; - _eventsRequested.Add(stream); - - var pendingRequestCorrelationId = Guid.NewGuid(); - _pendingRequests[stream] = pendingRequestCorrelationId; - - var readEventsForward = new ClientMessage.ReadStreamEventsForward( - Guid.NewGuid(), pendingRequestCorrelationId, new SendToThisEnvelope(this), stream, - _fromPositions.Streams[stream], - _maxReadCount, _resolveLinkTos, false, null, ReadAs, replyOnExpired: false); - if (delay) { - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), - CreateReadTimeoutMessage(pendingRequestCorrelationId, stream))); - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), readEventsForward)); - } else { - _publisher.Publish(readEventsForward); - ScheduleReadTimeoutMessage(pendingRequestCorrelationId, stream); - } - } - - private void ScheduleReadTimeoutMessage(Guid correlationId, string streamId) { - _publisher.Publish(CreateReadTimeoutMessage(correlationId, streamId)); - } - - private Message CreateReadTimeoutMessage(Guid correlationId, string streamId) { - return TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, streamId)); - } - - private void DeliverSafePositionToJoin() { - if (_stopOnEof || _safePositionToJoin == null) - return; - // deliver if already available - _publisher.Publish( - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, null, PositionToSafeJoinPosition(_safePositionToJoin), 100.0f, - source: this.GetType())); - } - - private void UpdateSafePositionToJoin(string streamId, long? preparePosition) { - _preparePositions[streamId] = preparePosition; - if (_preparePositions.All(v => v.Value != null)) - _safePositionToJoin = _preparePositions.Min(v => v.Value.GetValueOrDefault()); - } - - private void DeliverEvent(EventStore.Core.Data.ResolvedEvent pair, float progress) { - _deliveredEvents++; - var positionEvent = pair.OriginalEvent; - string streamId = positionEvent.EventStreamId; - long fromPosition = _fromPositions.Streams[streamId]; - - //if events have been deleted from the beginning of the stream, start from the first event we find - if (fromPosition == 0 && positionEvent.EventNumber > 0) { - fromPosition = positionEvent.EventNumber; - } - - if (positionEvent.EventNumber != fromPosition) { - // This can happen when the original stream has $maxAge/$maxCount set - _publisher.Publish(new ReaderSubscriptionMessage.Faulted(EventReaderCorrelationId, string.Format( - "Event number {0} was expected in the stream {1}, but event number {2} was received. This may happen if events have been deleted from the beginning of your stream, please reset your projection.", - fromPosition, streamId, positionEvent.EventNumber), this.GetType())); - return; - } - - _fromPositions = _fromPositions.UpdateStreamPosition(streamId, positionEvent.EventNumber + 1); - _publisher.Publish( - //TODO: publish both link and event data - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, new ResolvedEvent(pair, null), - _stopOnEof ? (long?)null : positionEvent.LogPosition, progress, source: this.GetType())); - } - - private long? EventPairToPosition(EventStore.Core.Data.ResolvedEvent resolvedEvent) { - return resolvedEvent.OriginalEvent.LogPosition; - } - - private long? MessageToLastCommitPosition(ClientMessage.ReadStreamEventsForwardCompleted message) { - return GetLastCommitPositionFrom(message); - } - - private long GetItemPosition(Tuple head) { - return head.Item1.OriginalEvent.LogPosition; - } - - private long GetMaxPosition() { - return long.MaxValue; - } - - private long? PositionToSafeJoinPosition(long? safePositionToJoin) { - return safePositionToJoin; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.Item.cs b/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.Item.cs deleted file mode 100644 index db826b0d4..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.Item.cs +++ /dev/null @@ -1,23 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.MultiStream; - -public partial class MultiStreamMultiOutputCheckpointManager -{ - private class Item { - internal EventStore.Core.Data.ResolvedEvent? _result; - private readonly CheckpointTag _tag; - - public Item(CheckpointTag tag) { - _tag = tag; - } - - public CheckpointTag Tag { - get { return _tag; } - } - - public void SetLoadedEvent(EventStore.Core.Data.ResolvedEvent eventLinkPair) { - _result = eventLinkPair; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.cs b/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.cs deleted file mode 100644 index cf6699aa9..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamMultiOutputCheckpointManager.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using EventStore.Common.Utils; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Messages; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.MultiStream { - public partial class MultiStreamMultiOutputCheckpointManager : DefaultCheckpointManager, IEmittedStreamContainer { - private readonly PositionTagger _positionTagger; - private CheckpointTag _lastOrderCheckpointTag; //TODO: use position tracker to ensure order? - private EmittedStream _orderStream; - private bool _orderStreamReadingCompleted; - private int _loadingItemsCount; - private readonly Stack _loadQueue = new Stack(); - private CheckpointTag _loadingPrerecordedEventsFrom; - private static readonly char[] _linkToSeparator = new[] {'@'}; - - public MultiStreamMultiOutputCheckpointManager( - IPublisher publisher, Guid projectionCorrelationId, ProjectionVersion projectionVersion, ClaimsPrincipal runAs, - IODispatcher ioDispatcher, ProjectionConfig projectionConfig, string name, PositionTagger positionTagger, - ProjectionNamesBuilder namingBuilder, bool usePersistentCheckpoints, bool producesRunningResults, - bool definesFold, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter) - : base( - publisher, projectionCorrelationId, projectionVersion, runAs, ioDispatcher, projectionConfig, name, - positionTagger, namingBuilder, usePersistentCheckpoints, producesRunningResults, definesFold, - coreProjectionCheckpointWriter) { - _positionTagger = positionTagger; - } - - public override void Initialize() { - base.Initialize(); - _lastOrderCheckpointTag = null; - if (_orderStream != null) _orderStream.Dispose(); - _orderStream = null; - } - - public override void Start(CheckpointTag checkpointTag, PartitionState rootPartitionState) { - base.Start(checkpointTag, rootPartitionState); - _orderStream = CreateOrderStream(checkpointTag); - _orderStream.Start(); - } - - public override void RecordEventOrder( - ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed) { - EnsureStarted(); - if (_stopping) - throw new InvalidOperationException("Stopping"); - var orderStreamName = _namingBuilder.GetOrderStreamName(); - //TODO: -order stream requires correctly configured event expiration. - // the best is to truncate using $startFrom, but $maxAge should be also acceptable - _orderStream.EmitEvents( - new[] { - new EmittedDataEvent( - orderStreamName, Guid.NewGuid(), "$>", - false, resolvedEvent.PositionSequenceNumber + "@" + resolvedEvent.PositionStreamId, null, - orderCheckpointTag, _lastOrderCheckpointTag, v => committed()) - }); - _lastOrderCheckpointTag = orderCheckpointTag; - } - - private EmittedStream CreateOrderStream(CheckpointTag from) { - //TODO: this stream requires $startFrom to be updated from time to time to reduce space taken - return new EmittedStream( - /* MUST NEVER SEND READY MESSAGE */ - _namingBuilder.GetOrderStreamName(), - new EmittedStream.WriterConfiguration( - new EmittedStreamsWriter(_ioDispatcher), new EmittedStream.WriterConfiguration.StreamMetadata(), - SystemAccounts.System, 100, _logger), - _projectionVersion, _positionTagger, @from, _publisher, _ioDispatcher, this, noCheckpoints: true); - } - - public override void GetStatistics(ProjectionStatistics info) { - base.GetStatistics(info); - if (_orderStream != null) { - info.WritePendingEventsAfterCheckpoint += _orderStream.GetWritePendingEvents(); - info.ReadsInProgress += _orderStream.GetReadsInProgress(); - info.WritesInProgress += _orderStream.GetWritesInProgress(); - } - } - - - public override void BeginLoadPrerecordedEvents(CheckpointTag checkpointTag) { - BeginLoadPrerecordedEventsChunk(checkpointTag, -1); - } - - private void BeginLoadPrerecordedEventsChunk(CheckpointTag checkpointTag, long fromEventNumber) { - _loadingPrerecordedEventsFrom = checkpointTag; - _ioDispatcher.ReadBackward( - _namingBuilder.GetOrderStreamName(), fromEventNumber, 100, false, SystemAccounts.System, - completed => { - switch (completed.Result) { - case ReadStreamResult.NoStream: - _lastOrderCheckpointTag = _positionTagger.MakeZeroCheckpointTag(); - PrerecordedEventsLoaded(checkpointTag); - break; - case ReadStreamResult.Success: - var epochEnded = false; - foreach (var @event in completed.Events) { - var parsed = @event.Event.Metadata.ParseCheckpointTagVersionExtraJson( - _projectionVersion); - //TODO: throw exception if different projectionID? - if (_projectionVersion.ProjectionId != parsed.Version.ProjectionId - || _projectionVersion.Epoch > parsed.Version.Version) { - epochEnded = true; - break; - } - - var tag = parsed.AdjustBy(_positionTagger, _projectionVersion); - //NOTE: even if this tag <= checkpointTag we set last tag - // this is to know the exact last tag to request when writing - if (_lastOrderCheckpointTag == null) - _lastOrderCheckpointTag = tag; - - if (tag <= checkpointTag) { - SetOrderStreamReadCompleted(); - return; - } - - EnqueuePrerecordedEvent(@event.Event, tag); - } - - if (epochEnded || completed.IsEndOfStream) - SetOrderStreamReadCompleted(); - else - BeginLoadPrerecordedEventsChunk(checkpointTag, completed.NextEventNumber); - break; - default: - throw new Exception("Cannot read order stream"); - } - }, () => { - _logger.Warning("Read backward of stream {stream} timed out. Retrying", - _namingBuilder.GetOrderStreamName()); - BeginLoadPrerecordedEventsChunk(checkpointTag, fromEventNumber); - }, Guid.NewGuid()); - } - - private void EnqueuePrerecordedEvent(EventRecord @event, CheckpointTag tag) { - if (@event == null) throw new ArgumentNullException("event"); - if (tag == null) throw new ArgumentNullException("tag"); - if (@event.EventType != "$>") - throw new ArgumentException("linkto ($>) event expected", "event"); - - _loadingItemsCount++; - - var item = new Item(tag); - _loadQueue.Push(item); - //NOTE: we do manual link-to resolution as we write links to the position events - // which may in turn be a link. This is necessary to provide a correct - // ResolvedEvent when replaying from the -order stream - var linkTo = Helper.UTF8NoBom.GetString(@event.Data.Span); - string[] parts = linkTo.Split(_linkToSeparator, 2); - long eventNumber = long.Parse(parts[0]); - string streamId = parts[1]; - - ReadPrerecordedEventStream(streamId, eventNumber, completed => { - switch (completed.Result) { - case ReadStreamResult.Success: - case ReadStreamResult.NoStream: - case ReadStreamResult.StreamDeleted: - if (completed.Events.Length == 1) - item.SetLoadedEvent(completed.Events[0]); - _loadingItemsCount--; - CheckAllEventsLoaded(); - break; - default: - throw new Exception(string.Format("Cannot read {0}. Error: {1}", linkTo, completed.Error)); - } - }); - } - - private void ReadPrerecordedEventStream(string streamId, long eventNumber, - Action action) { - _ioDispatcher.ReadBackward( - streamId, eventNumber, 1, true, SystemAccounts.System, action, () => { - _logger.Warning("Read backward of stream {stream} timed out. Retrying", streamId); - ReadPrerecordedEventStream(streamId, eventNumber, action); - }, Guid.NewGuid()); - } - - private void CheckAllEventsLoaded() { - CheckpointTag lastTag = null; - if (_orderStreamReadingCompleted && _loadingItemsCount == 0) { - var number = 0; - while (_loadQueue.Count > 0) { - var item = _loadQueue.Pop(); - var @event = item._result; - lastTag = item.Tag; - if (@event.HasValue) { - SendPrerecordedEvent(@event.Value, lastTag, number); - number++; - } - } - - _loadingItemsCount = -1; // completed - do not dispatch one more time - PrerecordedEventsLoaded(lastTag ?? _loadingPrerecordedEventsFrom); - } - } - - private void SetOrderStreamReadCompleted() { - _orderStreamReadingCompleted = true; - CheckAllEventsLoaded(); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamAwaiting message) { - if (_stopped) - return; - throw new NotImplementedException(); - } - - public void Handle(CoreProjectionProcessingMessage.EmittedStreamWriteCompleted message) { - if (_stopped) - return; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamPositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamPositionTagger.cs deleted file mode 100644 index d6fd9b000..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/MultiStream/MultiStreamPositionTagger.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.MultiStream { - public class MultiStreamPositionTagger : PositionTagger { - private readonly HashSet _streams; - - public MultiStreamPositionTagger(int phase, string[] streams) : base(phase) { - if (streams == null) throw new ArgumentNullException("streams"); - if (streams.Length == 0) throw new ArgumentException("streams"); - _streams = new HashSet(streams); - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase < Phase) - return true; - if (previous.Mode_ != CheckpointTag.Mode.MultiStream) - throw new ArgumentException("Mode.MultiStream expected", "previous"); - return _streams.Contains(committedEvent.Data.PositionStreamId) - && committedEvent.Data.PositionSequenceNumber > - previous.Streams[committedEvent.Data.PositionStreamId]; - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (!_streams.Contains(committedEvent.Data.PositionStreamId)) - throw new InvalidOperationException( - string.Format("Invalid stream '{0}'", committedEvent.Data.EventStreamId)); - return previous.UpdateStreamPosition( - committedEvent.Data.PositionStreamId, committedEvent.Data.PositionSequenceNumber); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromStreamPositions(Phase, - _streams.ToDictionary(v => v, v => (long)ExpectedVersion.NoStream)); - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - //TODO: should Stream be supported here as well if in the set? - return checkpointTag.Mode_ == CheckpointTag.Mode.MultiStream - && checkpointTag.Streams.All(v => _streams.Contains(v.Key)); - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, - tag.Phase), "tag"); - - if (tag.Mode_ == CheckpointTag.Mode.MultiStream) { - long p; - return CheckpointTag.FromStreamPositions( - tag.Phase, _streams.ToDictionary(v => v, v => tag.Streams.TryGetValue(v, out p) ? p : -1)); - } - - switch (tag.Mode_) { - case CheckpointTag.Mode.EventTypeIndex: - throw new NotSupportedException( - "Conversion from EventTypeIndex to MultiStream position tag is not supported"); - case CheckpointTag.Mode.Stream: - long p; - return CheckpointTag.FromStreamPositions( - tag.Phase, _streams.ToDictionary(v => v, v => tag.Streams.TryGetValue(v, out p) ? p : -1)); - case CheckpointTag.Mode.PreparePosition: - throw new NotSupportedException( - "Conversion from PreparePosition to MultiStream position tag is not supported"); - case CheckpointTag.Mode.Position: - throw new NotSupportedException( - "Conversion from Position to MultiStream position tag is not supported"); - default: - throw new NotSupportedException(string.Format( - "The given checkpoint is invalid. Possible causes might include having written an event to the projection's managed stream. The bad checkpoint: {0}", - tag.ToString())); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByHandleStatePartitionSelector.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByHandleStatePartitionSelector.cs deleted file mode 100644 index f94e1be52..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByHandleStatePartitionSelector.cs +++ /dev/null @@ -1,19 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class ByHandleStatePartitionSelector : StatePartitionSelector { - private readonly IProjectionStateHandler _handler; - - public ByHandleStatePartitionSelector(IProjectionStateHandler handler) { - _handler = handler; - } - - public override string GetStatePartition(EventReaderSubscriptionMessage.CommittedEventReceived @event) { - return _handler.GetStatePartition(@event.CheckpointTag, @event.EventCategory, @event.Data); - } - - public override bool EventReaderBasePartitionDeletedIsSupported() { - return false; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByStreamStatePartitionSelector.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByStreamStatePartitionSelector.cs deleted file mode 100644 index 60d4c7a75..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/ByStreamStatePartitionSelector.cs +++ /dev/null @@ -1,29 +0,0 @@ -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class ByStreamStatePartitionSelector : StatePartitionSelector { - public override string GetStatePartition(EventReaderSubscriptionMessage.CommittedEventReceived @event) { - if (@event.Data.ResolvedLinkTo && @event.Data.PositionMetadata != null) { - var extra = @event.Data.PositionMetadata.ParseCheckpointExtraJson(); - JToken v; - if (extra != null && extra.TryGetValue("$o", out v)) { - //TODO: handle exceptions properly - var originalStream = (string)((JValue)v).Value; - return originalStream; - } - } - - var eventStreamId = @event.Data.EventStreamId; - return SystemStreams.IsMetastream(eventStreamId) - ? eventStreamId.Substring("$$".Length) - : eventStreamId; - } - - public override bool EventReaderBasePartitionDeletedIsSupported() { - return true; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/NoopStatePartitionSelector.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/NoopStatePartitionSelector.cs deleted file mode 100644 index 4c30addae..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/NoopStatePartitionSelector.cs +++ /dev/null @@ -1,13 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class NoopStatePartitionSelector : StatePartitionSelector { - public override string GetStatePartition(EventReaderSubscriptionMessage.CommittedEventReceived @event) { - return ""; - } - - public override bool EventReaderBasePartitionDeletedIsSupported() { - return false; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionState.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionState.cs deleted file mode 100644 index eff6c4d86..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionState.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class PartitionState { - private static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings { - DateParseHandling = DateParseHandling.None, - }; - - public bool IsChanged(PartitionState newState) { - return State != newState.State || Result != newState.Result; - } - - public static PartitionState Deserialize(string serializedState, CheckpointTag causedBy) { - if (serializedState == null) - return new PartitionState("", null, causedBy); - - JToken state = null; - JToken result = null; - - if (!string.IsNullOrEmpty(serializedState)) { - var deserialized = JsonConvert.DeserializeObject(serializedState, JsonSettings); - var array = deserialized as JArray; - if (array != null && array.Count > 0) { - state = array[0] as JToken; - if (array.Count == 2) { - result = array[1] as JToken; - } - } else { - state = deserialized as JObject; - } - } - - var stateJson = state != null ? state.ToCanonicalJson() : ""; - var resultJson = result != null ? result.ToCanonicalJson() : null; - - return new PartitionState(stateJson, resultJson, causedBy); - } - - private static void Error(JsonTextReader reader, string message) { - throw new Exception(string.Format("{0} (At: {1}, {2})", message, reader.LineNumber, reader.LinePosition)); - } - - private readonly string _state; - private readonly string _result; - private readonly CheckpointTag _causedBy; - private int _size; - - public PartitionState(string state, string result, CheckpointTag causedBy) { - if (state == null) throw new ArgumentNullException("state"); - if (causedBy == null) throw new ArgumentNullException("causedBy"); - - _state = state; - _result = result; - _causedBy = causedBy; - _size = _state.Length + _result?.Length ?? 0; - } - - public string State { - get { return _state; } - } - - public CheckpointTag CausedBy { - get { return _causedBy; } - } - - public string Result { - get { return _result; } - } - - public int Size { - get { return _size; } - } - - public string Serialize() { - var state = _state; - if (state == "" && Result != null) - throw new Exception("state == \"\" && Result != null"); - return Result != null - ? "[" + state + "," + _result + "]" - : "[" + state + "]"; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateCache.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateCache.cs deleted file mode 100644 index f2e7fe856..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateCache.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class PartitionStateCache { - private readonly int _maxCachedPartitions; - - private readonly LinkedList> _cacheOrder = - new LinkedList>(); - - private readonly Dictionary> _partitionStates = - new Dictionary>(); - - private int _cachedItemCount; - - private CheckpointTag _unlockedBefore; - private readonly CheckpointTag _zeroPosition; - - public PartitionStateCache(int maxCachedPartitions = 4000) { - _zeroPosition = CheckpointTag.Empty; - _unlockedBefore = CheckpointTag.Empty; - _maxCachedPartitions = maxCachedPartitions; - } - - public int CachedItemCount { - get { return _cachedItemCount; } - } - - public void Initialize() { - _partitionStates.Clear(); - _cachedItemCount = 0; - - _cacheOrder.Clear(); - _unlockedBefore = _zeroPosition; - } - - public void CacheAndLockPartitionState(string partition, PartitionState data, CheckpointTag at) { - if (partition == null) throw new ArgumentNullException("partition"); - if (data == null) throw new ArgumentNullException("data"); - EnsureCanLockPartitionAt(partition, at); - - _partitionStates[partition] = Tuple.Create(data, at); - _cachedItemCount = _partitionStates.Count; - - if (!string.IsNullOrEmpty(partition)) // cached forever - for root state - _cacheOrder.AddLast(Tuple.Create(at, partition)); - CleanUp(); - } - - public void CachePartitionState(string partition, PartitionState data) { - if (partition == null) throw new ArgumentNullException("partition"); - if (data == null) throw new ArgumentNullException("data"); - - _partitionStates[partition] = Tuple.Create(data, _zeroPosition); - _cachedItemCount = _partitionStates.Count; - - _cacheOrder.AddFirst(Tuple.Create(_zeroPosition, partition)); - CleanUp(); - } - - public PartitionState TryGetAndLockPartitionState(string partition, CheckpointTag lockAt) { - if (partition == null) throw new ArgumentNullException("partition"); - Tuple stateData; - if (!_partitionStates.TryGetValue(partition, out stateData)) - return null; - EnsureCanLockPartitionAt(partition, lockAt); - if (lockAt != null && lockAt <= stateData.Item2) - throw new InvalidOperationException( - string.Format( - "Attempt to relock the '{0}' partition state locked at the '{1}' position at the earlier position '{2}'", - partition, stateData.Item2, lockAt)); - - _partitionStates[partition] = Tuple.Create(stateData.Item1, lockAt); - _cachedItemCount = _partitionStates.Count; - - if (!string.IsNullOrEmpty(partition)) // cached forever - for root state - _cacheOrder.AddLast(Tuple.Create(lockAt, partition)); - CleanUp(); - return stateData.Item1; - } - - public PartitionState TryGetPartitionState(string partition) { - if (partition == null) throw new ArgumentNullException("partition"); - Tuple stateData; - if (!_partitionStates.TryGetValue(partition, out stateData)) - return null; - return stateData.Item1; - } - - public PartitionState GetLockedPartitionState(string partition) { - Tuple stateData; - if (!_partitionStates.TryGetValue(partition, out stateData)) { - throw new InvalidOperationException( - string.Format( - "Partition '{0}' state was requested as locked but it is missing in the cache.", partition)); - } - - if (stateData.Item2 != null && stateData.Item2 <= _unlockedBefore) - throw new InvalidOperationException( - string.Format( - "Partition '{0}' state was requested as locked but it is cached as unlocked", partition)); - return stateData.Item1; - } - - public void Unlock(CheckpointTag beforeCheckpoint, bool forgetUnlocked = false) { - _unlockedBefore = beforeCheckpoint; - CleanUp(removeAllUnlocked: forgetUnlocked); - } - - private void CleanUp(bool removeAllUnlocked = false) { - while (removeAllUnlocked || _cacheOrder.Count > _maxCachedPartitions * 5 - || CachedItemCount > _maxCachedPartitions) { - if (_cacheOrder.Count == 0) - break; - Tuple top = _cacheOrder.FirstOrDefault(); - if (top.Item1 >= _unlockedBefore) - break; // other entries were locked after the checkpoint (or almost .. order is not very strong) - _cacheOrder.RemoveFirst(); - Tuple entry; - if (!_partitionStates.TryGetValue(top.Item2, out entry)) - continue; // already removed - if (entry.Item2 >= _unlockedBefore) - continue; // was relocked - - _partitionStates.Remove(top.Item2); - _cachedItemCount = _partitionStates.Count; - } - } - - private void EnsureCanLockPartitionAt(string partition, CheckpointTag at) { - if (partition == null) throw new ArgumentNullException("partition"); - if (at == null && partition != "") - throw new InvalidOperationException("Only the root partition can be locked forever"); - if (partition == "" && at != null) - throw new InvalidOperationException("Root partition must be locked forever"); - if (at != null && at <= _unlockedBefore) - throw new InvalidOperationException( - string.Format( - "Attempt to lock the '{0}' partition state at the position '{1}' before the unlocked position '{2}'", - partition, at, _unlockedBefore)); - } - - public IEnumerable> Enumerate() { - return _partitionStates.Select(v => Tuple.Create(v.Key, v.Value.Item1)).ToList(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateUpdateManager.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateUpdateManager.cs deleted file mode 100644 index 5a38b71e9..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/PartitionStateUpdateManager.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public class PartitionStateUpdateManager { - private class State { - public PartitionState PartitionState; - public CheckpointTag ExpectedTag; - } - - private readonly Dictionary _states = new Dictionary(); - private readonly ProjectionNamesBuilder _namingBuilder; - - private readonly EmittedStream.WriterConfiguration.StreamMetadata _partitionCheckpointStreamMetadata = - new EmittedStream.WriterConfiguration.StreamMetadata(maxCount: 2); - - public PartitionStateUpdateManager(ProjectionNamesBuilder namingBuilder) { - if (namingBuilder == null) throw new ArgumentNullException("namingBuilder"); - _namingBuilder = namingBuilder; - } - - public void StateUpdated(string partition, PartitionState state, CheckpointTag basedOn) { - State stateEntry; - if (_states.TryGetValue(partition, out stateEntry)) { - stateEntry.PartitionState = state; - } else { - _states.Add(partition, new State {PartitionState = state, ExpectedTag = basedOn}); - } - } - - public void EmitEvents(IEventWriter eventWriter) { - if (_states.Count > 0) { - var list = new List(); - foreach (var entry in _states) { - var partition = entry.Key; - var streamId = _namingBuilder.MakePartitionCheckpointStreamName(partition); - var data = entry.Value.PartitionState.Serialize(); - var causedBy = entry.Value.PartitionState.CausedBy; - var expectedTag = entry.Value.ExpectedTag; - list.Add( - new EmittedEventEnvelope( - new EmittedDataEvent( - streamId, Guid.NewGuid(), ProjectionEventTypes.PartitionCheckpoint, true, - data, null, causedBy, expectedTag), _partitionCheckpointStreamMetadata)); - } - - //NOTE: order yb is required to satisfy internal emit events validation - // which ensures that events are ordered by causedBy tag. - // it is too strong check, but ... - eventWriter.ValidateOrderAndEmitEvents(list.OrderBy(v => v.Event.CausedByTag).ToArray()); - } - } - - public void PartitionCompleted(string partition) { - _states.Remove(partition); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Partitioning/StatePartitionSelector.cs b/src/EventStore.Projections.Core/Services/Processing/Partitioning/StatePartitionSelector.cs deleted file mode 100644 index 34d445b5b..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Partitioning/StatePartitionSelector.cs +++ /dev/null @@ -1,8 +0,0 @@ -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Partitioning { - public abstract class StatePartitionSelector { - public abstract string GetStatePartition(EventReaderSubscriptionMessage.CommittedEventReceived @event); - public abstract bool EventReaderBasePartitionDeletedIsSupported(); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/EventProcessingProjectionProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/EventProcessingProjectionProcessingPhase.cs deleted file mode 100644 index b34625677..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/EventProcessingProjectionProcessingPhase.cs +++ /dev/null @@ -1,386 +0,0 @@ -using System; -using System.Diagnostics; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.WorkItems; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public class EventProcessingProjectionProcessingPhase : EventSubscriptionBasedProjectionProcessingPhase, - IHandle, - IHandle, - IHandle, - IEventProcessingProjectionPhase { - private readonly IProjectionStateHandler _projectionStateHandler; - private readonly bool _definesStateTransform; - private readonly StatePartitionSelector _statePartitionSelector; - private readonly bool _isBiState; - - private string _handlerPartition; - - //private bool _sharedStateSet; - private readonly Stopwatch _stopwatch; - - - public EventProcessingProjectionProcessingPhase( - CoreProjection coreProjection, - Guid projectionCorrelationId, - IPublisher publisher, - IPublisher inputQueue, - ProjectionConfig projectionConfig, - Action updateStatistics, - IProjectionStateHandler projectionStateHandler, - PartitionStateCache partitionStateCache, - bool definesStateTransform, - string projectionName, - ILogger logger, - CheckpointTag zeroCheckpointTag, - ICoreProjectionCheckpointManager coreProjectionCheckpointManager, - StatePartitionSelector statePartitionSelector, - ReaderSubscriptionDispatcher subscriptionDispatcher, - IReaderStrategy readerStrategy, - IResultWriter resultWriter, - bool useCheckpoints, - bool stopOnEof, - bool isBiState, - bool orderedPartitionProcessing, - IEmittedStreamsTracker emittedStreamsTracker, - bool enableContentTypeValidation) - : base( - publisher, - inputQueue, - coreProjection, - projectionCorrelationId, - coreProjectionCheckpointManager, - projectionConfig, - projectionName, - logger, - zeroCheckpointTag, - partitionStateCache, - resultWriter, - updateStatistics, - subscriptionDispatcher, - readerStrategy, - useCheckpoints, - stopOnEof, - orderedPartitionProcessing, - isBiState, - emittedStreamsTracker, - enableContentTypeValidation) { - _projectionStateHandler = projectionStateHandler; - _definesStateTransform = definesStateTransform; - _statePartitionSelector = statePartitionSelector; - _isBiState = isBiState; - - _stopwatch = new Stopwatch(); - } - - public void Handle(EventReaderSubscriptionMessage.CommittedEventReceived message) { - //TODO: make sure this is no longer required : if (_state != State.StateLoaded) - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - CheckpointTag eventTag = message.CheckpointTag; - var committedEventWorkItem = new CommittedEventWorkItem(this, message, _statePartitionSelector); - _processingQueue.EnqueueTask(committedEventWorkItem, eventTag); - if (_state == PhaseState.Running) // prevent processing mostly one projection - EnsureTickPending(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.PartitionDeleted message) { - //TODO: make sure this is no longer required : if (_state != State.StateLoaded) - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - if (_statePartitionSelector.EventReaderBasePartitionDeletedIsSupported()) { - var partitionDeletedWorkItem = new PartitionDeletedWorkItem(this, message); - _processingQueue.EnqueueOutOfOrderTask(partitionDeletedWorkItem); - if (_state == PhaseState.Running) // prevent processing mostly one projection - EnsureTickPending(); - } - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.PartitionEofReached message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - var partitionCompletedWorkItem = new PartitionCompletedWorkItem( - this, _checkpointManager, message.Partition, message.CheckpointTag); - _processingQueue.EnqueueTask( - partitionCompletedWorkItem, message.CheckpointTag, allowCurrentPosition: true); - ProcessEvent(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public EventProcessedResult ProcessCommittedEvent( - EventReaderSubscriptionMessage.CommittedEventReceived message, string partition) { - switch (_state) { - case PhaseState.Running: - var result = InternalProcessCommittedEvent(partition, message); - return result; - case PhaseState.Stopped: - _logger.Error("Ignoring committed event in stopped state"); - return null; - default: - throw new NotSupportedException(); - } - } - - public EventProcessedResult ProcessPartitionDeleted(string partition, CheckpointTag deletedPosition) { - switch (_state) { - case PhaseState.Running: - var result = InternalProcessPartitionDeleted(partition, deletedPosition); - return result; - case PhaseState.Stopped: - _logger.Error("Ignoring committed event in stopped state"); - return null; - default: - throw new NotSupportedException(); - } - } - - private EventProcessedResult InternalProcessCommittedEvent( - string partition, EventReaderSubscriptionMessage.CommittedEventReceived message) { - string newState; - string projectionResult; - EmittedEventEnvelope[] emittedEvents; - //TODO: support shared state - string newSharedState; - var hasBeenProcessed = SafeProcessEventByHandler( - partition, message, out newState, out newSharedState, out projectionResult, out emittedEvents); - if (hasBeenProcessed) { - var newPartitionState = new PartitionState(newState, projectionResult, message.CheckpointTag); - var newSharedPartitionState = newSharedState != null - ? new PartitionState(newSharedState, null, message.CheckpointTag) - : null; - - return InternalCommittedEventProcessed( - partition, message, emittedEvents, newPartitionState, newSharedPartitionState); - } - - return null; - } - - private EventProcessedResult InternalProcessPartitionDeleted( - string partition, CheckpointTag deletedPosition) { - string newState; - string projectionResult; - var hasBeenProcessed = SafeProcessPartitionDeletedByHandler( - partition, deletedPosition, out newState, out projectionResult); - if (hasBeenProcessed) { - var newPartitionState = new PartitionState(newState, projectionResult, deletedPosition); - - return InternalPartitionDeletedProcessed(partition, deletedPosition, newPartitionState); - } - - return null; - } - - private bool SafeProcessEventByHandler( - string partition, EventReaderSubscriptionMessage.CommittedEventReceived message, out string newState, - out string newSharedState, out string projectionResult, out EmittedEventEnvelope[] emittedEvents) { - projectionResult = null; - //TODO: not emitting (optimized) projection handlers can skip serializing state on each processed event - bool hasBeenProcessed; - try { - hasBeenProcessed = ProcessEventByHandler( - partition, message, out newState, out newSharedState, out projectionResult, out emittedEvents); - } catch (Exception ex) { - // update progress to reflect exact fault position - _checkpointManager.Progress(message.Progress); - SetFaulting( - String.Format( - "The {0} projection failed to process an event.\r\nHandler: {1}\r\nEvent Position: {2}\r\n\r\nMessage:\r\n\r\n{3}", - _projectionName, GetHandlerTypeName(), message.CheckpointTag, ex.Message), ex); - newState = null; - newSharedState = null; - emittedEvents = null; - hasBeenProcessed = false; - } - - newState = newState ?? ""; - return hasBeenProcessed; - } - - private bool SafeProcessPartitionDeletedByHandler( - string partition, CheckpointTag deletedPosition, out string newState, - out string projectionResult) { - projectionResult = null; - //TODO: not emitting (optimized) projection handlers can skip serializing state on each processed event - bool hasBeenProcessed; - try { - hasBeenProcessed = ProcessPartitionDeletedByHandler( - partition, deletedPosition, out newState, out projectionResult); - } catch (Exception ex) { - SetFaulting( - String.Format( - "The {0} projection failed to process a delete partition notification.\r\nHandler: {1}\r\nEvent Position: {2}\r\n\r\nMessage:\r\n\r\n{3}", - _projectionName, GetHandlerTypeName(), deletedPosition, ex.Message), ex); - newState = null; - hasBeenProcessed = false; - } - - newState = newState ?? ""; - return hasBeenProcessed; - } - - private string GetHandlerTypeName() { - return _projectionStateHandler.GetType().Namespace + "." + _projectionStateHandler.GetType().Name; - } - - private bool ProcessEventByHandler( - string partition, EventReaderSubscriptionMessage.CommittedEventReceived message, out string newState, - out string newSharedState, out string projectionResult, out EmittedEventEnvelope[] emittedEvents) { - projectionResult = null; - var newPatitionInitialized = InitOrLoadHandlerState(partition); - _stopwatch.Start(); - EmittedEventEnvelope[] eventsEmittedOnInitialization = null; - if (newPatitionInitialized) { - _projectionStateHandler.ProcessPartitionCreated( - partition, message.CheckpointTag, message.Data, out eventsEmittedOnInitialization); - } - - var result = _projectionStateHandler.ProcessEvent( - partition, message.CheckpointTag, message.EventCategory, message.Data, out newState, out newSharedState, - out emittedEvents); - if (result) { - var oldState = _partitionStateCache.GetLockedPartitionState(partition); - //TODO: depending on query processing final state to result transformation should happen either here (if EOF) on while writing results - if ( /*_producesRunningResults && */oldState.State != newState) { - if (_definesStateTransform) { - projectionResult = _projectionStateHandler.TransformStateToResult(); - } else { - projectionResult = newState; - } - } else { - projectionResult = oldState.Result; - } - } - - _stopwatch.Stop(); - if (eventsEmittedOnInitialization != null) { - if (emittedEvents == null || emittedEvents.Length == 0) - emittedEvents = eventsEmittedOnInitialization; - else - emittedEvents = eventsEmittedOnInitialization.Concat(emittedEvents).ToArray(); - } - - return result; - } - - private bool ProcessPartitionDeletedByHandler( - string partition, CheckpointTag deletePosition, out string newState, - out string projectionResult) { - projectionResult = null; - InitOrLoadHandlerState(partition); - _stopwatch.Start(); - var result = _projectionStateHandler.ProcessPartitionDeleted( - partition, deletePosition, out newState); - if (result) { - var oldState = _partitionStateCache.GetLockedPartitionState(partition); - //TODO: depending on query processing final state to result transformation should happen either here (if EOF) on while writing results - if ( /*_producesRunningResults && */oldState.State != newState) { - if (_definesStateTransform) { - projectionResult = _projectionStateHandler.TransformStateToResult(); - } else { - projectionResult = newState; - } - } else { - projectionResult = oldState.Result; - } - } - - _stopwatch.Stop(); - return result; - } - - /// - /// initializes or loads existing partition state - /// - /// - /// true - if new partition state was initialized - private bool InitOrLoadHandlerState(string partition) { - if (_handlerPartition == partition) - return false; - - var newState = _partitionStateCache.GetLockedPartitionState(partition); - _handlerPartition = partition; - var initialized = false; - if (newState != null && !String.IsNullOrEmpty(newState.State)) - _projectionStateHandler.Load(newState.State); - else { - initialized = true; - _projectionStateHandler.Initialize(); - } - - //if (!_sharedStateSet && _isBiState) - if (_isBiState) { - var newSharedState = _partitionStateCache.GetLockedPartitionState(""); - if (newSharedState != null && !String.IsNullOrEmpty(newSharedState.State)) - _projectionStateHandler.LoadShared(newSharedState.State); - else - _projectionStateHandler.InitializeShared(); - } - - return initialized; - } - - public override void NewCheckpointStarted(CheckpointTag at) { - if (!(_state == PhaseState.Running || _state == PhaseState.Starting)) { - _logger.Debug("Starting a checkpoint in non-runnable state"); - return; - } - - var checkpointHandler = _projectionStateHandler as IProjectionCheckpointHandler; - if (checkpointHandler != null) { - EmittedEventEnvelope[] emittedEvents; - try { - checkpointHandler.ProcessNewCheckpoint(at, out emittedEvents); - } catch (Exception ex) { - var faultedReason = - String.Format( - "The {0} projection failed to process a checkpoint start.\r\nHandler: {1}\r\nEvent Position: {2}\r\n\r\nMessage:\r\n\r\n{3}", - _projectionName, GetHandlerTypeName(), at, ex.Message); - SetFaulting(faultedReason, ex); - emittedEvents = null; - } - - if (emittedEvents != null && emittedEvents.Length > 0) { - if (!ValidateEmittedEvents(emittedEvents)) - return; - - if (_state == PhaseState.Running || _state == PhaseState.Starting) - _resultWriter.EventsEmitted( - emittedEvents, Guid.Empty, correlationId: null); - } - } - } - - public override void GetStatistics(ProjectionStatistics info) { - base.GetStatistics(info); - info.CoreProcessingTime = _stopwatch.ElapsedMilliseconds; - } - - public override void Dispose() { - if (_projectionStateHandler != null) - _projectionStateHandler.Dispose(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.ProgressResultWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.ProgressResultWriter.cs deleted file mode 100644 index bfe6a04a2..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.ProgressResultWriter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Strategies; - -namespace EventStore.Projections.Core.Services.Processing.Phases; - -public abstract partial class EventSubscriptionBasedProjectionProcessingPhase -{ - internal class ProgressResultWriter : IProgressResultWriter { - private readonly EventSubscriptionBasedProjectionProcessingPhase _phase; - private readonly IResultWriter _resultWriter; - - public ProgressResultWriter(EventSubscriptionBasedProjectionProcessingPhase phase, - IResultWriter resultWriter) { - _phase = phase; - _resultWriter = resultWriter; - } - - public void WriteProgress(float progress) { - _resultWriter.WriteProgress(_phase._currentSubscriptionId, progress); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.cs deleted file mode 100644 index 3f4108e74..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/EventSubscriptionBasedProjectionProcessingPhase.cs +++ /dev/null @@ -1,580 +0,0 @@ -using System; -using System.Diagnostics.Contracts; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Strategies; -using EventStore.Projections.Core.Services.Processing.Subscriptions; -using EventStore.Projections.Core.Services.Processing.WorkItems; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public abstract partial class EventSubscriptionBasedProjectionProcessingPhase : IProjectionPhaseCompleter, - IProjectionPhaseCheckpointManager, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IProjectionProcessingPhase, - IProjectionPhaseStateManager { - protected readonly IPublisher _publisher; - private readonly IPublisher _inputQueue; - protected readonly ICoreProjectionForProcessingPhase _coreProjection; - protected readonly Guid _projectionCorrelationId; - protected readonly ICoreProjectionCheckpointManager _checkpointManager; - protected readonly IProgressResultWriter _progressResultWriter; - protected readonly ProjectionConfig _projectionConfig; - protected readonly string _projectionName; - protected readonly Serilog.ILogger _logger; - protected readonly CheckpointTag _zeroCheckpointTag; - protected readonly CoreProjectionQueue _processingQueue; - protected readonly PartitionStateCache _partitionStateCache; - protected readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - protected readonly IReaderStrategy _readerStrategy; - protected readonly IResultWriter _resultWriter; - protected readonly bool _useCheckpoints; - protected long _expectedSubscriptionMessageSequenceNumber = -1; - protected Guid _currentSubscriptionId; - protected PhaseSubscriptionState _subscriptionState; - protected PhaseState _state; - protected readonly bool _stopOnEof; - private readonly bool _isBiState; - protected readonly IEmittedStreamsTracker _emittedStreamsTracker; - protected readonly bool _enableContentTypeValidation; - - private readonly Action _updateStatistics; - - protected EventSubscriptionBasedProjectionProcessingPhase( - IPublisher publisher, - IPublisher inputQueue, - ICoreProjectionForProcessingPhase coreProjection, - Guid projectionCorrelationId, - ICoreProjectionCheckpointManager checkpointManager, - ProjectionConfig projectionConfig, - string projectionName, - ILogger logger, - CheckpointTag zeroCheckpointTag, - PartitionStateCache partitionStateCache, - IResultWriter resultWriter, - Action updateStatistics, - ReaderSubscriptionDispatcher subscriptionDispatcher, - IReaderStrategy readerStrategy, - bool useCheckpoints, - bool stopOnEof, - bool orderedPartitionProcessing, - bool isBiState, - IEmittedStreamsTracker emittedStreamsTracker, - bool enableContentTypeValidation) { - _publisher = publisher; - _inputQueue = inputQueue; - _coreProjection = coreProjection; - _projectionCorrelationId = projectionCorrelationId; - _checkpointManager = checkpointManager; - _projectionConfig = projectionConfig; - _projectionName = projectionName; - _logger = logger; - _zeroCheckpointTag = zeroCheckpointTag; - _partitionStateCache = partitionStateCache; - _resultWriter = resultWriter; - _updateStatistics = updateStatistics; - _processingQueue = new CoreProjectionQueue(publisher, - projectionConfig.PendingEventsThreshold, - orderedPartitionProcessing); - _processingQueue.EnsureTickPending += EnsureTickPending; - _subscriptionDispatcher = subscriptionDispatcher; - _readerStrategy = readerStrategy; - _useCheckpoints = useCheckpoints; - _stopOnEof = stopOnEof; - _isBiState = isBiState; - _progressResultWriter = new ProgressResultWriter(this, _resultWriter); - _inutQueueEnvelope = _inputQueue; - _emittedStreamsTracker = emittedStreamsTracker; - _enableContentTypeValidation = enableContentTypeValidation; - } - - public void UnlockAndForgetBefore(CheckpointTag checkpointTag) { - _partitionStateCache.Unlock(checkpointTag, forgetUnlocked: true); - } - - public CheckpointTag LastProcessedEventPosition { - get { return _coreProjection.LastProcessedEventPosition; } - } - - public ICoreProjectionCheckpointManager CheckpointManager { - get { return _checkpointManager; } - } - - public IEmittedStreamsTracker EmittedStreamsTracker { - get { return _emittedStreamsTracker; } - } - - protected bool IsOutOfOrderSubscriptionMessage(EventReaderSubscriptionMessageBase message) { - if (_currentSubscriptionId != message.SubscriptionId) - return true; - if (_expectedSubscriptionMessageSequenceNumber != message.SubscriptionMessageSequenceNumber) - throw new InvalidOperationException("Out of order message detected"); - return false; - } - - protected void RegisterSubscriptionMessage(EventReaderSubscriptionMessageBase message) { - _expectedSubscriptionMessageSequenceNumber = message.SubscriptionMessageSequenceNumber + 1; - } - - protected void EnsureTickPending() { - _coreProjection.EnsureTickPending(); - } - - public void ProcessEvent() { - _processingQueue.ProcessEvent(); - EnsureUpdateStatisticksTickPending(); - } - - private void EnsureUpdateStatisticksTickPending() { - if (_updateStatisticsTicketPending) - return; - _updateStatisticsTicketPending = true; - _publisher.Publish( - TimerMessage.Schedule.Create( - _updateInterval, - _inutQueueEnvelope, - new UnwrapEnvelopeMessage(MarkTicketReceivedAndUpdateStatistics))); - } - - private void MarkTicketReceivedAndUpdateStatistics() { - _updateStatisticsTicketPending = false; - UpdateStatistics(); - } - - private void UpdateStatistics() { - if (_updateStatistics != null) - _updateStatistics(); - } - - public void Handle(EventReaderSubscriptionMessage.ProgressChanged message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - var progressWorkItem = - new ProgressWorkItem(_checkpointManager, _progressResultWriter, message.Progress); - _processingQueue.EnqueueTask(progressWorkItem, message.CheckpointTag, allowCurrentPosition: true); - ProcessEvent(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.SubscriptionStarted message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - _subscriptionStartedAtLastCommitPosition = message.StartingLastCommitPosition; - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.NotAuthorized message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - var progressWorkItem = new NotAuthorizedWorkItem(); - _processingQueue.EnqueueTask(progressWorkItem, message.CheckpointTag, allowCurrentPosition: true); - ProcessEvent(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Unsubscribed() { - _subscriptionDispatcher.Cancel(_projectionCorrelationId); - _subscriptionState = PhaseSubscriptionState.Unsubscribed; - _processingQueue.Unsubscribed(); - } - - public void Handle(EventReaderSubscriptionMessage.EofReached message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - Unsubscribed(); - var completedWorkItem = new CompletedWorkItem(this); - _processingQueue.EnqueueTask(completedWorkItem, message.CheckpointTag, allowCurrentPosition: true); - ProcessEvent(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.CheckpointSuggested message) { - if (IsOutOfOrderSubscriptionMessage(message)) - return; - RegisterSubscriptionMessage(message); - try { - if (_useCheckpoints) { - CheckpointTag checkpointTag = message.CheckpointTag; - var checkpointSuggestedWorkItem = - new CheckpointSuggestedWorkItem(this, message, _checkpointManager); - _processingQueue.EnqueueTask(checkpointSuggestedWorkItem, checkpointTag, - allowCurrentPosition: true); - } - - ProcessEvent(); - } catch (Exception ex) { - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(CoreProjectionManagementMessage.GetState message) { - try { - var getStateWorkItem = new GetStateWorkItem( - _publisher, message.CorrelationId, message.ProjectionId, this, message.Partition); - _processingQueue.EnqueueOutOfOrderTask(getStateWorkItem); - ProcessEvent(); - } catch (Exception ex) { - _publisher.Publish( - new CoreProjectionStatusMessage.StateReport( - message.CorrelationId, _projectionCorrelationId, message.Partition, state: null, - position: null)); - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(CoreProjectionManagementMessage.GetResult message) { - try { - var getResultWorkItem = new GetResultWorkItem( - _publisher, message.CorrelationId, message.ProjectionId, this, message.Partition); - _processingQueue.EnqueueOutOfOrderTask(getResultWorkItem); - ProcessEvent(); - } catch (Exception ex) { - _publisher.Publish( - new CoreProjectionStatusMessage.ResultReport( - message.CorrelationId, _projectionCorrelationId, message.Partition, result: null, - position: null)); - _coreProjection.SetFaulted(ex); - } - } - - public void Handle(EventReaderSubscriptionMessage.SubscribeTimeout message) { - if (_subscriptionState is not PhaseSubscriptionState.Subscribing - || message.SubscriptionId != _currentSubscriptionId) return; - SubscriptionFailed("Reader subscription timed out"); - } - - public void Handle(EventReaderSubscriptionMessage.Failed message) => SubscriptionFailed(message.Reason); - - private void SubscriptionFailed(string reason) { - if (_subscriptionState is PhaseSubscriptionState.Subscribed or PhaseSubscriptionState.Subscribing) - _subscriptionDispatcher.Cancel(_currentSubscriptionId); - _subscriptionState = PhaseSubscriptionState.Failed; - _coreProjection.SetFaulted(reason); - } - - protected void UnsubscribeFromPreRecordedOrderEvents() { - // projectionCorrelationId is used as a subscription identifier for delivery - // of pre-recorded order events recovered by checkpoint manager - _subscriptionDispatcher.Cancel(_projectionCorrelationId); - _subscriptionState = PhaseSubscriptionState.Unsubscribed; - } - - public void Subscribed(Guid subscriptionId) { - _processingQueue.Subscribed(subscriptionId); - } - - public ReaderSubscriptionOptions GetSubscriptionOptions() { - return new ReaderSubscriptionOptions( - _projectionConfig.CheckpointUnhandledBytesThreshold, _projectionConfig.CheckpointHandledThreshold, - _projectionConfig.CheckpointAfterMs, - _stopOnEof, stopAfterNEvents: null, _enableContentTypeValidation); - } - - protected void SubscribeReaders(CheckpointTag checkpointTag) { - _expectedSubscriptionMessageSequenceNumber = 0; - _currentSubscriptionId = Guid.NewGuid(); - Subscribed(_currentSubscriptionId); - var readerStrategy = _readerStrategy; - if (readerStrategy != null) { - _subscriptionState = PhaseSubscriptionState.Subscribing; - _subscriptionDispatcher.PublishSubscribe( - new ReaderSubscriptionManagement.Subscribe( - _currentSubscriptionId, checkpointTag, readerStrategy, - GetSubscriptionOptions()), this, scheduleTimeout: true); - } else { - _coreProjection.Subscribed(); - } - } - - public void SubscribeToPreRecordedOrderEvents() { - var coreProjection = (CoreProjection)_coreProjection; - // projectionCorrelationId is used as a subscription identifier for delivery - // of pre-recorded order events recovered by checkpoint manager - _expectedSubscriptionMessageSequenceNumber = 0; - _currentSubscriptionId = coreProjection._projectionCorrelationId; - _subscriptionDispatcher.Subscribed(coreProjection._projectionCorrelationId, this); - // even if it is not a real subscription we need to unsubscribe - _subscriptionState = PhaseSubscriptionState.Subscribed; - } - - public virtual void Subscribe(CheckpointTag from, bool fromCheckpoint) { - Contract.Assert(_checkpointManager.LastProcessedEventPosition == @from); - if (fromCheckpoint) { - SubscribeToPreRecordedOrderEvents(); - _checkpointManager.BeginLoadPrerecordedEvents(@from); - } else - SubscribeReaders(@from); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - UnsubscribeFromPreRecordedOrderEvents(); - SubscribeReaders(message.CheckpointTag); - } - - public CheckpointTag AdjustTag(CheckpointTag tag) { - return _readerStrategy.PositionTagger.AdjustTag(tag); - } - - protected void SetFaulting(string faultedReason, Exception ex = null) { - if (_logger != null) { - if (ex != null) - _logger.Error(ex, faultedReason); - else - _logger.Error(faultedReason); - } - - _coreProjection.SetFaulting(faultedReason); - } - - protected bool ValidateEmittedEvents(EmittedEventEnvelope[] emittedEvents) { - if (!_projectionConfig.EmitEventEnabled) { - if (emittedEvents != null && emittedEvents.Length > 0) { - SetFaulting("'emit' is not allowed by the projection/configuration/mode"); - return false; - } - } - - return true; - } - - public abstract void NewCheckpointStarted(CheckpointTag at); - - public void InitializeFromCheckpoint(CheckpointTag checkpointTag) { - _subscriptionState = PhaseSubscriptionState.Unknown; - // this can be old checkpoint - var adjustedCheckpointTag = _readerStrategy.PositionTagger.AdjustTag(checkpointTag); - _processingQueue.InitializeQueue(adjustedCheckpointTag); - } - - public int GetBufferedEventCount() { - return _processingQueue.GetBufferedEventCount(); - } - - public string GetStatus() { - return _processingQueue.GetStatus(); - } - - protected EventProcessedResult InternalCommittedEventProcessed( - string partition, EventReaderSubscriptionMessage.CommittedEventReceived message, - EmittedEventEnvelope[] emittedEvents, PartitionState newPartitionState, - PartitionState newSharedPartitionState) { - if (_subscriptionState != PhaseSubscriptionState.Subscribed) - _logger?.Verbose("Got CommittedEventReceived in {state} SubscriptionState, but expected to be in {expectedState}", - _subscriptionState, PhaseSubscriptionState.Subscribed); - - if (!ValidateEmittedEvents(emittedEvents)) - return null; - - bool eventsWereEmitted = emittedEvents != null; - var oldState = _partitionStateCache.GetLockedPartitionState(partition); - var oldSharedState = _isBiState ? _partitionStateCache.GetLockedPartitionState("") : null; - bool changed = oldState.IsChanged(newPartitionState) - || (_isBiState && oldSharedState.IsChanged(newSharedPartitionState)); - - PartitionState partitionState = null; - // NOTE: projectionResult cannot change independently unless projection definition has changed - if (changed) { - var lockPartitionStateAt = partition != "" ? message.CheckpointTag : null; - partitionState = newPartitionState; - _partitionStateCache.CacheAndLockPartitionState(partition, partitionState, lockPartitionStateAt); - if (_isBiState) { - _partitionStateCache.CacheAndLockPartitionState("", newSharedPartitionState, null); - } - } - - if (changed || eventsWereEmitted) { - var correlationId = - message.Data.IsJson ? message.Data.Metadata.ParseCheckpointTagCorrelationId() : null; - return new EventProcessedResult( - partition, message.CheckpointTag, oldState, partitionState, oldSharedState, newSharedPartitionState, - emittedEvents, message.Data.EventId, correlationId); - } else return null; - } - - protected EventProcessedResult InternalPartitionDeletedProcessed( - string partition, CheckpointTag deletePosition, - PartitionState newPartitionState - ) { - var oldState = _partitionStateCache.GetLockedPartitionState(partition); - var oldSharedState = _isBiState ? _partitionStateCache.GetLockedPartitionState("") : null; - bool changed = oldState.IsChanged(newPartitionState); - - - PartitionState partitionState = null; - // NOTE: projectionResult cannot change independently unless projection definition has changed - if (changed) { - var lockPartitionStateAt = partition != "" ? deletePosition : null; - partitionState = newPartitionState; - _partitionStateCache.CacheAndLockPartitionState(partition, partitionState, lockPartitionStateAt); - } - - return new EventProcessedResult( - partition, deletePosition, oldState, partitionState, oldSharedState, null, null, Guid.Empty, null, - isPartitionTombstone: true); - } - - public void BeginGetPartitionStateAt( - string statePartition, CheckpointTag at, Action loadCompleted, bool lockLoaded) { - if (statePartition == "") // root is always cached - { - // root partition is always locked - var state = _partitionStateCache.TryGetAndLockPartitionState(statePartition, null); - loadCompleted(state); - } else { - var s = lockLoaded - ? _partitionStateCache.TryGetAndLockPartitionState(statePartition, at) - : _partitionStateCache.TryGetPartitionState(statePartition); - if (s != null) - loadCompleted(s); - else { - Action completed = state => { - if (lockLoaded) - _partitionStateCache.CacheAndLockPartitionState(statePartition, state, at); - else - _partitionStateCache.CachePartitionState(statePartition, state); - loadCompleted(state); - }; - if (_projectionConfig.CheckpointsEnabled) { - _checkpointManager.BeginLoadPartitionStateAt(statePartition, at, completed); - } else { - var state = new PartitionState("", null, _zeroCheckpointTag); - completed(state); - } - } - } - } - - public void FinalizeEventProcessing( - EventProcessedResult result, CheckpointTag eventCheckpointTag, float progress) { - if (_state == PhaseState.Running) { - //TODO: move to separate projection method and cache result in work item - if (result != null) { - _resultWriter.AccountPartition(result); - if (_projectionConfig.EmitEventEnabled && result.EmittedEvents != null) { - _resultWriter.EventsEmitted( - result.EmittedEvents, result.CausedBy, result.CorrelationId); - _emittedStreamsTracker.TrackEmittedStream(result.EmittedEvents.Select(x => x.Event).ToArray()); - } - - if (result.NewState != null) { - _resultWriter.WriteRunningResult(result); - _checkpointManager.StateUpdated(result.Partition, result.OldState, result.NewState); - } - - if (result.NewSharedState != null) { - _checkpointManager.StateUpdated("", result.OldSharedState, result.NewSharedState); - } - } - - _checkpointManager.EventProcessed(eventCheckpointTag, progress); - _progressResultWriter.WriteProgress(progress); - } - } - - public void EmitEofResult( - string partition, string resultBody, CheckpointTag causedBy, Guid causedByGuid, string correlationId) { - _resultWriter.WriteEofResult( - _currentSubscriptionId, partition, resultBody, causedBy, causedByGuid, correlationId); - } - - public void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action completed) { - switch (_state) { - case PhaseState.Running: - _checkpointManager.RecordEventOrder( - resolvedEvent, orderCheckpointTag, completed); - break; - case PhaseState.Stopped: - _logger.Error("Should not receive events in stopped state anymore"); - completed(); // allow collecting events for debugging - break; - } - } - - public void Complete() { - //NOTE: no need for EnsureUnsubscribed as EOF - Unsubscribed(); - _coreProjection.CompletePhase(); - } - - public void SetCurrentCheckpointSuggestedWorkItem(CheckpointSuggestedWorkItem checkpointSuggestedWorkItem) { - _coreProjection.SetCurrentCheckpointSuggestedWorkItem(checkpointSuggestedWorkItem); - } - - public virtual void GetStatistics(ProjectionStatistics info) { - info.Status = info.Status + GetStatus(); - info.BufferedEvents += GetBufferedEventCount(); - } - - public CheckpointTag MakeZeroCheckpointTag() { - return _zeroCheckpointTag; - } - - public void EnsureUnsubscribed() { - if (_subscriptionState is PhaseSubscriptionState.Subscribed) { - Unsubscribed(); - // this way we distinguish pre-recorded events subscription - if (_currentSubscriptionId != _projectionCorrelationId) - _publisher.Publish( - new ReaderSubscriptionManagement.Unsubscribe(_currentSubscriptionId)); - } - } - - protected long _subscriptionStartedAtLastCommitPosition; - private readonly IEnvelope _inutQueueEnvelope; - private readonly TimeSpan _updateInterval = TimeSpan.FromMilliseconds(250); - private bool _updateStatisticsTicketPending; - - public void Handle(EventReaderSubscriptionMessage.ReaderAssignedReader message) { - if (_state != PhaseState.Starting) - return; - if (_subscriptionState is not PhaseSubscriptionState.Subscribing - || message.SubscriptionId != _currentSubscriptionId) - return; - _subscriptionState = PhaseSubscriptionState.Subscribed; - _coreProjection.Subscribed(); - } - - public abstract void Dispose(); - - public void SetProjectionState(PhaseState state) { - var starting = _state == PhaseState.Starting && state == PhaseState.Running; - - _state = state; - _processingQueue.SetIsRunning(state == PhaseState.Running); - if (starting) - NewCheckpointStarted(LastProcessedEventPosition); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/ICoreProjectionForProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/ICoreProjectionForProcessingPhase.cs deleted file mode 100644 index 5f9e71e93..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/ICoreProjectionForProcessingPhase.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.WorkItems; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public interface ICoreProjectionForProcessingPhase { - void CompletePhase(); - void SetFaulted(string reason); - void SetFaulted(Exception ex); - void SetFaulting(string reason); - void SetCurrentCheckpointSuggestedWorkItem(CheckpointSuggestedWorkItem checkpointSuggestedWorkItem); - void EnsureTickPending(); - CheckpointTag LastProcessedEventPosition { get; } - void Subscribed(); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/IEventProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/IEventProcessingPhase.cs deleted file mode 100644 index 14f967109..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/IEventProcessingPhase.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.WorkItems; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public interface IProjectionPhaseCompleter { - void Complete(); - } - - public interface IProjectionPhaseCheckpointManager { - void NewCheckpointStarted(CheckpointTag checkpointTag); - void SetCurrentCheckpointSuggestedWorkItem(CheckpointSuggestedWorkItem checkpointSuggestedWorkItem); - } - - public interface IProjectionPhaseStateManager { - void BeginGetPartitionStateAt( - string statePartition, CheckpointTag at, Action loadCompleted, - bool lockLoaded); - - void UnlockAndForgetBefore(CheckpointTag checkpointTag); - - CheckpointTag LastProcessedEventPosition { get; } - } - - public interface IEventProcessingProjectionPhase : IProjectionPhaseStateManager { - EventProcessedResult ProcessCommittedEvent(EventReaderSubscriptionMessage.CommittedEventReceived message, - string partition); - - void FinalizeEventProcessing( - EventProcessedResult result, CheckpointTag eventCheckpointTag, float progress); - - void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action completed); - - void EmitEofResult( - string partition, string resultBody, CheckpointTag causedBy, Guid causedByGuid, string correlationId); - - EventProcessedResult ProcessPartitionDeleted(string partition, CheckpointTag deletedPosition); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/IProgressResultWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/IProgressResultWriter.cs deleted file mode 100644 index bb109c4d0..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/IProgressResultWriter.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Phases { - public interface IProgressResultWriter { - void WriteProgress(float progress); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/IProjectionProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/IProjectionProcessingPhase.cs deleted file mode 100644 index 489082273..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/IProjectionProcessingPhase.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public interface IProjectionProcessingPhase : IDisposable, - IHandle, - IHandle, - IHandle { - CheckpointTag AdjustTag(CheckpointTag tag); - - void InitializeFromCheckpoint(CheckpointTag checkpointTag); - - //TODO: remove from - it is passed for validation purpose only - void Subscribe(CheckpointTag from, bool fromCheckpoint); - - void ProcessEvent(); - - void EnsureUnsubscribed(); - - void SetProjectionState(PhaseState state); - - void GetStatistics(ProjectionStatistics info); - - CheckpointTag MakeZeroCheckpointTag(); - ICoreProjectionCheckpointManager CheckpointManager { get; } - IEmittedStreamsTracker EmittedStreamsTracker { get; } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/PhasePositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/PhasePositionTagger.cs deleted file mode 100644 index 40ebb5ea0..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/PhasePositionTagger.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public class PhasePositionTagger : PositionTagger { - public PhasePositionTagger(int phase) : base(phase) { - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromPhase(Phase, completed: false); - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - return checkpointTag.Mode_ == CheckpointTag.Mode.Phase; - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, - tag.Phase), "tag"); - - if (tag.Mode_ == CheckpointTag.Mode.Phase) { - return tag; - } - - throw new NotSupportedException("Conversion to phase based checkpoint tag is not supported"); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/PhaseState.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/PhaseState.cs deleted file mode 100644 index d602b08d3..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/PhaseState.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Phases; - -public enum PhaseState { - Unknown, - Stopped, - Starting, - Running, -} - -public enum PhaseSubscriptionState { - Unknown = 0, - Unsubscribed, - Subscribing, - Subscribed, - Failed -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryEofProjectionProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryEofProjectionProcessingPhase.cs deleted file mode 100644 index ce47b828f..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryEofProjectionProcessingPhase.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public sealed class WriteQueryEofProjectionProcessingPhase : WriteQueryResultProjectionProcessingPhaseBase { - public WriteQueryEofProjectionProcessingPhase( - IPublisher publisher, - int phase, - string resultStream, - ICoreProjectionForProcessingPhase coreProjection, - PartitionStateCache stateCache, - ICoreProjectionCheckpointManager checkpointManager, - IEmittedEventWriter emittedEventWriter, - IEmittedStreamsTracker emittedStreamsTracker) - : base(publisher, phase, resultStream, coreProjection, stateCache, checkpointManager, emittedEventWriter, - emittedStreamsTracker) { - } - - protected override IEnumerable WriteResults(CheckpointTag phaseCheckpointTag) { - // do nothing - yield break; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhase.cs deleted file mode 100644 index d2c32f9b6..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhase.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public sealed class WriteQueryResultProjectionProcessingPhase : WriteQueryResultProjectionProcessingPhaseBase { - public WriteQueryResultProjectionProcessingPhase( - IPublisher publisher, - int phase, - string resultStream, - ICoreProjectionForProcessingPhase coreProjection, - PartitionStateCache stateCache, - ICoreProjectionCheckpointManager checkpointManager, - IEmittedEventWriter emittedEventWriter, - IEmittedStreamsTracker emittedStreamsTracker) - : base(publisher, phase, resultStream, coreProjection, stateCache, checkpointManager, emittedEventWriter, - emittedStreamsTracker) { - } - - protected override IEnumerable WriteResults(CheckpointTag phaseCheckpointTag) { - var items = _stateCache.Enumerate(); - EmittedStream.WriterConfiguration.StreamMetadata streamMetadata = null; - return from item in items - let partitionState = item.Item2 - select - new EmittedEventEnvelope( - new EmittedDataEvent( - _resultStream, - Guid.NewGuid(), - "Result", - true, - partitionState.Result, - null, - phaseCheckpointTag, - null), - streamMetadata); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhaseBase.cs b/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhaseBase.cs deleted file mode 100644 index ed41a4d56..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Phases/WriteQueryResultProjectionProcessingPhaseBase.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using EventStore.Projections.Core.Services.Processing.Partitioning; - -namespace EventStore.Projections.Core.Services.Processing.Phases { - public abstract class WriteQueryResultProjectionProcessingPhaseBase : IProjectionProcessingPhase { - private readonly IPublisher _publisher; - private readonly int _phase; - protected readonly string _resultStream; - private readonly ICoreProjectionForProcessingPhase _coreProjection; - protected readonly PartitionStateCache _stateCache; - protected readonly ICoreProjectionCheckpointManager _checkpointManager; - protected readonly IEmittedEventWriter _emittedEventWriter; - protected readonly IEmittedStreamsTracker _emittedStreamsTracker; - private bool _subscribed; - private PhaseState _projectionState; - - public WriteQueryResultProjectionProcessingPhaseBase( - IPublisher publisher, - int phase, - string resultStream, - ICoreProjectionForProcessingPhase coreProjection, - PartitionStateCache stateCache, - ICoreProjectionCheckpointManager checkpointManager, - IEmittedEventWriter emittedEventWriter, - IEmittedStreamsTracker emittedStreamsTracker) { - if (resultStream == null) throw new ArgumentNullException("resultStream"); - if (coreProjection == null) throw new ArgumentNullException("coreProjection"); - if (stateCache == null) throw new ArgumentNullException("stateCache"); - if (checkpointManager == null) throw new ArgumentNullException("checkpointManager"); - if (emittedEventWriter == null) throw new ArgumentNullException("emittedEventWriter"); - if (emittedStreamsTracker == null) throw new ArgumentNullException("emittedStreamsTracker"); - if (string.IsNullOrEmpty(resultStream)) throw new ArgumentException("resultStream"); - - _publisher = publisher; - _phase = phase; - _resultStream = resultStream; - _coreProjection = coreProjection; - _stateCache = stateCache; - _checkpointManager = checkpointManager; - _emittedEventWriter = emittedEventWriter; - _emittedStreamsTracker = emittedStreamsTracker; - } - - public ICoreProjectionCheckpointManager CheckpointManager { - get { return _checkpointManager; } - } - - public IEmittedStreamsTracker EmittedStreamsTracker { - get { return _emittedStreamsTracker; } - } - - public void Dispose() { - } - - public void Handle(CoreProjectionManagementMessage.GetState message) { - var state = _stateCache.TryGetPartitionState(message.Partition); - var stateString = state != null ? state.State : null; - _publisher.Publish( - new CoreProjectionStatusMessage.StateReport( - message.CorrelationId, - message.CorrelationId, - message.Partition, - state: stateString, - position: null)); - } - - public void Handle(CoreProjectionManagementMessage.GetResult message) { - var state = _stateCache.TryGetPartitionState(message.Partition); - var resultString = state != null ? state.Result : null; - _publisher.Publish( - new CoreProjectionStatusMessage.ResultReport( - message.CorrelationId, - message.CorrelationId, - message.Partition, - result: resultString, - position: null)); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - throw new NotImplementedException(); - } - - public CheckpointTag AdjustTag(CheckpointTag tag) { - return tag; - } - - public void InitializeFromCheckpoint(CheckpointTag checkpointTag) { - _subscribed = false; - } - - public void ProcessEvent() { - if (!_subscribed) - throw new InvalidOperationException(); - if (_projectionState != PhaseState.Running) - return; - - var phaseCheckpointTag = CheckpointTag.FromPhase(_phase, completed: true); - var writeResults = WriteResults(phaseCheckpointTag); - - var writeEofResults = WriteEofEvent(phaseCheckpointTag); - - _emittedEventWriter.EventsEmitted(writeResults.Concat(writeEofResults).ToArray(), Guid.Empty, null); - - _checkpointManager.EventProcessed(phaseCheckpointTag, 100.0f); - _coreProjection.CompletePhase(); - } - - private IEnumerable WriteEofEvent(CheckpointTag phaseCheckpointTag) { - EmittedStream.WriterConfiguration.StreamMetadata streamMetadata = null; - yield return - new EmittedEventEnvelope( - new EmittedDataEvent( - _resultStream, - Guid.NewGuid(), - "$Eof", - true, - null, - null, - phaseCheckpointTag, - null), - streamMetadata); - } - - protected abstract IEnumerable WriteResults(CheckpointTag phaseCheckpointTag); - - public void Subscribe(CheckpointTag from, bool fromCheckpoint) { - _subscribed = true; - _coreProjection.Subscribed(); - } - - public void SetProjectionState(PhaseState state) { - _projectionState = state; - } - - public void GetStatistics(ProjectionStatistics info) { - info.Status = info.Status + "/Writing results"; - } - - public CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromPhase(_phase, completed: false); - } - - public void EnsureUnsubscribed() { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ProjectionCoreService.cs b/src/EventStore.Projections.Core/Services/Processing/ProjectionCoreService.cs deleted file mode 100644 index 718d82a26..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ProjectionCoreService.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Management; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Services.Processing.Strategies; -using Serilog; - -namespace EventStore.Projections.Core.Services.Processing { - public class ProjectionCoreService - : IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - public const string SubComponentName = "ProjectionCoreService"; - - private readonly Guid _workerId; - private readonly IPublisher _publisher; - private readonly IPublisher _inputQueue; - private readonly ILogger _logger = Log.ForContext(); - - private readonly Dictionary _projections = new Dictionary(); - - private readonly IODispatcher _ioDispatcher; - - private readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - - private readonly ITimeProvider _timeProvider; - private readonly ProcessingStrategySelector _processingStrategySelector; - - private bool _stopping; - private readonly Dictionary _suspendingProjections = new Dictionary(); - private Guid _stopQueueId = Guid.Empty; - private int _projectionStopTimeoutMs = 5000; - private readonly ProjectionStateHandlerFactory _factory; - - public ProjectionCoreService( - Guid workerId, - IPublisher inputQueue, - IPublisher publisher, - ReaderSubscriptionDispatcher subscriptionDispatcher, - ITimeProvider timeProvider, - IODispatcher ioDispatcher, - ProjectionsStandardComponents configuration) { - _workerId = workerId; - _inputQueue = inputQueue; - _publisher = publisher; - _ioDispatcher = ioDispatcher; - _subscriptionDispatcher = subscriptionDispatcher; - _timeProvider = timeProvider; - _processingStrategySelector = new ProcessingStrategySelector(_subscriptionDispatcher); - _factory = new ProjectionStateHandlerFactory(TimeSpan.FromMilliseconds(configuration.ProjectionCompilationTimeout), - TimeSpan.FromMilliseconds(configuration.ProjectionExecutionTimeout)); - } - - public ILogger Logger { - get { return _logger; } - } - - public void Handle(ProjectionCoreServiceMessage.StartCore message) { - _publisher.Publish(new ProjectionCoreServiceMessage.SubComponentStarted( - SubComponentName, message.InstanceCorrelationId)); - } - - public void Handle(ProjectionCoreServiceMessage.StopCore message) { - _stopQueueId = message.QueueId; - StopProjections(); - } - - private void StopProjections() { - _stopping = true; - - _ioDispatcher.StartDraining( - () => _publisher.Publish(new ProjectionSubsystemMessage.IODispatcherDrained(SubComponentName))); - - var allProjections = _projections.Values.ToArray(); - foreach (var projection in allProjections) - { - var requiresStopping = projection.Suspend(); - if (requiresStopping) { - _suspendingProjections.Add(projection._projectionCorrelationId, projection); - } - } - - if (_suspendingProjections.IsEmpty()) { - FinishStopping(); - } else { - _publisher.Publish(TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(_projectionStopTimeoutMs), - _inputQueue, - new ProjectionCoreServiceMessage.StopCoreTimeout(_stopQueueId))); - } - } - - public void Handle(ProjectionCoreServiceMessage.StopCoreTimeout message) { - if (message.QueueId != _stopQueueId) return; - _logger.Debug("PROJECTIONS: Suspending projections in Projection Core Service timed out. Force stopping."); - FinishStopping(); - } - - public void Handle(CoreProjectionStatusMessage.Suspended message) { - if (!_stopping) return; - - _suspendingProjections.Remove(message.ProjectionId); - if (_suspendingProjections.Count == 0) { - FinishStopping(); - } - } - - private void FinishStopping() { - if (!_stopping) return; - - _projections.Clear(); - _stopping = false; - _publisher.Publish(new ProjectionCoreServiceMessage.SubComponentStopped( - nameof(ProjectionCoreService), _stopQueueId)); - _stopQueueId = Guid.Empty; - } - - public void Handle(ProjectionCoreServiceMessage.CoreTick message) { - message.Action(); - } - - public void Handle(CoreProjectionManagementMessage.CreateAndPrepare message) { - try { - //TODO: factory method can throw - var stateHandler = CreateStateHandler(_factory, - _logger, - message.HandlerType, - message.Query, - message.EnableContentTypeValidation, - message.Config.ProjectionExecutionTimeout); - - string name = message.Name; - var sourceDefinition = ProjectionSourceDefinition.From(stateHandler.GetSourceDefinition()); - - var projectionVersion = message.Version; - var projectionConfig = message.Config; - var namesBuilder = new ProjectionNamesBuilder(name, sourceDefinition); - - var projectionProcessingStrategy = _processingStrategySelector.CreateProjectionProcessingStrategy( - name, - projectionVersion, - namesBuilder, - sourceDefinition, - projectionConfig, - stateHandler, - message.HandlerType, - message.Query, - message.EnableContentTypeValidation); - - CreateCoreProjection(message.ProjectionId, projectionConfig.RunAs, projectionProcessingStrategy); - _publisher.Publish( - new CoreProjectionStatusMessage.Prepared( - message.ProjectionId, sourceDefinition)); - } catch (Exception ex) { - _publisher.Publish( - new CoreProjectionStatusMessage.Faulted(message.ProjectionId, ex.Message)); - } - } - - public void Handle(CoreProjectionManagementMessage.CreatePrepared message) { - try { - var name = message.Name; - var sourceDefinition = ProjectionSourceDefinition.From(message.SourceDefinition); - var projectionVersion = message.Version; - var projectionConfig = message.Config; - var namesBuilder = new ProjectionNamesBuilder(name, sourceDefinition); - - var projectionProcessingStrategy = _processingStrategySelector.CreateProjectionProcessingStrategy( - name, - projectionVersion, - namesBuilder, - sourceDefinition, - projectionConfig, - null, - message.HandlerType, - message.Query, - message.EnableContentTypeValidation); - - CreateCoreProjection(message.ProjectionId, projectionConfig.RunAs, projectionProcessingStrategy); - _publisher.Publish( - new CoreProjectionStatusMessage.Prepared( - message.ProjectionId, sourceDefinition)); - } catch (Exception ex) { - _publisher.Publish( - new CoreProjectionStatusMessage.Faulted(message.ProjectionId, ex.Message)); - } - } - - private void CreateCoreProjection( - Guid projectionCorrelationId, ClaimsPrincipal runAs, ProjectionProcessingStrategy processingStrategy) { - var projection = processingStrategy.Create( - projectionCorrelationId, - _inputQueue, - _workerId, - runAs, - _publisher, - _ioDispatcher, - _subscriptionDispatcher, - _timeProvider); - _projections.Add(projectionCorrelationId, projection); - } - - public void Handle(CoreProjectionManagementMessage.Dispose message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) { - _projections.Remove(message.ProjectionId); - projection.Dispose(); - } - } - - public void Handle(CoreProjectionManagementMessage.Start message) { - var projection = _projections[message.ProjectionId]; - projection.Start(); - } - - public void Handle(CoreProjectionManagementMessage.LoadStopped message) { - var projection = _projections[message.ProjectionId]; - projection.LoadStopped(); - } - - public void Handle(CoreProjectionManagementMessage.Stop message) { - var projection = _projections[message.ProjectionId]; - projection.Stop(); - } - - public void Handle(CoreProjectionManagementMessage.Kill message) { - var projection = _projections[message.ProjectionId]; - projection.Kill(); - } - - public void Handle(CoreProjectionManagementMessage.GetState message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionManagementMessage.GetResult message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointCompleted message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.CheckpointLoaded message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.PrerecordedEventsLoaded message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.RestartRequested message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public void Handle(CoreProjectionProcessingMessage.Failed message) { - CoreProjection projection; - if (_projections.TryGetValue(message.ProjectionId, out projection)) - projection.Handle(message); - } - - public static IProjectionStateHandler CreateStateHandler(ProjectionStateHandlerFactory factory, - ILogger logger, - string handlerType, - string query, - bool enableContentTypeValidation, - int? projectionExecutionTimeout) { - var stateHandler = factory.Create( - handlerType, - query, - enableContentTypeValidation, - projectionExecutionTimeout, - logger: logger.Verbose); - return stateHandler; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ProjectionNamesBuilder.cs b/src/EventStore.Projections.Core/Services/Processing/ProjectionNamesBuilder.cs deleted file mode 100644 index 88efaf7cf..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ProjectionNamesBuilder.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing { - public class ProjectionNamesBuilder { - public static class StandardProjections { - public const string StreamsStandardProjection = "$streams"; - public const string StreamByCategoryStandardProjection = "$stream_by_category"; - public const string EventByCategoryStandardProjection = "$by_category"; - public const string EventByTypeStandardProjection = "$by_event_type"; - public const string EventByCorrIdStandardProjection = "$by_correlation_id"; - } - - public static ProjectionNamesBuilder CreateForTest(string name) { - return new ProjectionNamesBuilder(name); - } - - private readonly string _name; - private readonly IQuerySources _sources; - private readonly string _resultStreamName; - private readonly string _partitionCatalogStreamName; - private readonly string _checkpointStreamName; - private readonly string _orderStreamName; - private readonly string _emittedStreamsName; - private readonly string _emittedStreamsCheckpointName; - - private ProjectionNamesBuilder(string name) - : this(name, new QuerySourcesDefinition()) { - } - - public ProjectionNamesBuilder(string name, IQuerySources sources) { - if (sources == null) throw new ArgumentNullException("sources"); - _name = name; - _sources = sources; - _resultStreamName = _sources.ResultStreamNameOption - ?? ProjectionsStreamPrefix + EffectiveProjectionName + ProjectionsStateStreamSuffix; - _partitionCatalogStreamName = ProjectionsStreamPrefix + EffectiveProjectionName - + ProjectionPartitionCatalogStreamSuffix; - _checkpointStreamName = - ProjectionsStreamPrefix + EffectiveProjectionName + ProjectionCheckpointStreamSuffix; - _orderStreamName = ProjectionsStreamPrefix + EffectiveProjectionName + ProjectionOrderStreamSuffix; - _emittedStreamsName = ProjectionsStreamPrefix + EffectiveProjectionName + ProjectionEmittedStreamSuffix; - _emittedStreamsCheckpointName = ProjectionsStreamPrefix + EffectiveProjectionName + - ProjectionEmittedStreamSuffix + ProjectionCheckpointStreamSuffix; - } - - public string EffectiveProjectionName { - get { return _name; } - } - - - private string GetPartitionResultStreamName(string partitionName) { - return String.Format(GetPartitionResultStreamNamePattern(), partitionName); - } - - public string GetResultStreamName() { - return _resultStreamName; - } - - public string GetPartitionResultStreamNamePattern() { - return _sources.PartitionResultStreamNamePatternOption - ?? ProjectionsStreamPrefix + EffectiveProjectionName + "-{0}" + ProjectionsStateStreamSuffix; - } - - public const string ProjectionsStreamPrefix = "$projections-"; - private const string ProjectionsStateStreamSuffix = "-result"; - private const string ProjectionCheckpointStreamSuffix = "-checkpoint"; - private const string ProjectionEmittedStreamSuffix = "-emittedstreams"; - private const string ProjectionOrderStreamSuffix = "-order"; - private const string ProjectionPartitionCatalogStreamSuffix = "-partitions"; - public const string ProjectionsRegistrationStream = "$projections-$all"; - - public string GetPartitionCatalogStreamName() { - return _partitionCatalogStreamName; - } - - public string MakePartitionResultStreamName(string statePartition) { - return String.IsNullOrEmpty(statePartition) - ? GetResultStreamName() - : GetPartitionResultStreamName(statePartition); - } - - public string MakePartitionCheckpointStreamName(string statePartition) { - if (String.IsNullOrEmpty(statePartition)) - throw new InvalidOperationException("Root partition cannot have a partition checkpoint stream"); - - return ProjectionsStreamPrefix + EffectiveProjectionName + "-" + statePartition - + ProjectionCheckpointStreamSuffix; - } - - - public string MakeCheckpointStreamName() { - return _checkpointStreamName; - } - - public string GetEmittedStreamsName() { - return _emittedStreamsName; - } - - public string GetEmittedStreamsCheckpointName() { - return _emittedStreamsCheckpointName; - } - - public string GetOrderStreamName() { - return _orderStreamName; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ProjectionOutputConfig.cs b/src/EventStore.Projections.Core/Services/Processing/ProjectionOutputConfig.cs deleted file mode 100644 index bd4424661..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ProjectionOutputConfig.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Runtime.Serialization; - -namespace EventStore.Projections.Core.Services.Processing { - [DataContract] - public class ProjectionOutputConfig { - [DataMember] public string ResultStreamName { get; set; } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ProjectionSourceDefinition.cs b/src/EventStore.Projections.Core/Services/Processing/ProjectionSourceDefinition.cs deleted file mode 100644 index 013c04eca..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ProjectionSourceDefinition.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System.Linq; -using System.Runtime.Serialization; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing { - [DataContract] - public class ProjectionSourceDefinition : IQuerySources { - [DataMember] public bool AllEvents { get; set; } - - [DataMember] public bool AllStreams { get; set; } - - [DataMember] public bool ByStream { get; set; } - - [DataMember] public bool ByCustomPartitions { get; set; } - - [DataMember] public string[] Categories { get; set; } - - [DataMember] public string[] Events { get; set; } - - [DataMember] public string[] Streams { get; set; } - - [DataMember] public long? LimitingCommitPosition { get; set; } - - [DataMember] public QuerySourceOptions Options { get; set; } - - bool IQuerySources.DefinesStateTransform { - get { return Options != null && Options.DefinesStateTransform; } - } - - bool IQuerySources.ProducesResults { - get { return Options != null && Options.ProducesResults; } - } - - bool IQuerySources.DefinesFold { - get { return Options != null && Options.DefinesFold; } - } - - bool IQuerySources.HandlesDeletedNotifications { - get { return Options != null && Options.HandlesDeletedNotifications; } - } - - bool IQuerySources.IncludeLinksOption { - get { return Options != null && Options.IncludeLinks; } - } - - string IQuerySources.ResultStreamNameOption { - get { return Options != null ? Options.ResultStreamName : null; } - } - - string IQuerySources.PartitionResultStreamNamePatternOption { - get { return Options != null ? Options.PartitionResultStreamNamePattern : null; } - } - - bool IQuerySources.ReorderEventsOption { - get { return Options != null && Options.ReorderEvents; } - } - - int? IQuerySources.ProcessingLagOption { - get { return Options != null ? Options.ProcessingLag : (int?)null; } - } - - bool IQuerySources.IsBiState { - get { return Options != null ? Options.IsBiState : false; } - } - - bool IQuerySources.ByStreams { - get { return ByStream; } - } - - public static ProjectionSourceDefinition From(IQuerySources sources) { - return new ProjectionSourceDefinition { - AllEvents = sources.AllEvents, - AllStreams = sources.AllStreams, - ByStream = sources.ByStreams, - ByCustomPartitions = sources.ByCustomPartitions, - Categories = (sources.Categories ?? new string[0]).ToArray(), - Events = (sources.Events ?? new string[0]).ToArray(), - Streams = (sources.Streams ?? new string[0]).ToArray(), - LimitingCommitPosition = sources.LimitingCommitPosition, - Options = - new QuerySourceOptions { - DefinesStateTransform = sources.DefinesStateTransform, - ProducesResults = sources.ProducesResults, - DefinesFold = sources.DefinesFold, - HandlesDeletedNotifications = sources.HandlesDeletedNotifications, - IncludeLinks = sources.IncludeLinksOption, - PartitionResultStreamNamePattern = sources.PartitionResultStreamNamePatternOption, - ProcessingLag = sources.ProcessingLagOption.GetValueOrDefault(), - IsBiState = sources.IsBiState, - ReorderEvents = sources.ReorderEventsOption, - ResultStreamName = sources.ResultStreamNameOption, - }, - }; - } - - private bool Equals(string[] a, string[] b) { - bool aEmpty = (a == null || a.Length == 0); - bool bEmpty = (b == null || b.Length == 0); - if (aEmpty && bEmpty) - return true; - if (aEmpty || bEmpty) - return false; - return a.SequenceEqual(b); - } - - protected bool Equals(ProjectionSourceDefinition other) { - return AllEvents.Equals(other.AllEvents) && AllStreams.Equals(other.AllStreams) - && ByStream.Equals(other.ByStream) && - ByCustomPartitions.Equals(other.ByCustomPartitions) - && Equals(Categories, other.Categories) && - Equals(Events, other.Events) - && Equals(Streams, other.Streams) - && LimitingCommitPosition == other.LimitingCommitPosition && - Equals(Options, other.Options); - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((ProjectionSourceDefinition)obj); - } - - public override int GetHashCode() { - unchecked { - int hashCode = AllEvents.GetHashCode(); - hashCode = (hashCode * 397) ^ AllStreams.GetHashCode(); - hashCode = (hashCode * 397) ^ ByStream.GetHashCode(); - hashCode = (hashCode * 397) ^ ByCustomPartitions.GetHashCode(); - hashCode = (hashCode * 397) ^ LimitingCommitPosition.GetHashCode(); - hashCode = (hashCode * 397) ^ (Options != null ? Options.GetHashCode() : 0); - return hashCode; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ProjectionVersion.cs b/src/EventStore.Projections.Core/Services/Processing/ProjectionVersion.cs deleted file mode 100644 index 409c37949..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ProjectionVersion.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing { - public struct ProjectionVersion { - public readonly long ProjectionId; - public readonly long Epoch; - public readonly long Version; - - public ProjectionVersion(long projectionId, long epoch, long version) { - ProjectionId = projectionId; - Epoch = epoch; - Version = version; - } - - public bool Equals(ProjectionVersion other) { - return ProjectionId == other.ProjectionId && Epoch == other.Epoch && Version == other.Version; - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - return obj is ProjectionVersion && Equals((ProjectionVersion)obj); - } - - public override int GetHashCode() { - unchecked { - var hashCode = ProjectionId.GetHashCode(); - hashCode = (hashCode * 397) ^ Epoch.GetHashCode(); - hashCode = (hashCode * 397) ^ Version.GetHashCode(); - return hashCode; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/QuerySourceOptions.cs b/src/EventStore.Projections.Core/Services/Processing/QuerySourceOptions.cs deleted file mode 100644 index 72df311eb..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/QuerySourceOptions.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Runtime.Serialization; - -namespace EventStore.Projections.Core.Services.Processing; - -[DataContract] -public class QuerySourceOptions { - [DataMember] public string ResultStreamName { get; set; } - - [DataMember] public string PartitionResultStreamNamePattern { get; set; } - - [DataMember] public bool ReorderEvents { get; set; } - - [DataMember] public int ProcessingLag { get; set; } - - [DataMember] public bool IsBiState { get; set; } - - [DataMember] public bool DefinesStateTransform { get; set; } - - [DataMember] public bool ProducesResults { get; set; } - - [DataMember] public bool DefinesFold { get; set; } - - [DataMember] public bool HandlesDeletedNotifications { get; set; } - - [DataMember] public bool IncludeLinks { get; set; } - - protected bool Equals(QuerySourceOptions other) { - return string.Equals(ResultStreamName, other.ResultStreamName) - && string.Equals(PartitionResultStreamNamePattern, other.PartitionResultStreamNamePattern) - && ReorderEvents.Equals(other.ReorderEvents) && ProcessingLag == other.ProcessingLag - && IsBiState.Equals(other.IsBiState) && DefinesStateTransform.Equals(other.DefinesStateTransform) - && ProducesResults.Equals(other.ProducesResults) && DefinesFold.Equals(other.DefinesFold) - && HandlesDeletedNotifications.Equals(other.HandlesDeletedNotifications) - && IncludeLinks.Equals(other.IncludeLinks); - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((QuerySourceOptions)obj); - } - - public override int GetHashCode() { - unchecked { - int hashCode = (ResultStreamName != null ? ResultStreamName.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (PartitionResultStreamNamePattern != null - ? PartitionResultStreamNamePattern.GetHashCode() - : 0); - hashCode = (hashCode * 397) ^ ReorderEvents.GetHashCode(); - hashCode = (hashCode * 397) ^ ProcessingLag; - hashCode = (hashCode * 397) ^ IsBiState.GetHashCode(); - hashCode = (hashCode * 397) ^ DefinesStateTransform.GetHashCode(); - hashCode = (hashCode * 397) ^ ProducesResults.GetHashCode(); - hashCode = (hashCode * 397) ^ DefinesFold.GetHashCode(); - hashCode = (hashCode * 397) ^ HandlesDeletedNotifications.GetHashCode(); - hashCode = (hashCode * 397) ^ IncludeLinks.GetHashCode(); - return hashCode; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/RequestResponseQueueForwarder.cs b/src/EventStore.Projections.Core/Services/Processing/RequestResponseQueueForwarder.cs deleted file mode 100644 index 0d5630609..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/RequestResponseQueueForwarder.cs +++ /dev/null @@ -1,88 +0,0 @@ -using EventStore.Core.Bus; -using EventStore.Core.Messages; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Messaging; - -namespace EventStore.Projections.Core.Services.Processing { - public class RequestResponseQueueForwarder : IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - private readonly IPublisher _externalRequestQueue; - private readonly IPublisher _inputQueue; - - public RequestResponseQueueForwarder(IPublisher inputQueue, IPublisher externalRequestQueue) { - _inputQueue = inputQueue; - _externalRequestQueue = externalRequestQueue; - } - - public void Handle(ClientMessage.ReadEvent msg) { - _externalRequestQueue.Publish( - new ClientMessage.ReadEvent( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), - msg.EventStreamId, msg.EventNumber, msg.ResolveLinkTos, msg.RequireLeader, msg.User)); - } - - public void Handle(ClientMessage.WriteEvents msg) { - _externalRequestQueue.Publish( - new ClientMessage.WriteEvents( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), true, - msg.EventStreamId, msg.ExpectedVersion, msg.Events, msg.User)); - } - - public void Handle(ClientMessage.DeleteStream msg) { - _externalRequestQueue.Publish( - new ClientMessage.DeleteStream( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), true, - msg.EventStreamId, msg.ExpectedVersion, msg.HardDelete, msg.User)); - } - - public void Handle(ClientMessage.ReadStreamEventsBackward msg) { - _externalRequestQueue.Publish( - new ClientMessage.ReadStreamEventsBackward( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), - msg.EventStreamId, msg.FromEventNumber, msg.MaxCount, msg.ResolveLinkTos, msg.RequireLeader, - msg.ValidationStreamVersion, msg.User)); - } - - public void Handle(ClientMessage.ReadStreamEventsForward msg) { - _externalRequestQueue.Publish( - new ClientMessage.ReadStreamEventsForward( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), - msg.EventStreamId, msg.FromEventNumber, msg.MaxCount, msg.ResolveLinkTos, msg.RequireLeader, - msg.ValidationStreamVersion, msg.User, replyOnExpired: false)); - } - - public void Handle(ClientMessage.ReadAllEventsForward msg) { - _externalRequestQueue.Publish( - new ClientMessage.ReadAllEventsForward( - msg.InternalCorrId, msg.CorrelationId, new PublishToWrapEnvelop(_inputQueue, msg.Envelope), - msg.CommitPosition, msg.PreparePosition, msg.MaxCount, msg.ResolveLinkTos, msg.RequireLeader, - msg.ValidationTfLastCommitPosition, msg.User, replyOnExpired: false)); - } - - public void Handle(SystemMessage.SubSystemInitialized msg) { - _externalRequestQueue.Publish( - new SystemMessage.SubSystemInitialized(msg.SubSystemName)); - } - - void IHandle.Handle( - ProjectionCoreServiceMessage.SubComponentStarted message) { - _externalRequestQueue.Publish( - new ProjectionCoreServiceMessage.SubComponentStarted(message.SubComponent, message.InstanceCorrelationId) - ); - } - - void IHandle.Handle( - ProjectionCoreServiceMessage.SubComponentStopped message) { - _externalRequestQueue.Publish( - new ProjectionCoreServiceMessage.SubComponentStopped(message.SubComponent, message.QueueId) - ); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/ResolvedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/ResolvedEvent.cs deleted file mode 100644 index 924afe4ef..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/ResolvedEvent.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Common.Utils; -using EventStore.Core.Data; -using EventStore.Core.Services; -using EventStore.Core.TransactionLog.LogRecords; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Standard; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Services.Processing { - public class ResolvedEvent { - private readonly string _eventStreamId; - private readonly long _eventSequenceNumber; - private readonly bool _resolvedLinkTo; - - private readonly string _positionStreamId; - private readonly long _positionSequenceNumber; - private readonly TFPos _position; - private readonly TFPos _eventOrLinkTargetPosition; - private readonly TFPos _linkOrEventPosition; - - - public readonly Guid EventId; - public readonly string EventType; - public readonly bool IsJson; - public readonly DateTime Timestamp; - - public readonly string Data; - public readonly string Metadata; - public readonly string PositionMetadata; - public readonly string StreamMetadata; - public readonly bool IsLinkToDeletedStream; - public readonly bool IsLinkToDeletedStreamTombstone; - - public ResolvedEvent(EventStore.Core.Data.ResolvedEvent resolvedEvent, byte[] streamMetadata) { - var positionEvent = resolvedEvent.Link ?? resolvedEvent.Event; - _linkOrEventPosition = resolvedEvent.OriginalPosition.GetValueOrDefault(); - var @event = resolvedEvent.Event; - _positionStreamId = positionEvent.EventStreamId; - _positionSequenceNumber = positionEvent.EventNumber; - _eventStreamId = @event != null ? @event.EventStreamId : null; - _eventSequenceNumber = @event != null ? @event.EventNumber : -1; - _resolvedLinkTo = positionEvent != @event; - _position = resolvedEvent.OriginalPosition ?? new TFPos(-1, positionEvent.LogPosition); - EventId = @event != null ? @event.EventId : Guid.Empty; - EventType = @event != null ? @event.EventType : null; - IsJson = @event != null && (@event.Flags & PrepareFlags.IsJson) != 0; - Timestamp = positionEvent.TimeStamp; - - //TODO: handle utf-8 conversion exception - Data = @event != null && @event.Data.Length > 0 ? Helper.UTF8NoBom.GetString(@event.Data.Span) : null; - Metadata = @event != null && @event.Metadata.Length > 0 ? Helper.UTF8NoBom.GetString(@event.Metadata.Span) : null; - PositionMetadata = _resolvedLinkTo - ? (positionEvent.Metadata.Length > 0 ? Helper.UTF8NoBom.GetString(positionEvent.Metadata.Span) : null) - : null; - StreamMetadata = streamMetadata != null ? Helper.UTF8NoBom.GetString(streamMetadata) : null; - - TFPos eventOrLinkTargetPosition; - if (_resolvedLinkTo) { - Dictionary extraMetadata = null; - if (positionEvent.Metadata.Length > 0 && positionEvent.Metadata.Length > 0) { - //TODO: parse JSON only when unresolved link and just tag otherwise - CheckpointTag tag; - if (resolvedEvent.Link != null && resolvedEvent.Event == null) { - var checkpointTagJson = - positionEvent.Metadata.ParseCheckpointTagVersionExtraJson(default(ProjectionVersion)); - tag = checkpointTagJson.Tag; - extraMetadata = checkpointTagJson.ExtraMetadata; - - var parsedPosition = tag.Position; - - eventOrLinkTargetPosition = parsedPosition != new TFPos(long.MinValue, long.MinValue) - ? parsedPosition - : new TFPos(-1, positionEvent.LogPosition); - } else { - tag = positionEvent.Metadata.ParseCheckpointTagJson(); - var parsedPosition = tag.Position; - if (parsedPosition == new TFPos(long.MinValue, long.MinValue) && - @event.Metadata.IsValidJson()) { - tag = @event.Metadata.ParseCheckpointTagJson(); - if (tag != null) { - parsedPosition = tag.Position; - } - } - - eventOrLinkTargetPosition = parsedPosition != new TFPos(long.MinValue, long.MinValue) - ? parsedPosition - : new TFPos(-1, resolvedEvent.Event.LogPosition); - } - } else { - eventOrLinkTargetPosition = @event != null - ? new TFPos(-1, @event.LogPosition) - : new TFPos(-1, positionEvent.LogPosition); - } - - JToken deletedValue; - IsLinkToDeletedStreamTombstone = extraMetadata != null - && extraMetadata.TryGetValue("$deleted", out deletedValue); - if (resolvedEvent.ResolveResult == ReadEventResult.NoStream - || resolvedEvent.ResolveResult == ReadEventResult.StreamDeleted || IsLinkToDeletedStreamTombstone) { - IsLinkToDeletedStream = true; - var streamId = SystemEventTypes.StreamReferenceEventToStreamId( - SystemEventTypes.LinkTo, resolvedEvent.Link.Data); - _eventStreamId = streamId; - } - } else { - // not a link - eventOrLinkTargetPosition = resolvedEvent.OriginalPosition ?? new TFPos(-1, positionEvent.LogPosition); - } - - _eventOrLinkTargetPosition = eventOrLinkTargetPosition; - } - - - public ResolvedEvent( - string positionStreamId, long positionSequenceNumber, string eventStreamId, long eventSequenceNumber, - bool resolvedLinkTo, TFPos position, TFPos eventOrLinkTargetPosition, Guid eventId, string eventType, - bool isJson, byte[] data, - byte[] metadata, byte[] positionMetadata, byte[] streamMetadata, DateTime timestamp) { - _positionStreamId = positionStreamId; - _positionSequenceNumber = positionSequenceNumber; - _eventStreamId = eventStreamId; - _eventSequenceNumber = eventSequenceNumber; - _resolvedLinkTo = resolvedLinkTo; - _position = position; - _eventOrLinkTargetPosition = eventOrLinkTargetPosition; - EventId = eventId; - EventType = eventType; - IsJson = isJson; - Timestamp = timestamp; - - //TODO: handle utf-8 conversion exception - Data = data != null ? Helper.UTF8NoBom.GetString(data) : null; - Metadata = metadata != null ? Helper.UTF8NoBom.GetString(metadata) : null; - PositionMetadata = positionMetadata != null ? Helper.UTF8NoBom.GetString(positionMetadata) : null; - StreamMetadata = streamMetadata != null ? Helper.UTF8NoBom.GetString(streamMetadata) : null; - } - - - public ResolvedEvent( - string positionStreamId, long positionSequenceNumber, string eventStreamId, long eventSequenceNumber, - bool resolvedLinkTo, TFPos position, Guid eventId, string eventType, bool isJson, string data, - string metadata, string positionMetadata = null, string streamMetadata = null) { - DateTime timestamp = default(DateTime); - if (Guid.Empty == eventId) - throw new ArgumentException("Empty eventId provided."); - if (string.IsNullOrEmpty(eventType)) - throw new ArgumentException("Empty eventType provided."); - - _positionStreamId = positionStreamId; - _positionSequenceNumber = positionSequenceNumber; - _eventStreamId = eventStreamId; - _eventSequenceNumber = eventSequenceNumber; - _resolvedLinkTo = resolvedLinkTo; - _position = position; - EventId = eventId; - EventType = eventType; - IsJson = isJson; - Timestamp = timestamp; - - Data = data; - Metadata = metadata; - PositionMetadata = positionMetadata; - StreamMetadata = streamMetadata; - } - - public string EventStreamId { - get { return _eventStreamId; } - } - - public long EventSequenceNumber { - get { return _eventSequenceNumber; } - } - - public bool ResolvedLinkTo { - get { return _resolvedLinkTo; } - } - - public string PositionStreamId { - get { return _positionStreamId; } - } - - public long PositionSequenceNumber { - get { return _positionSequenceNumber; } - } - - public TFPos Position { - get { return _position; } - } - - public TFPos EventOrLinkTargetPosition { - get { return _eventOrLinkTargetPosition; } - } - - public TFPos LinkOrEventPosition { - get { return _linkOrEventPosition; } - } - - public bool IsStreamDeletedEvent { - get { - string temp; - return StreamDeletedHelper.IsStreamDeletedEvent(EventStreamId, EventType, Data, out temp); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/SingleStream/CategoryEventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/SingleStream/CategoryEventFilter.cs deleted file mode 100644 index 1cbaadb79..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/SingleStream/CategoryEventFilter.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Services.Processing.SingleStream { - public class CategoryEventFilter : EventFilter { - private readonly string _category; - private readonly string _categoryStream; - - public CategoryEventFilter(string category, bool allEvents, HashSet events) - : base(allEvents, false, events) { - _category = category; - _categoryStream = "$ce-" + category; - } - - protected override bool DeletedNotificationPasses(string positionStreamId) { - return _categoryStream == positionStreamId; - } - - public override bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType) { - return resolvedFromLinkTo && _categoryStream == positionStreamId; - } - - public override string GetCategory(string positionStreamId) { - if (!positionStreamId.StartsWith("$ce-")) - throw new ArgumentException(string.Format("'{0}' is not a category stream", positionStreamId), - "positionStreamId"); - return positionStreamId.Substring("$ce-".Length); - } - - public override string ToString() { - return string.Format("Category: {0}, CategoryStream: {1}", _category, _categoryStream); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventFilter.cs deleted file mode 100644 index 70a1f9647..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventFilter.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; - -namespace EventStore.Projections.Core.Services.Processing.SingleStream { - public class StreamEventFilter : EventFilter { - private readonly string _streamId; - - public StreamEventFilter(string streamId, bool allEvents, HashSet events) - : base(allEvents, false, events) { - _streamId = streamId; - } - - protected override bool DeletedNotificationPasses(string positionStreamId) { - return positionStreamId == _streamId; - } - - public override bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType) { - return positionStreamId == _streamId; - } - - public override string GetCategory(string positionStreamId) { - return null; - } - - public override string ToString() { - return string.Format("StreamId: {0}", _streamId); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventReader.cs deleted file mode 100644 index 37f3315ee..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamEventReader.cs +++ /dev/null @@ -1,242 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Standard; - -namespace EventStore.Projections.Core.Services.Processing.SingleStream { - public class StreamEventReader : EventReader, - IHandle, - IHandle { - private readonly string _streamName; - private long _fromSequenceNumber; - private readonly ITimeProvider _timeProvider; - private readonly bool _resolveLinkTos; - private readonly bool _produceStreamDeletes; - - private bool _eventsRequested; - private int _maxReadCount = 111; - private long _lastPosition; - private bool _eof; - private Guid _pendingRequestCorrelationId; - - public StreamEventReader( - IPublisher publisher, - Guid eventReaderCorrelationId, - ClaimsPrincipal readAs, - string streamName, - long fromSequenceNumber, - ITimeProvider timeProvider, - bool resolveLinkTos, - bool produceStreamDeletes, - bool stopOnEof = false) - : base(publisher, eventReaderCorrelationId, readAs, stopOnEof) { - if (fromSequenceNumber < 0) throw new ArgumentException("fromSequenceNumber"); - if (streamName == null) throw new ArgumentNullException("streamName"); - if (string.IsNullOrEmpty(streamName)) throw new ArgumentException("streamName"); - _streamName = streamName; - _fromSequenceNumber = fromSequenceNumber; - _timeProvider = timeProvider; - _resolveLinkTos = resolveLinkTos; - _produceStreamDeletes = produceStreamDeletes; - } - - protected override bool AreEventsRequested() { - return _eventsRequested; - } - - public void Handle(ClientMessage.ReadStreamEventsForwardCompleted message) { - if (_disposed) - return; - if (!_eventsRequested) - throw new InvalidOperationException("Read events has not been requested"); - if (message.EventStreamId != _streamName) - throw new InvalidOperationException( - string.Format("Invalid stream name: {0}. Expected: {1}", message.EventStreamId, _streamName)); - if (Paused) - throw new InvalidOperationException("Paused"); - if (message.CorrelationId != _pendingRequestCorrelationId) { - return; - } - - _eventsRequested = false; - _lastPosition = message.TfLastCommitPosition; - NotifyIfStarting(message.TfLastCommitPosition); - switch (message.Result) { - case ReadStreamResult.StreamDeleted: - _eof = true; - DeliverSafeJoinPosition(GetLastCommitPositionFrom(message)); // allow joining heading distribution - PauseOrContinueProcessing(); - SendIdle(); - SendPartitionDeleted_WhenReadingDataStream(_streamName, -1, null, null, null, null); - SendEof(); - break; - case ReadStreamResult.NoStream: - _eof = true; - DeliverSafeJoinPosition(GetLastCommitPositionFrom(message)); // allow joining heading distribution - PauseOrContinueProcessing(); - SendIdle(); - if (message.LastEventNumber >= 0) - SendPartitionDeleted_WhenReadingDataStream(_streamName, message.LastEventNumber, null, null, - null, null); - SendEof(); - break; - case ReadStreamResult.Success: - var oldFromSequenceNumber = StartFrom(message, _fromSequenceNumber); - _fromSequenceNumber = message.NextEventNumber; - var eof = (message.Events.Length == 0) && message.IsEndOfStream; - _eof = eof; - var willDispose = eof && _stopOnEof; - - if (!willDispose) { - PauseOrContinueProcessing(); - } - - if (eof) { - // the end - DeliverSafeJoinPosition(GetLastCommitPositionFrom(message)); - SendIdle(); - SendEof(); - } else { - for (int index = 0; index < message.Events.Length; index++) { - var @event = message.Events[index].Event; - var @link = message.Events[index].Link; - DeliverEvent(message.Events[index], - 100.0f * (link ?? @event).EventNumber / message.LastEventNumber, - ref oldFromSequenceNumber); - } - } - - break; - case ReadStreamResult.AccessDenied: - SendNotAuthorized(); - return; - default: - throw new NotSupportedException( - string.Format("ReadEvents result code was not recognized. Code: {0}", message.Result)); - } - } - - public void Handle(ProjectionManagementMessage.Internal.ReadTimeout message) { - if (_disposed) return; - if (Paused) return; - if (message.CorrelationId != _pendingRequestCorrelationId) return; - - _eventsRequested = false; - PauseOrContinueProcessing(); - } - - private long StartFrom(ClientMessage.ReadStreamEventsForwardCompleted message, long fromSequenceNumber) { - if (fromSequenceNumber != 0) return fromSequenceNumber; - if (message.Events.Length > 0) { - return message.Events[0].OriginalEventNumber; - } - - return fromSequenceNumber; - } - - private void SendIdle() { - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderIdle(EventReaderCorrelationId, _timeProvider.UtcNow)); - } - - protected override void RequestEvents() { - if (_disposed) throw new InvalidOperationException("Disposed"); - if (_eventsRequested) - throw new InvalidOperationException("Read operation is already in progress"); - if (PauseRequested || Paused) - throw new InvalidOperationException("Paused or pause requested"); - _eventsRequested = true; - - _pendingRequestCorrelationId = Guid.NewGuid(); - var readEventsForward = CreateReadEventsMessage(_pendingRequestCorrelationId); - if (_eof) { - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), - CreateReadTimeoutMessage(_pendingRequestCorrelationId, _streamName))); - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), readEventsForward)); - } else { - _publisher.Publish(readEventsForward); - ScheduleReadTimeoutMessage(_pendingRequestCorrelationId, _streamName); - } - } - - private void ScheduleReadTimeoutMessage(Guid correlationId, string streamId) { - _publisher.Publish(CreateReadTimeoutMessage(correlationId, streamId)); - } - - private Message CreateReadTimeoutMessage(Guid correlationId, string streamId) { - return TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, streamId)); - } - - private Message CreateReadEventsMessage(Guid readCorrelationId) { - return new ClientMessage.ReadStreamEventsForward( - readCorrelationId, readCorrelationId, new SendToThisEnvelope(this), _streamName, _fromSequenceNumber, - _maxReadCount, _resolveLinkTos, false, null, ReadAs, replyOnExpired: false); - } - - private void DeliverSafeJoinPosition(long? safeJoinPosition) { - if (_stopOnEof || safeJoinPosition == null || safeJoinPosition == -1) - return; //TODO: this should not happen, but StorageReader does not return it now - _publisher.Publish( - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, null, safeJoinPosition, 100.0f, source: this.GetType())); - } - - private void DeliverEvent(EventStore.Core.Data.ResolvedEvent pair, float progress, ref long sequenceNumber) { - EventRecord positionEvent = pair.OriginalEvent; - if (positionEvent.EventNumber != sequenceNumber) { - // This can happen when the original stream has $maxAge/$maxCount set - _publisher.Publish(new ReaderSubscriptionMessage.Faulted(EventReaderCorrelationId, string.Format( - "Event number {0} was expected in the stream {1}, but event number {2} was received. This may happen if events have been deleted from the beginning of your stream, please reset your projection.", - sequenceNumber, _streamName, positionEvent.EventNumber), this.GetType())); - return; - } - - sequenceNumber = positionEvent.EventNumber + 1; - var resolvedEvent = new ResolvedEvent(pair, null); - - string deletedPartitionStreamId; - - if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone) - return; - - bool isDeletedStreamEvent = - StreamDeletedHelper.IsStreamDeletedEventOrLinkToStreamDeletedEvent(resolvedEvent, pair.ResolveResult, - out deletedPartitionStreamId); - - if (isDeletedStreamEvent) { - var deletedPartition = deletedPartitionStreamId; - - if (_produceStreamDeletes) - _publisher.Publish( - //TODO: publish both link and event data - new ReaderSubscriptionMessage.EventReaderPartitionDeleted( - EventReaderCorrelationId, deletedPartition, source: this.GetType(), lastEventNumber: -1, - deleteEventOrLinkTargetPosition: null, - deleteLinkOrEventPosition: resolvedEvent.EventOrLinkTargetPosition, - positionStreamId: resolvedEvent.PositionStreamId, - positionEventNumber: resolvedEvent.PositionSequenceNumber)); - } else if (!resolvedEvent.IsStreamDeletedEvent) - _publisher.Publish( - //TODO: publish both link and event data - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, resolvedEvent, _stopOnEof ? (long?)null : positionEvent.LogPosition, - progress, source: this.GetType())); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamPositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamPositionTagger.cs deleted file mode 100644 index 7f11ea55e..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/SingleStream/StreamPositionTagger.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Linq; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.SingleStream { - public class StreamPositionTagger : PositionTagger { - private readonly string _stream; - - public StreamPositionTagger(int phase, string stream) : base(phase) { - if (stream == null) throw new ArgumentNullException("stream"); - if (string.IsNullOrEmpty(stream)) throw new ArgumentException("stream"); - _stream = stream; - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase < Phase) - return true; - if (previous.Mode_ != CheckpointTag.Mode.Stream) - throw new ArgumentException("Mode.Stream expected", "previous"); - return committedEvent.Data.PositionStreamId == _stream - && committedEvent.Data.PositionSequenceNumber > previous.Streams[_stream]; - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (committedEvent.Data.PositionStreamId != _stream) - throw new InvalidOperationException( - string.Format( - "Invalid stream '{0}'. Expected stream is '{1}'", committedEvent.Data.EventStreamId, _stream)); - return CheckpointTag.FromStreamPosition(previous.Phase, committedEvent.Data.PositionStreamId, - committedEvent.Data.PositionSequenceNumber); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (partitionDeleted.PositionStreamId != _stream) - throw new InvalidOperationException( - string.Format( - "Invalid stream '{0}'. Expected stream is '{1}'", partitionDeleted.Partition, _stream)); - - // return ordinary checkpoint tag (suitable for fromCategory.foreachStream as well as for regular fromStream - return CheckpointTag.FromStreamPosition( - previous.Phase, partitionDeleted.PositionStreamId, partitionDeleted.PositionEventNumber.Value); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromStreamPosition(Phase, _stream, -1); - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - return checkpointTag.Mode_ == CheckpointTag.Mode.Stream && checkpointTag.Streams.Keys.First() == _stream; - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, - tag.Phase), "tag"); - - - if (tag.Mode_ == CheckpointTag.Mode.Stream) { - long p; - return CheckpointTag.FromStreamPosition( - tag.Phase, _stream, tag.Streams.TryGetValue(_stream, out p) ? p : -1); - } - - switch (tag.Mode_) { - case CheckpointTag.Mode.EventTypeIndex: - throw new NotSupportedException( - "Conversion from EventTypeIndex to Stream position tag is not supported"); - case CheckpointTag.Mode.PreparePosition: - throw new NotSupportedException( - "Conversion from PreparePosition to Stream position tag is not supported"); - case CheckpointTag.Mode.MultiStream: - long p; - return CheckpointTag.FromStreamPosition( - tag.Phase, _stream, tag.Streams.TryGetValue(_stream, out p) ? p : -1); - case CheckpointTag.Mode.Position: - throw new NotSupportedException("Conversion from Position to Stream position tag is not supported"); - default: - throw new NotSupportedException(string.Format( - "The given checkpoint is invalid. Possible causes might include having written an event to the projection's managed stream. The bad checkpoint: {0}", - tag.ToString())); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/SourceDefinitionBuilder.cs b/src/EventStore.Projections.Core/Services/Processing/SourceDefinitionBuilder.cs deleted file mode 100644 index 82ba9393d..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/SourceDefinitionBuilder.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing { - public sealed class SourceDefinitionBuilder : IQuerySources - { - private readonly QuerySourceOptions _options = new QuerySourceOptions(); - private bool _allStreams; - private List _categories; - private List _streams; - private bool _allEvents; - private List _events; - private bool _byStream; - private bool _byCustomPartitions; - private long? _limitingCommitPosition; - - public SourceDefinitionBuilder() { - _options.DefinesFold = true; - } - - public void FromAll() { - _allStreams = true; - } - - public void FromCategory(string categoryName) { - if (_categories == null) - _categories = new List(); - _categories.Add(categoryName); - } - - public void FromStream(string streamName) { - if (_streams == null) - _streams = new List(); - _streams.Add(streamName); - } - - public void AllEvents() { - _allEvents = true; - } - - public void NotAllEvents() { - _allEvents = false; - } - - public void SetIncludeLinks(bool includeLinks = true) { - _options.IncludeLinks = includeLinks; - } - - public void IncludeEvent(string eventName) { - if (_events == null) - _events = new List(); - _events.Add(eventName); - } - - public void SetByStream() { - _byStream = true; - } - - public void SetByCustomPartitions() { - _byCustomPartitions = true; - } - - public void SetDefinesStateTransform() { - _options.DefinesStateTransform = true; - } - - public void SetOutputState() { - _options.ProducesResults = true; - } - - public void NoWhen() { - _options.DefinesFold = false; - } - - public void SetDefinesFold() { - _options.DefinesFold = true; - } - - public void SetResultStreamNameOption(string resultStreamName) { - _options.ResultStreamName = String.IsNullOrWhiteSpace(resultStreamName) ? null : resultStreamName; - } - - public void SetPartitionResultStreamNamePatternOption(string partitionResultStreamNamePattern) { - _options.PartitionResultStreamNamePattern = String.IsNullOrWhiteSpace(partitionResultStreamNamePattern) - ? null - : partitionResultStreamNamePattern; - } - - public void SetReorderEvents(bool reorderEvents) { - _options.ReorderEvents = reorderEvents; - } - - public void SetProcessingLag(int processingLag) { - _options.ProcessingLag = processingLag; - } - - public void SetIsBiState(bool isBiState) { - _options.IsBiState = isBiState; - } - - public void SetHandlesStreamDeletedNotifications(bool value = true) { - _options.HandlesDeletedNotifications = value; - } - - public bool AllStreams { - get { return _allStreams; } - } - - public string[] Categories { - get { return _categories != null ? _categories.ToArray() : null; } - } - - public string[] Streams { - get { return _streams != null ? _streams.ToArray() : null; } - } - - bool IQuerySources.AllEvents { - get { return _allEvents; } - } - - public string[] Events { - get { return _events != null ? _events.ToArray() : null; } - } - - public bool ByStreams { - get { return _byStream; } - } - - public bool ByCustomPartitions { - get { return _byCustomPartitions; } - } - - public long? LimitingCommitPosition { - get { return _limitingCommitPosition; } - } - - public bool DefinesStateTransform { - get { return _options.DefinesStateTransform; } - } - - public bool ProducesResults { - get { return _options.ProducesResults; } - } - - public bool DefinesFold { - get { return _options.DefinesFold; } - } - - public bool HandlesDeletedNotifications { - get { return _options.HandlesDeletedNotifications; } - } - - public bool IncludeLinksOption { - get { return _options.IncludeLinks; } - } - - public string ResultStreamNameOption { - get { return _options.ResultStreamName; } - } - - public string PartitionResultStreamNamePatternOption { - get { return _options.PartitionResultStreamNamePattern; } - } - - public bool ReorderEventsOption { - get { return _options.ReorderEvents; } - } - - public int? ProcessingLagOption { - get { return _options.ProcessingLag; } - } - - public bool IsBiState { - get { return _options.IsBiState; } - } - - public static IQuerySources From(Action configure) { - var b = new SourceDefinitionBuilder(); - configure(b); - return b.Build(); - } - - public IQuerySources Build() { - return QuerySourcesDefinition.From(this); - } - - public void SetLimitingCommitPosition(long limitingCommitPosition) { - _limitingCommitPosition = limitingCommitPosition; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/StagedProcessingQueue.cs b/src/EventStore.Projections.Core/Services/Processing/StagedProcessingQueue.cs deleted file mode 100644 index b15673189..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/StagedProcessingQueue.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace EventStore.Projections.Core.Services.Processing { - /// - /// Staged processing queue allows queued processing of multi-step tasks. The - /// processing order allows multiple tasks to be processed at the same time with a constraint - /// a) ordered stage: all preceding tasks in the queue has already started processing at the given stage. - /// b) unordered stage: no items with the same correlation_id are in the queue before current item - /// - /// For instance: multiple foreach sub-projections can request state to be loaded, then they can process - /// it and store. But no subprojection can process events prior to preceding projections has completed processing. - /// - public class StagedProcessingQueue { - private class TaskEntry { - public readonly StagedTask Task; - public readonly long Sequence; - public bool Busy; - public object BusyCorrelationId; - public TaskEntry PreviousByCorrelation; - public TaskEntry NextByCorrelation; - public TaskEntry Next; - public bool Completed; - public int ReadForStage; - - public TaskEntry(StagedTask task, long sequence) { - Task = task; - ReadForStage = -1; - Sequence = sequence; - } - - public override string ToString() { - return string.Format("ReadForStage: {3}, Busy: {1}, Completed: {2} => {0}", Task, Busy, Completed, - ReadForStage); - } - } - - private class StageEntry { - public TaskEntry Entry; - public StageEntry Next; - } - - private readonly bool[] _orderedStage; - private readonly Dictionary _correlationLastEntries = new Dictionary(); - private StageEntry[] _byUnorderedStageFirst; // null means all processed? so append need to set it? - private StageEntry[] _byUnorderedStageLast; // null means all processed? so append need to set it? - private TaskEntry[] _byOrderedStageLast; // null means all processed? so append need to set it? - private long _sequence = 0; - private TaskEntry _first; - private TaskEntry _last; - private int _count; - private readonly int _maxStage; - public event Action EnsureTickPending; - - public StagedProcessingQueue(bool[] orderedStage) { - _orderedStage = orderedStage.ToArray(); - _byUnorderedStageFirst = new StageEntry[_orderedStage.Length]; - _byUnorderedStageLast = new StageEntry[_orderedStage.Length]; - _byOrderedStageLast = new TaskEntry[_orderedStage.Length]; - _maxStage = _orderedStage.Length - 1; - } - - public bool IsEmpty { - get { return _count == 0; } - } - - public int Count { - get { return _count; } - } - - public void Enqueue(StagedTask stagedTask) { - var entry = new TaskEntry(stagedTask, ++_sequence); - if (_first == null) { - _first = entry; - _last = entry; - _count = 1; - } else { - _last.Next = entry; - _last = entry; - _count++; - } - - // re-initialize already completed queues - for (var stage = 0; stage <= _maxStage; stage++) - if (_orderedStage[stage] && _byOrderedStageLast[stage] == null) - _byOrderedStageLast[stage] = entry; - - SetEntryCorrelation(entry, stagedTask.InitialCorrelationId); - EnqueueForStage(entry, 0); - } - - public bool Process(int max = 1) { - int processed = 0; - int fromStage = _maxStage; - while (_count > 0 && processed < max) { - RemoveCompleted(); - var entry = GetEntryToProcess(fromStage); - if (entry == null) - break; - ProcessEntry(entry); - fromStage = entry.ReadForStage; - processed++; - } - - return processed > 0; - } - - private void ProcessEntry(TaskEntry entry) { - // here we should be at the first StagedTask of current processing level which is not busy - entry.Busy = true; - AdvanceStage(entry.ReadForStage, entry); - entry.Task.Process( - entry.ReadForStage, - (readyForStage, newCorrelationId) => CompleteTaskProcessing(entry, readyForStage, newCorrelationId)); - } - - private TaskEntry GetEntryToProcess(int fromStage) { - var stageIndex = fromStage; - while (stageIndex >= 0) { - TaskEntry task = null; - if (!_orderedStage[stageIndex]) { - if (_byUnorderedStageFirst[stageIndex] != null - && _byUnorderedStageFirst[stageIndex].Entry.PreviousByCorrelation == null) { - var stageEntry = _byUnorderedStageFirst[stageIndex]; - task = stageEntry.Entry; - } - } else { - var taskEntry = _byOrderedStageLast[stageIndex]; - if (taskEntry != null && taskEntry.ReadForStage == stageIndex && !taskEntry.Busy - && !taskEntry.Completed && taskEntry.PreviousByCorrelation == null) - task = taskEntry; - } - - if (task == null) { - stageIndex--; - continue; - } - - if (task.ReadForStage != stageIndex) - throw new Exception(); - return task; - } - - return null; - } - - private void RemoveCompleted() { - while (_first != null && _first.Completed) { - var task = _first; - _first = task.Next; - if (_first == null) - _last = null; - _count--; - if (task.BusyCorrelationId != null) { - var nextByCorrelation = task.NextByCorrelation; - if (nextByCorrelation != null) { - if (nextByCorrelation.PreviousByCorrelation != task) - throw new Exception("Invalid linked list by correlation"); - task.NextByCorrelation = null; - nextByCorrelation.PreviousByCorrelation = null; - if (!_orderedStage[nextByCorrelation.ReadForStage]) - EnqueueForStage(nextByCorrelation, nextByCorrelation.ReadForStage); - } else { - // remove the last one - _correlationLastEntries.Remove(task.BusyCorrelationId); - } - } - } - } - - private void CompleteTaskProcessing(TaskEntry entry, int readyForStage, object newCorrelationId) { - if (!entry.Busy) - throw new InvalidOperationException("Task was not in progress"); - entry.Busy = false; - SetEntryCorrelation(entry, newCorrelationId); - if (readyForStage < 0) { - MarkCompletedTask(entry); - if (entry == _first) - RemoveCompleted(); - } else - EnqueueForStage(entry, readyForStage); - - if (EnsureTickPending != null) - EnsureTickPending(); - } - - private void EnqueueForStage(TaskEntry entry, int readyForStage) { - entry.ReadForStage = readyForStage; - if (!_orderedStage[readyForStage] && (entry.PreviousByCorrelation == null)) { - var stageEntry = new StageEntry {Entry = entry, Next = null}; - if (_byUnorderedStageFirst[readyForStage] != null) { - _byUnorderedStageLast[readyForStage].Next = stageEntry; - _byUnorderedStageLast[readyForStage] = stageEntry; - } else { - _byUnorderedStageFirst[readyForStage] = stageEntry; - _byUnorderedStageLast[readyForStage] = stageEntry; - } - } - } - - private void AdvanceStage(int stage, TaskEntry entry) { - if (!_orderedStage[stage]) { - if (_byUnorderedStageFirst[stage].Entry != entry) - throw new ArgumentException( - string.Format("entry is not a head of the queue at the stage {0}", stage), "entry"); - _byUnorderedStageFirst[stage] = _byUnorderedStageFirst[stage].Next; - if (_byUnorderedStageFirst[stage] == null) - _byUnorderedStageLast[stage] = null; - } else { - if (_byOrderedStageLast[stage] != entry) - throw new ArgumentException( - string.Format("entry is not a head of the queue at the stage {0}", stage), "entry"); - _byOrderedStageLast[stage] = entry.Next; - } - } - - private void SetEntryCorrelation(TaskEntry entry, object newCorrelationId) { - if (!Equals(entry.BusyCorrelationId, newCorrelationId)) { - if (entry.ReadForStage != -1 && !_orderedStage[entry.ReadForStage]) - throw new InvalidOperationException("Cannot set busy correlation id at non-ordered stage"); - if (entry.BusyCorrelationId != null) - throw new InvalidOperationException("Busy correlation id has been already set"); - - entry.BusyCorrelationId = newCorrelationId; - if (newCorrelationId != null) { - TaskEntry lastEntry; - if (_correlationLastEntries.TryGetValue(newCorrelationId, out lastEntry)) { - if (entry.Sequence < lastEntry.Sequence) - //NOTE: should never happen as we require ordered stage or initialization - throw new InvalidOperationException( - "Cannot inject task correlation id before another task with the same correlation id"); - lastEntry.NextByCorrelation = entry; - entry.PreviousByCorrelation = lastEntry; - _correlationLastEntries[newCorrelationId] = entry; - } else - _correlationLastEntries.Add(newCorrelationId, entry); - } - } - } - - private void MarkCompletedTask(TaskEntry entry) { - entry.Completed = true; - } - - public void Initialize() { - _correlationLastEntries.Clear(); - _byUnorderedStageFirst = new StageEntry[_orderedStage.Length]; - _byUnorderedStageLast = new StageEntry[_orderedStage.Length]; - _byOrderedStageLast = new TaskEntry[_orderedStage.Length]; - _count = 0; - _first = null; - _last = null; - } - } - - public abstract class StagedTask { - public readonly object InitialCorrelationId; - - protected StagedTask(object initialCorrelationId) { - InitialCorrelationId = initialCorrelationId; - } - - public abstract void Process(int onStage, Action readyForStage); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/ContinuousProjectionProcessingStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/ContinuousProjectionProcessingStrategy.cs deleted file mode 100644 index 2868e5217..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/ContinuousProjectionProcessingStrategy.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public class ContinuousProjectionProcessingStrategy : DefaultProjectionProcessingStrategy { - public ContinuousProjectionProcessingStrategy( - string name, ProjectionVersion projectionVersion, IProjectionStateHandler stateHandler, - ProjectionConfig projectionConfig, IQuerySources sourceDefinition, ILogger logger, - ReaderSubscriptionDispatcher subscriptionDispatcher, bool enableContentTypeValidation) - : base( - name, projectionVersion, stateHandler, projectionConfig, sourceDefinition, logger, - subscriptionDispatcher, enableContentTypeValidation) { - } - - public override bool GetStopOnEof() { - return false; - } - - public override bool GetUseCheckpoints() { - return _projectionConfig.CheckpointsEnabled; - } - - public override bool GetProducesRunningResults() { - return _sourceDefinition.ProducesResults; - } - - protected override IProjectionProcessingPhase[] CreateProjectionProcessingPhases( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - ProjectionNamesBuilder namingBuilder, - PartitionStateCache partitionStateCache, - CoreProjection coreProjection, - IODispatcher ioDispatcher, - IProjectionProcessingPhase firstPhase) { - return new IProjectionProcessingPhase[] {firstPhase}; - } - - protected override IResultEventEmitter CreateFirstPhaseResultEmitter(ProjectionNamesBuilder namingBuilder) { - return _sourceDefinition.ProducesResults - ? new ResultEventEmitter(namingBuilder) - : (IResultEventEmitter)new NoopResultEventEmitter(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/DefaultProjectionProcessingStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/DefaultProjectionProcessingStrategy.cs deleted file mode 100644 index 0f54cdf73..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/DefaultProjectionProcessingStrategy.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public abstract class DefaultProjectionProcessingStrategy : EventReaderBasedProjectionProcessingStrategy { - private readonly IProjectionStateHandler _stateHandler; - - protected DefaultProjectionProcessingStrategy( - string name, ProjectionVersion projectionVersion, IProjectionStateHandler stateHandler, - ProjectionConfig projectionConfig, IQuerySources sourceDefinition, ILogger logger, - ReaderSubscriptionDispatcher subscriptionDispatcher, bool enableContentTypeValidation) - : base(name, projectionVersion, projectionConfig, sourceDefinition, logger, subscriptionDispatcher, enableContentTypeValidation) { - _stateHandler = stateHandler; - } - - protected override IProjectionProcessingPhase CreateFirstProcessingPhase( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - PartitionStateCache partitionStateCache, - Action updateStatistics, - CoreProjection coreProjection, - ReaderSubscriptionDispatcher subscriptionDispatcher, - CheckpointTag zeroCheckpointTag, - ICoreProjectionCheckpointManager checkpointManager, - IReaderStrategy readerStrategy, - IResultWriter resultWriter, - IEmittedStreamsTracker emittedStreamsTracker) { - var statePartitionSelector = CreateStatePartitionSelector(); - - var orderedPartitionProcessing = _sourceDefinition.ByStreams && _sourceDefinition.IsBiState; - return new EventProcessingProjectionProcessingPhase( - coreProjection, - projectionCorrelationId, - publisher, - inputQueue, - _projectionConfig, - updateStatistics, - _stateHandler, - partitionStateCache, - _sourceDefinition.DefinesStateTransform, - _name, - _logger, - zeroCheckpointTag, - checkpointManager, - statePartitionSelector, - subscriptionDispatcher, - readerStrategy, - resultWriter, - _projectionConfig.CheckpointsEnabled, - this.GetStopOnEof(), - _sourceDefinition.IsBiState, - orderedPartitionProcessing: orderedPartitionProcessing, - emittedStreamsTracker: emittedStreamsTracker, - enableContentTypeValidation: _enableContentTypeValidation); - } - - protected virtual StatePartitionSelector CreateStatePartitionSelector() { - return _sourceDefinition.ByCustomPartitions - ? new ByHandleStatePartitionSelector(_stateHandler) - : (_sourceDefinition.ByStreams - ? (StatePartitionSelector)new ByStreamStatePartitionSelector() - : new NoopStatePartitionSelector()); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/EventReaderBasedProjectionProcessingStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/EventReaderBasedProjectionProcessingStrategy.cs deleted file mode 100644 index 86062f955..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/EventReaderBasedProjectionProcessingStrategy.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.Strategies; - -public abstract class EventReaderBasedProjectionProcessingStrategy : ProjectionProcessingStrategy { - protected readonly ProjectionConfig _projectionConfig; - protected readonly IQuerySources _sourceDefinition; - private readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - private readonly bool _isBiState; - protected readonly bool _enableContentTypeValidation; - - protected EventReaderBasedProjectionProcessingStrategy( - string name, ProjectionVersion projectionVersion, ProjectionConfig projectionConfig, - IQuerySources sourceDefinition, Serilog.ILogger logger, ReaderSubscriptionDispatcher subscriptionDispatcher, bool enableContentTypeValidation) - : base(name, projectionVersion, logger) { - _projectionConfig = projectionConfig; - _sourceDefinition = sourceDefinition; - _subscriptionDispatcher = subscriptionDispatcher; - _isBiState = sourceDefinition.IsBiState; - _enableContentTypeValidation = enableContentTypeValidation; - } - - public override sealed IProjectionProcessingPhase[] CreateProcessingPhases( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - PartitionStateCache partitionStateCache, - Action updateStatistics, - CoreProjection coreProjection, - ProjectionNamesBuilder namingBuilder, - ITimeProvider timeProvider, - IODispatcher ioDispatcher, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter) { - var definesFold = _sourceDefinition.DefinesFold; - - var readerStrategy = CreateReaderStrategy(timeProvider); - - var zeroCheckpointTag = readerStrategy.PositionTagger.MakeZeroCheckpointTag(); - - var checkpointManager = CreateCheckpointManager( - projectionCorrelationId, - publisher, - ioDispatcher, - namingBuilder, - coreProjectionCheckpointWriter, - definesFold, - readerStrategy); - - var resultWriter = CreateFirstPhaseResultWriter( - checkpointManager as IEmittedEventWriter, - zeroCheckpointTag, - namingBuilder); - - var emittedStreamsTracker = new EmittedStreamsTracker(ioDispatcher, _projectionConfig, namingBuilder); - - var firstPhase = CreateFirstProcessingPhase( - publisher, - inputQueue, - projectionCorrelationId, - partitionStateCache, - updateStatistics, - coreProjection, - _subscriptionDispatcher, - zeroCheckpointTag, - checkpointManager, - readerStrategy, - resultWriter, - emittedStreamsTracker); - - return CreateProjectionProcessingPhases( - publisher, - inputQueue, - projectionCorrelationId, - namingBuilder, - partitionStateCache, - coreProjection, - ioDispatcher, - firstPhase); - } - - protected abstract IProjectionProcessingPhase CreateFirstProcessingPhase( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - PartitionStateCache partitionStateCache, - Action updateStatistics, - CoreProjection coreProjection, - ReaderSubscriptionDispatcher subscriptionDispatcher, - CheckpointTag zeroCheckpointTag, - ICoreProjectionCheckpointManager checkpointManager, - IReaderStrategy readerStrategy, - IResultWriter resultWriter, - IEmittedStreamsTracker emittedStreamsTracker); - - protected virtual IReaderStrategy CreateReaderStrategy(ITimeProvider timeProvider) { - return ReaderStrategy.Create( - _name, - 0, - _sourceDefinition, - timeProvider, - _projectionConfig.StopOnEof, - _projectionConfig.RunAs); - } - - protected abstract IResultEventEmitter CreateFirstPhaseResultEmitter(ProjectionNamesBuilder namingBuilder); - - protected abstract IProjectionProcessingPhase[] CreateProjectionProcessingPhases( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - ProjectionNamesBuilder namingBuilder, - PartitionStateCache partitionStateCache, - CoreProjection coreProjection, - IODispatcher ioDispatcher, - IProjectionProcessingPhase firstPhase); - - protected override IQuerySources GetSourceDefinition() { - return _sourceDefinition; - } - - public override bool GetRequiresRootPartition() { - return !(_sourceDefinition.ByStreams || _sourceDefinition.ByCustomPartitions) || _isBiState; - } - - public override void EnrichStatistics(ProjectionStatistics info) { - //TODO: get rid of this cast - info.ResultStreamName = _sourceDefinition.ResultStreamNameOption; - } - - protected virtual ICoreProjectionCheckpointManager CreateCheckpointManager( - Guid projectionCorrelationId, IPublisher publisher, IODispatcher ioDispatcher, - ProjectionNamesBuilder namingBuilder, CoreProjectionCheckpointWriter coreProjectionCheckpointWriter, - bool definesFold, IReaderStrategy readerStrategy) { - var emitAny = _projectionConfig.EmitEventEnabled; - - //NOTE: not emitting one-time/transient projections are always handled by default checkpoint manager - // as they don't depend on stable event order - if (emitAny && !readerStrategy.IsReadingOrderRepeatable) { - return new MultiStreamMultiOutputCheckpointManager( - publisher, projectionCorrelationId, _projectionVersion, _projectionConfig.RunAs, ioDispatcher, - _projectionConfig, _name, readerStrategy.PositionTagger, namingBuilder, - _projectionConfig.CheckpointsEnabled, GetProducesRunningResults(), definesFold, - coreProjectionCheckpointWriter); - } else { - return new DefaultCheckpointManager( - publisher, projectionCorrelationId, _projectionVersion, _projectionConfig.RunAs, ioDispatcher, - _projectionConfig, _name, readerStrategy.PositionTagger, namingBuilder, - _projectionConfig.CheckpointsEnabled, GetProducesRunningResults(), definesFold, - coreProjectionCheckpointWriter); - } - } - - protected virtual IResultWriter CreateFirstPhaseResultWriter( - IEmittedEventWriter emittedEventWriter, CheckpointTag zeroCheckpointTag, - ProjectionNamesBuilder namingBuilder) { - return new ResultWriter( - CreateFirstPhaseResultEmitter(namingBuilder), emittedEventWriter, GetProducesRunningResults(), - zeroCheckpointTag, namingBuilder.GetPartitionCatalogStreamName()); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/IReaderStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/IReaderStrategy.cs deleted file mode 100644 index 439fe679a..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/IReaderStrategy.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public interface IReaderStrategy { - bool IsReadingOrderRepeatable { get; } - EventFilter EventFilter { get; } - PositionTagger PositionTagger { get; } - - IReaderSubscription CreateReaderSubscription( - IPublisher publisher, CheckpointTag fromCheckpointTag, Guid subscriptionId, - ReaderSubscriptionOptions readerSubscriptionOptions); - - IEventReader CreatePausedEventReader( - Guid eventReaderId, IPublisher publisher, IODispatcher ioDispatcher, CheckpointTag checkpointTag, - bool stopOnEof, int? stopAfterNEvents); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/IResultWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/IResultWriter.cs deleted file mode 100644 index 7e3655f9d..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/IResultWriter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public interface IResultWriter { - //NOTE: subscriptionId should not be here. Reconsider how to pass it to follower projection result writer - void WriteEofResult( - Guid subscriptionId, string partition, string resultBody, CheckpointTag causedBy, Guid causedByGuid, - string correlationId); - - void WriteRunningResult(EventProcessedResult result); - - void AccountPartition(EventProcessedResult result); - - void EventsEmitted(EmittedEventEnvelope[] scheduledWrites, Guid causedBy, string correlationId); - - void WriteProgress(Guid subscriptionId, float progress); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/ProcessingStrategySelector.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/ProcessingStrategySelector.cs deleted file mode 100644 index 9ec9d1480..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/ProcessingStrategySelector.cs +++ /dev/null @@ -1,44 +0,0 @@ -using EventStore.Projections.Core.Messages; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public class ProcessingStrategySelector { - private readonly ILogger _logger = Serilog.Log.ForContext(); - private readonly ReaderSubscriptionDispatcher _subscriptionDispatcher; - - public ProcessingStrategySelector( - ReaderSubscriptionDispatcher subscriptionDispatcher) { - _subscriptionDispatcher = subscriptionDispatcher; - } - - public ProjectionProcessingStrategy CreateProjectionProcessingStrategy( - string name, - ProjectionVersion projectionVersion, - ProjectionNamesBuilder namesBuilder, - IQuerySources sourceDefinition, - ProjectionConfig projectionConfig, - IProjectionStateHandler stateHandler, string handlerType, string query, bool enableContentTypeValidation) { - - return projectionConfig.StopOnEof - ? (ProjectionProcessingStrategy) - new QueryProcessingStrategy( - name, - projectionVersion, - stateHandler, - projectionConfig, - sourceDefinition, - _logger, - _subscriptionDispatcher, - enableContentTypeValidation) - : new ContinuousProjectionProcessingStrategy( - name, - projectionVersion, - stateHandler, - projectionConfig, - sourceDefinition, - _logger, - _subscriptionDispatcher, - enableContentTypeValidation); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/ProjectionProcessingStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/ProjectionProcessingStrategy.cs deleted file mode 100644 index 6e4311e08..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/ProjectionProcessingStrategy.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public abstract class ProjectionProcessingStrategy { - protected readonly string _name; - protected readonly ProjectionVersion _projectionVersion; - protected readonly ILogger _logger; - - protected ProjectionProcessingStrategy(string name, ProjectionVersion projectionVersion, ILogger logger) { - _name = name; - _projectionVersion = projectionVersion; - _logger = logger; - } - - public CoreProjection Create( - Guid projectionCorrelationId, - IPublisher inputQueue, - Guid workerId, - ClaimsPrincipal runAs, - IPublisher publisher, - IODispatcher ioDispatcher, - ReaderSubscriptionDispatcher subscriptionDispatcher, - ITimeProvider timeProvider) { - if (inputQueue == null) throw new ArgumentNullException("inputQueue"); - //if (runAs == null) throw new ArgumentNullException("runAs"); - if (publisher == null) throw new ArgumentNullException("publisher"); - if (ioDispatcher == null) throw new ArgumentNullException("ioDispatcher"); - if (timeProvider == null) throw new ArgumentNullException("timeProvider"); - - var namingBuilder = new ProjectionNamesBuilder(_name, GetSourceDefinition()); - - var coreProjectionCheckpointWriter = - new CoreProjectionCheckpointWriter( - namingBuilder.MakeCheckpointStreamName(), - ioDispatcher, - _projectionVersion, - namingBuilder.EffectiveProjectionName); - - var partitionStateCache = new PartitionStateCache(); - - return new CoreProjection( - this, - _projectionVersion, - projectionCorrelationId, - inputQueue, - workerId, - runAs, - publisher, - ioDispatcher, - subscriptionDispatcher, - _logger, - namingBuilder, - coreProjectionCheckpointWriter, - partitionStateCache, - namingBuilder.EffectiveProjectionName, - timeProvider); - } - - protected abstract IQuerySources GetSourceDefinition(); - - public abstract bool GetStopOnEof(); - public abstract bool GetUseCheckpoints(); - public abstract bool GetRequiresRootPartition(); - public abstract bool GetProducesRunningResults(); - public abstract void EnrichStatistics(ProjectionStatistics info); - - public abstract IProjectionProcessingPhase[] CreateProcessingPhases( - IPublisher publisher, - IPublisher inputQueue, - Guid projectionCorrelationId, - PartitionStateCache partitionStateCache, - Action updateStatistics, - CoreProjection coreProjection, - ProjectionNamesBuilder namingBuilder, - ITimeProvider timeProvider, - IODispatcher ioDispatcher, - CoreProjectionCheckpointWriter coreProjectionCheckpointWriter); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/QueryProcessingStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/QueryProcessingStrategy.cs deleted file mode 100644 index b56b05b2f..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/QueryProcessingStrategy.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.UserManagement; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; -using ILogger = Serilog.ILogger; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public class QueryProcessingStrategy : DefaultProjectionProcessingStrategy { - public QueryProcessingStrategy( - string name, ProjectionVersion projectionVersion, IProjectionStateHandler stateHandler, - ProjectionConfig projectionConfig, IQuerySources sourceDefinition, ILogger logger, - ReaderSubscriptionDispatcher subscriptionDispatcher, bool enableContentTypeValidation) - : base( - name, projectionVersion, stateHandler, projectionConfig, sourceDefinition, logger, - subscriptionDispatcher, enableContentTypeValidation) { - } - - public override bool GetStopOnEof() { - return true; - } - - public override bool GetUseCheckpoints() { - return false; - } - - public override bool GetProducesRunningResults() { - return !_sourceDefinition.DefinesFold; - } - - protected override IProjectionProcessingPhase[] CreateProjectionProcessingPhases( - IPublisher publisher, IPublisher inputQueue, Guid projectionCorrelationId, - ProjectionNamesBuilder namingBuilder, - PartitionStateCache partitionStateCache, CoreProjection coreProjection, IODispatcher ioDispatcher, - IProjectionProcessingPhase firstPhase) { - var coreProjectionCheckpointWriter = - new CoreProjectionCheckpointWriter( - namingBuilder.MakeCheckpointStreamName(), ioDispatcher, _projectionVersion, _name); - var checkpointManager2 = new DefaultCheckpointManager( - publisher, projectionCorrelationId, _projectionVersion, SystemAccounts.System, ioDispatcher, - _projectionConfig, _name, new PhasePositionTagger(1), namingBuilder, GetUseCheckpoints(), false, - _sourceDefinition.DefinesFold, coreProjectionCheckpointWriter); - - IProjectionProcessingPhase writeResultsPhase; - if (GetProducesRunningResults()) - writeResultsPhase = new WriteQueryEofProjectionProcessingPhase( - publisher, - 1, - namingBuilder.GetResultStreamName(), - coreProjection, - partitionStateCache, - checkpointManager2, - checkpointManager2, - firstPhase.EmittedStreamsTracker); - else - writeResultsPhase = new WriteQueryResultProjectionProcessingPhase( - publisher, - 1, - namingBuilder.GetResultStreamName(), - coreProjection, - partitionStateCache, - checkpointManager2, - checkpointManager2, - firstPhase.EmittedStreamsTracker); - - return new[] {firstPhase, writeResultsPhase}; - } - - protected override IResultEventEmitter CreateFirstPhaseResultEmitter(ProjectionNamesBuilder namingBuilder) { - return new ResultEventEmitter(namingBuilder); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/ReaderStrategy.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/ReaderStrategy.cs deleted file mode 100644 index a942778b6..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/ReaderStrategy.cs +++ /dev/null @@ -1,296 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.AllStream; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.EventByType; -using EventStore.Projections.Core.Services.Processing.MultiStream; -using EventStore.Projections.Core.Services.Processing.SingleStream; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public class ReaderStrategy : IReaderStrategy { - private readonly bool _allStreams; - private readonly HashSet _categories; - private readonly HashSet _streams; - private readonly bool _allEvents; - private readonly bool _includeLinks; - private readonly HashSet _events; - private readonly bool _includeStreamDeletedNotification; - private readonly bool _reorderEvents; - private readonly ClaimsPrincipal _runAs; - private readonly int _processingLag; - - - private readonly EventFilter _eventFilter; - private readonly PositionTagger _positionTagger; - private readonly ITimeProvider _timeProvider; - - private readonly string _tag; - private readonly int _phase; - - public static IReaderStrategy Create( - string tag, - int phase, - IQuerySources sources, - ITimeProvider timeProvider, - bool stopOnEof, - ClaimsPrincipal runAs) { - if (!sources.AllStreams && !sources.HasCategories() && !sources.HasStreams()) - throw new InvalidOperationException("None of streams and categories are included"); - if (!sources.AllEvents && !sources.HasEvents()) - throw new InvalidOperationException("None of events are included"); - if (sources.HasStreams() && sources.HasCategories()) - throw new InvalidOperationException( - "Streams and categories cannot be included in a filter at the same time"); - if (sources.AllStreams && (sources.HasCategories() || sources.HasStreams())) - throw new InvalidOperationException("Both FromAll and specific categories/streams cannot be set"); - if (sources.AllEvents && sources.HasEvents()) - throw new InvalidOperationException("Both AllEvents and specific event filters cannot be set"); - - if (sources.ByStreams && sources.HasStreams()) - throw new InvalidOperationException( - "foreachStream projections are not supported on stream based sources"); - - if (sources.ReorderEventsOption) { - if (sources.AllStreams) - throw new InvalidOperationException("Event reordering cannot be used with fromAll()"); - if (!(sources.HasStreams() && sources.Streams.Length > 1)) { - throw new InvalidOperationException( - "Event reordering is only available in fromStreams([]) projections"); - } - - if (sources.ProcessingLagOption < 50) - throw new InvalidOperationException("Event reordering requires processing lag at least of 50ms"); - } - - if (sources.HandlesDeletedNotifications && !sources.ByStreams) - throw new InvalidOperationException( - "Deleted stream notifications are only supported with foreachStream()"); - - var readerStrategy = new ReaderStrategy( - tag, - phase, - sources.AllStreams, - sources.Categories, - sources.Streams, - sources.AllEvents, - sources.IncludeLinksOption, - sources.Events, - sources.HandlesDeletedNotifications, - sources.ProcessingLagOption, - sources.ReorderEventsOption, - runAs, - timeProvider); - return readerStrategy; - } - - private ReaderStrategy( - string tag, - int phase, - bool allStreams, - string[] categories, - string[] streams, - bool allEvents, - bool includeLinks, - string[] events, - bool includeStreamDeletedNotification, - int? processingLag, - bool reorderEvents, - ClaimsPrincipal runAs, - ITimeProvider timeProvider) { - _tag = tag; - _phase = phase; - _allStreams = allStreams; - _categories = categories != null && categories.Length > 0 ? new HashSet(categories) : null; - _streams = streams != null && streams.Length > 0 ? new HashSet(streams) : null; - _allEvents = allEvents; - _includeLinks = includeLinks; - _events = events != null && events.Length > 0 ? new HashSet(events) : null; - _includeStreamDeletedNotification = includeStreamDeletedNotification; - _processingLag = processingLag.GetValueOrDefault(); - _reorderEvents = reorderEvents; - _runAs = runAs; - - _eventFilter = CreateEventFilter(); - _positionTagger = CreatePositionTagger(); - _timeProvider = timeProvider; - } - - public bool IsReadingOrderRepeatable { - get { return !(_streams != null && _streams.Count > 1); } - } - - public EventFilter EventFilter { - get { return _eventFilter; } - } - - public PositionTagger PositionTagger { - get { return _positionTagger; } - } - - public int Phase { - get { return _phase; } - } - - public IReaderSubscription CreateReaderSubscription( - IPublisher publisher, CheckpointTag fromCheckpointTag, Guid subscriptionId, - ReaderSubscriptionOptions readerSubscriptionOptions) { - if (_reorderEvents) - return new EventReorderingReaderSubscription( - publisher, - subscriptionId, - fromCheckpointTag, - this, - _timeProvider, - readerSubscriptionOptions.CheckpointUnhandledBytesThreshold, - readerSubscriptionOptions.CheckpointProcessedEventsThreshold, - readerSubscriptionOptions.CheckpointAfterMs, - _processingLag, - readerSubscriptionOptions.StopOnEof, - readerSubscriptionOptions.StopAfterNEvents, - readerSubscriptionOptions.EnableContentTypeValidation); - else - return new ReaderSubscription( - _tag, - publisher, - subscriptionId, - fromCheckpointTag, - this, - _timeProvider, - readerSubscriptionOptions.CheckpointUnhandledBytesThreshold, - readerSubscriptionOptions.CheckpointProcessedEventsThreshold, - readerSubscriptionOptions.CheckpointAfterMs, - readerSubscriptionOptions.StopOnEof, - readerSubscriptionOptions.StopAfterNEvents, - readerSubscriptionOptions.EnableContentTypeValidation); - } - - public IEventReader CreatePausedEventReader( - Guid eventReaderId, IPublisher publisher, IODispatcher ioDispatcher, CheckpointTag checkpointTag, - bool stopOnEof, int? stopAfterNEvents) { - if (_allStreams && _events != null && _events.Count >= 1) { - //IEnumerable streams = GetEventIndexStreams(); - return CreatePausedEventIndexEventReader( - eventReaderId, ioDispatcher, publisher, checkpointTag, stopOnEof, stopAfterNEvents, true, _events, - _includeStreamDeletedNotification); - } - - if (_allStreams) { - var eventReader = new TransactionFileEventReader(publisher, eventReaderId, _runAs, - new TFPos(checkpointTag.CommitPosition.Value, checkpointTag.PreparePosition.Value), _timeProvider, - deliverEndOfTFPosition: true, stopOnEof: stopOnEof, resolveLinkTos: false); - return eventReader; - } - - if (_streams != null && _streams.Count == 1) { - var streamName = checkpointTag.Streams.Keys.First(); - //TODO: handle if not the same - return CreatePausedStreamEventReader( - eventReaderId, ioDispatcher, publisher, checkpointTag, streamName, stopOnEof, resolveLinkTos: true, - stopAfterNEvents: stopAfterNEvents, produceStreamDeletes: _includeStreamDeletedNotification); - } - - if (_categories != null && _categories.Count == 1) { - var streamName = checkpointTag.Streams.Keys.First(); - return CreatePausedStreamEventReader( - eventReaderId, ioDispatcher, publisher, checkpointTag, streamName, stopOnEof, resolveLinkTos: true, - stopAfterNEvents: stopAfterNEvents, produceStreamDeletes: _includeStreamDeletedNotification); - } - - if (_streams != null && _streams.Count > 1) { - return CreatePausedMultiStreamEventReader( - eventReaderId, ioDispatcher, publisher, checkpointTag, stopOnEof, stopAfterNEvents, true, _streams); - } - - throw new NotSupportedException(); - } - - //TODO: clean up $deleted event notification vs $streamDeleted event - - private EventFilter CreateEventFilter() { - if (_allStreams && _events != null && _events.Count >= 1) - return new EventByTypeIndexEventFilter(_events); - if (_allStreams) - //NOTE: a projection cannot handle both stream deleted notifications - // and real stream tombstone/stream deleted events as they have the same position - // and thus processing cannot be correctly checkpointed - return new TransactionFileEventFilter( - _allEvents, !_includeStreamDeletedNotification, _events, includeLinks: _includeLinks); - if (_categories != null && _categories.Count == 1) - return new CategoryEventFilter(_categories.First(), _allEvents, _events); - if (_categories != null) - throw new NotSupportedException(); - if (_streams != null && _streams.Count == 1) - return new StreamEventFilter(_streams.First(), _allEvents, _events); - if (_streams != null && _streams.Count > 1) - return new MultiStreamEventFilter(_streams, _allEvents, _events); - throw new NotSupportedException(); - } - - private PositionTagger CreatePositionTagger() { - if (_allStreams && _events != null && _events.Count >= 1) - return new EventByTypeIndexPositionTagger(_phase, _events.ToArray(), _includeStreamDeletedNotification); - if (_allStreams && _reorderEvents) - return new PreparePositionTagger(_phase); - if (_allStreams) - return new TransactionFilePositionTagger(_phase); - if (_categories != null && _categories.Count == 1) - //TODO: '-' is a hardcoded separator - return new StreamPositionTagger(_phase, "$ce-" + _categories.First()); - if (_categories != null) - throw new NotSupportedException(); - if (_streams != null && _streams.Count == 1) - return new StreamPositionTagger(_phase, _streams.First()); - if (_streams != null && _streams.Count > 1) - return new MultiStreamPositionTagger(_phase, _streams.ToArray()); - //TODO: consider passing projection phase from outside (above) - throw new NotSupportedException(); - } - - - private IEventReader CreatePausedStreamEventReader( - Guid eventReaderId, IODispatcher ioDispatcher, IPublisher publisher, CheckpointTag checkpointTag, - string streamName, bool stopOnEof, int? stopAfterNEvents, bool resolveLinkTos, bool produceStreamDeletes) { - var lastProcessedSequenceNumber = checkpointTag.Streams.Values.First(); - var fromSequenceNumber = lastProcessedSequenceNumber + 1; - var eventReader = new StreamEventReader(publisher, eventReaderId, _runAs, streamName, fromSequenceNumber, - _timeProvider, - resolveLinkTos, produceStreamDeletes, stopOnEof); - return eventReader; - } - - private IEventReader CreatePausedEventIndexEventReader( - Guid eventReaderId, IODispatcher ioDispatcher, IPublisher publisher, CheckpointTag checkpointTag, - bool stopOnEof, int? stopAfterNEvents, bool resolveLinkTos, IEnumerable eventTypes, - bool includeStreamDeletedNotification) { - //NOTE: just optimization - anyway if reading from TF events may reappear - long p; - var nextPositions = eventTypes.ToDictionary( - v => "$et-" + v, v => checkpointTag.Streams.TryGetValue(v, out p) ? p + 1 : 0); - - if (includeStreamDeletedNotification) - nextPositions.Add("$et-$deleted", checkpointTag.Streams.TryGetValue("$deleted", out p) ? p + 1 : 0); - - return new EventByTypeIndexEventReader(publisher, eventReaderId, _runAs, eventTypes.ToArray(), - includeStreamDeletedNotification, - checkpointTag.Position, nextPositions, resolveLinkTos, _timeProvider, stopOnEof); - } - - private IEventReader CreatePausedMultiStreamEventReader( - Guid eventReaderId, IODispatcher ioDispatcher, IPublisher publisher, CheckpointTag checkpointTag, - bool stopOnEof, int? stopAfterNEvents, bool resolveLinkTos, IEnumerable streams) { - var nextPositions = checkpointTag.Streams.ToDictionary(v => v.Key, v => v.Value + 1); - - return new MultiStreamEventReader( - ioDispatcher, publisher, eventReaderId, _runAs, Phase, streams.ToArray(), nextPositions, resolveLinkTos, - _timeProvider, stopOnEof, stopAfterNEvents); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Strategies/ResultWriter.cs b/src/EventStore.Projections.Core/Services/Processing/Strategies/ResultWriter.cs deleted file mode 100644 index 82eac71c6..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Strategies/ResultWriter.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Services.Processing.Strategies { - public class ResultWriter : IResultWriter { - private readonly IResultEventEmitter _resultEventEmitter; - private readonly IEmittedEventWriter _coreProjectionCheckpointManager; - private readonly bool _producesRunningResults; - private readonly CheckpointTag _zeroCheckpointTag; - private readonly string _partitionCatalogStreamName; - - public ResultWriter( - IResultEventEmitter resultEventEmitter, IEmittedEventWriter coreProjectionCheckpointManager, - bool producesRunningResults, CheckpointTag zeroCheckpointTag, string partitionCatalogStreamName) { - _resultEventEmitter = resultEventEmitter; - _coreProjectionCheckpointManager = coreProjectionCheckpointManager; - _producesRunningResults = producesRunningResults; - _zeroCheckpointTag = zeroCheckpointTag; - _partitionCatalogStreamName = partitionCatalogStreamName; - } - - public void WriteEofResult( - Guid subscriptionId, string partition, string resultBody, CheckpointTag causedBy, Guid causedByGuid, - string correlationId) { - if (resultBody != null) - WriteResult(partition, resultBody, causedBy, causedByGuid, correlationId); - } - - private void WriteResult( - string partition, string resultBody, CheckpointTag causedBy, Guid causedByGuid, string correlationId) { - var resultEvents = ResultUpdated(partition, resultBody, causedBy); - if (resultEvents != null) - _coreProjectionCheckpointManager.EventsEmitted(resultEvents, causedByGuid, correlationId); - } - - public void WriteRunningResult(EventProcessedResult result) { - if (!_producesRunningResults) - return; - var oldState = result.OldState; - var newState = result.NewState; - var resultBody = newState.Result; - if (oldState.Result != resultBody) { - var partition = result.Partition; - var causedBy = newState.CausedBy; - WriteResult( - partition, resultBody, causedBy, result.CausedBy, result.CorrelationId); - } - } - - private EmittedEventEnvelope[] ResultUpdated(string partition, string result, CheckpointTag causedBy) { - return _resultEventEmitter.ResultUpdated(partition, result, causedBy); - } - - protected EmittedEventEnvelope[] RegisterNewPartition(string partition, CheckpointTag at) { - return new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _partitionCatalogStreamName, Guid.NewGuid(), "$partition", false, partition, - null, at, null)) - }; - } - - public void AccountPartition(EventProcessedResult result) { - if (_producesRunningResults) - if (result.Partition != "" && result.OldState.CausedBy == _zeroCheckpointTag) { - var resultEvents = RegisterNewPartition(result.Partition, result.CheckpointTag); - if (resultEvents != null) - _coreProjectionCheckpointManager.EventsEmitted( - resultEvents, Guid.Empty, correlationId: null); - } - } - - public void EventsEmitted( - EmittedEventEnvelope[] scheduledWrites, Guid causedBy, string correlationId) { - _coreProjectionCheckpointManager.EventsEmitted( - scheduledWrites, causedBy, correlationId); - } - - public void WriteProgress(Guid subscriptionId, float progress) { - // intentionally does nothing - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/EventReorderingReaderSubscription.cs b/src/EventStore.Projections.Core/Services/Processing/Subscriptions/EventReorderingReaderSubscription.cs deleted file mode 100644 index 8bbe15ad8..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/EventReorderingReaderSubscription.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; - -namespace EventStore.Projections.Core.Services.Processing.Subscriptions { - public class EventReorderingReaderSubscription : ReaderSubscriptionBase, IReaderSubscription { - private readonly SortedList _buffer = - new SortedList(); - - private readonly int _processingLagMs; - - public EventReorderingReaderSubscription( - IPublisher publisher, - Guid subscriptionId, - CheckpointTag @from, - IReaderStrategy readerStrategy, - ITimeProvider timeProvider, - long? checkpointUnhandledBytesThreshold, - int? checkpointProcessedEventsThreshold, - int checkpointAfterMs, - int processingLagMs, - bool stopOnEof, - int? stopAfterNEvents, - bool enableContentTypeValidation) - : base( - publisher, - subscriptionId, - @from, - readerStrategy, - timeProvider, - checkpointUnhandledBytesThreshold, - checkpointProcessedEventsThreshold, - checkpointAfterMs, - stopOnEof, - stopAfterNEvents, - enableContentTypeValidation) { - _processingLagMs = processingLagMs; - } - - public void Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - if (message.Data == null) - throw new NotSupportedException(); - ReaderSubscriptionMessage.CommittedEventDistributed existing; - // ignore duplicate messages (when replaying from heading event distribution point) - if (!_buffer.TryGetValue(message.Data.Position.PreparePosition, out existing)) { - _buffer.Add(message.Data.Position.PreparePosition, message); - var maxTimestamp = _buffer.Max(v => v.Value.Data.Timestamp); - ProcessAllFor(maxTimestamp); - } - } - - private void ProcessAllFor(DateTime maxTimestamp) { - //NOTE: this is the most straightforward implementation - //TODO: build proper data structure when the approach is finalized - bool processed; - do { - processed = ProcessFor(maxTimestamp); - } while (processed); - } - - private bool ProcessFor(DateTime maxTimestamp) { - if (_buffer.Count == 0) - return false; - var first = _buffer.ElementAt(0); - if ((maxTimestamp - first.Value.Data.Timestamp).TotalMilliseconds > _processingLagMs) { - _buffer.RemoveAt(0); - ProcessOne(first.Value); - return true; - } - - return false; - } - - public void Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - ProcessAllFor(message.IdleTimestampUtc); - } - - - protected override void EofReached() { - // flush all available events as wqe reached eof (currently onetime projections only) - ProcessAllFor(DateTime.MaxValue); - } - - public new void Handle(ReaderSubscriptionMessage.EventReaderPartitionEof message) { - throw new NotSupportedException(); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - throw new NotSupportedException(); - } - - public void Handle(ReaderSubscriptionMessage.ReportProgress message) { - NotifyProgress(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/IReaderSubscription.cs b/src/EventStore.Projections.Core/Services/Processing/Subscriptions/IReaderSubscription.cs deleted file mode 100644 index 8c8728404..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/IReaderSubscription.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services.Processing.Subscriptions { - public interface IReaderSubscription : IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle, - IHandle { - string Tag { get; } - Guid SubscriptionId { get; } - IEventReader CreatePausedEventReader(IPublisher publisher, IODispatcher ioDispatcher, Guid forkedEventReaderId); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscription.cs b/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscription.cs deleted file mode 100644 index 698b04e64..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscription.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; - -namespace EventStore.Projections.Core.Services.Processing.Subscriptions { - public class ReaderSubscription : ReaderSubscriptionBase, IReaderSubscription { - public ReaderSubscription( - string tag, - IPublisher publisher, - Guid subscriptionId, - CheckpointTag @from, - IReaderStrategy readerStrategy, - ITimeProvider timeProvider, - long? checkpointUnhandledBytesThreshold, - int? checkpointProcessedEventsThreshold, - int checkpointAfterMs, - bool stopOnEof, - int? stopAfterNEvents, - bool enableContentTypeValidation) - : base( - publisher, - subscriptionId, - @from, - readerStrategy, - timeProvider, - checkpointUnhandledBytesThreshold, - checkpointProcessedEventsThreshold, - checkpointAfterMs, - stopOnEof, - stopAfterNEvents, - enableContentTypeValidation) { - _tag = tag; - } - - public void Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - ProcessOne(message); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - ForceProgressValue(100); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - if (!base._eventFilter.PassesDeleteNotification(message.PositionStreamId)) - return; - var deletePosition = _positionTagger.MakeCheckpointTag(_positionTracker.LastTag, message); - PublishPartitionDeleted(message.Partition, deletePosition); - } - - public void Handle(ReaderSubscriptionMessage.ReportProgress message) { - NotifyProgress(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionBase.cs b/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionBase.cs deleted file mode 100644 index 3a4fd00c5..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionBase.cs +++ /dev/null @@ -1,257 +0,0 @@ -using System; -using System.Diagnostics; -using EventStore.Core.Bus; -using EventStore.Core.Helpers; -using EventStore.Core.Services.TimerService; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Strategies; -using Serilog; - -namespace EventStore.Projections.Core.Services.Processing.Subscriptions { - public class ReaderSubscriptionBase { - private readonly IPublisher _publisher; - private readonly IReaderStrategy _readerStrategy; - private readonly ITimeProvider _timeProvider; - private readonly long? _checkpointUnhandledBytesThreshold; - private readonly int? _checkpointProcessedEventsThreshold; - private readonly bool _stopOnEof; - private readonly int? _stopAfterNEvents; - protected readonly EventFilter _eventFilter; - protected readonly PositionTagger _positionTagger; - protected readonly PositionTracker _positionTracker; - private long? _lastPassedOrCheckpointedEventPosition; - private float _progress = -1; - private long _subscriptionMessageSequenceNumber; - private int _eventsSinceLastCheckpointSuggestedOrStart; - private readonly Guid _subscriptionId; - private bool _eofReached; - protected string _tag; - private TimeSpan _checkpointAfter; - private DateTime _lastCheckpointTime = DateTime.MinValue; - private bool _enableContentTypeValidation; - private ILogger _logger; - private CheckpointTag _lastCheckpointTag; - - protected ReaderSubscriptionBase( - IPublisher publisher, - Guid subscriptionId, - CheckpointTag @from, - IReaderStrategy readerStrategy, - ITimeProvider timeProvider, - long? checkpointUnhandledBytesThreshold, - int? checkpointProcessedEventsThreshold, - int checkpointAfterMs, - bool stopOnEof, - int? stopAfterNEvents, - bool enableContentTypeValidation) { - if (publisher == null) throw new ArgumentNullException("publisher"); - if (readerStrategy == null) throw new ArgumentNullException("readerStrategy"); - if (timeProvider == null) throw new ArgumentNullException("timeProvider"); - if (checkpointProcessedEventsThreshold > 0 && stopAfterNEvents > 0) - throw new ArgumentException("checkpointProcessedEventsThreshold > 0 && stopAfterNEvents > 0"); - - _publisher = publisher; - _readerStrategy = readerStrategy; - _timeProvider = timeProvider; - _checkpointUnhandledBytesThreshold = checkpointUnhandledBytesThreshold; - _checkpointProcessedEventsThreshold = checkpointProcessedEventsThreshold; - _checkpointAfter = TimeSpan.FromMilliseconds(checkpointAfterMs); - _stopOnEof = stopOnEof; - _stopAfterNEvents = stopAfterNEvents; - _subscriptionId = subscriptionId; - _lastPassedOrCheckpointedEventPosition = null; - - _eventFilter = readerStrategy.EventFilter; - - _positionTagger = readerStrategy.PositionTagger; - _positionTracker = new PositionTracker(_positionTagger); - _positionTracker.UpdateByCheckpointTagInitial(@from); - _lastCheckpointTag = _positionTracker.LastTag; - _enableContentTypeValidation = enableContentTypeValidation; - _logger = Serilog.Log.ForContext(); - } - - public string Tag { - get { return _tag; } - } - - public Guid SubscriptionId { - get { return _subscriptionId; } - } - - protected void ProcessOne(ReaderSubscriptionMessage.CommittedEventDistributed message) { - if (_eofReached) - return; // eof may be set by reach N events - - // NOTE: we may receive here messages from heading event distribution point - // and they may not pass out source filter. Discard them first - var roundedProgress = (float)Math.Round(message.Progress, 1); - bool progressChanged = _progress != roundedProgress; - - bool passesStreamSourceFilter = _eventFilter.PassesSource(message.Data.ResolvedLinkTo, message.Data.PositionStreamId, message.Data.EventType); - bool passesEventFilter = _eventFilter.Passes(message.Data.ResolvedLinkTo, message.Data.PositionStreamId, message.Data.EventType, message.Data.IsStreamDeletedEvent); - bool isValid = !_enableContentTypeValidation || _eventFilter.PassesValidation(message.Data.IsJson, message.Data.Data); - if (!isValid) { - _logger.Verbose($"Event {message.Data.EventSequenceNumber}@{message.Data.EventStreamId} is not valid json. Data: ({message.Data.Data})"); - } - - CheckpointTag eventCheckpointTag = null; - - if (passesStreamSourceFilter) { - // NOTE: after joining heading distribution point it delivers all cached events to the subscription - // some of this events we may have already received. The delivered events may have different order - // (in case of partially ordered cases multi-stream reader etc). We discard all the messages that are not - // after the last available checkpoint tag - - //NOTE: older events can appear here when replaying events from the heading event reader - // or when event-by-type-index reader reads TF and both event and resolved-event appear as output - if (!_positionTagger.IsMessageAfterCheckpointTag(_positionTracker.LastTag, message)) - return; - - eventCheckpointTag = _positionTagger.MakeCheckpointTag(_positionTracker.LastTag, message); - _positionTracker.UpdateByCheckpointTagForward(eventCheckpointTag); - } - - var now = _timeProvider.UtcNow; - var timeDifference = now - _lastCheckpointTime; - if (isValid && passesEventFilter) { - Debug.Assert(passesStreamSourceFilter, "Event passes event filter but not source filter"); - Debug.Assert(eventCheckpointTag != null, "Event checkpoint tag is null"); - - _lastPassedOrCheckpointedEventPosition = message.Data.Position.PreparePosition; - var convertedMessage = - EventReaderSubscriptionMessage.CommittedEventReceived.FromCommittedEventDistributed( - message, eventCheckpointTag, _eventFilter.GetCategory(message.Data.PositionStreamId), - _subscriptionId, _subscriptionMessageSequenceNumber++); - _publisher.Publish(convertedMessage); - _eventsSinceLastCheckpointSuggestedOrStart++; - if (_checkpointProcessedEventsThreshold > 0 - && timeDifference > _checkpointAfter - && _eventsSinceLastCheckpointSuggestedOrStart >= _checkpointProcessedEventsThreshold - && _lastCheckpointTag != _positionTracker.LastTag) - SuggestCheckpoint(message); - if (_stopAfterNEvents > 0 && _eventsSinceLastCheckpointSuggestedOrStart >= _stopAfterNEvents) - NEventsReached(); - } else { - if (_checkpointUnhandledBytesThreshold > 0 - && timeDifference > _checkpointAfter - && (_lastPassedOrCheckpointedEventPosition != null - && message.Data.Position.PreparePosition - _lastPassedOrCheckpointedEventPosition.Value - > _checkpointUnhandledBytesThreshold) - && _lastCheckpointTag != _positionTracker.LastTag) - SuggestCheckpoint(message); - else if (progressChanged) - _progress = roundedProgress; - } - - // initialize checkpointing based on first message - if (_lastPassedOrCheckpointedEventPosition == null) - _lastPassedOrCheckpointedEventPosition = message.Data.Position.PreparePosition; - } - - private void NEventsReached() { - ProcessEofAndEmitEof(); - } - - protected void NotifyProgress() { - _publisher.Publish(new EventReaderSubscriptionMessage.ProgressChanged( - _subscriptionId, - _positionTracker.LastTag, - _progress, - _subscriptionMessageSequenceNumber++)); - } - - /// - /// Forces a progression value. - /// - /// a percentage rate. For example if the progress is 42%, value parameter must be 42 - protected void ForceProgressValue(float value) { - _progress = value; - } - - protected void PublishPartitionDeleted(string partition, CheckpointTag deletePosition) { - _publisher.Publish( - new EventReaderSubscriptionMessage.PartitionDeleted( - _subscriptionId, deletePosition, partition, _subscriptionMessageSequenceNumber++)); - } - - private void PublishStartingAt(long startingLastCommitPosition) { - _publisher.Publish( - new EventReaderSubscriptionMessage.SubscriptionStarted( - _subscriptionId, _positionTracker.LastTag, startingLastCommitPosition, - _subscriptionMessageSequenceNumber++)); - } - - private void SuggestCheckpoint(ReaderSubscriptionMessage.CommittedEventDistributed message) { - _lastPassedOrCheckpointedEventPosition = message.Data.Position.PreparePosition; - _lastCheckpointTag = _positionTracker.LastTag; - _publisher.Publish( - new EventReaderSubscriptionMessage.CheckpointSuggested( - _subscriptionId, _positionTracker.LastTag, message.Progress, - _subscriptionMessageSequenceNumber++)); - _eventsSinceLastCheckpointSuggestedOrStart = 0; - _lastCheckpointTime = _timeProvider.UtcNow; - } - - public IEventReader CreatePausedEventReader(IPublisher publisher, IODispatcher ioDispatcher, - Guid eventReaderId) { - if (_eofReached) - throw new InvalidOperationException("Onetime projection has already reached the eof position"); -// _logger.Trace("Creating an event distribution point at '{lastTag}'", _positionTracker.LastTag); - return _readerStrategy.CreatePausedEventReader( - eventReaderId, publisher, ioDispatcher, _positionTracker.LastTag, _stopOnEof, _stopAfterNEvents); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderEof message) { - if (_eofReached) - return; // self eof-reached, but reader is still running - - if (_stopOnEof) - ProcessEofAndEmitEof(); - } - - private void ProcessEofAndEmitEof() { - _eofReached = true; - EofReached(); - _publisher.Publish( - new EventReaderSubscriptionMessage.EofReached( - _subscriptionId, - _positionTracker.LastTag, - _subscriptionMessageSequenceNumber++)); - // self unsubscribe - _publisher.Publish(new ReaderSubscriptionManagement.Unsubscribe(_subscriptionId)); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderPartitionEof message) { - if (_eofReached) - return; // self eof-reached, but reader is still running - - var eventCheckpointTag = _positionTagger.MakeCheckpointTag(_positionTracker.LastTag, message); - - _publisher.Publish( - new EventReaderSubscriptionMessage.PartitionEofReached( - _subscriptionId, eventCheckpointTag, message.Partition, - _subscriptionMessageSequenceNumber++)); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderNotAuthorized message) { - if (_eofReached) - return; // self eof-reached, but reader is still running - - if (_stopOnEof) { - _eofReached = true; - } - _publisher.Publish( - new EventReaderSubscriptionMessage.NotAuthorized( - _subscriptionId, _positionTracker.LastTag, _progress, _subscriptionMessageSequenceNumber++)); - } - - public void Handle(ReaderSubscriptionMessage.EventReaderStarting message) { - PublishStartingAt(message.LastCommitPosition); - } - - protected virtual void EofReached() { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionOptions.cs b/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionOptions.cs deleted file mode 100644 index 8c6c2bdbd..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/Subscriptions/ReaderSubscriptionOptions.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.Subscriptions { - public class ReaderSubscriptionOptions { - private readonly long _checkpointUnhandledBytesThreshold; - private readonly int? _checkpointProcessedEventsThreshold; - private readonly int _checkpointAfterMs; - private readonly bool _stopOnEof; - private readonly int? _stopAfterNEvents; - private readonly bool _enableContentTypeValidation; - - public ReaderSubscriptionOptions( - long checkpointUnhandledBytesThreshold, int? checkpointProcessedEventsThreshold, int checkpointAfterMs, - bool stopOnEof, int? stopAfterNEvents, bool enableContentTypeValidation) { - _checkpointUnhandledBytesThreshold = checkpointUnhandledBytesThreshold; - _checkpointProcessedEventsThreshold = checkpointProcessedEventsThreshold; - _checkpointAfterMs = checkpointAfterMs; - _stopOnEof = stopOnEof; - _stopAfterNEvents = stopAfterNEvents; - _enableContentTypeValidation = enableContentTypeValidation; - } - - public long CheckpointUnhandledBytesThreshold { - get { return _checkpointUnhandledBytesThreshold; } - } - - public int? CheckpointProcessedEventsThreshold { - get { return _checkpointProcessedEventsThreshold; } - } - - public int CheckpointAfterMs { - get { return _checkpointAfterMs; } - } - - public bool StopOnEof { - get { return _stopOnEof; } - } - - public int? StopAfterNEvents { - get { return _stopAfterNEvents; } - } - - public bool EnableContentTypeValidation { - get { return _enableContentTypeValidation; } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TaggedResolvedEvent.cs b/src/EventStore.Projections.Core/Services/Processing/TaggedResolvedEvent.cs deleted file mode 100644 index 443811650..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TaggedResolvedEvent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing { - public sealed class TaggedResolvedEvent { - public readonly ResolvedEvent ResolvedEvent; - public readonly CheckpointTag ReaderPosition; - - public TaggedResolvedEvent(ResolvedEvent resolvedEvent, CheckpointTag readerPosition) { - ResolvedEvent = resolvedEvent; - ReaderPosition = readerPosition; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.CommittedEventItem.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.CommittedEventItem.cs deleted file mode 100644 index 85096c10e..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.CommittedEventItem.cs +++ /dev/null @@ -1,28 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.TransactionFile; - -public partial class HeadingEventReader -{ - private class CommittedEventItem : HeadingEventReader.Item { - public readonly ReaderSubscriptionMessage.CommittedEventDistributed Message; - - public CommittedEventItem(ReaderSubscriptionMessage.CommittedEventDistributed message) - : base(message.Data.Position) { - Message = message; - } - - public override void Handle(IReaderSubscription subscription) { - subscription.Handle(Message); - } - - public override string ToString() { - return string.Format( - "{0} : {2}@{1}", - Message.Data.EventType, - Message.Data.PositionStreamId, - Message.Data.PositionSequenceNumber); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.Item.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.Item.cs deleted file mode 100644 index 20fc4ed30..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.Item.cs +++ /dev/null @@ -1,17 +0,0 @@ -using EventStore.Core.Data; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.TransactionFile; - -public partial class HeadingEventReader -{ - private abstract class Item { - public readonly TFPos Position; - - protected Item(TFPos position) { - Position = position; - } - - public abstract void Handle(IReaderSubscription subscription); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.PartitionDeletedItem.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.PartitionDeletedItem.cs deleted file mode 100644 index da07789bd..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.PartitionDeletedItem.cs +++ /dev/null @@ -1,20 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.TransactionFile; - -public partial class HeadingEventReader -{ - private class PartitionDeletedItem : Item { - public readonly ReaderSubscriptionMessage.EventReaderPartitionDeleted Message; - - public PartitionDeletedItem(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) - : base(message.DeleteLinkOrEventPosition.Value) { - Message = message; - } - - public override void Handle(IReaderSubscription subscription) { - subscription.Handle(Message); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.cs deleted file mode 100644 index 925c42547..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/HeadingEventReader.cs +++ /dev/null @@ -1,221 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Subscriptions; - -namespace EventStore.Projections.Core.Services.Processing.TransactionFile { - public partial class HeadingEventReader { - private IEventReader _headEventReader; - private TFPos _subscribeFromPosition = new TFPos(long.MaxValue, long.MaxValue); - - private readonly Queue _lastMessages = new Queue(); - - private readonly int _eventCacheSize; - - private readonly Dictionary _headSubscribers = - new Dictionary(); - - private Guid _eventReaderId; - - private bool _started; - - private TFPos _lastEventPosition = new TFPos(0, -1); - private TFPos _lastDeletePosition = new TFPos(0, -1); - - private IPublisher _publisher; - - public HeadingEventReader(int eventCacheSize, IPublisher publisher) { - _eventCacheSize = eventCacheSize; - _publisher = publisher; - } - - public bool Handle(ReaderSubscriptionMessage.CommittedEventDistributed message) { - EnsureStarted(); - if (message.CorrelationId != _eventReaderId) - return false; - if (message.Data == null) - return true; - - ValidateEventOrder(message); - - CacheRecentMessage(message); - DistributeMessage(message); - return true; - } - - public bool Handle(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - EnsureStarted(); - if (message.CorrelationId != _eventReaderId) - return false; - - ValidateEventOrder(message); - - - CacheRecentMessage(message); - DistributeMessage(message); - return true; - } - - public bool Handle(ReaderSubscriptionMessage.EventReaderIdle message) { - EnsureStarted(); - if (message.CorrelationId != _eventReaderId) - return false; - DistributeMessage(message); - return true; - } - - private void ValidateEventOrder(ReaderSubscriptionMessage.CommittedEventDistributed message) { - if (_lastEventPosition >= message.Data.Position || _lastDeletePosition > message.Data.Position) - throw new InvalidOperationException( - string.Format( - "Invalid committed event order. Last: '{0}' Received: '{1}' LastDelete: '{2}'", - _lastEventPosition, message.Data.Position, _lastEventPosition)); - _lastEventPosition = message.Data.Position; - } - - private void ValidateEventOrder(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - if (_lastEventPosition > message.DeleteLinkOrEventPosition.Value - || _lastDeletePosition >= message.DeleteLinkOrEventPosition.Value) - throw new InvalidOperationException( - string.Format( - "Invalid partition deleted event order. Last: '{0}' Received: '{1}' LastDelete: '{2}'", - _lastEventPosition, message.DeleteLinkOrEventPosition.Value, _lastEventPosition)); - _lastDeletePosition = message.DeleteLinkOrEventPosition.Value; - } - - public void Start(Guid eventReaderId, IEventReader eventReader) { - if (_started) - throw new InvalidOperationException("Already started"); - _eventReaderId = eventReaderId; - _headEventReader = eventReader; - //Guid.Empty means head distribution point - _started = true; // started before resume due to old style test with immediate callback - _headEventReader.Resume(); - } - - public void Stop() { - EnsureStarted(); - _headEventReader.Pause(); - _headEventReader = null; - EmptyCache(); - _started = false; - } - - public bool TrySubscribe( - Guid projectionId, IReaderSubscription readerSubscription, long fromTransactionFilePosition) { - EnsureStarted(); - if (_headSubscribers.ContainsKey(projectionId)) - throw new InvalidOperationException( - string.Format("Projection '{0}' has been already subscribed", projectionId)); - if (_subscribeFromPosition.CommitPosition <= fromTransactionFilePosition) { - if (!DispatchRecentMessagesTo(readerSubscription, fromTransactionFilePosition)) { - return false; - } - - AddSubscriber(projectionId, readerSubscription); - return true; - } - - return false; - } - - public void Unsubscribe(Guid projectionId) { - EnsureStarted(); - if (!_headSubscribers.ContainsKey(projectionId)) - throw new InvalidOperationException( - string.Format("Projection '{0}' has not been subscribed", projectionId)); - _headSubscribers.Remove(projectionId); - } - - private bool DispatchRecentMessagesTo(IReaderSubscription subscription, long fromTransactionFilePosition) { - foreach (var m in _lastMessages) { - if (m.Position.CommitPosition >= fromTransactionFilePosition) { - try { - m.Handle(subscription); - } catch (Exception ex) { - var item = m as HeadingEventReader.CommittedEventItem; - string message; - if (item != null) { - message = string.Format( - "The heading subscription failed to handle a recently cached event {0}:{1}@{2} because {3}", - item.Message.Data.EventStreamId, item.Message.Data.EventType, - item.Message.Data.PositionSequenceNumber, ex.Message); - } else { - message = string.Format( - "The heading subscription failed to handle a recently cached deleted event at position {0} because {1}", - m.Position, ex.Message); - } - - _publisher.Publish( - new EventReaderSubscriptionMessage.Failed(subscription.SubscriptionId, message)); - return false; - } - } - } - - return true; - } - - private void DistributeMessage(ReaderSubscriptionMessage.CommittedEventDistributed message) { - foreach (var subscriber in _headSubscribers.Values) { - try { - subscriber.Handle(message); - } catch (Exception ex) { - _publisher.Publish(new EventReaderSubscriptionMessage.Failed(subscriber.SubscriptionId, - string.Format("The heading subscription failed to handle an event {0}:{1}@{2} because {3}", - message.Data.EventStreamId, message.Data.EventType, message.Data.PositionSequenceNumber, - ex.Message))); - } - } - } - - private void DistributeMessage(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - foreach (var subscriber in _headSubscribers.Values) - subscriber.Handle(message); - } - - private void DistributeMessage(ReaderSubscriptionMessage.EventReaderIdle message) { - foreach (var subscriber in _headSubscribers.Values) - subscriber.Handle(message); - } - - private void CacheRecentMessage(ReaderSubscriptionMessage.CommittedEventDistributed message) { - _lastMessages.Enqueue(new HeadingEventReader.CommittedEventItem(message)); - CleanUpCache(); - } - - private void CacheRecentMessage(ReaderSubscriptionMessage.EventReaderPartitionDeleted message) { - _lastMessages.Enqueue(new HeadingEventReader.PartitionDeletedItem(message)); - CleanUpCache(); - } - - private void CleanUpCache() { - if (_lastMessages.Count > _eventCacheSize) { - var removed = _lastMessages.Dequeue(); - // as we may have multiple items at the same position it is important to - // remove them together as we may subscribe in the middle otherwise - while (_lastMessages.Count > 0 && _lastMessages.Peek().Position == removed.Position) - _lastMessages.Dequeue(); - } - - var lastAvailableCommittedEvent = _lastMessages.Peek(); - _subscribeFromPosition = lastAvailableCommittedEvent.Position; - } - - private void EmptyCache() { - _lastMessages.Clear(); - _subscribeFromPosition = new TFPos(long.MaxValue, long.MaxValue); - } - - private void AddSubscriber(Guid publishWithCorrelationId, IReaderSubscription subscription) { - _headSubscribers.Add(publishWithCorrelationId, subscription); - } - - private void EnsureStarted() { - if (!_started) - throw new InvalidOperationException("Not started"); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/PreparePositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/PreparePositionTagger.cs deleted file mode 100644 index 6a6127c28..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/PreparePositionTagger.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.AllStream { - public class PreparePositionTagger : PositionTagger { - public PreparePositionTagger(int phase) - : base(phase) { - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase < Phase) - return true; - return committedEvent.Data.Position.PreparePosition > previous.PreparePosition; - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - return CheckpointTag.FromPreparePosition(previous.Phase, committedEvent.Data.Position.PreparePosition); - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - throw new NotSupportedException(); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromPreparePosition(Phase, -1); - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - return checkpointTag.Mode_ == CheckpointTag.Mode.PreparePosition; - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format( - "Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, tag.Phase), - "tag"); - - if (tag.Mode_ == CheckpointTag.Mode.PreparePosition) - return tag; - - switch (tag.Mode_) { - case CheckpointTag.Mode.EventTypeIndex: - throw new NotSupportedException( - "Conversion from EventTypeIndex to PreparePosition position tag is not supported"); - case CheckpointTag.Mode.Stream: - throw new NotSupportedException( - "Conversion from Stream to PreparePosition position tag is not supported"); - case CheckpointTag.Mode.MultiStream: - throw new NotSupportedException( - "Conversion from MultiStream to PreparePosition position tag is not supported"); - case CheckpointTag.Mode.Position: - throw new NotSupportedException( - "Conversion from Position to PreparePosition position tag is not supported"); - default: - throw new NotSupportedException(string.Format( - "The given checkpoint is invalid. Possible causes might include having written an event to the projection's managed stream. The bad checkpoint: {0}", - tag.ToString())); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventFilter.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventFilter.cs deleted file mode 100644 index db1c05536..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventFilter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; -using EventStore.Core.Services; - -namespace EventStore.Projections.Core.Services.Processing.AllStream { - public class TransactionFileEventFilter : EventFilter { - private readonly bool _includeLinks; - - public TransactionFileEventFilter( - bool allEvents, bool includeDeletedStreamEvents, HashSet events, bool includeLinks = false) - : base(allEvents, includeDeletedStreamEvents, events) { - _includeLinks = includeLinks; - } - - protected override bool DeletedNotificationPasses(string positionStreamId) { - return true; - } - - public override bool PassesSource(bool resolvedFromLinkTo, string positionStreamId, string eventType) { - if (!_includeLinks && eventType == SystemEventTypes.LinkTo) return false; - return (_includeLinks || !resolvedFromLinkTo) - && (!SystemStreams.IsSystemStream(positionStreamId) - || SystemStreams.IsMetastream(positionStreamId) - && !SystemStreams.IsSystemStream(SystemStreams.OriginalStreamOf(positionStreamId))); - } - - public override string GetCategory(string positionStreamId) { - return null; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventReader.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventReader.cs deleted file mode 100644 index dca2f96cb..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFileEventReader.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Security.Claims; -using EventStore.Core.Bus; -using EventStore.Core.Data; -using EventStore.Core.Messages; -using EventStore.Core.Messaging; -using EventStore.Core.Services.AwakeReaderService; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Standard; - -namespace EventStore.Projections.Core.Services.Processing.AllStream { - public class TransactionFileEventReader : EventReader, - IHandle, - IHandle { - private bool _eventsRequested; - private int _maxReadCount = 250; - private TFPos _from; - private readonly bool _deliverEndOfTfPosition; - private readonly bool _resolveLinkTos; - private readonly ITimeProvider _timeProvider; - private long _lastPosition; - private bool _eof; - private Guid _pendingRequestCorrelationId; - - public TransactionFileEventReader( - IPublisher publisher, - Guid eventReaderCorrelationId, - ClaimsPrincipal readAs, - TFPos @from, - ITimeProvider timeProvider, - bool stopOnEof = false, - bool deliverEndOfTFPosition = true, - bool resolveLinkTos = true) - : base(publisher, eventReaderCorrelationId, readAs, stopOnEof) { - if (publisher == null) throw new ArgumentNullException("publisher"); - _from = @from; - _deliverEndOfTfPosition = deliverEndOfTFPosition; - _resolveLinkTos = resolveLinkTos; - _timeProvider = timeProvider; - } - - protected override bool AreEventsRequested() { - return _eventsRequested; - } - - public void Handle(ClientMessage.ReadAllEventsForwardCompleted message) { - if (_disposed) - return; - if (!_eventsRequested) - throw new InvalidOperationException("Read events has not been requested"); - if (Paused) - throw new InvalidOperationException("Paused"); - if (message.CorrelationId != _pendingRequestCorrelationId) { - return; - } - - _eventsRequested = false; - _lastPosition = message.TfLastCommitPosition; - if (message.Result == ReadAllResult.AccessDenied) { - SendNotAuthorized(); - return; - } - - var eof = (message.Events.Length == 0) && message.IsEndOfStream; - _eof = eof; - var willDispose = _stopOnEof && eof; - var oldFrom = _from; - _from = message.NextPos; - - if (!willDispose) { - PauseOrContinueProcessing(); - } - - if (eof) { - // the end - if (_deliverEndOfTfPosition) - DeliverLastCommitPosition(_from); - // allow joining heading distribution - SendIdle(); - SendEof(); - } else { - for (int index = 0; index < message.Events.Length; index++) { - var @event = message.Events[index]; - DeliverEvent(@event, message.TfLastCommitPosition, oldFrom); - } - } - } - - public void Handle(ProjectionManagementMessage.Internal.ReadTimeout message) { - if (_disposed) return; - if (Paused) return; - if (message.CorrelationId != _pendingRequestCorrelationId) return; - - _eventsRequested = false; - PauseOrContinueProcessing(); - } - - private void SendIdle() { - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderIdle(EventReaderCorrelationId, _timeProvider.UtcNow)); - } - - protected override void RequestEvents() { - if (_disposed) throw new InvalidOperationException("Disposed"); - if (_eventsRequested) - throw new InvalidOperationException("Read operation is already in progress"); - if (PauseRequested || Paused) - throw new InvalidOperationException("Paused or pause requested"); - _eventsRequested = true; - - _pendingRequestCorrelationId = Guid.NewGuid(); - var readEventsForward = CreateReadEventsMessage(_pendingRequestCorrelationId); - if (_eof) { - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), - CreateReadTimeoutMessage(_pendingRequestCorrelationId, "$all"))); - _publisher.Publish( - new AwakeServiceMessage.SubscribeAwake( - _publisher, Guid.NewGuid(), null, - new TFPos(_lastPosition, _lastPosition), readEventsForward)); - } else { - _publisher.Publish(readEventsForward); - ScheduleReadTimeoutMessage(_pendingRequestCorrelationId, "$all"); - } - } - - private void ScheduleReadTimeoutMessage(Guid correlationId, string streamId) { - _publisher.Publish(CreateReadTimeoutMessage(correlationId, streamId)); - } - - private Message CreateReadTimeoutMessage(Guid correlationId, string streamId) { - return TimerMessage.Schedule.Create( - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout), - new SendToThisEnvelope(this), - new ProjectionManagementMessage.Internal.ReadTimeout(correlationId, streamId)); - } - - private Message CreateReadEventsMessage(Guid correlationId) { - return new ClientMessage.ReadAllEventsForward( - correlationId, correlationId, new SendToThisEnvelope(this), _from.CommitPosition, - _from.PreparePosition == -1 ? _from.CommitPosition : _from.PreparePosition, _maxReadCount, - _resolveLinkTos, false, null, ReadAs, replyOnExpired: false); - } - - private void DeliverLastCommitPosition(TFPos lastPosition) { - if (_stopOnEof) - return; - _publisher.Publish( - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, null, lastPosition.PreparePosition, 100.0f, source: this.GetType())); - //TODO: check was is passed here - } - - private void DeliverEvent( - EventStore.Core.Data.ResolvedEvent @event, long lastCommitPosition, TFPos currentFrom) { - EventRecord linkEvent = @event.Link; - EventRecord targetEvent = @event.Event ?? linkEvent; - EventRecord positionEvent = (linkEvent ?? targetEvent); - - TFPos receivedPosition = @event.OriginalPosition.Value; - if (currentFrom > receivedPosition) - throw new Exception( - string.Format( - "ReadFromTF returned events in incorrect order. Last known position is: {0}. Received position is: {1}", - currentFrom, receivedPosition)); - - var resolvedEvent = new ResolvedEvent(@event, null); - - string deletedPartitionStreamId; - if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone) - return; - - bool isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEventOrLinkToStreamDeletedEvent( - resolvedEvent, @event.ResolveResult, out deletedPartitionStreamId); - - _publisher.Publish( - new ReaderSubscriptionMessage.CommittedEventDistributed( - EventReaderCorrelationId, - resolvedEvent, - _stopOnEof ? (long?)null : receivedPosition.PreparePosition, - 100.0f * positionEvent.LogPosition / lastCommitPosition, - source: this.GetType())); - if (isDeletedStreamEvent) - _publisher.Publish( - new ReaderSubscriptionMessage.EventReaderPartitionDeleted( - EventReaderCorrelationId, deletedPartitionStreamId, source: this.GetType(), lastEventNumber: -1, - deleteEventOrLinkTargetPosition: resolvedEvent.EventOrLinkTargetPosition, - deleteLinkOrEventPosition: resolvedEvent.LinkOrEventPosition, - positionStreamId: positionEvent.EventStreamId, positionEventNumber: positionEvent.EventNumber)); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFilePositionTagger.cs b/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFilePositionTagger.cs deleted file mode 100644 index 5fcc7612c..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/TransactionFile/TransactionFilePositionTagger.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.AllStream { - public class TransactionFilePositionTagger : PositionTagger { - public TransactionFilePositionTagger(int phase) - : base(phase) { - } - - public override bool IsCompatible(CheckpointTag checkpointTag) { - return checkpointTag.Mode_ == CheckpointTag.Mode.Position; - } - - public override CheckpointTag AdjustTag(CheckpointTag tag) { - if (tag.Phase < Phase) - return tag; - if (tag.Phase > Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected less or equal to: {0} Was: {1}", Phase, - tag.Phase), "tag"); - - if (tag.Mode_ == CheckpointTag.Mode.Position) - return tag; - - switch (tag.Mode_) { - case CheckpointTag.Mode.EventTypeIndex: - return CheckpointTag.FromPosition( - tag.Phase, tag.Position.CommitPosition, tag.Position.PreparePosition); - case CheckpointTag.Mode.Stream: - throw new NotSupportedException("Conversion from Stream to Position position tag is not supported"); - case CheckpointTag.Mode.MultiStream: - throw new NotSupportedException( - "Conversion from MultiStream to Position position tag is not supported"); - case CheckpointTag.Mode.PreparePosition: - throw new NotSupportedException( - "Conversion from PreparePosition to Position position tag is not supported"); - default: - throw new NotSupportedException(string.Format( - "The given checkpoint is invalid. Possible causes might include having written an event to the projection's managed stream. The bad checkpoint: {0}", - tag.ToString())); - } - } - - public override bool IsMessageAfterCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase < Phase) - return true; - if (previous.Mode_ != CheckpointTag.Mode.Position) - throw new ArgumentException("Mode.Position expected", "previous"); - return committedEvent.Data.Position > previous.Position; - } - - public override CheckpointTag MakeCheckpointTag( - CheckpointTag previous, ReaderSubscriptionMessage.CommittedEventDistributed committedEvent) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - return CheckpointTag.FromPosition(previous.Phase, committedEvent.Data.Position); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionEof partitionEof) { - throw new NotImplementedException(); - } - - public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, - ReaderSubscriptionMessage.EventReaderPartitionDeleted partitionDeleted) { - if (previous.Phase != Phase) - throw new ArgumentException( - string.Format("Invalid checkpoint tag phase. Expected: {0} Was: {1}", Phase, previous.Phase)); - - if (partitionDeleted.DeleteLinkOrEventPosition == null) - throw new ArgumentException( - "Invalid partiton deleted message. deleteEventOrLinkTargetPosition required"); - - return CheckpointTag.FromPosition(previous.Phase, partitionDeleted.DeleteLinkOrEventPosition.Value); - } - - public override CheckpointTag MakeZeroCheckpointTag() { - return CheckpointTag.FromPosition(Phase, 0, -1); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointSuggestedWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointSuggestedWorkItem.cs deleted file mode 100644 index 53d63e113..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointSuggestedWorkItem.cs +++ /dev/null @@ -1,49 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - public class CheckpointSuggestedWorkItem : CheckpointWorkItemBase { - private readonly IProjectionPhaseCheckpointManager _projectionPhase; - private readonly EventReaderSubscriptionMessage.CheckpointSuggested _message; - private readonly ICoreProjectionCheckpointManager _checkpointManager; - - private bool _completed = false; - private bool _completeRequested = false; - - public CheckpointSuggestedWorkItem( - IProjectionPhaseCheckpointManager projectionPhase, - EventReaderSubscriptionMessage.CheckpointSuggested message, - ICoreProjectionCheckpointManager checkpointManager) - : base() { - _projectionPhase = projectionPhase; - _message = message; - _checkpointManager = checkpointManager; - } - - protected override void WriteOutput() { - _projectionPhase.SetCurrentCheckpointSuggestedWorkItem(this); - if (_checkpointManager.CheckpointSuggested(_message.CheckpointTag, _message.Progress)) { - _projectionPhase.SetCurrentCheckpointSuggestedWorkItem(null); - _completed = true; - } - - _projectionPhase.NewCheckpointStarted(_message.CheckpointTag); - NextStage(); - } - - protected override void CompleteItem() { - if (_completed) - NextStage(); - else - _completeRequested = true; - } - - internal void CheckpointCompleted() { - if (_completeRequested) - NextStage(); - else - _completed = true; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointWorkItemBase.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointWorkItemBase.cs deleted file mode 100644 index 52a812771..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CheckpointWorkItemBase.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - public class CheckpointWorkItemBase : WorkItem { - private static readonly object _correlationId = new object(); - - protected CheckpointWorkItemBase() - : base(_correlationId) { - _requiresRunning = true; - } - - protected CheckpointWorkItemBase(object correlation) - : base(correlation) { - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CommittedEventWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/CommittedEventWorkItem.cs deleted file mode 100644 index bde4451e8..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CommittedEventWorkItem.cs +++ /dev/null @@ -1,78 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class CommittedEventWorkItem : WorkItem { - private readonly EventReaderSubscriptionMessage.CommittedEventReceived _message; - private string _partition; - private readonly IEventProcessingProjectionPhase _projection; - private readonly StatePartitionSelector _statePartitionSelector; - private EventProcessedResult _eventProcessedResult; - - public CommittedEventWorkItem( - IEventProcessingProjectionPhase projection, EventReaderSubscriptionMessage.CommittedEventReceived message, - StatePartitionSelector statePartitionSelector) - : base(null) { - _projection = projection; - _statePartitionSelector = statePartitionSelector; - _message = message; - _requiresRunning = true; - } - - protected override void RecordEventOrder() { - _projection.RecordEventOrder(_message.Data, _message.CheckpointTag, () => NextStage()); - } - - protected override void GetStatePartition() { - _partition = _statePartitionSelector.GetStatePartition(_message); - if (_partition == null) - // skip processing of events not mapped to any partition - NextStage(); - else - NextStage(_partition); - } - - protected override void Load(CheckpointTag checkpointTag) { - if (_partition == null) { - NextStage(); - return; - } - - // we load partition state even if stopping etc. should we skip? - _projection.BeginGetPartitionStateAt( - _partition, _message.CheckpointTag, LoadCompleted, lockLoaded: true); - } - - private void LoadCompleted(PartitionState state) { - NextStage(); - } - - protected override void ProcessEvent() { - if (_partition == null) { - NextStage(); - return; - } - - var eventProcessedResult = _projection.ProcessCommittedEvent(_message, _partition); - if (eventProcessedResult != null) - SetEventProcessedResult(eventProcessedResult); - NextStage(); - } - - protected override void WriteOutput() { - if (_partition == null) { - NextStage(); - return; - } - - _projection.FinalizeEventProcessing(_eventProcessedResult, _message.CheckpointTag, _message.Progress); - NextStage(); - } - - private void SetEventProcessedResult(EventProcessedResult eventProcessedResult) { - _eventProcessedResult = eventProcessedResult; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CompletedWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/CompletedWorkItem.cs deleted file mode 100644 index 82911ef0e..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/CompletedWorkItem.cs +++ /dev/null @@ -1,17 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class CompletedWorkItem : CheckpointWorkItemBase { - private readonly IProjectionPhaseCompleter _projection; - - public CompletedWorkItem(IProjectionPhaseCompleter projection) - : base() { - _projection = projection; - } - - protected override void WriteOutput() { - _projection.Complete(); - NextStage(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetDataWorkItemBase.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetDataWorkItemBase.cs deleted file mode 100644 index a6f7409c2..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetDataWorkItemBase.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - abstract class GetDataWorkItemBase : WorkItem { - protected readonly IPublisher _publisher; - protected readonly string _partition; - protected Guid _correlationId; - protected Guid _projectionId; - private readonly IProjectionPhaseStateManager _projection; - private PartitionState _state; - private CheckpointTag _lastProcessedCheckpointTag; - - protected GetDataWorkItemBase( - IPublisher publisher, - Guid correlationId, - Guid projectionId, - IProjectionPhaseStateManager projection, - string partition) - : base(null) { - if (partition == null) throw new ArgumentNullException("partition"); - _publisher = publisher; - _partition = partition; - _correlationId = correlationId; - _projectionId = projectionId; - _projection = projection; - } - - protected override void GetStatePartition() { - NextStage(_partition); - } - - protected override void Load(CheckpointTag checkpointTag) { - _lastProcessedCheckpointTag = _projection.LastProcessedEventPosition; - _projection.BeginGetPartitionStateAt( - _partition, - _lastProcessedCheckpointTag, - LoadCompleted, - lockLoaded: false); - } - - private void LoadCompleted(PartitionState state) { - _state = state; - NextStage(); - } - - protected override void WriteOutput() { - Reply(_state, _lastProcessedCheckpointTag); - NextStage(); - } - - protected abstract void Reply(PartitionState state, CheckpointTag checkpointTag); - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetResultWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetResultWorkItem.cs deleted file mode 100644 index 102c87eba..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetResultWorkItem.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class GetResultWorkItem : GetDataWorkItemBase { - public GetResultWorkItem( - IPublisher publisher, - Guid correlationId, - Guid projectionId, - IProjectionPhaseStateManager projection, - string partition) - : base(publisher, correlationId, projectionId, projection, partition) { - } - - protected override void Reply(PartitionState state, CheckpointTag checkpointTag) { - if (state == null) - _publisher.Publish( - new CoreProjectionStatusMessage.ResultReport( - _correlationId, - _projectionId, - _partition, - null, - checkpointTag)); - else - _publisher.Publish( - new CoreProjectionStatusMessage.ResultReport( - _correlationId, - _projectionId, - _partition, - state.Result, - checkpointTag)); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetStateWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetStateWorkItem.cs deleted file mode 100644 index 99cea4f2b..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/GetStateWorkItem.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using EventStore.Core.Bus; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class GetStateWorkItem : GetDataWorkItemBase { - public GetStateWorkItem( - IPublisher publisher, - Guid correlationId, - Guid projectionId, - IProjectionPhaseStateManager projection, - string partition) - : base(publisher, correlationId, projectionId, projection, partition) { - } - - protected override void Reply(PartitionState state, CheckpointTag checkpointTag) { - if (state == null) - _publisher.Publish( - new CoreProjectionStatusMessage.StateReport( - _correlationId, - _projectionId, - _partition, - null, - checkpointTag)); - else - _publisher.Publish( - new CoreProjectionStatusMessage.StateReport( - _correlationId, - _projectionId, - _partition, - state.State, - checkpointTag)); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/NotAuthorizedWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/NotAuthorizedWorkItem.cs deleted file mode 100644 index a4889e5bb..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/NotAuthorizedWorkItem.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class NotAuthorizedWorkItem : CheckpointWorkItemBase { - public NotAuthorizedWorkItem() - : base(null) { - } - - protected override void ProcessEvent() { - throw new Exception("Projection cannot read its source. Not authorized."); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionCompletedWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionCompletedWorkItem.cs deleted file mode 100644 index ce97adeba..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionCompletedWorkItem.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class PartitionCompletedWorkItem : CheckpointWorkItemBase { - private readonly IEventProcessingProjectionPhase _projection; - private readonly ICoreProjectionCheckpointManager _checkpointManager; - private readonly string _partition; - private readonly CheckpointTag _checkpointTag; - private PartitionState _state; - - public PartitionCompletedWorkItem( - IEventProcessingProjectionPhase projection, ICoreProjectionCheckpointManager checkpointManager, - string partition, CheckpointTag checkpointTag) - : base() { - _projection = projection; - _checkpointManager = checkpointManager; - _partition = partition; - _checkpointTag = checkpointTag; - } - - protected override void Load(CheckpointTag checkpointTag) { - if (_partition == null) - throw new NotSupportedException(); - _projection.BeginGetPartitionStateAt(_partition, _checkpointTag, LoadCompleted, lockLoaded: false); - } - - private void LoadCompleted(PartitionState obj) { - _state = obj; - NextStage(); - } - - protected override void WriteOutput() { - _projection.EmitEofResult(_partition, _state.Result, _checkpointTag, Guid.Empty, null); - //NOTE: write output is an ordered processing stage - // thus all the work items before have been already processed - // and as we are processing in the stream-by-stream mode - // it is safe to clean everything before this position up - _projection.UnlockAndForgetBefore(_checkpointTag); - _checkpointManager.PartitionCompleted(_partition); - NextStage(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionDeletedWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionDeletedWorkItem.cs deleted file mode 100644 index f7fb70823..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/PartitionDeletedWorkItem.cs +++ /dev/null @@ -1,61 +0,0 @@ -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Partitioning; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class PartitionDeletedWorkItem : WorkItem { - private readonly EventReaderSubscriptionMessage.PartitionDeleted _message; - private readonly string _partition; - private readonly IEventProcessingProjectionPhase _projection; - private EventProcessedResult _eventProcessedResult; - - public PartitionDeletedWorkItem( - IEventProcessingProjectionPhase projection, EventReaderSubscriptionMessage.PartitionDeleted message) - : base(null) { - _partition = message.Partition; - _projection = projection; - _message = message; - _requiresRunning = true; - } - - protected override void GetStatePartition() { - NextStage(_partition); - } - - protected override void Load(CheckpointTag checkpointTag) { - // we load partition state even if stopping etc. should we skip? - _projection.BeginGetPartitionStateAt(_partition, _message.CheckpointTag, LoadCompleted, lockLoaded: true); - } - - private void LoadCompleted(PartitionState state) { - NextStage(); - } - - protected override void ProcessEvent() { - if (_partition == null) { - NextStage(); - return; - } - - var eventProcessedResult = _projection.ProcessPartitionDeleted(_partition, _message.CheckpointTag); - if (eventProcessedResult != null) - SetEventProcessedResult(eventProcessedResult); - NextStage(); - } - - protected override void WriteOutput() { - if (_partition == null) { - NextStage(); - return; - } - - _projection.FinalizeEventProcessing(_eventProcessedResult, _message.CheckpointTag, _message.Progress); - NextStage(); - } - - private void SetEventProcessedResult(EventProcessedResult eventProcessedResult) { - _eventProcessedResult = eventProcessedResult; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/ProgressWorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/ProgressWorkItem.cs deleted file mode 100644 index 9955fa726..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/ProgressWorkItem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Phases; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - class ProgressWorkItem : CheckpointWorkItemBase { - private readonly ICoreProjectionCheckpointManager _checkpointManager; - private readonly IProgressResultWriter _resultWriter; - private readonly float _progress; - - public ProgressWorkItem(ICoreProjectionCheckpointManager checkpointManager, IProgressResultWriter resultWriter, - float progress) - : base(null) { - _checkpointManager = checkpointManager; - _resultWriter = resultWriter; - _progress = progress; - } - - protected override void WriteOutput() { - _checkpointManager.Progress(_progress); - _resultWriter.WriteProgress(_progress); - NextStage(); - } - } -} diff --git a/src/EventStore.Projections.Core/Services/Processing/WorkItems/WorkItem.cs b/src/EventStore.Projections.Core/Services/Processing/WorkItems/WorkItem.cs deleted file mode 100644 index fc621a234..000000000 --- a/src/EventStore.Projections.Core/Services/Processing/WorkItems/WorkItem.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using EventStore.Projections.Core.Services.Processing.Checkpointing; - -namespace EventStore.Projections.Core.Services.Processing.WorkItems { - public abstract class WorkItem : StagedTask { - private readonly int _lastStage; - private Action _complete; - private int _onStage; - private CheckpointTag _checkpointTag; - private object _lastStageCorrelationId; - private CoreProjectionQueue _queue; - protected bool _requiresRunning; - - protected WorkItem(object initialCorrelationId) - : base(initialCorrelationId) { - _lastStage = 5; - } - - protected CoreProjectionQueue Queue { - get { return _queue; } - } - - public override void Process(int onStage, Action readyForStage) { - if (_checkpointTag == null) - throw new InvalidOperationException("CheckpointTag has not been initialized"); - _complete = readyForStage; - _onStage = onStage; - //TODO: - if (_requiresRunning && !Queue.IsRunning) - NextStage(); - else { - switch (onStage) { - case 0: - RecordEventOrder(); - break; - case 1: - GetStatePartition(); - break; - case 2: - Load(_checkpointTag); - break; - case 3: - ProcessEvent(); - break; - case 4: - WriteOutput(); - break; - case 5: - CompleteItem(); - break; - default: - throw new NotSupportedException(); - } - } - } - - protected virtual void RecordEventOrder() { - NextStage(); - } - - protected virtual void GetStatePartition() { - NextStage(); - } - - protected virtual void Load(CheckpointTag checkpointTag) { - NextStage(); - } - - protected virtual void ProcessEvent() { - NextStage(); - } - - protected virtual void WriteOutput() { - NextStage(); - } - - - protected virtual void CompleteItem() { - NextStage(); - } - - protected void NextStage(object newCorrelationId = null) { - _lastStageCorrelationId = newCorrelationId ?? _lastStageCorrelationId ?? InitialCorrelationId; - _complete(_onStage == _lastStage ? -1 : _onStage + 1, _lastStageCorrelationId); - } - - public void SetCheckpointTag(CheckpointTag checkpointTag) { - _checkpointTag = checkpointTag; - } - - public void SetProjectionQueue(CoreProjectionQueue coreProjectionQueue) { - _queue = coreProjectionQueue; - } - } -} diff --git a/src/EventStore.Projections.Core/Services/ProjectionConfig.cs b/src/EventStore.Projections.Core/Services/ProjectionConfig.cs deleted file mode 100644 index 453403756..000000000 --- a/src/EventStore.Projections.Core/Services/ProjectionConfig.cs +++ /dev/null @@ -1,113 +0,0 @@ -using EventStore.Projections.Core.Common; -using System; -using System.Security.Claims; -using EventStore.Core; - -namespace EventStore.Projections.Core.Services { - public class ProjectionConfig { - private readonly ClaimsPrincipal _runAs; - private readonly int _checkpointHandledThreshold; - private readonly int _checkpointUnhandledBytesThreshold; - private readonly int _pendingEventsThreshold; - private readonly int _maxWriteBatchLength; - private readonly bool _emitEventEnabled; - private readonly bool _checkpointsEnabled; - private readonly bool _createTempStreams; - private readonly bool _stopOnEof; - private readonly bool _trackEmittedStreams; - private readonly int _checkpointAfterMs; - private readonly int _maximumAllowedWritesInFlight; - - public ProjectionConfig(ClaimsPrincipal runAs, int checkpointHandledThreshold, int checkpointUnhandledBytesThreshold, - int pendingEventsThreshold, int maxWriteBatchLength, bool emitEventEnabled, bool checkpointsEnabled, - bool createTempStreams, bool stopOnEof, bool trackEmittedStreams, - int checkpointAfterMs, int maximumAllowedWritesInFlight, int? projectionExecutionTimeout) { - if (checkpointsEnabled) { - if (checkpointHandledThreshold <= 0) - throw new ArgumentOutOfRangeException("checkpointHandledThreshold"); - if (checkpointUnhandledBytesThreshold < checkpointHandledThreshold) - throw new ArgumentException( - "Checkpoint threshold cannot be less than checkpoint handled threshold"); - } else { - if (checkpointHandledThreshold != 0) - throw new ArgumentOutOfRangeException("checkpointHandledThreshold must be 0"); - if (checkpointUnhandledBytesThreshold != 0) - throw new ArgumentException("checkpointUnhandledBytesThreshold must be 0"); - } - - if (maximumAllowedWritesInFlight < AllowedWritesInFlight.Unbounded) { - throw new ArgumentException( - $"The Maximum Number of Allowed Writes in Flight cannot be less than {AllowedWritesInFlight.Unbounded}"); - } - - if (projectionExecutionTimeout is not null && projectionExecutionTimeout <= 0) { - throw new ArgumentException( - $"The projection execution timeout should be positive. Found : {projectionExecutionTimeout}"); - } - - _runAs = runAs; - _checkpointHandledThreshold = checkpointHandledThreshold; - _checkpointUnhandledBytesThreshold = checkpointUnhandledBytesThreshold; - _pendingEventsThreshold = pendingEventsThreshold; - _maxWriteBatchLength = maxWriteBatchLength; - _emitEventEnabled = emitEventEnabled; - _checkpointsEnabled = checkpointsEnabled; - _createTempStreams = createTempStreams; - _stopOnEof = stopOnEof; - _trackEmittedStreams = trackEmittedStreams; - _checkpointAfterMs = checkpointAfterMs; - _maximumAllowedWritesInFlight = maximumAllowedWritesInFlight; - ProjectionExecutionTimeout = projectionExecutionTimeout; - } - - public int CheckpointHandledThreshold { - get { return _checkpointHandledThreshold; } - } - - public int CheckpointUnhandledBytesThreshold { - get { return _checkpointUnhandledBytesThreshold; } - } - - public int MaxWriteBatchLength { - get { return _maxWriteBatchLength; } - } - - public bool EmitEventEnabled { - get { return _emitEventEnabled; } - } - - public bool CheckpointsEnabled { - get { return _checkpointsEnabled; } - } - - public int PendingEventsThreshold { - get { return _pendingEventsThreshold; } - } - - public bool CreateTempStreams { - get { return _createTempStreams; } - } - - public bool StopOnEof { - get { return _stopOnEof; } - } - - public ClaimsPrincipal RunAs { - get { return _runAs; } - } - - public bool TrackEmittedStreams { - get { return _trackEmittedStreams; } - } - - public int CheckpointAfterMs { - get { return _checkpointAfterMs; } - } - - public int MaximumAllowedWritesInFlight { - get { return _maximumAllowedWritesInFlight; } - } - - public int? ProjectionExecutionTimeout { get; } - } -} diff --git a/src/EventStore.Projections.Core/Services/ProjectionMode.cs b/src/EventStore.Projections.Core/Services/ProjectionMode.cs deleted file mode 100644 index c37c6e6d9..000000000 --- a/src/EventStore.Projections.Core/Services/ProjectionMode.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace EventStore.Projections.Core.Services { - public enum ProjectionMode { - Transient = 0, - OneTime = 1, - - //____1 = 1, - //____2 = 2, - //____3 = 3, - Continuous = 4, - AllNonTransient = 999, - } -} diff --git a/src/EventStore.Projections.Core/Services/ProjectionStatistics.cs b/src/EventStore.Projections.Core/Services/ProjectionStatistics.cs deleted file mode 100644 index 30045b9a6..000000000 --- a/src/EventStore.Projections.Core/Services/ProjectionStatistics.cs +++ /dev/null @@ -1,119 +0,0 @@ -using EventStore.Projections.Core.Services.Management; - -namespace EventStore.Projections.Core.Services { - public class ProjectionStatistics { - //TODO: resolve name collisions... - - public string Status { get; set; } - - public bool Enabled { get; set; } - - public ManagedProjectionState LeaderStatus { get; set; } - - public string StateReason { get; set; } - - public string Name { get; set; } - - public long ProjectionId { get; set; } - - public long Epoch { get; set; } - - public long Version { get; set; } - - public ProjectionMode Mode { get; set; } - - public string Position { get; set; } - - public float Progress { get; set; } - - public string LastCheckpoint { get; set; } - - public int EventsProcessedAfterRestart { get; set; } - - public int BufferedEvents { get; set; } - - public string CheckpointStatus { get; set; } - - public int WritePendingEventsBeforeCheckpoint { get; set; } - - public int WritePendingEventsAfterCheckpoint { get; set; } - - public int PartitionsCached { get; set; } - - public int ReadsInProgress { get; set; } - - public int WritesInProgress { get; set; } - - public string EffectiveName { get; set; } - - public string ResultStreamName { get; set; } - - public long CoreProcessingTime { get; set; } - - public ProjectionStatistics Clone() { - return (ProjectionStatistics)MemberwiseClone(); - } - - protected bool Equals(ProjectionStatistics other) { - return string.Equals(Status, other.Status) && Enabled.Equals(other.Enabled) - && LeaderStatus == other.LeaderStatus && - string.Equals(StateReason, other.StateReason) - && string.Equals(Name, other.Name) && - ProjectionId == other.ProjectionId && Epoch == other.Epoch - && Version == other.Version && Mode == other.Mode && - Equals(Position, other.Position) - && Progress.Equals(other.Progress) && - string.Equals(LastCheckpoint, other.LastCheckpoint) - && EventsProcessedAfterRestart == - other.EventsProcessedAfterRestart - && BufferedEvents == other.BufferedEvents && - string.Equals(CheckpointStatus, other.CheckpointStatus) - && WritePendingEventsBeforeCheckpoint == - other.WritePendingEventsBeforeCheckpoint - && WritePendingEventsAfterCheckpoint == - other.WritePendingEventsAfterCheckpoint - && PartitionsCached == other.PartitionsCached && - ReadsInProgress == other.ReadsInProgress - && WritesInProgress == other.WritesInProgress && - string.Equals(EffectiveName, other.EffectiveName) - && string.Equals(ResultStreamName, other.ResultStreamName) && - CoreProcessingTime == other.CoreProcessingTime; - } - - public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((ProjectionStatistics)obj); - } - - public override int GetHashCode() { - unchecked { - int hashCode = (Status != null ? Status.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ Enabled.GetHashCode(); - hashCode = (hashCode * 397) ^ (int)LeaderStatus; - hashCode = (hashCode * 397) ^ (StateReason != null ? StateReason.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (Name != null ? Name.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ ProjectionId.GetHashCode(); - hashCode = (hashCode * 397) ^ Epoch.GetHashCode(); - hashCode = (hashCode * 397) ^ Version.GetHashCode(); - hashCode = (hashCode * 397) ^ (int)Mode; - hashCode = (hashCode * 397) ^ (Position != null ? Position.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ Progress.GetHashCode(); - hashCode = (hashCode * 397) ^ (LastCheckpoint != null ? LastCheckpoint.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ EventsProcessedAfterRestart; - hashCode = (hashCode * 397) ^ BufferedEvents; - hashCode = (hashCode * 397) ^ (CheckpointStatus != null ? CheckpointStatus.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ WritePendingEventsBeforeCheckpoint; - hashCode = (hashCode * 397) ^ WritePendingEventsAfterCheckpoint; - hashCode = (hashCode * 397) ^ PartitionsCached; - hashCode = (hashCode * 397) ^ ReadsInProgress; - hashCode = (hashCode * 397) ^ WritesInProgress; - hashCode = (hashCode * 397) ^ (EffectiveName != null ? EffectiveName.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (ResultStreamName != null ? ResultStreamName.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ CoreProcessingTime.GetHashCode(); - return hashCode; - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/ReadWrite.cs b/src/EventStore.Projections.Core/Services/ReadWrite.cs deleted file mode 100644 index cd0dd5bcc..000000000 --- a/src/EventStore.Projections.Core/Services/ReadWrite.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace EventStore.Projections.Core.Services { - public enum ReadWrite { - Read, - Write - } -} diff --git a/src/EventStore.Projections.Core/Services/ReaderSubscriptionDispatcher.cs b/src/EventStore.Projections.Core/Services/ReaderSubscriptionDispatcher.cs deleted file mode 100644 index 1fbe0e700..000000000 --- a/src/EventStore.Projections.Core/Services/ReaderSubscriptionDispatcher.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Collections.Concurrent; -using EventStore.Core.Bus; -using EventStore.Core.Messaging; -using EventStore.Core.Services.TimerService; -using EventStore.Core.Settings; -using EventStore.Projections.Core.Messages; - -namespace EventStore.Projections.Core.Services { - public sealed class ReaderSubscriptionDispatcher { - private readonly ConcurrentDictionary _map = new(); - private readonly IPublisher _publisher; - private readonly IEnvelope _publishEnvelope; - private readonly TimeSpan _readerSubscriptionTimeout = - TimeSpan.FromMilliseconds(ESConsts.ReadRequestTimeout); - - public ReaderSubscriptionDispatcher(IPublisher publisher) { - _publisher = publisher; - _publishEnvelope = _publisher; - } - - /// - /// Publishes the message to be handled later. - /// The caller must wait for further s to determine whether - /// the subscription was successful. - /// - /// The subscription to request - /// The subscriber to call with any responses for this subscription - /// Whether to schedule a message for this subscription - /// - public void PublishSubscribe( - ReaderSubscriptionManagement.Subscribe request, object subscriber, bool scheduleTimeout) { - _map.TryAdd(request.SubscriptionId, subscriber); - _publisher.Publish(request); - if (scheduleTimeout) - ScheduleSubscriptionTimeout(request.SubscriptionId); - } - - private void ScheduleSubscriptionTimeout(Guid subscriptionId) { - _publisher.Publish(TimerMessage.Schedule.Create( - _readerSubscriptionTimeout, _publishEnvelope, - new EventReaderSubscriptionMessage.SubscribeTimeout(subscriptionId))); - } - - public void Cancel(Guid requestId) { - _map.TryRemove(requestId, out _); - } - - public IHandle CreateSubscriber() where T : EventReaderSubscriptionMessageBase { - return new Subscriber(this); - } - - private void Handle(T message) where T : EventReaderSubscriptionMessageBase { - var correlationId = message.SubscriptionId; - if (_map.TryGetValue(correlationId, out var subscriber)) { - if (subscriber is IHandle h) { - h.Handle(message); - } else if (subscriber is IAsyncHandle) { - throw new Exception($"ReaderSubscriptionDispatcher does not support asynchronous subscribers. Subscriber: {subscriber}"); - } - } - } - - public void Subscribed(Guid correlationId, object subscriber) { - _map.TryAdd(correlationId, subscriber); - } - - private class Subscriber : IHandle where T : EventReaderSubscriptionMessageBase { - private readonly ReaderSubscriptionDispatcher _host; - - public Subscriber( - ReaderSubscriptionDispatcher host) { - _host = host; - } - - public void Handle(T message) { - _host.Handle(message); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Services/SystemNames.cs b/src/EventStore.Projections.Core/Services/SystemNames.cs deleted file mode 100644 index a4668e82a..000000000 --- a/src/EventStore.Projections.Core/Services/SystemNames.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace EventStore.Projections.Core.Services { - public static class ProjectionEventTypes { - public const string ProjectionCheckpoint = "$ProjectionCheckpoint"; - public const string PartitionCheckpoint = "$Checkpoint"; - public const string StreamTracked = "$StreamTracked"; - - public const string ProjectionCreated = "$ProjectionCreated"; - public const string ProjectionDeleted = "$ProjectionDeleted"; - public const string ProjectionsInitialized = "$ProjectionsInitialized"; - public const string ProjectionUpdated = "$ProjectionUpdated"; - } -} diff --git a/src/EventStore.Projections.Core/Standard/ByCorrelationId.cs b/src/EventStore.Projections.Core/Standard/ByCorrelationId.cs deleted file mode 100644 index a695c3028..000000000 --- a/src/EventStore.Projections.Core/Standard/ByCorrelationId.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using EventStore.Common.Utils; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Standard { - public class ByCorrelationId : IProjectionStateHandler { - private readonly string _corrIdStreamPrefix; - - public ByCorrelationId(string source, Action logger) { - if (!string.IsNullOrWhiteSpace(source)) { - string correlationIdProperty; - if (!TryParseCorrelationIdProperty(source, out correlationIdProperty)) { - throw new InvalidOperationException( - "Could not parse projection source. Please make sure the source is a valid JSON string with a property: 'correlationIdProperty' having a string value"); - } - - CorrelationIdPropertyContext.CorrelationIdProperty = correlationIdProperty; - } - - _corrIdStreamPrefix = "$bc-"; - } - - private bool TryParseCorrelationIdProperty(string source, out string correlationIdProperty) { - correlationIdProperty = null; - JObject obj = null; - try { - obj = JObject.Parse(source); - string prop = obj["correlationIdProperty"].Value(); - if (prop != null) { - correlationIdProperty = prop; - return true; - } else { - return false; - } - } catch (Exception) { - return false; - } - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - builder.FromAll(); - builder.AllEvents(); - } - - public void Load(string state) { - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - } - - public void InitializeShared() { - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - emittedEvents = null; - newState = null; - if (data.EventStreamId != data.PositionStreamId) - return false; - - if (data.Metadata == null) - return false; - - JObject metadata = null; - - try { - metadata = JObject.Parse(data.Metadata); - } catch (JsonReaderException) { - return false; - } - - if (metadata[CorrelationIdPropertyContext.CorrelationIdProperty] == null) - return false; - - string correlationId = metadata[CorrelationIdPropertyContext.CorrelationIdProperty].Value(); - if (correlationId == null) - return false; - - string linkTarget; - if (data.EventType == SystemEventTypes.LinkTo) - linkTarget = data.Data; - else - linkTarget = data.EventSequenceNumber + "@" + data.EventStreamId; - - var metadataDict = new Dictionary(); - metadataDict.Add("$eventTimestamp", "\"" + data.Timestamp.ToString("yyyy-MM-ddTHH:mm:ss.ffffffZ") + "\""); - if (data.EventType == SystemEventTypes.LinkTo) { - JObject linkObj = new JObject(); - linkObj.Add("eventId", data.EventId); - linkObj.Add("metadata", metadata); - metadataDict.Add("$link", linkObj.ToJson()); - } - - var linkMetadata = new ExtraMetaData(metadataDict); - - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _corrIdStreamPrefix + correlationId, Guid.NewGuid(), "$>", false, - linkTarget, - linkMetadata, - eventPosition, - expectedTag: null)) - }; - - - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public void Dispose() { - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/CategorizeEventsByStreamPath.cs b/src/EventStore.Projections.Core/Standard/CategorizeEventsByStreamPath.cs deleted file mode 100644 index d923e0fa1..000000000 --- a/src/EventStore.Projections.Core/Standard/CategorizeEventsByStreamPath.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Standard { - public class CategorizeEventsByStreamPath : IProjectionStateHandler { - private readonly string _categoryStreamPrefix; - private readonly StreamCategoryExtractor _streamCategoryExtractor; - - public CategorizeEventsByStreamPath(string source, Action logger) { - var extractor = StreamCategoryExtractor.GetExtractor(source, logger); - // we will need to declare event types we are interested in - _categoryStreamPrefix = "$ce-"; - _streamCategoryExtractor = extractor; - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - builder.FromAll(); - builder.AllEvents(); - builder.SetIncludeLinks(); - } - - public void Load(string state) { - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - } - - public void InitializeShared() { - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - emittedEvents = null; - newState = null; - string deletedStreamId; - var isStreamDeletedEvent = StreamDeletedHelper.IsStreamDeletedEvent( - data.PositionStreamId, data.EventType, data.Data, out deletedStreamId); - - var category = _streamCategoryExtractor.GetCategoryByStreamId(isStreamDeletedEvent?deletedStreamId:data.PositionStreamId); - if (category == null) - return true; // handled but not interesting - - - string linkTarget; - if (data.EventType == SystemEventTypes.LinkTo) - linkTarget = data.Data; - else - linkTarget = data.EventSequenceNumber + "@" + data.EventStreamId; - - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedLinkToWithRecategorization( - _categoryStreamPrefix + category, Guid.NewGuid(), linkTarget, eventPosition, expectedTag: null, - originalStreamId: isStreamDeletedEvent?deletedStreamId:data.PositionStreamId, streamDeletedAt: isStreamDeletedEvent ? -1 : (int?)null)) - }; - - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public void Dispose() { - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/CategorizeStreamByPath.cs b/src/EventStore.Projections.Core/Standard/CategorizeStreamByPath.cs deleted file mode 100644 index f446b13c8..000000000 --- a/src/EventStore.Projections.Core/Standard/CategorizeStreamByPath.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Standard { - public class CategorizeStreamByPath : IProjectionStateHandler { - private readonly StreamCategoryExtractor _streamCategoryExtractor; - - public CategorizeStreamByPath(string source, Action logger) { - var extractor = StreamCategoryExtractor.GetExtractor(source, logger); - // we will need to declare event types we are interested in - _streamCategoryExtractor = extractor; - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - builder.FromAll(); - builder.AllEvents(); - builder.SetIncludeLinks(); - } - - public void Load(string state) { - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - } - - public void InitializeShared() { - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - emittedEvents = null; - newState = null; - - if (data.PositionSequenceNumber != 0) - return false; // not our event - - var category = _streamCategoryExtractor.GetCategoryByStreamId(data.PositionStreamId); - if (category == null) - return true; // handled but not interesting - - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - "$category" + "-" + category, Guid.NewGuid(), SystemEventTypes.StreamReference, false, - data.PositionStreamId, null, eventPosition, expectedTag: null)) - }; - - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public void Dispose() { - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/IndexEventsByEventType.cs b/src/EventStore.Projections.Core/Standard/IndexEventsByEventType.cs deleted file mode 100644 index 563eed0cd..000000000 --- a/src/EventStore.Projections.Core/Standard/IndexEventsByEventType.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace EventStore.Projections.Core.Standard { - public class IndexEventsByEventType : IProjectionStateHandler, IProjectionCheckpointHandler { - private readonly string _indexStreamPrefix; - private readonly string _indexCheckpointStream; - - public IndexEventsByEventType(string source, Action logger) { - if (!string.IsNullOrWhiteSpace(source)) - throw new InvalidOperationException("Empty source expected"); - if (logger != null) { -// logger("Index events by event type projection handler has been initialized"); - } - - // we will need to declare event types we are interested in - _indexStreamPrefix = "$et-"; - _indexCheckpointStream = "$et"; - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - builder.FromAll(); - builder.AllEvents(); - } - - public void Load(string state) { - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - } - - public void InitializeShared() { - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - emittedEvents = null; - newState = null; - if (data.EventStreamId != data.PositionStreamId) - return false; - var indexedEventType = data.EventType; - if (indexedEventType == "$>") - return false; - - string positionStreamId; - var isStreamDeletedEvent = StreamDeletedHelper.IsStreamDeletedEvent( - data.PositionStreamId, data.EventType, data.Data, out positionStreamId); - if (isStreamDeletedEvent) - indexedEventType = "$deleted"; - - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _indexStreamPrefix + indexedEventType, Guid.NewGuid(), "$>", false, - data.EventSequenceNumber + "@" + positionStreamId, - isStreamDeletedEvent - ? new ExtraMetaData(new Dictionary {{"$deleted", new JRaw(-1)}}) - : null, eventPosition, expectedTag: null)) - }; - - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public void Dispose() { - } - - public void ProcessNewCheckpoint(CheckpointTag checkpointPosition, out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - _indexCheckpointStream, Guid.NewGuid(), ProjectionEventTypes.PartitionCheckpoint, - true, checkpointPosition.ToJsonString(), null, checkpointPosition, expectedTag: null)) - }; - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/IndexStreams.cs b/src/EventStore.Projections.Core/Standard/IndexStreams.cs deleted file mode 100644 index d467fa5e2..000000000 --- a/src/EventStore.Projections.Core/Standard/IndexStreams.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using EventStore.Core.Services; -using EventStore.Projections.Core.Messages; -using EventStore.Projections.Core.Services; -using EventStore.Projections.Core.Services.Processing; -using EventStore.Projections.Core.Services.Processing.Checkpointing; -using EventStore.Projections.Core.Services.Processing.Emitting; -using EventStore.Projections.Core.Services.Processing.Emitting.EmittedEvents; - -namespace EventStore.Projections.Core.Standard { - public class IndexStreams : IProjectionStateHandler { - public IndexStreams(string source, Action logger) { - var trimmedSource = source == null ? null : source.Trim(); - if (!string.IsNullOrEmpty(trimmedSource)) - throw new InvalidOperationException( - "Cannot initialize categorize stream projection handler. No source is allowed."); - if (logger != null) { -// logger(string.Format("Index streams projection handler has been initialized")); - } - } - - public void ConfigureSourceProcessingStrategy(SourceDefinitionBuilder builder) { - builder.FromAll(); - builder.AllEvents(); - builder.SetIncludeLinks(); - } - - public void Load(string state) { - } - - public void LoadShared(string state) { - throw new NotImplementedException(); - } - - public void Initialize() { - } - - public void InitializeShared() { - } - - public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data) { - throw new NotImplementedException(); - } - - public bool ProcessEvent( - string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data, - out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents) { - newSharedState = null; - emittedEvents = null; - newState = null; - if (data.PositionSequenceNumber != 0) - return false; // not our event - - emittedEvents = new[] { - new EmittedEventEnvelope( - new EmittedDataEvent( - SystemStreams.StreamsStream, Guid.NewGuid(), SystemEventTypes.LinkTo, false, - data.PositionSequenceNumber + "@" + data.PositionStreamId, null, eventPosition, - expectedTag: null)) - }; - - return true; - } - - public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, - out EmittedEventEnvelope[] emittedEvents) { - emittedEvents = null; - return false; - } - - public bool ProcessPartitionDeleted(string partition, CheckpointTag deletePosition, out string newState) { - throw new NotImplementedException(); - } - - public string TransformStateToResult() { - throw new NotImplementedException(); - } - - public void Dispose() { - } - - public IQuerySources GetSourceDefinition() { - return SourceDefinitionBuilder.From(ConfigureSourceProcessingStrategy); - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractor.cs b/src/EventStore.Projections.Core/Standard/StreamCategoryExtractor.cs deleted file mode 100644 index 756e59ca8..000000000 --- a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractor.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Standard { - public abstract class StreamCategoryExtractor { - private const string ConfigurationFormatIs = "Configuration format is: \r\nfirst|last\r\nseparator"; - - public abstract string GetCategoryByStreamId(string streamId); - - public static StreamCategoryExtractor GetExtractor(string source, Action logger) { - var trimmedSource = source == null ? null : source.Trim(); - if (string.IsNullOrEmpty(source)) - throw new InvalidOperationException( - "Cannot initialize categorization projection handler. " - + "One symbol separator or configuration must be supplied in the source. " - + ConfigurationFormatIs); - - if (trimmedSource.Length == 1) { - var separator = trimmedSource[0]; - if (logger != null) { -/* - logger( - String.Format( - "Categorize stream projection handler has been initialized with separator: '{0}'", separator)); -*/ - } - - var extractor = new StreamCategoryExtractorByLastSeparator(separator); - return extractor; - } - - var parts = trimmedSource.Split(new[] {'\n'}); - - if (parts.Length != 2) - throw new InvalidOperationException( - "Cannot initialize categorization projection handler. " - + "Invalid configuration " - + ConfigurationFormatIs); - - var direction = parts[0].ToLowerInvariant().Trim(); - if (direction != "first" && direction != "last") - throw new InvalidOperationException( - "Cannot initialize categorization projection handler. " - + "Invalid direction specifier. Expected 'first' or 'last'. " - + ConfigurationFormatIs); - - var separatorLine = parts[1]; - if (separatorLine.Length != 1) - throw new InvalidOperationException( - "Cannot initialize categorization projection handler. " - + "Single separator expected. " - + ConfigurationFormatIs); - - switch (direction) { - case "first": - return new StreamCategoryExtractorByFirstSeparator(separatorLine[0]); - case "last": - return new StreamCategoryExtractorByLastSeparator(separatorLine[0]); - default: - throw new Exception(); - } - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByFirstSeparator.cs b/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByFirstSeparator.cs deleted file mode 100644 index d6c1be354..000000000 --- a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByFirstSeparator.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace EventStore.Projections.Core.Standard { - public class StreamCategoryExtractorByFirstSeparator : StreamCategoryExtractor { - private readonly char _separator; - - public StreamCategoryExtractorByFirstSeparator(char separator) { - _separator = separator; - } - - public override string GetCategoryByStreamId(string streamId) { - string category = null; - if (!streamId.StartsWith("$")) { - var lastSeparatorPosition = streamId.IndexOf(_separator); - if (lastSeparatorPosition > 0) - category = streamId.Substring(0, lastSeparatorPosition); - } - - return category; - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByLastSeparator.cs b/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByLastSeparator.cs deleted file mode 100644 index 90e89ec91..000000000 --- a/src/EventStore.Projections.Core/Standard/StreamCategoryExtractorByLastSeparator.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace EventStore.Projections.Core.Standard { - public class StreamCategoryExtractorByLastSeparator : StreamCategoryExtractor { - private readonly char _separator; - - public StreamCategoryExtractorByLastSeparator(char separator) { - _separator = separator; - } - - public override string GetCategoryByStreamId(string streamId) { - string category = null; - if (!streamId.StartsWith("$")) { - var lastSeparatorPosition = streamId.LastIndexOf(_separator); - if (lastSeparatorPosition > 0) - category = streamId.Substring(0, lastSeparatorPosition); - } - - return category; - } - } -} diff --git a/src/EventStore.Projections.Core/Standard/StreamDeletedHelper.cs b/src/EventStore.Projections.Core/Standard/StreamDeletedHelper.cs deleted file mode 100644 index b824dc2f8..000000000 --- a/src/EventStore.Projections.Core/Standard/StreamDeletedHelper.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using EventStore.Core.Data; -using EventStore.Core.Services; -using EventStore.Projections.Core.Utils; -using ResolvedEvent = EventStore.Projections.Core.Services.Processing.ResolvedEvent; - -namespace EventStore.Projections.Core.Standard { - public static class StreamDeletedHelper { - public static bool IsStreamDeletedEventOrLinkToStreamDeletedEvent(ResolvedEvent resolvedEvent, - ReadEventResult resolveResult, out string deletedPartitionStreamId) { - bool isDeletedStreamEvent; - // If the event didn't resolve, we can't rely on it as a deleted event - if (resolveResult != ReadEventResult.Success) { - deletedPartitionStreamId = null; - return false; - } - - if (resolvedEvent.IsLinkToDeletedStreamTombstone) { - isDeletedStreamEvent = true; - deletedPartitionStreamId = resolvedEvent.EventStreamId; - } else { - isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEvent( - resolvedEvent.EventStreamId, resolvedEvent.EventType, resolvedEvent.Data, - out deletedPartitionStreamId); - } - - return isDeletedStreamEvent; - } - - public static bool IsStreamDeletedEvent( - string streamOrMetaStreamId, string eventType, string eventData, out string deletedPartitionStreamId) { - if (string.IsNullOrEmpty(streamOrMetaStreamId)) { - deletedPartitionStreamId = null; - return false; - } - - bool isMetaStream; - if (SystemStreams.IsMetastream(streamOrMetaStreamId)) { - isMetaStream = true; - deletedPartitionStreamId = streamOrMetaStreamId.Substring("$$".Length); - } else { - isMetaStream = false; - deletedPartitionStreamId = streamOrMetaStreamId; - } - - var isStreamDeletedEvent = false; - if (isMetaStream) { - if (eventType == SystemEventTypes.StreamMetadata) { - var metadata = StreamMetadata.FromJson(eventData); - //NOTE: we do not ignore JSON deserialization exceptions here assuming that metadata stream events must be deserializable - - if (metadata.TruncateBefore == EventNumber.DeletedStream) - isStreamDeletedEvent = true; - } - } else { - if (eventType == SystemEventTypes.StreamDeleted) - isStreamDeletedEvent = true; - } - - return isStreamDeletedEvent; - } - - public static bool IsStreamDeletedEvent( - string streamOrMetaStreamId, string eventType, ReadOnlyMemory eventData, out string deletedPartitionStreamId) { - bool isMetaStream; - if (SystemStreams.IsMetastream(streamOrMetaStreamId)) { - isMetaStream = true; - deletedPartitionStreamId = streamOrMetaStreamId.Substring("$$".Length); - } else { - isMetaStream = false; - deletedPartitionStreamId = streamOrMetaStreamId; - } - - var isStreamDeletedEvent = false; - if (isMetaStream) { - if (eventType == SystemEventTypes.StreamMetadata) { - var metadata = StreamMetadata.FromJson(eventData.FromUtf8()); - //NOTE: we do not ignore JSON deserialization exceptions here assuming that metadata stream events must be deserializable - - if (metadata.TruncateBefore == EventNumber.DeletedStream) - isStreamDeletedEvent = true; - } - } else { - if (eventType == SystemEventTypes.StreamDeleted) - isStreamDeletedEvent = true; - } - - return isStreamDeletedEvent; - } - } -} diff --git a/src/EventStore.Projections.Core/Utils/EncodingExtensions.cs b/src/EventStore.Projections.Core/Utils/EncodingExtensions.cs deleted file mode 100644 index 23c328857..000000000 --- a/src/EventStore.Projections.Core/Utils/EncodingExtensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using EventStore.Common.Utils; - -namespace EventStore.Projections.Core.Utils { - public static class EncodingExtensions { - public static string FromUtf8(this byte[] self) { - return Helper.UTF8NoBom.GetString(self); - } - - public static string FromUtf8(this ReadOnlyMemory self) { - return Helper.UTF8NoBom.GetString(self.Span); - } - - public static byte[] ToUtf8(this string self) { - return Helper.UTF8NoBom.GetBytes(self); - } - - public static string Apply(this string format, params object[] args) { - return string.Format(format, args); - } - } -} diff --git a/src/EventStore.Projections.Core/Utils/EnumExtensions.cs b/src/EventStore.Projections.Core/Utils/EnumExtensions.cs deleted file mode 100644 index d4cca1bb8..000000000 --- a/src/EventStore.Projections.Core/Utils/EnumExtensions.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace EventStore.Projections.Core.Utils { - public static class EnumExtensions { - public static string EnumValueName(this T value) where T : struct { - return Enum.GetName(typeof(T), value); - } - } -} diff --git a/src/EventStore.UI b/src/EventStore.UI deleted file mode 160000 index 4175ff3f9..000000000 --- a/src/EventStore.UI +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4175ff3f9c18cfd5432f76e3b3a5bed868084fca diff --git a/src/EventStore.sln b/src/EventStore.sln index e176b0777..a233e89af 100644 --- a/src/EventStore.sln +++ b/src/EventStore.sln @@ -7,16 +7,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.BufferManagement EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.BufferManagement.Tests", "EventStore.BufferManagement.Tests\EventStore.BufferManagement.Tests.csproj", "{289B2A5C-9EC6-47C4-9C1B-15D4C2ADFDCD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Projections.Core.Tests", "EventStore.Projections.Core.Tests\EventStore.Projections.Core.Tests.csproj", "{96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.ClusterNode.Web", "EventStore.ClusterNode.Web\EventStore.ClusterNode.Web.csproj", "{401862D3-E12F-470C-9137-B9DE10591AC6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Common", "EventStore.Common\EventStore.Common.csproj", "{3F955137-DC23-4AC1-B7F8-6D0857234CCB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Core.Tests", "EventStore.Core.Tests\EventStore.Core.Tests.csproj", "{F0E1719C-88FF-4E44-BCBE-8B59ADA29134}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Projections.Core", "EventStore.Projections.Core\EventStore.Projections.Core.csproj", "{800E7456-4BC4-49B5-940F-1D634B687C6E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.TestClient", "EventStore.TestClient\EventStore.TestClient.csproj", "{68011903-5E41-41E2-891B-2C0B3B13C189}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Transport.Http", "EventStore.Transport.Http\EventStore.Transport.Http.csproj", "{EB8587FE-7805-4306-AD50-EBE45AB0A189}" @@ -49,10 +45,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.LogCommon", "Eve EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Core.XUnit.Tests", "EventStore.Core.XUnit.Tests\EventStore.Core.XUnit.Tests.csproj", "{101DD668-2140-4183-8C97-F641173AF736}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Projections.Core.Javascript.Tests", "EventStore.Projections.Core.Javascript.Tests\EventStore.Projections.Core.Javascript.Tests.csproj", "{1826D544-16E6-460F-A8F2-1D56B5041AE7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.MicroBenchmarks", "EventStore.MicroBenchmarks\EventStore.MicroBenchmarks.csproj", "{87F81751-192B-4263-A658-6DFC51EA557C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.SourceGenerators", "EventStore.SourceGenerators\EventStore.SourceGenerators.csproj", "{24BA3208-F690-4DD4-AECB-E339DEE0C69E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.SourceGenerators.Tests", "EventStore.SourceGenerators.Tests\EventStore.SourceGenerators.Tests.csproj", "{3C9DCA10-0006-4FA5-88CB-9CCEC1B2C522}" @@ -63,8 +55,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.PluginHosting", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.SystemRuntime", "EventStore.SystemRuntime\EventStore.SystemRuntime.csproj", "{8A023103-C4C8-4ECA-A78C-2D1BCF7A7BDB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventStore.Projections.Core.XUnit.Tests", "EventStore.Projections.Core.XUnit.Tests\EventStore.Projections.Core.XUnit.Tests.csproj", "{41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -99,18 +89,6 @@ Global {289B2A5C-9EC6-47C4-9C1B-15D4C2ADFDCD}.Release|ARM64.Build.0 = Release|ARM64 {289B2A5C-9EC6-47C4-9C1B-15D4C2ADFDCD}.Release|x64.ActiveCfg = Release|x64 {289B2A5C-9EC6-47C4-9C1B-15D4C2ADFDCD}.Release|x64.Build.0 = Release|x64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|ARM64.Build.0 = Debug|ARM64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|x64.ActiveCfg = Debug|x64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Debug|x64.Build.0 = Debug|x64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|Any CPU.Build.0 = Release|Any CPU - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|ARM64.ActiveCfg = Release|ARM64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|ARM64.Build.0 = Release|ARM64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|x64.ActiveCfg = Release|x64 - {96FC74C3-8E5D-4090-B4C7-2B7ED46AE187}.Release|x64.Build.0 = Release|x64 {401862D3-E12F-470C-9137-B9DE10591AC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {401862D3-E12F-470C-9137-B9DE10591AC6}.Debug|Any CPU.Build.0 = Debug|Any CPU {401862D3-E12F-470C-9137-B9DE10591AC6}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -147,18 +125,6 @@ Global {F0E1719C-88FF-4E44-BCBE-8B59ADA29134}.Release|ARM64.Build.0 = Release|ARM64 {F0E1719C-88FF-4E44-BCBE-8B59ADA29134}.Release|x64.ActiveCfg = Release|x64 {F0E1719C-88FF-4E44-BCBE-8B59ADA29134}.Release|x64.Build.0 = Release|x64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|ARM64.Build.0 = Debug|ARM64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|x64.ActiveCfg = Debug|x64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Debug|x64.Build.0 = Debug|x64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|Any CPU.Build.0 = Release|Any CPU - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|ARM64.ActiveCfg = Release|ARM64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|ARM64.Build.0 = Release|ARM64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|x64.ActiveCfg = Release|x64 - {800E7456-4BC4-49B5-940F-1D634B687C6E}.Release|x64.Build.0 = Release|x64 {68011903-5E41-41E2-891B-2C0B3B13C189}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68011903-5E41-41E2-891B-2C0B3B13C189}.Debug|Any CPU.Build.0 = Debug|Any CPU {68011903-5E41-41E2-891B-2C0B3B13C189}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -291,30 +257,6 @@ Global {101DD668-2140-4183-8C97-F641173AF736}.Release|ARM64.Build.0 = Release|ARM64 {101DD668-2140-4183-8C97-F641173AF736}.Release|x64.ActiveCfg = Release|x64 {101DD668-2140-4183-8C97-F641173AF736}.Release|x64.Build.0 = Release|x64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|ARM64.Build.0 = Debug|ARM64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|x64.ActiveCfg = Debug|x64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Debug|x64.Build.0 = Debug|x64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|Any CPU.Build.0 = Release|Any CPU - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|ARM64.ActiveCfg = Release|ARM64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|ARM64.Build.0 = Release|ARM64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|x64.ActiveCfg = Release|x64 - {1826D544-16E6-460F-A8F2-1D56B5041AE7}.Release|x64.Build.0 = Release|x64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|ARM64.Build.0 = Debug|ARM64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|x64.ActiveCfg = Debug|x64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Debug|x64.Build.0 = Debug|x64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|Any CPU.Build.0 = Release|Any CPU - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|ARM64.ActiveCfg = Release|ARM64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|ARM64.Build.0 = Release|ARM64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|x64.ActiveCfg = Release|x64 - {87F81751-192B-4263-A658-6DFC51EA557C}.Release|x64.Build.0 = Release|x64 {24BA3208-F690-4DD4-AECB-E339DEE0C69E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {24BA3208-F690-4DD4-AECB-E339DEE0C69E}.Debug|Any CPU.Build.0 = Debug|Any CPU {24BA3208-F690-4DD4-AECB-E339DEE0C69E}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -375,18 +317,6 @@ Global {8A023103-C4C8-4ECA-A78C-2D1BCF7A7BDB}.Release|ARM64.Build.0 = Release|ARM64 {8A023103-C4C8-4ECA-A78C-2D1BCF7A7BDB}.Release|x64.ActiveCfg = Release|x64 {8A023103-C4C8-4ECA-A78C-2D1BCF7A7BDB}.Release|x64.Build.0 = Release|x64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|ARM64.Build.0 = Debug|ARM64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|x64.ActiveCfg = Debug|x64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Debug|x64.Build.0 = Debug|x64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|Any CPU.Build.0 = Release|Any CPU - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|ARM64.ActiveCfg = Release|ARM64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|ARM64.Build.0 = Release|ARM64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|x64.ActiveCfg = Release|x64 - {41EEB66F-D77B-4FF3-BF68-DA3748C80BB5}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE