public async Task ResourceInvalidCharsTest()
        {
            var mockProcessManager = new MockProcessManager(MockProcessManager.MockProcessManagerRequestType.Success);

            // VisualStudioAccessTokenProvider has in internal only constructor to allow for unit testing.
            var visualStudioAccessTokenProvider = new VisualStudioAccessTokenProvider(mockProcessManager, _visualStudioTokenProviderFile);

            var exception = await Assert.ThrowsAsync <AzureServiceTokenProviderException>(() => Task.Run(() => visualStudioAccessTokenProvider.GetAuthResultAsync("https://test^", Constants.TenantId)));

            Assert.Contains(Constants.NotInExpectedFormatError, exception.Message);
        }
        public async Task TokenProvidersNotFoundTest()
        {
            // set all token providers in the token provider object to non-existent paths
            _visualStudioTokenProviderFile.TokenProviders.ForEach(tp => tp.Path = $"C:\\{Guid.NewGuid()}\\Microsoft.Asal.TokenService.exe.json");
            var visualStudioAccessTokenProvider = new VisualStudioAccessTokenProvider(new ProcessManager(), _visualStudioTokenProviderFile);

            var exception = await Assert.ThrowsAsync <AzureServiceTokenProviderException>(() => Task.Run(() => visualStudioAccessTokenProvider.GetAuthResultAsync(Constants.KeyVaultResourceId, Constants.TenantId)));

            Assert.Contains(AzureServiceTokenProviderException.GenericErrorMessage, exception.Message);
            Assert.Contains(Constants.KeyVaultResourceId, exception.Message);
            Assert.Contains(VisualStudioAccessTokenProvider.TokenProvidersNotFound, exception.Message);
        }
        public async Task GetTokenTest()
        {
            // Mock the progress manager. This emulates running an actual process to get token from Visual Studio key chain.
            var mockProcessManager = new MockProcessManager(MockProcessManager.MockProcessManagerRequestType.VisualStudioSuccess);

            // VisualStudioAccessTokenProvider has in internal only constructor to allow for unit testing.
            var visualStudioAccessTokenProvider = new VisualStudioAccessTokenProvider(mockProcessManager, _visualStudioTokenProviderFile);

            // Get token and validate it
            var authResult = await visualStudioAccessTokenProvider.GetAuthResultAsync(Constants.KeyVaultResourceId, Constants.TenantId).ConfigureAwait(false);

            Validator.ValidateToken(authResult.AccessToken, visualStudioAccessTokenProvider.PrincipalUsed, Constants.UserType, Constants.TenantId, expiresOn: authResult.ExpiresOn);
        }
        public async Task FailedToGetToken()
        {
            var mockProcessManager = new MockProcessManager(MockProcessManager.MockProcessManagerRequestType.Failure);

            // VisualStudioAccessTokenProvider has in internal only constructor to allow for unit testing.
            var visualStudioAccessTokenProvider = new VisualStudioAccessTokenProvider(mockProcessManager, _visualStudioTokenProviderFile);

            var exception = await Assert.ThrowsAsync <AzureServiceTokenProviderException>(() => Task.Run(() => visualStudioAccessTokenProvider.GetAuthResultAsync(Constants.KeyVaultResourceId, Constants.TenantId)));

            Assert.Contains(AzureServiceTokenProviderException.GenericErrorMessage, exception.Message);
            Assert.Contains(Constants.DeveloperToolError, exception.Message);
            Assert.Contains(Constants.KeyVaultResourceId, exception.Message);
            Assert.Contains(VisualStudioAccessTokenProvider.TokenProviderGenericError, exception.Message);
        }
        public async Task TokenProviderFileNotFoundTest()
        {
            var visualStudioAccessTokenProvider = new VisualStudioAccessTokenProvider(new ProcessManager());

            // This will ensure that the localappdata folder doesnt exist on the machine. Since VS token provider file path is added to this, the file will not exist either.
            string path = Guid.NewGuid().ToString();

            Environment.SetEnvironmentVariable(Constants.LocalAppDataEnv, path);

            var exception = await Assert.ThrowsAsync <AzureServiceTokenProviderException>(() => Task.Run(() => visualStudioAccessTokenProvider.GetAuthResultAsync(Constants.KeyVaultResourceId, Constants.TenantId)));

            Assert.Contains(path, exception.Message);
            Assert.Contains(AzureServiceTokenProviderException.GenericErrorMessage, exception.Message);
            Assert.Contains(Constants.KeyVaultResourceId, exception.Message);
            Assert.Contains(VisualStudioAccessTokenProvider.TokenProviderFileNotFound, exception.Message);
        }