blob: fa40e66458917848b45288584d86c1b377bbc574 [file] [log] [blame]
// Copyright 2017 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 "multidevice_service.h"
#include <memory>
#include "base/barrier_closure.h"
#include "base/run_loop.h"
#include "components/multidevice/service/public/interfaces/constants.mojom.h"
#include "components/multidevice/service/public/interfaces/device_sync.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/service_test.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kServiceTestName[] = "multidevice_service_unittest";
enum class MultiDeviceServiceActionType {
FORCE_ENROLLMENT_NOW,
FORCE_SYNC_NOW
};
} // namespace
namespace multidevice {
class MultiDeviceServiceTest : public service_manager::test::ServiceTest {
public:
class DeviceSyncObserverImpl : public device_sync::mojom::DeviceSyncObserver {
public:
DeviceSyncObserverImpl(
device_sync::mojom::DeviceSyncObserverRequest request)
: binding_(this, std::move(request)) {}
void OnEnrollmentFinished(bool success) override {
if (success) {
num_times_enrollment_finished_called_.success_count++;
} else {
num_times_enrollment_finished_called_.failure_count++;
}
on_callback_invoked_->Run();
}
void OnDevicesSynced(bool success) override {
if (success) {
num_times_device_synced_.success_count++;
} else {
num_times_device_synced_.failure_count++;
}
on_callback_invoked_->Run();
}
// Sets the necessary callback that will be invoked upon each interface
// method call in order to return control to the test.
void SetOnCallbackInvokedClosure(base::Closure* on_callback_invoked) {
on_callback_invoked_ = on_callback_invoked;
}
int GetNumCalls(MultiDeviceServiceActionType type, bool success_count) {
switch (type) {
case MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW:
return num_times_enrollment_finished_called_.CountType(success_count);
case MultiDeviceServiceActionType::FORCE_SYNC_NOW:
return num_times_device_synced_.CountType(success_count);
default:
NOTREACHED();
}
return 0;
}
private:
struct ObserverCallbackCount {
int success_count = 0;
int failure_count = 0;
int CountType(bool success) {
return success ? success_count : failure_count;
}
};
mojo::Binding<device_sync::mojom::DeviceSyncObserver> binding_;
base::Closure* on_callback_invoked_ = nullptr;
ObserverCallbackCount num_times_enrollment_finished_called_;
ObserverCallbackCount num_times_device_synced_;
};
MultiDeviceServiceTest() : ServiceTest(kServiceTestName){};
~MultiDeviceServiceTest() override{};
void SetUp() override {
ServiceTest::SetUp();
connector()->BindInterface(multidevice::mojom::kServiceName,
&device_sync_ptr_);
}
void AddDeviceSyncObservers(int num) {
device_sync::mojom::DeviceSyncObserverPtr device_sync_observer_ptr;
for (int i = 0; i < num; i++) {
device_sync_observer_ptr = device_sync::mojom::DeviceSyncObserverPtr();
observers_.emplace_back(std::make_unique<DeviceSyncObserverImpl>(
mojo::MakeRequest(&device_sync_observer_ptr)));
device_sync_ptr_->AddObserver(std::move(device_sync_observer_ptr));
}
}
void MultDeviceServiceAction(MultiDeviceServiceActionType type) {
base::RunLoop run_loop;
base::Closure closure = base::BarrierClosure(
static_cast<int>(observers_.size()), run_loop.QuitClosure());
for (auto& observer : observers_) {
observer->SetOnCallbackInvokedClosure(&closure);
}
switch (type) {
case MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW:
device_sync_ptr_->ForceEnrollmentNow();
break;
case MultiDeviceServiceActionType::FORCE_SYNC_NOW:
device_sync_ptr_->ForceSyncNow();
break;
default:
NOTREACHED();
}
run_loop.Run();
}
device_sync::mojom::DeviceSyncPtr device_sync_ptr_;
std::vector<std::unique_ptr<DeviceSyncObserverImpl>> observers_;
};
TEST_F(MultiDeviceServiceTest, MultipleCallTest) {
AddDeviceSyncObservers(2);
MultDeviceServiceAction(MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW);
EXPECT_EQ(1, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
true /* success_count */));
EXPECT_EQ(1, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
true /* success_count */));
EXPECT_EQ(0, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
false /* success_count */));
EXPECT_EQ(0, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
false /* success_count */));
MultDeviceServiceAction(MultiDeviceServiceActionType::FORCE_SYNC_NOW);
EXPECT_EQ(1, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
true /* success_count */));
EXPECT_EQ(1, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
true /* success_count */));
EXPECT_EQ(0, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
false /* success_count */));
EXPECT_EQ(0, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
false /* success_count */));
MultDeviceServiceAction(MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW);
EXPECT_EQ(2, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
true /* success_count */));
EXPECT_EQ(2, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
true /* success_count */));
EXPECT_EQ(0, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
false /* success_count */));
EXPECT_EQ(0, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_ENROLLMENT_NOW,
false /* success_count */));
MultDeviceServiceAction(MultiDeviceServiceActionType::FORCE_SYNC_NOW);
EXPECT_EQ(2, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
true /* success_count */));
EXPECT_EQ(2, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
true /* success_count */));
EXPECT_EQ(0, observers_[0]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
false /* success_count */));
EXPECT_EQ(0, observers_[1]->GetNumCalls(
MultiDeviceServiceActionType::FORCE_SYNC_NOW,
false /* success_count */));
}
} // namespace multidevice