| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/wallet/android/boarding_pass_detector.h" |
| #include "chrome/common/wallet/boarding_pass_extractor.mojom.h" |
| |
| #include "base/test/scoped_feature_list.h" |
| #include "base/test/task_environment.h" |
| #include "base/test/test_future.h" |
| #include "chrome/common/chrome_features.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace wallet { |
| |
| class FakeBoardingPassExtractor : public mojom::BoardingPassExtractor { |
| public: |
| mojo::PendingRemote<mojom::BoardingPassExtractor> BindAndPassRemote() { |
| return receiver_.BindNewPipeAndPassRemote(); |
| } |
| |
| // mojom::BoardingPassExtractor |
| void ExtractBoardingPass(ExtractBoardingPassCallback callback) override { |
| CHECK(!HasPendingRequest()); |
| callback_ = std::move(callback); |
| if (!signal_.IsReady()) { |
| signal_.SetValue(); |
| } |
| } |
| |
| void WaitForRequest() { |
| if (HasPendingRequest()) { |
| return; |
| } |
| signal_.Clear(); |
| EXPECT_TRUE(signal_.Wait()); |
| } |
| |
| void AnswerRequest(const std::vector<std::string>& results) { |
| CHECK(HasPendingRequest()); |
| std::move(callback_).Run(results); |
| } |
| |
| void ResetReceiver() { receiver_.reset(); } |
| |
| private: |
| bool HasPendingRequest() const { return bool(callback_); } |
| base::test::TestFuture<void> signal_; |
| |
| ExtractBoardingPassCallback callback_; |
| mojo::Receiver<mojom::BoardingPassExtractor> receiver_{this}; |
| }; |
| |
| class BoardingPassDetectorTest : public ::testing::Test { |
| public: |
| void SetAllowList(const std::string& allowlist) { |
| feature_list_.InitAndEnableFeatureWithParameters( |
| features::kBoardingPassDetector, |
| {{features::kBoardingPassDetectorUrlParam.name, allowlist}}); |
| } |
| |
| private: |
| base::test::ScopedFeatureList feature_list_; |
| base::test::TaskEnvironment task_env_; |
| }; |
| |
| TEST_F(BoardingPassDetectorTest, ShouldDetect) { |
| SetAllowList("https://aa.com/adc, https://www.google.com/boarding"); |
| |
| EXPECT_TRUE(BoardingPassDetector::ShouldDetect("https://aa.com/adc")); |
| EXPECT_TRUE(BoardingPassDetector::ShouldDetect( |
| "https://www.google.com/boarding/abc")); |
| } |
| |
| TEST_F(BoardingPassDetectorTest, ShouldNotDetect) { |
| SetAllowList("https://aa.com/adc, https://www.google.com/boarding"); |
| |
| EXPECT_FALSE(BoardingPassDetector::ShouldDetect("https://aa.com/")); |
| EXPECT_FALSE( |
| BoardingPassDetector::ShouldDetect("https://www.google.com/abc")); |
| } |
| |
| TEST_F(BoardingPassDetectorTest, DetectBoardingPassSuccess) { |
| FakeBoardingPassExtractor boarding_pass_extractor; |
| base::test::TestFuture<const std::vector<std::string>&> test_future; |
| BoardingPassDetector* detector = new BoardingPassDetector(); |
| detector->DetectBoardingPassWithRemote( |
| mojo::Remote<mojom::BoardingPassExtractor>( |
| boarding_pass_extractor.BindAndPassRemote()), |
| test_future.GetCallback()); |
| boarding_pass_extractor.WaitForRequest(); |
| |
| std::vector<std::string> extractor_response; |
| extractor_response.push_back("test1"); |
| boarding_pass_extractor.AnswerRequest(extractor_response); |
| |
| auto results = test_future.Get(); |
| EXPECT_EQ(results.size(), extractor_response.size()); |
| EXPECT_EQ(results[0], extractor_response[0]); |
| } |
| |
| TEST_F(BoardingPassDetectorTest, DetectBoardingPassDisconnect) { |
| FakeBoardingPassExtractor boarding_pass_extractor; |
| base::test::TestFuture<const std::vector<std::string>&> test_future; |
| BoardingPassDetector* detector = new BoardingPassDetector(); |
| detector->DetectBoardingPassWithRemote( |
| mojo::Remote<mojom::BoardingPassExtractor>( |
| boarding_pass_extractor.BindAndPassRemote()), |
| test_future.GetCallback()); |
| boarding_pass_extractor.ResetReceiver(); |
| |
| auto results = test_future.Get(); |
| EXPECT_EQ(results.size(), 0u); |
| } |
| |
| } // namespace wallet |