public async Task WaitForGameLaunchEndedAndRecordTestAsync(EndReason?reason, bool throws)
        {
            _target = GetGameLaunch(false);
            var action = Substitute.For <IAction>();
            DeveloperLogEvent devEvent = SetupUpdateEvent(action);

            action.RecordAsync(Arg.Any <Task>()).Returns(callInfo => callInfo.Arg <Task>());
            _actionRecorder.CreateToolAction(ActionType.GameLaunchWaitForEnd).Returns(action);
            var endResult = new DeleteLaunchResult(
                GetGameLaunch(GameLaunchState.GameLaunchEnded, reason), true);

            _gameLaunchBeHelper
            .WaitUntilGameLaunchEndedAsync(_launchName, Arg.Any <ICancelable>(), action)
            .Returns(Task.FromResult(endResult));

            if (throws)
            {
                Assert.ThrowsAsync <GameLaunchFailError>(
                    async() => await _target.WaitForGameLaunchEndedAndRecordAsync());
            }
            else
            {
                await _target.WaitForGameLaunchEndedAndRecordAsync();
            }

            Assert.That(devEvent.GameLaunchData.LaunchId, Is.EqualTo(_launchId));
            Assert.That(devEvent.GameLaunchData.EndReason, Is.EqualTo((int?)reason));
            await action.Received(1).RecordAsync(Arg.Any <Task>());
        }
        public async Task DeleteLaunchNoLaunchAsync()
        {
            _gameletClient.DeleteGameLaunchAsync(_gameLaunchName, _action).Throws(
                new CloudException(
                    "error", new RpcException(new Status(StatusCode.NotFound, "not found"))));

            DeleteLaunchResult result =
                await _target.DeleteLaunchAsync(_gameLaunchName, _cancelable, _action);

            Assert.That(result.IsSuccessful, Is.EqualTo(true));
            Assert.That(result.DeletedLaunch, Is.Null);
            await AssertActionNotRecordedAsync();
        }
        public async Task DeleteLaunchSuccessAsync()
        {
            _gameletClient.DeleteGameLaunchAsync(_gameLaunchName, _action).Returns(
                GetLaunch(_gameLaunchName, GameLaunchState.RunningGame));
            GgpGrpc.Models.GameLaunch lastLaunch =
                GetLaunch(_gameLaunchName, GameLaunchState.GameLaunchEnded,
                          EndReason.GameExitedWithSuccessfulCode);
            _gameletClient.GetGameLaunchStateAsync(_gameLaunchName, _action).Returns(
                GetLaunch(_gameLaunchName, GameLaunchState.RunningGame),
                GetLaunch(_gameLaunchName, GameLaunchState.RunningGame), lastLaunch);

            DeleteLaunchResult result =
                await _target.DeleteLaunchAsync(_gameLaunchName, _cancelable, _action);

            Assert.That(result.IsSuccessful, Is.EqualTo(true));
            Assert.That(result.DeletedLaunch, Is.EqualTo(lastLaunch));
            await AssertActionNotRecordedAsync();
        }
        public async Task WaitUntilGameLaunchEndedAsync(GameLaunchState[] launchStates,
                                                        int[] stateRepeat, bool isSuccessful)
        {
            List <GameLaunchState> statusSequence = launchStates
                                                    .Select((state, i) => Enumerable.Repeat(state, stateRepeat[i]))
                                                    .SelectMany(states => states).ToList();

            Task <GgpGrpc.Models.GameLaunch>[] launches = statusSequence
                                                          .Select((state, i) => Task.FromResult(GetLaunch(_gameLaunchName, state))).ToArray();
            _gameletClient.GetGameLaunchStateAsync(_gameLaunchName, _action)
            .Returns(launches[0], launches.Skip(1).ToArray());

            DeleteLaunchResult result =
                await _target.WaitUntilGameLaunchEndedAsync(_gameLaunchName, _cancelable, _action);

            Assert.That(result.IsSuccessful, Is.EqualTo(isSuccessful));
            Assert.That(result.DeletedLaunch.Name, Is.EqualTo(_gameLaunchName));
            await AssertActionNotRecordedAsync();
        }