blob: 4a9b3460f4a0f83348d5fc5f6dee792cc3d19d37 [file] [log] [blame]
// Copyright 2020 The Chromium 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 "chrome/test/payments/test_event_waiter.h"
#include <iostream>
namespace payments {
std::ostream& operator<<(std::ostream& out, TestEvent event) {
switch (event) {
case TestEvent::kCanMakePaymentCalled:
out << "CanMakePaymentCalled";
break;
case TestEvent::kCanMakePaymentReturned:
out << "CanMakePaymentReturned";
break;
case TestEvent::kHasEnrolledInstrumentCalled:
out << "HasEnrolledInstrumentCalled";
break;
case TestEvent::kHasEnrolledInstrumentReturned:
out << "HasEnrolledInstrumentReturned";
break;
case TestEvent::kConnectionTerminated:
out << "ConnectionTerminated";
break;
case TestEvent::kNotSupportedError:
out << "NotSupportedError";
break;
case TestEvent::kAbortCalled:
out << "AbortCalled";
break;
case TestEvent::kAppListReady:
out << "AppListReady";
break;
case TestEvent::kErrorDisplayed:
out << "ErrorDisplayed";
break;
case TestEvent::kPaymentCompleted:
out << "PaymentCompleted";
break;
case TestEvent::kUIDisplayed:
out << "UIDisplayed";
break;
}
return out;
}
EventWaiter::EventWaiter(std::list<TestEvent> expected_event_sequence,
bool wait_for_single_event)
: expected_events_(std::move(expected_event_sequence)),
wait_for_single_event_(wait_for_single_event) {
if (wait_for_single_event)
DCHECK_EQ(1U, expected_events_.size());
else
DCHECK_GT(expected_events_.size(), 0U);
}
EventWaiter::~EventWaiter() = default;
bool EventWaiter::Wait() {
if (expected_events_.empty())
return true;
DCHECK(!run_loop_.running());
run_loop_.Run();
return expected_events_.empty();
}
void EventWaiter::OnEvent(TestEvent current_event) {
if (expected_events_.empty())
return;
// While waiting for a single event, ignore arrival of other events.
if (wait_for_single_event_ && expected_events_.front() != current_event) {
return;
}
DCHECK_EQ(expected_events_.front(), current_event);
expected_events_.pop_front();
// Only quit the loop if no other events are expected.
if (expected_events_.empty() && run_loop_.running())
run_loop_.Quit();
}
} // namespace payments