public override async Task <TokenResponse> ExchangeTokenAsync(string userId, string connectionName, string channelId, TokenExchangeRequest exchangeRequest, CancellationToken cancellationToken)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(ExchangeTokenAsync));
            }

            _ = userId ?? throw new ArgumentNullException(nameof(userId));
            _ = connectionName ?? throw new ArgumentNullException(nameof(connectionName));

            _logger.LogInformation($"ExchangeAsyncAsync ConnectionName: {connectionName}");
            var result = await _client.ExchangeAsyncAsync(userId, connectionName, channelId, exchangeRequest, cancellationToken).ConfigureAwait(false);

            if (result is ErrorResponse errorResponse)
            {
                throw new InvalidOperationException($"Unable to exchange token: ({errorResponse?.Error?.Code}) {errorResponse?.Error?.Message}");
            }
            else if (result is TokenResponse tokenResponse)
            {
                return(tokenResponse);
            }
            else
            {
                throw new InvalidOperationException($"ExchangeAsyncAsync returned improper result: {result.GetType()}");
            }
        }
        public async Task ExchangeAsyncWithHttpMessagesAsync_ShouldThrowOnNoLocalBot()
        {
            var client = new OAuthClient(new Uri("http://localhost"), new BotAccessTokenStub("token"));

            ServiceClientTracing.IsEnabled = true;

            if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("AGENT_OS")) &&
                Environment.GetEnvironmentVariable("AGENT_OS").Equals("Windows_NT"))
            {
                // Automated Windows build exception:
                await client.ExchangeAsyncAsync(
                    "dummyUserId", "dummyConnectionName", "dummyChannelId", new TokenExchangeRequest());

                Assert.True(true, "No exception thrown.");
            }
            else
            {
                // MacLinux build and local build exception:
                await Assert.ThrowsAsync <System.Net.Http.HttpRequestException>(() => client.ExchangeAsyncAsync(
                                                                                    "dummyUserId", "dummyConnectionName", "dummyChannelId", new TokenExchangeRequest()));
            }
        }
 public async Task ExchangeAsyncWithHttpMessagesAsync_ShouldThrowOnNullExchangeRequest()
 {
     var client = new OAuthClient(new Uri("http://localhost"), new BotAccessTokenStub("token"));
     await Assert.ThrowsAsync <ValidationException>(() => client.ExchangeAsyncAsync(
                                                        "dummyUserId", "dummyConnectionName", "dummyChannelId", null));
 }