diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc index ddfed532..16e2bdf9 100644 --- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc +++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
@@ -179,6 +179,25 @@ observers_.RemoveObserver(observer); } +void ArcKioskAppManager::AddAutoLaunchAppForTest( + const std::string& app_id, + const policy::ArcKioskAppBasicInfo& app_info, + const AccountId& account_id) { + for (auto it = apps_.begin(); it != apps_.end(); ++it) { + if ((*it)->app_id() == app_id) { + apps_.erase(it); + break; + } + } + + apps_.emplace_back(std::make_unique<ArcKioskAppData>( + app_id, app_info.package_name(), app_info.class_name(), app_info.action(), + account_id, app_info.display_name())); + + auto_launch_account_id_ = account_id; + auto_launched_with_zero_delay_ = true; +} + void ArcKioskAppManager::UpdateApps() { // Do not populate ARC kiosk apps if ARC kiosk apps can't be run on the // device.
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h index 9023959..722d351 100644 --- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h +++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
@@ -69,6 +69,12 @@ return auto_launched_with_zero_delay_; } + // Adds an app with the given meta data directly, skips meta data fetching + // and sets the app as the auto launched one. Only for test. + void AddAutoLaunchAppForTest(const std::string& app_id, + const policy::ArcKioskAppBasicInfo& app_info, + const AccountId& account_id); + private: // Updates apps_ based on CrosSettings. void UpdateApps();
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc index a0579c9..df17ac1 100644 --- a/chrome/browser/chromeos/policy/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -1096,21 +1096,28 @@ return false; em::AppStatus* running_kiosk_app = status->mutable_running_kiosk_app(); - running_kiosk_app->set_app_id(account->kiosk_app_id); + if (account->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP) { + running_kiosk_app->set_app_id(account->kiosk_app_id); - const std::string app_version = GetAppVersion(account->kiosk_app_id); - if (app_version.empty()) { - DLOG(ERROR) << "Unable to get version for extension: " - << account->kiosk_app_id; + const std::string app_version = GetAppVersion(account->kiosk_app_id); + if (app_version.empty()) { + DLOG(ERROR) << "Unable to get version for extension: " + << account->kiosk_app_id; + } else { + running_kiosk_app->set_extension_version(app_version); + } + + chromeos::KioskAppManager::App app_info; + if (chromeos::KioskAppManager::Get()->GetApp(account->kiosk_app_id, + &app_info)) { + running_kiosk_app->set_required_platform_version( + app_info.required_platform_version); + } + } else if (account->type == policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP) { + // Use package name as app ID for ARC Kiosks. + running_kiosk_app->set_app_id(account->arc_kiosk_app_info.package_name()); } else { - running_kiosk_app->set_extension_version(app_version); - } - - chromeos::KioskAppManager::App app_info; - if (chromeos::KioskAppManager::Get()->GetApp(account->kiosk_app_id, - &app_info)) { - running_kiosk_app->set_required_platform_version( - app_info.required_platform_version); + NOTREACHED(); } return true; } @@ -1240,15 +1247,22 @@ // Get the account ID associated with this user. status->set_device_local_account_id(account->account_id); em::AppStatus* app_status = status->add_installed_apps(); - app_status->set_app_id(account->kiosk_app_id); + if (account->type == policy::DeviceLocalAccount::TYPE_KIOSK_APP) { + app_status->set_app_id(account->kiosk_app_id); - // Look up the app and get the version. - const std::string app_version = GetAppVersion(account->kiosk_app_id); - if (app_version.empty()) { - DLOG(ERROR) << "Unable to get version for extension: " - << account->kiosk_app_id; + // Look up the app and get the version. + const std::string app_version = GetAppVersion(account->kiosk_app_id); + if (app_version.empty()) { + DLOG(ERROR) << "Unable to get version for extension: " + << account->kiosk_app_id; + } else { + app_status->set_extension_version(app_version); + } + } else if (account->type == policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP) { + // Use package name as app ID for ARC Kiosks. + app_status->set_app_id(account->arc_kiosk_app_info.package_name()); } else { - app_status->set_extension_version(app_version); + NOTREACHED(); } return true;
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc index 64687f9d..dd8752f 100644 --- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -23,6 +23,7 @@ #include "base/test/scoped_path_override.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_data.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" #include "chrome/browser/chromeos/login/users/mock_user_manager.h" @@ -80,7 +81,9 @@ const int64_t kMillisecondsPerDay = Time::kMicrosecondsPerDay / 1000; const char kKioskAccountId[] = "kiosk_user@localhost"; +const char kArcKioskAccountId[] = "arc_kiosk_user@localhost"; const char kKioskAppId[] = "kiosk_app_id"; +const char kArcKioskPackageName[] = "com.test.kioskapp"; const char kExternalMountPoint[] = "/a/b/c"; const char kPublicAccountId[] = "public_user@localhost"; const char kArcStatus[] = "{\"applications\":[ { " @@ -284,10 +287,17 @@ user_manager_(new chromeos::MockUserManager()), user_manager_enabler_(base::WrapUnique(user_manager_)), got_session_status_(false), - fake_device_local_account_(policy::DeviceLocalAccount::TYPE_KIOSK_APP, - kKioskAccountId, - kKioskAppId, - std::string() /* kiosk_app_update_url */), + fake_kiosk_device_local_account_( + policy::DeviceLocalAccount::TYPE_KIOSK_APP, + kKioskAccountId, + kKioskAppId, + std::string() /* kiosk_app_update_url */), + fake_arc_kiosk_app_basic_info_(kArcKioskPackageName, + std::string() /* class_name */, + std::string() /* action */, + std::string() /* display_name */), + fake_arc_kiosk_device_local_account_(fake_arc_kiosk_app_basic_info_, + kArcKioskAccountId), user_data_dir_override_(chrome::DIR_USER_DATA), update_engine_client_(new chromeos::FakeUpdateEngineClient) { EXPECT_CALL(*user_manager_, Shutdown()).Times(1); @@ -437,13 +447,18 @@ .WillRepeatedly(Return(false)); } - void MockRunningKioskApp(const DeviceLocalAccount& account) { + void MockRunningKioskApp(const DeviceLocalAccount& account, bool arc_kiosk) { std::vector<DeviceLocalAccount> accounts; accounts.push_back(account); user_manager::User* user = user_manager_->CreateKioskAppUser( AccountId::FromUserEmail(account.user_id)); - EXPECT_CALL(*user_manager_, IsLoggedInAsKioskApp()).WillRepeatedly( - Return(true)); + if (arc_kiosk) { + EXPECT_CALL(*user_manager_, IsLoggedInAsArcKioskApp()) + .WillRepeatedly(Return(true)); + } else { + EXPECT_CALL(*user_manager_, IsLoggedInAsKioskApp()) + .WillRepeatedly(Return(true)); + } testing_profile_ = base::MakeUnique<TestingProfile>(); chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting( @@ -484,6 +499,25 @@ manager->GetAutoLaunchAppRequiredPlatformVersion()); } + void MockAutoLaunchArcKioskApp( + const DeviceLocalAccount& auto_launch_app_account) { + arc_kiosk_app_manager_.reset(new chromeos::ArcKioskAppManager()); + arc_kiosk_app_manager_->AddAutoLaunchAppForTest( + auto_launch_app_account.arc_kiosk_app_info.package_name(), + auto_launch_app_account.arc_kiosk_app_info, + AccountId::FromUserEmail(auto_launch_app_account.user_id)); + + std::vector<DeviceLocalAccount> accounts; + accounts.push_back(auto_launch_app_account); + SetDeviceLocalAccounts(owner_settings_service_.get(), accounts); + + owner_settings_service_->SetString( + chromeos::kAccountsPrefDeviceLocalAccountAutoLoginId, + auto_launch_app_account.account_id); + + base::RunLoop().RunUntilIdle(); + } + // Convenience method. int64_t ActivePeriodMilliseconds() { return policy::DeviceStatusCollector::kIdlePollIntervalSeconds * 1000; @@ -504,13 +538,17 @@ std::unique_ptr<chromeos::FakeOwnerSettingsService> owner_settings_service_; // Only set after MockRunningKioskApp was called. std::unique_ptr<TestingProfile> testing_profile_; + // Only set after MockAutoLaunchArcKioskApp was called. + std::unique_ptr<chromeos::ArcKioskAppManager> arc_kiosk_app_manager_; chromeos::MockUserManager* const user_manager_; user_manager::ScopedUserManager user_manager_enabler_; em::DeviceStatusReportRequest device_status_; em::SessionStatusReportRequest session_status_; bool got_session_status_; std::unique_ptr<TestingDeviceStatusCollector> status_collector_; - const policy::DeviceLocalAccount fake_device_local_account_; + const policy::DeviceLocalAccount fake_kiosk_device_local_account_; + const policy::ArcKioskAppBasicInfo fake_arc_kiosk_app_basic_info_; + const policy::DeviceLocalAccount fake_arc_kiosk_device_local_account_; base::ScopedPathOverride user_data_dir_override_; TestingPrefServiceSimple local_state_; chromeos::FakeUpdateEngineClient* const update_engine_client_; @@ -1076,8 +1114,8 @@ base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo)); status_collector_->set_kiosk_account( - base::MakeUnique<DeviceLocalAccount>(fake_device_local_account_)); - MockRunningKioskApp(fake_device_local_account_); + base::MakeUnique<DeviceLocalAccount>(fake_kiosk_device_local_account_)); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); testing_profile_->GetPrefs()->SetBoolean(prefs::kReportArcStatusEnabled, true); @@ -1098,8 +1136,8 @@ // Mock Kiosk app, so some session status is reported status_collector_->set_kiosk_account( - base::MakeUnique<DeviceLocalAccount>(fake_device_local_account_)); - MockRunningKioskApp(fake_device_local_account_); + base::MakeUnique<DeviceLocalAccount>(fake_kiosk_device_local_account_)); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); GetStatus(); EXPECT_TRUE(got_session_status_); @@ -1176,9 +1214,10 @@ // ReportDeviceSessionStatus only controls Kiosk reporting, ARC reporting // has to be disabled serarately. status_collector_->set_kiosk_account( - base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); + base::MakeUnique<policy::DeviceLocalAccount>( + fake_kiosk_device_local_account_)); // Set up a device-local account for single-app kiosk mode. - MockRunningKioskApp(fake_device_local_account_); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); testing_profile_->GetPrefs()->SetBoolean(prefs::kReportArcStatusEnabled, false); @@ -1189,10 +1228,11 @@ TEST_F(DeviceStatusCollectorTest, ReportKioskSessionStatus) { settings_helper_.SetBoolean(chromeos::kReportDeviceSessionStatus, true); status_collector_->set_kiosk_account( - base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); + base::MakeUnique<policy::DeviceLocalAccount>( + fake_kiosk_device_local_account_)); // Set up a device-local account for single-app kiosk mode. - MockRunningKioskApp(fake_device_local_account_); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); GetStatus(); EXPECT_TRUE(got_session_status_); @@ -1208,10 +1248,33 @@ EXPECT_FALSE(session_status_.has_user_dm_token()); } +TEST_F(DeviceStatusCollectorTest, ReportArcKioskSessionStatus) { + settings_helper_.SetBoolean(chromeos::kReportDeviceSessionStatus, true); + status_collector_->set_kiosk_account( + base::MakeUnique<policy::DeviceLocalAccount>( + fake_arc_kiosk_device_local_account_)); + + // Set up a device-local account for single-app ARC kiosk mode. + MockRunningKioskApp(fake_arc_kiosk_device_local_account_, + true /* arc_kiosk */); + + GetStatus(); + EXPECT_TRUE(got_session_status_); + ASSERT_EQ(1, session_status_.installed_apps_size()); + EXPECT_EQ(kArcKioskAccountId, session_status_.device_local_account_id()); + const em::AppStatus app = session_status_.installed_apps(0); + EXPECT_EQ(kArcKioskPackageName, app.app_id()); + EXPECT_TRUE(app.extension_version().empty()); + EXPECT_FALSE(app.has_status()); + EXPECT_FALSE(app.has_error()); + // Expect no User DM Token for kiosk sessions. + EXPECT_FALSE(session_status_.has_user_dm_token()); +} + TEST_F(DeviceStatusCollectorTest, NoOsUpdateStatusByDefault) { MockPlatformVersion("1234.0.0"); - MockAutoLaunchKioskAppWithRequiredPlatformVersion(fake_device_local_account_, - "1234.0.0"); + MockAutoLaunchKioskAppWithRequiredPlatformVersion( + fake_kiosk_device_local_account_, "1234.0.0"); GetStatus(); EXPECT_FALSE(device_status_.has_os_update_status()); @@ -1225,7 +1288,7 @@ for (size_t i = 0; i < arraysize(kRequiredPlatformVersions); ++i) { MockAutoLaunchKioskAppWithRequiredPlatformVersion( - fake_device_local_account_, kRequiredPlatformVersions[i]); + fake_kiosk_device_local_account_, kRequiredPlatformVersions[i]); GetStatus(); ASSERT_TRUE(device_status_.has_os_update_status()) @@ -1242,8 +1305,8 @@ TEST_F(DeviceStatusCollectorTest, ReportOsUpdateStatus) { MockPlatformVersion("1234.0.0"); settings_helper_.SetBoolean(chromeos::kReportOsUpdateStatus, true); - MockAutoLaunchKioskAppWithRequiredPlatformVersion(fake_device_local_account_, - "1235"); + MockAutoLaunchKioskAppWithRequiredPlatformVersion( + fake_kiosk_device_local_account_, "1235"); chromeos::UpdateEngineClient::Status update_status; update_status.status = chromeos::UpdateEngineClient::UPDATE_STATUS_IDLE; @@ -1287,11 +1350,12 @@ TEST_F(DeviceStatusCollectorTest, NoRunningKioskAppByDefault) { MockPlatformVersion("1234.0.0"); - MockAutoLaunchKioskAppWithRequiredPlatformVersion(fake_device_local_account_, - "1234.0.0"); + MockAutoLaunchKioskAppWithRequiredPlatformVersion( + fake_kiosk_device_local_account_, "1234.0.0"); status_collector_->set_kiosk_account( - base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); - MockRunningKioskApp(fake_device_local_account_); + base::MakeUnique<policy::DeviceLocalAccount>( + fake_kiosk_device_local_account_)); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); GetStatus(); EXPECT_FALSE(device_status_.has_running_kiosk_app()); @@ -1300,8 +1364,8 @@ TEST_F(DeviceStatusCollectorTest, NoRunningKioskAppWhenNotInKioskSession) { settings_helper_.SetBoolean(chromeos::kReportRunningKioskApp, true); MockPlatformVersion("1234.0.0"); - MockAutoLaunchKioskAppWithRequiredPlatformVersion(fake_device_local_account_, - "1234.0.0"); + MockAutoLaunchKioskAppWithRequiredPlatformVersion( + fake_kiosk_device_local_account_, "1234.0.0"); GetStatus(); EXPECT_FALSE(device_status_.has_running_kiosk_app()); @@ -1310,11 +1374,12 @@ TEST_F(DeviceStatusCollectorTest, ReportRunningKioskApp) { settings_helper_.SetBoolean(chromeos::kReportRunningKioskApp, true); MockPlatformVersion("1234.0.0"); - MockAutoLaunchKioskAppWithRequiredPlatformVersion(fake_device_local_account_, - "1235"); - MockRunningKioskApp(fake_device_local_account_); + MockAutoLaunchKioskAppWithRequiredPlatformVersion( + fake_kiosk_device_local_account_, "1235"); + MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */); status_collector_->set_kiosk_account( - base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); + base::MakeUnique<policy::DeviceLocalAccount>( + fake_kiosk_device_local_account_)); GetStatus(); ASSERT_TRUE(device_status_.has_running_kiosk_app()); @@ -1325,6 +1390,25 @@ EXPECT_FALSE(app.has_error()); } +TEST_F(DeviceStatusCollectorTest, ReportRunningArcKioskApp) { + settings_helper_.SetBoolean(chromeos::kReportRunningKioskApp, true); + MockAutoLaunchArcKioskApp(fake_arc_kiosk_device_local_account_); + MockRunningKioskApp(fake_arc_kiosk_device_local_account_, + true /* arc_kiosk */); + status_collector_->set_kiosk_account( + base::MakeUnique<policy::DeviceLocalAccount>( + fake_arc_kiosk_device_local_account_)); + + GetStatus(); + ASSERT_TRUE(device_status_.has_running_kiosk_app()); + const em::AppStatus app = device_status_.running_kiosk_app(); + EXPECT_EQ(kArcKioskPackageName, app.app_id()); + EXPECT_TRUE(app.extension_version().empty()); + EXPECT_TRUE(app.required_platform_version().empty()); + EXPECT_FALSE(app.has_status()); + EXPECT_FALSE(app.has_error()); +} + TEST_F(DeviceStatusCollectorTest, TestSoundVolume) { // Expect the sound volume to be reported by default (default sound volume // used in testing is 75). @@ -1619,7 +1703,8 @@ TEST_F(DeviceStatusCollectorNetworkInterfacesTest, NetworkInterfaces) { // Mock that we are in kiosk mode so we report network state. status_collector_->set_kiosk_account( - base::MakeUnique<policy::DeviceLocalAccount>(fake_device_local_account_)); + base::MakeUnique<policy::DeviceLocalAccount>( + fake_kiosk_device_local_account_)); // Interfaces should be reported by default. GetStatus();
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java index 4fc2d37..7756d38 100644 --- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java +++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploaderImplTest.java
@@ -11,6 +11,7 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.ThreadUtils; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.components.minidump_uploader.CrashTestRule.MockCrashReportingPermissionManager; import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; @@ -251,6 +252,16 @@ // Ensure we tell JobScheduler to reschedule the job. Assert.assertTrue(minidumpUploader.cancelUploads()); stopStallingLatch.countDown(); + // Wait for the MinidumpUploader worker thread to finish before ending the test. This is to + // ensure the worker thread doesn't continue running after the test finishes - trying to + // access directories or minidumps set up and deleted by the test framework. + ThreadUtils.runOnUiThreadBlocking(() -> { + try { + minidumpUploader.joinWorkerThreadForTesting(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); } private interface MinidumpUploadCallableCreator {
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index a3bc015..7f770b15 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -756,8 +756,8 @@ // OS version. optional OsUpdateStatus os_update_status = 17; - // Set only when there is an auto launched with zero delay kiosk app - // and it is currently running. Otherwise, this field is empty. + // Set only when there is an auto launched with zero delay Chrome or ARC kiosk + // app and it is currently running. Otherwise, this field is empty. optional AppStatus running_kiosk_app = 18; // Sound output volume level in range [0,100]. @@ -790,10 +790,12 @@ // Provides status information for an installed app/extension. message AppStatus { - // ID of the installed app/extension + // ID of the installed app/extension for a Chrome app. + // Package name for ARC kiosk app. optional string app_id = 1; - // Currently installed version of the app. + // Currently installed version of the app for a Chrome app. + // Empty for ARC kiosk app. optional string extension_version = 2; // Self-reported status summary (via chrome.reporting APIs) @@ -803,6 +805,7 @@ optional bool error = 4; // App required Chrome version, specified in app’s manifest file. + // Empty for ARC kiosk app. optional string required_platform_version = 5; } @@ -820,7 +823,8 @@ // If this is a kiosk session, this is the device local account ID. optional string device_local_account_id = 4; - // Information about installed apps for this user on this device. + // Information about installed apps for this user on this device, + // including information about ARC kiosk app for ARC kiosk session. repeated AppStatus installed_apps = 5; // Information about ARC status.