Commit 76f718c7 authored by Hidehiko Abe's avatar Hidehiko Abe Committed by Commit Bot

Add unittests for ArcSessionImpl.

BUG=739118
TEST=Ran bots.

Change-Id: Ic4c81c914974b8d860cc65bcbc6e5cc67695f3fe
Reviewed-on: https://chromium-review.googlesource.com/768618Reviewed-by: default avatarLuis Hector Chavez <lhchavez@chromium.org>
Reviewed-by: default avatarDan Erat <derat@chromium.org>
Reviewed-by: default avatarYusuke Sato <yusukes@chromium.org>
Commit-Queue: Hidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#518299}
parent 1f24e405
......@@ -14,7 +14,6 @@
#include "base/location.h"
#include "base/numerics/safe_conversions.h"
#include "base/path_service.h"
#include "base/rand_util.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_util.h"
#include "base/threading/thread_task_runner_handle.h"
......@@ -29,6 +28,8 @@ namespace chromeos {
namespace {
constexpr char kFakeContainerInstanceId[] = "0123456789ABCDEF";
// Store the owner key in a file on the disk, so that it can be loaded by
// DeviceSettingsService and used e.g. for validating policy signatures in the
// integration tests. This is done on behalf of the real session manager, that
......@@ -59,7 +60,8 @@ FakeSessionManagerClient::FakeSessionManagerClient()
request_lock_screen_call_count_(0),
notify_lock_screen_shown_call_count_(0),
notify_lock_screen_dismissed_call_count_(0),
arc_available_(false) {}
arc_available_(false),
weak_ptr_factory_(this) {}
FakeSessionManagerClient::~FakeSessionManagerClient() {
}
......@@ -278,11 +280,19 @@ void FakeSessionManagerClient::StartArcInstance(
StartArcInstanceCallback callback) {
StartArcInstanceResult result;
std::string container_instance_id;
if (arc_available_) {
result = StartArcInstanceResult::SUCCESS;
base::Base64Encode(base::RandBytesAsString(16), &container_instance_id);
} else {
if (!arc_available_) {
result = StartArcInstanceResult::UNKNOWN_ERROR;
} else if (low_disk_) {
result = StartArcInstanceResult::LOW_FREE_DISK_SPACE;
} else {
result = StartArcInstanceResult::SUCCESS;
if (container_instance_id_.empty()) {
// This is starting a new container.
base::Base64Encode(kFakeContainerInstanceId, &container_instance_id_);
// Note that empty |container_instance_id| should be returned if
// this is upgrade case, so assign only when starting a new container.
container_instance_id = container_instance_id_;
}
}
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), result,
......@@ -291,8 +301,21 @@ void FakeSessionManagerClient::StartArcInstance(
void FakeSessionManagerClient::StopArcInstance(
VoidDBusMethodCallback callback) {
if (!arc_available_ || container_instance_id_.empty()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), false /* result */));
return;
}
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), arc_available_));
FROM_HERE, base::BindOnce(std::move(callback), true /* result */));
// Emulate ArcInstanceStopped signal propagation.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&FakeSessionManagerClient::NotifyArcInstanceStopped,
weak_ptr_factory_.GetWeakPtr(), true /* clean */,
std::move(container_instance_id_)));
container_instance_id_.clear();
}
void FakeSessionManagerClient::SetArcCpuRestriction(
......@@ -327,6 +350,13 @@ void FakeSessionManagerClient::RemoveArcData(
}
}
void FakeSessionManagerClient::NotifyArcInstanceStopped(
bool clean,
const std::string& container_instance_id) {
for (auto& observer : observers_)
observer.ArcInstanceStopped(clean, container_instance_id);
}
const std::string& FakeSessionManagerClient::device_policy() const {
return device_policy_;
}
......
......@@ -91,6 +91,10 @@ class FakeSessionManagerClient : public SessionManagerClient {
void RemoveArcData(const cryptohome::Identification& cryptohome_id,
VoidDBusMethodCallback callback) override;
// Notifies observers as if ArcInstanceStopped signal is received.
void NotifyArcInstanceStopped(bool clean,
const std::string& conainer_instance_id);
void set_store_device_policy_success(bool success) {
store_device_policy_success_ = success;
}
......@@ -143,6 +147,12 @@ class FakeSessionManagerClient : public SessionManagerClient {
void set_arc_available(bool available) { arc_available_ = available; }
void set_low_disk(bool low_disk) { low_disk_ = low_disk; }
const std::string& container_instance_id() const {
return container_instance_id_;
}
private:
bool store_device_policy_success_ = true;
std::string device_policy_;
......@@ -164,7 +174,11 @@ class FakeSessionManagerClient : public SessionManagerClient {
int notify_lock_screen_dismissed_call_count_;
bool arc_available_;
bool low_disk_ = false;
// Pseudo running container id. If not running, empty.
std::string container_instance_id_;
base::WeakPtrFactory<FakeSessionManagerClient> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(FakeSessionManagerClient);
};
......
......@@ -162,6 +162,8 @@ static_library("arc_test_support") {
sources = [
"test/fake_app_instance.cc",
"test/fake_app_instance.h",
"test/fake_arc_bridge_host.cc",
"test/fake_arc_bridge_host.h",
"test/fake_arc_session.cc",
"test/fake_arc_session.h",
"test/fake_bluetooth_instance.cc",
......@@ -197,6 +199,7 @@ source_set("unit_tests") {
testonly = true
sources = [
"arc_data_remover_unittest.cc",
"arc_session_impl_unittest.cc",
"arc_session_runner_unittest.cc",
"arc_util_unittest.cc",
"bluetooth/bluetooth_struct_traits_unittest.cc",
......
......@@ -43,8 +43,9 @@ chromeos::SessionManagerClient* GetSessionManagerClient() {
// there isn't much we can do. This should only happen when running tests.
if (!chromeos::DBusThreadManager::IsInitialized() ||
!chromeos::DBusThreadManager::Get() ||
!chromeos::DBusThreadManager::Get()->GetSessionManagerClient())
!chromeos::DBusThreadManager::Get()->GetSessionManagerClient()) {
return nullptr;
}
return chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
}
......@@ -613,4 +614,26 @@ void ArcSessionImpl::OnShutdown() {
OnStopped(ArcStopReason::SHUTDOWN);
}
std::ostream& operator<<(std::ostream& os, ArcSessionImpl::State state) {
#define MAP_STATE(name) \
case ArcSessionImpl::State::name: \
return os << #name
switch (state) {
MAP_STATE(NOT_STARTED);
MAP_STATE(STARTING_MINI_INSTANCE);
MAP_STATE(RUNNING_MINI_INSTANCE);
MAP_STATE(STARTING_FULL_INSTANCE);
MAP_STATE(CONNECTING_MOJO);
MAP_STATE(RUNNING_FULL_INSTANCE);
MAP_STATE(STOPPED);
}
#undef MAP_STATE
// Some compilers report an error even if all values of an enum-class are
// covered exhaustively in a switch statement.
NOTREACHED() << "Invalid value " << static_cast<int>(state);
return os;
}
} // namespace arc
......@@ -6,6 +6,7 @@
#define COMPONENTS_ARC_ARC_SESSION_IMPL_H_
#include <memory>
#include <ostream>
#include <string>
#include "base/callback.h"
......@@ -143,6 +144,8 @@ class ArcSessionImpl : public ArcSession,
static std::unique_ptr<Delegate> CreateDelegate(
ArcBridgeService* arc_bridge_service);
State GetStateForTesting() { return state_; }
// ArcSession overrides:
void Start(ArcInstanceMode request_mode) override;
void Stop() override;
......@@ -228,10 +231,12 @@ class ArcSessionImpl : public ArcSession,
// WeakPtrFactory to use callbacks.
base::WeakPtrFactory<ArcSessionImpl> weak_factory_;
private:
DISALLOW_COPY_AND_ASSIGN(ArcSessionImpl);
};
// Stringified output for logging purpose.
std::ostream& operator<<(std::ostream& os, ArcSessionImpl::State state);
} // namespace arc
#endif // COMPONENTS_ARC_ARC_SESSION_IMPL_H_
This diff is collapsed.
// 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 "components/arc/test/fake_arc_bridge_host.h"
namespace arc {
FakeArcBridgeHost::FakeArcBridgeHost() = default;
FakeArcBridgeHost::~FakeArcBridgeHost() = default;
void FakeArcBridgeHost::OnAccessibilityHelperInstanceReady(
mojom::AccessibilityHelperInstancePtr accessibility_helper_ptr) {}
void FakeArcBridgeHost::OnAppInstanceReady(mojom::AppInstancePtr app_ptr) {}
void FakeArcBridgeHost::OnAudioInstanceReady(
mojom::AudioInstancePtr audio_ptr) {}
void FakeArcBridgeHost::OnAuthInstanceReady(mojom::AuthInstancePtr auth_ptr) {}
void FakeArcBridgeHost::OnBackupSettingsInstanceReady(
mojom::BackupSettingsInstancePtr backup_settings_ptr) {}
void FakeArcBridgeHost::OnBluetoothInstanceReady(
mojom::BluetoothInstancePtr bluetooth_ptr) {}
void FakeArcBridgeHost::OnBootPhaseMonitorInstanceReady(
mojom::BootPhaseMonitorInstancePtr boot_phase_monitor_ptr) {}
void FakeArcBridgeHost::OnCastReceiverInstanceReady(
mojom::CastReceiverInstancePtr cast_receiver_ptr) {}
void FakeArcBridgeHost::OnCertStoreInstanceReady(
mojom::CertStoreInstancePtr instance_ptr) {}
void FakeArcBridgeHost::OnClipboardInstanceReady(
mojom::ClipboardInstancePtr clipboard_ptr) {}
void FakeArcBridgeHost::OnCrashCollectorInstanceReady(
mojom::CrashCollectorInstancePtr crash_collector_ptr) {}
void FakeArcBridgeHost::OnEnterpriseReportingInstanceReady(
mojom::EnterpriseReportingInstancePtr enterprise_reporting_ptr) {}
void FakeArcBridgeHost::OnFileSystemInstanceReady(
mojom::FileSystemInstancePtr file_system_ptr) {}
void FakeArcBridgeHost::OnImeInstanceReady(mojom::ImeInstancePtr ime_ptr) {}
void FakeArcBridgeHost::OnIntentHelperInstanceReady(
mojom::IntentHelperInstancePtr intent_helper_ptr) {}
void FakeArcBridgeHost::OnKioskInstanceReady(
mojom::KioskInstancePtr kiosk_ptr) {}
void FakeArcBridgeHost::OnLockScreenInstanceReady(
mojom::LockScreenInstancePtr lock_screen_ptr) {}
void FakeArcBridgeHost::OnMetricsInstanceReady(
mojom::MetricsInstancePtr metrics_ptr) {}
void FakeArcBridgeHost::OnMidisInstanceReady(
mojom::MidisInstancePtr midis_ptr) {}
void FakeArcBridgeHost::OnNetInstanceReady(mojom::NetInstancePtr net_ptr) {}
void FakeArcBridgeHost::OnNotificationsInstanceReady(
mojom::NotificationsInstancePtr notifications_ptr) {}
void FakeArcBridgeHost::OnObbMounterInstanceReady(
mojom::ObbMounterInstancePtr obb_mounter_ptr) {}
void FakeArcBridgeHost::OnOemCryptoInstanceReady(
mojom::OemCryptoInstancePtr oemcrypto_ptr) {}
void FakeArcBridgeHost::OnPolicyInstanceReady(
mojom::PolicyInstancePtr policy_ptr) {}
void FakeArcBridgeHost::OnPowerInstanceReady(
mojom::PowerInstancePtr power_ptr) {}
void FakeArcBridgeHost::OnPrintInstanceReady(
mojom::PrintInstancePtr print_ptr) {}
void FakeArcBridgeHost::OnProcessInstanceReady(
mojom::ProcessInstancePtr process_ptr) {}
void FakeArcBridgeHost::OnRotationLockInstanceReady(
mojom::RotationLockInstancePtr rotation_lock_ptr) {}
void FakeArcBridgeHost::OnStorageManagerInstanceReady(
mojom::StorageManagerInstancePtr storage_manager_ptr) {}
void FakeArcBridgeHost::OnTracingInstanceReady(
mojom::TracingInstancePtr trace_ptr) {}
void FakeArcBridgeHost::OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) {}
void FakeArcBridgeHost::OnVideoInstanceReady(
mojom::VideoInstancePtr video_ptr) {}
void FakeArcBridgeHost::OnVoiceInteractionArcHomeInstanceReady(
mojom::VoiceInteractionArcHomeInstancePtr home_ptr) {}
void FakeArcBridgeHost::OnVoiceInteractionFrameworkInstanceReady(
mojom::VoiceInteractionFrameworkInstancePtr framework_ptr) {}
void FakeArcBridgeHost::OnVolumeMounterInstanceReady(
mojom::VolumeMounterInstancePtr volume_mounter_ptr) {}
void FakeArcBridgeHost::OnWallpaperInstanceReady(
mojom::WallpaperInstancePtr wallpaper_ptr) {}
} // namespace arc
// 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.
#ifndef COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_HOST_H_
#define COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_HOST_H_
#include "base/macros.h"
#include "components/arc/common/arc_bridge.mojom.h"
namespace arc {
class FakeArcBridgeHost : public mojom::ArcBridgeHost {
public:
FakeArcBridgeHost();
~FakeArcBridgeHost() override;
// ArcBridgeHost overrides.
void OnAccessibilityHelperInstanceReady(
mojom::AccessibilityHelperInstancePtr accessibility_helper_ptr) override;
void OnAppInstanceReady(mojom::AppInstancePtr app_ptr) override;
void OnAudioInstanceReady(mojom::AudioInstancePtr audio_ptr) override;
void OnAuthInstanceReady(mojom::AuthInstancePtr auth_ptr) override;
void OnBackupSettingsInstanceReady(
mojom::BackupSettingsInstancePtr backup_settings_ptr) override;
void OnBluetoothInstanceReady(
mojom::BluetoothInstancePtr bluetooth_ptr) override;
void OnBootPhaseMonitorInstanceReady(
mojom::BootPhaseMonitorInstancePtr boot_phase_monitor_ptr) override;
void OnCastReceiverInstanceReady(
mojom::CastReceiverInstancePtr cast_receiver_ptr) override;
void OnCertStoreInstanceReady(
mojom::CertStoreInstancePtr instance_ptr) override;
void OnClipboardInstanceReady(
mojom::ClipboardInstancePtr clipboard_ptr) override;
void OnCrashCollectorInstanceReady(
mojom::CrashCollectorInstancePtr crash_collector_ptr) override;
void OnEnterpriseReportingInstanceReady(
mojom::EnterpriseReportingInstancePtr enterprise_reporting_ptr) override;
void OnFileSystemInstanceReady(
mojom::FileSystemInstancePtr file_system_ptr) override;
void OnImeInstanceReady(mojom::ImeInstancePtr ime_ptr) override;
void OnIntentHelperInstanceReady(
mojom::IntentHelperInstancePtr intent_helper_ptr) override;
void OnKioskInstanceReady(mojom::KioskInstancePtr kiosk_ptr) override;
void OnLockScreenInstanceReady(
mojom::LockScreenInstancePtr lock_screen_ptr) override;
void OnMetricsInstanceReady(mojom::MetricsInstancePtr metrics_ptr) override;
void OnMidisInstanceReady(mojom::MidisInstancePtr midis_ptr) override;
void OnNetInstanceReady(mojom::NetInstancePtr net_ptr) override;
void OnNotificationsInstanceReady(
mojom::NotificationsInstancePtr notifications_ptr) override;
void OnObbMounterInstanceReady(
mojom::ObbMounterInstancePtr obb_mounter_ptr) override;
void OnOemCryptoInstanceReady(
mojom::OemCryptoInstancePtr oemcrypto_ptr) override;
void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override;
void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override;
void OnPrintInstanceReady(mojom::PrintInstancePtr print_ptr) override;
void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override;
void OnRotationLockInstanceReady(
mojom::RotationLockInstancePtr rotation_lock_ptr) override;
void OnStorageManagerInstanceReady(
mojom::StorageManagerInstancePtr storage_manager_ptr) override;
void OnTracingInstanceReady(mojom::TracingInstancePtr trace_ptr) override;
void OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) override;
void OnVideoInstanceReady(mojom::VideoInstancePtr video_ptr) override;
void OnVoiceInteractionArcHomeInstanceReady(
mojom::VoiceInteractionArcHomeInstancePtr home_ptr) override;
void OnVoiceInteractionFrameworkInstanceReady(
mojom::VoiceInteractionFrameworkInstancePtr framework_ptr) override;
void OnVolumeMounterInstanceReady(
mojom::VolumeMounterInstancePtr volume_mounter_ptr) override;
void OnWallpaperInstanceReady(
mojom::WallpaperInstancePtr wallpaper_ptr) override;
private:
DISALLOW_COPY_AND_ASSIGN(FakeArcBridgeHost);
};
} // namespace arc
#endif // COMPONENTS_ARC_TEST_FAKE_ARC_BRIDGE_HOST_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment