// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using FakeItEasy; using Orleans; using Orleans.Runtime; using Xunit; namespace Squidex.Infrastructure.Orleans { public class BootstrapTests { private readonly IBackgroundGrain grain = A.Fake(); private readonly GrainBootstrap sut; public BootstrapTests() { var factory = A.Fake(); sut = new GrainBootstrap(factory); A.CallTo(() => factory.GetGrain("Default", null)) .Returns(grain); } [Fact] public async Task Should_activate_grain_on_run() { await sut.StartAsync(default); A.CallTo(() => grain.ActivateAsync()) .MustHaveHappened(); } [Fact] public async Task Should_fail_on_non_rejection_exception() { A.CallTo(() => grain.ActivateAsync()) .Throws(new InvalidOperationException()); await Assert.ThrowsAsync(() => sut.StartAsync(default)); } [Fact] public async Task Should_retry_after_rejection_exception() { A.CallTo(() => grain.ActivateAsync()) .Throws(new OrleansException()).Once(); await sut.StartAsync(default); A.CallTo(() => grain.ActivateAsync()) .MustHaveHappened(2, Times.Exactly); } [Fact] public async Task Should_fail_after_10_rejection_exception() { A.CallTo(() => grain.ActivateAsync()) .Throws(new OrleansException()); await Assert.ThrowsAsync(() => sut.StartAsync(default)); A.CallTo(() => grain.ActivateAsync()) .MustHaveHappened(10, Times.Exactly); } } }