blob: 6b1b0ed79c3fc9b8a3a82365eb5a97d281a53f5a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "include/local_auth_windows/local_auth_plugin.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <windows.h>
#include <functional>
#include <memory>
#include <string>
#include "mocks.h"
namespace local_auth_windows {
namespace test {
using flutter::EncodableList;
using flutter::EncodableMap;
using flutter::EncodableValue;
using ::testing::_;
using ::testing::DoAll;
using ::testing::EndsWith;
using ::testing::Eq;
using ::testing::Pointee;
using ::testing::Return;
TEST(LocalAuthPlugin, IsDeviceSupportedHandlerSuccessIfVerifierAvailable) {
std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
std::make_unique<MockUserConsentVerifier>();
EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
.Times(1)
.WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability> {
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability::Available;
});
LocalAuthPlugin plugin(std::move(mockConsentVerifier));
ErrorOr<bool> result(false);
plugin.IsDeviceSupported([&result](ErrorOr<bool> reply) { result = reply; });
EXPECT_FALSE(result.has_error());
EXPECT_TRUE(result.value());
}
TEST(LocalAuthPlugin, IsDeviceSupportedHandlerSuccessIfVerifierNotAvailable) {
std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
std::make_unique<MockUserConsentVerifier>();
EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
.Times(1)
.WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability> {
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability::DeviceNotPresent;
});
LocalAuthPlugin plugin(std::move(mockConsentVerifier));
ErrorOr<bool> result(true);
plugin.IsDeviceSupported([&result](ErrorOr<bool> reply) { result = reply; });
EXPECT_FALSE(result.has_error());
EXPECT_FALSE(result.value());
}
TEST(LocalAuthPlugin, AuthenticateHandlerWorksWhenAuthorized) {
std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
std::make_unique<MockUserConsentVerifier>();
EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
.Times(1)
.WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability> {
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability::Available;
});
EXPECT_CALL(*mockConsentVerifier, RequestVerificationForWindowAsync)
.Times(1)
.WillOnce([](std::wstring localizedReason)
-> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerificationResult> {
EXPECT_EQ(localizedReason, L"My Reason");
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerificationResult::Verified;
});
LocalAuthPlugin plugin(std::move(mockConsentVerifier));
ErrorOr<bool> result(false);
plugin.Authenticate("My Reason",
[&result](ErrorOr<bool> reply) { result = reply; });
EXPECT_FALSE(result.has_error());
EXPECT_TRUE(result.value());
}
TEST(LocalAuthPlugin, AuthenticateHandlerWorksWhenNotAuthorized) {
std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
std::make_unique<MockUserConsentVerifier>();
EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
.Times(1)
.WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability> {
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerifierAvailability::Available;
});
EXPECT_CALL(*mockConsentVerifier, RequestVerificationForWindowAsync)
.Times(1)
.WillOnce([](std::wstring localizedReason)
-> winrt::Windows::Foundation::IAsyncOperation<
winrt::Windows::Security::Credentials::UI::
UserConsentVerificationResult> {
EXPECT_EQ(localizedReason, L"My Reason");
co_return winrt::Windows::Security::Credentials::UI::
UserConsentVerificationResult::Canceled;
});
LocalAuthPlugin plugin(std::move(mockConsentVerifier));
ErrorOr<bool> result(true);
plugin.Authenticate("My Reason",
[&result](ErrorOr<bool> reply) { result = reply; });
EXPECT_FALSE(result.has_error());
EXPECT_FALSE(result.value());
}
} // namespace test
} // namespace local_auth_windows