public async Task OAuth2Client_E2E_DeviceFlowAndRefresh()
        {
            const string expectedUserCode      = "736998";
            const string expectedDeviceCode    = "db6558b2a1d649758394ac3c2d9e00b1";
            const string expectedAccessToken1  = "LET_ME_IN-1";
            const string expectedAccessToken2  = "LET_ME_IN-2";
            const string expectedRefreshToken1 = "REFRESH_ME-1";
            const string expectedRefreshToken2 = "REFRESH_ME-2";

            var baseUri = new Uri("https://example.com");
            OAuth2ServerEndpoints endpoints = CreateEndpoints(baseUri);

            var httpHandler = new TestHttpMessageHandler {
                ThrowOnUnexpectedRequest = true
            };

            string[] expectedScopes = { "read", "write", "delete" };

            OAuth2Application app = CreateTestApplication();

            var server = new TestOAuth2Server(endpoints);

            server.RegisterApplication(app);
            server.Bind(httpHandler);
            server.TokenGenerator.UserCodes.Add(expectedUserCode);
            server.TokenGenerator.DeviceCodes.Add(expectedDeviceCode);
            server.TokenGenerator.AccessTokens.Add(expectedAccessToken1);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken1);

            OAuth2Client client = CreateClient(httpHandler, endpoints);

            OAuth2DeviceCodeResult deviceResult = await client.GetDeviceCodeAsync(expectedScopes, CancellationToken.None);

            // Simulate the user taking some time to sign in with the user code
            Thread.Sleep(1000);
            server.SignInDeviceWithUserCode(deviceResult.UserCode);

            OAuth2TokenResult result1 = await client.GetTokenByDeviceCodeAsync(deviceResult, CancellationToken.None);

            Assert.NotNull(result1);
            Assert.Equal(expectedScopes, result1.Scopes);
            Assert.Equal(expectedAccessToken1, result1.AccessToken);
            Assert.Equal(expectedRefreshToken1, result1.RefreshToken);

            server.TokenGenerator.AccessTokens.Add(expectedAccessToken2);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken2);

            OAuth2TokenResult result2 = await client.GetTokenByRefreshTokenAsync(result1.RefreshToken, CancellationToken.None);

            Assert.NotNull(result2);
            Assert.Equal(expectedScopes, result2.Scopes);
            Assert.Equal(expectedAccessToken2, result2.AccessToken);
            Assert.Equal(expectedRefreshToken2, result2.RefreshToken);
        }
        public async Task OAuth2Client_GetTokenByDeviceCodeAsync()
        {
            const string expectedUserCode     = "342728";
            const string expectedDeviceCode   = "ad6498533bf54f4db53e49612a4acfb0";
            const string expectedAccessToken  = "LET_ME_IN";
            const string expectedRefreshToken = "REFRESH_ME";

            var baseUri = new Uri("https://example.com");
            OAuth2ServerEndpoints endpoints = CreateEndpoints(baseUri);

            var httpHandler = new TestHttpMessageHandler {
                ThrowOnUnexpectedRequest = true
            };

            string[] expectedScopes = { "read", "write", "delete" };

            var grant = new OAuth2Application.DeviceCodeGrant(expectedUserCode, expectedDeviceCode, expectedScopes);

            OAuth2Application app = CreateTestApplication();

            app.DeviceGrants.Add(grant);

            var server = new TestOAuth2Server(endpoints);

            server.RegisterApplication(app);
            server.Bind(httpHandler);
            server.TokenGenerator.UserCodes.Add(expectedUserCode);
            server.TokenGenerator.DeviceCodes.Add(expectedDeviceCode);
            server.TokenGenerator.AccessTokens.Add(expectedAccessToken);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken);

            OAuth2Client client = CreateClient(httpHandler, endpoints);

            var deviceCodeResult = new OAuth2DeviceCodeResult(expectedDeviceCode, expectedUserCode, null, null);

            Task <OAuth2TokenResult> resultTask = client.GetTokenByDeviceCodeAsync(deviceCodeResult, CancellationToken.None);

            // Simulate the user taking some time to sign in with the user code
            Thread.Sleep(1000);
            server.SignInDeviceWithUserCode(expectedUserCode);

            OAuth2TokenResult result = await resultTask;

            Assert.NotNull(result);
            Assert.Equal(expectedScopes, result.Scopes);
            Assert.Equal(expectedAccessToken, result.AccessToken);
            Assert.Equal(expectedRefreshToken, result.RefreshToken);
        }