| // Copyright 2021 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 <string> |
| #include <utility> |
| |
| #include "chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h" |
| #include "chromeos/dbus/cros_healthd/fake_cros_healthd_client.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/debug_daemon/fake_debug_daemon_client.h" |
| #include "chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom.h" |
| #include "content/public/test/browser_test.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace chromeos { |
| |
| using TelemetryExtensionTelemetryApiBrowserTest = |
| BaseTelemetryExtensionBrowserTest; |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetVpdInfoError) { |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getVpdInfo() { |
| await chrome.test.assertPromiseRejects( |
| chrome.os.telemetry.getVpdInfo(), |
| 'Error: API internal error' |
| ); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetVpdInfoWithSerialNumberPermission) { |
| // Configure fake cros_healthd response. |
| { |
| auto telemetry_info = cros_healthd::mojom::TelemetryInfo::New(); |
| |
| { |
| auto os_version = cros_healthd::mojom::OsVersion::New(); |
| |
| auto system_info = cros_healthd::mojom::SystemInfo::New(); |
| system_info->first_power_date = "2021-50"; |
| system_info->product_model_name = "COOL-LAPTOP-CHROME"; |
| system_info->product_serial_number = "5CD9132880"; |
| system_info->product_sku_number = "sku15"; |
| system_info->os_version = std::move(os_version); |
| |
| telemetry_info->system_result = |
| cros_healthd::mojom::SystemResult::NewSystemInfo( |
| std::move(system_info)); |
| } |
| |
| ASSERT_TRUE(cros_healthd::FakeCrosHealthdClient::Get()); |
| |
| cros_healthd::FakeCrosHealthdClient::Get() |
| ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); |
| } |
| |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getVpdInfo() { |
| const result = await chrome.os.telemetry.getVpdInfo(); |
| chrome.test.assertEq("2021-50", result.activateDate); |
| chrome.test.assertEq("COOL-LAPTOP-CHROME", result.modelName); |
| chrome.test.assertEq("5CD9132880", result.serialNumber); |
| chrome.test.assertEq("sku15", result.skuNumber); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| namespace { |
| |
| class TestDebugDaemonClient : public FakeDebugDaemonClient { |
| public: |
| TestDebugDaemonClient() = default; |
| ~TestDebugDaemonClient() override = default; |
| |
| void GetLog(const std::string& log_name, |
| DBusMethodCallback<std::string> callback) override { |
| EXPECT_EQ(log_name, "oemdata"); |
| std::move(callback).Run(absl::nullopt); |
| } |
| }; |
| |
| } // namespace |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetOemDataWithSerialNumberPermission_Error) { |
| DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient( |
| std::make_unique<TestDebugDaemonClient>()); |
| |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getOemData() { |
| await chrome.test.assertPromiseRejects( |
| chrome.os.telemetry.getOemData(), |
| 'Error: API internal error' |
| ); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetOemDataWithSerialNumberPermission_Success) { |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getOemData() { |
| const result = await chrome.os.telemetry.getOemData(); |
| chrome.test.assertEq( |
| "oemdata: response from GetLog", result.oemData); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetMemoryInfo_Error) { |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getMemoryInfo() { |
| await chrome.test.assertPromiseRejects( |
| chrome.os.telemetry.getMemoryInfo(), |
| 'Error: API internal error' |
| ); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetMemoryInfo_Success) { |
| // Configure fake cros_healthd response. |
| { |
| auto telemetry_info = cros_healthd::mojom::TelemetryInfo::New(); |
| |
| { |
| auto memory_info = chromeos::cros_healthd::mojom::MemoryInfo::New(); |
| memory_info->total_memory_kib = 2147483647; |
| memory_info->free_memory_kib = 2147483646; |
| memory_info->available_memory_kib = 2147483645; |
| memory_info->page_faults_since_last_boot = 4611686018427388000; |
| |
| telemetry_info->memory_result = |
| chromeos::cros_healthd::mojom::MemoryResult::NewMemoryInfo( |
| std::move(memory_info)); |
| } |
| |
| ASSERT_TRUE(cros_healthd::FakeCrosHealthdClient::Get()); |
| |
| cros_healthd::FakeCrosHealthdClient::Get() |
| ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); |
| } |
| |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getMemoryInfo() { |
| const result = await chrome.os.telemetry.getMemoryInfo(); |
| chrome.test.assertEq(2147483647, result.totalMemoryKiB); |
| chrome.test.assertEq(2147483646, result.freeMemoryKiB); |
| chrome.test.assertEq(2147483645, result.availableMemoryKiB); |
| chrome.test.assertEq(4611686018427388000, |
| result.pageFaultsSinceLastBoot); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetCpuInfo_Error) { |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getCpuInfo() { |
| await chrome.test.assertPromiseRejects( |
| chrome.os.telemetry.getCpuInfo(), |
| 'Error: API internal error' |
| ); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TelemetryExtensionTelemetryApiBrowserTest, |
| GetCpuInfo_Success) { |
| // Configure fake cros_healthd response. |
| { |
| auto telemetry_info = cros_healthd::mojom::TelemetryInfo::New(); |
| |
| { |
| auto c_state1 = chromeos::cros_healthd::mojom::CpuCStateInfo::New(); |
| c_state1->name = "C1"; |
| c_state1->time_in_state_since_last_boot_us = 1125899906875957; |
| |
| auto c_state2 = chromeos::cros_healthd::mojom::CpuCStateInfo::New(); |
| c_state2->name = "C2"; |
| c_state2->time_in_state_since_last_boot_us = 1125899906877777; |
| |
| auto logical_info1 = chromeos::cros_healthd::mojom::LogicalCpuInfo::New(); |
| logical_info1->max_clock_speed_khz = 2147473647; |
| logical_info1->scaling_max_frequency_khz = 1073764046; |
| logical_info1->scaling_current_frequency_khz = 536904245; |
| // Idle time cannot be tested in browser test, because it requires USER_HZ |
| // system constant to convert idle_time_user_hz to milliseconds. |
| logical_info1->idle_time_user_hz = 0; |
| logical_info1->c_states.push_back(std::move(c_state1)); |
| logical_info1->c_states.push_back(std::move(c_state2)); |
| |
| auto logical_info2 = chromeos::cros_healthd::mojom::LogicalCpuInfo::New(); |
| logical_info2->max_clock_speed_khz = 1147494759; |
| logical_info2->scaling_max_frequency_khz = 1063764046; |
| logical_info2->scaling_current_frequency_khz = 936904246; |
| // Idle time cannot be tested in browser test, because it requires USER_HZ |
| // system constant to convert idle_time_user_hz to milliseconds. |
| logical_info2->idle_time_user_hz = 0; |
| |
| auto physical_info1 = |
| chromeos::cros_healthd::mojom::PhysicalCpuInfo::New(); |
| physical_info1->model_name = "i9"; |
| physical_info1->logical_cpus.push_back(std::move(logical_info1)); |
| physical_info1->logical_cpus.push_back(std::move(logical_info2)); |
| |
| auto logical_info3 = chromeos::cros_healthd::mojom::LogicalCpuInfo::New(); |
| logical_info3->max_clock_speed_khz = 1247494759; |
| logical_info3->scaling_max_frequency_khz = 1263764046; |
| logical_info3->scaling_current_frequency_khz = 946904246; |
| // Idle time cannot be tested in browser test, because it requires USER_HZ |
| // system constant to convert idle_time_user_hz to milliseconds. |
| logical_info3->idle_time_user_hz = 0; |
| |
| auto physical_info2 = |
| chromeos::cros_healthd::mojom::PhysicalCpuInfo::New(); |
| physical_info2->model_name = "i9-low-powered"; |
| physical_info2->logical_cpus.push_back(std::move(logical_info3)); |
| |
| auto cpu_info = chromeos::cros_healthd::mojom::CpuInfo::New(); |
| cpu_info->num_total_threads = 2147483647; |
| cpu_info->architecture = |
| chromeos::cros_healthd::mojom::CpuArchitectureEnum::kArmv7l; |
| cpu_info->physical_cpus.push_back(std::move(physical_info1)); |
| cpu_info->physical_cpus.push_back(std::move(physical_info2)); |
| |
| telemetry_info->cpu_result = |
| chromeos::cros_healthd::mojom::CpuResult::NewCpuInfo( |
| std::move(cpu_info)); |
| } |
| |
| ASSERT_TRUE(cros_healthd::FakeCrosHealthdClient::Get()); |
| |
| cros_healthd::FakeCrosHealthdClient::Get() |
| ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); |
| } |
| |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getCpuInfo() { |
| const result = await chrome.os.telemetry.getCpuInfo(); |
| |
| chrome.test.assertEq( |
| // The dictionary members are ordered lexicographically by the Unicode |
| // codepoints that comprise their identifiers. |
| { |
| 'architecture': 'armv7l', |
| 'numTotalThreads': 2147483647, |
| 'physicalCpus': [{ |
| 'logicalCpus': [{ |
| 'cStates': [{ |
| 'name': 'C1', |
| 'timeInStateSinceLastBootUs': 1125899906875957, |
| }, |
| { |
| 'name': 'C2', |
| 'timeInStateSinceLastBootUs': 1125899906877777, |
| }], |
| 'idleTimeMs': 0, |
| 'maxClockSpeedKhz': 2147473647, |
| 'scalingCurrentFrequencyKhz': 536904245, |
| 'scalingMaxFrequencyKhz': 1073764046, |
| }, { |
| 'cStates': [], |
| 'idleTimeMs': 0, |
| 'maxClockSpeedKhz': 1147494759, |
| 'scalingCurrentFrequencyKhz': 936904246, |
| 'scalingMaxFrequencyKhz': 1063764046, |
| }], |
| 'modelName': 'i9', |
| }, { |
| 'logicalCpus': [{ |
| 'cStates': [], |
| 'idleTimeMs': 0, |
| 'maxClockSpeedKhz': 1247494759, |
| 'scalingCurrentFrequencyKhz': 946904246, |
| 'scalingMaxFrequencyKhz': 1263764046, |
| }], |
| 'modelName': 'i9-low-powered', |
| }], |
| }, result); |
| |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| class TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest |
| : public TelemetryExtensionTelemetryApiBrowserTest { |
| public: |
| TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest() = default; |
| ~TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest() override = |
| default; |
| |
| TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest( |
| const BaseTelemetryExtensionBrowserTest&) = delete; |
| TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest& operator=( |
| const TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest&) = |
| delete; |
| |
| protected: |
| std::string GetManifestFile(const std::string& matches_origin) override { |
| return base::StringPrintf(R"( |
| { |
| "key": "%s", |
| "name": "Test Telemetry Extension", |
| "version": "1", |
| "manifest_version": 3, |
| "chromeos_system_extension": {}, |
| "background": { |
| "service_worker": "sw.js" |
| }, |
| "permissions": [ "os.diagnostics", "os.telemetry" ], |
| "externally_connectable": { |
| "matches": [ |
| "%s" |
| ] |
| }, |
| "options_page": "options.html" |
| } |
| )", |
| public_key().c_str(), matches_origin.c_str()); |
| } |
| }; |
| |
| IN_PROC_BROWSER_TEST_F( |
| TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest, |
| GetVpdInfoWithoutSerialNumberPermission) { |
| // Configure fake cros_healthd response. |
| { |
| auto telemetry_info = cros_healthd::mojom::TelemetryInfo::New(); |
| |
| { |
| auto os_version = cros_healthd::mojom::OsVersion::New(); |
| |
| auto system_info = cros_healthd::mojom::SystemInfo::New(); |
| system_info->first_power_date = "2021-50"; |
| system_info->product_model_name = "COOL-LAPTOP-CHROME"; |
| system_info->product_serial_number = "5CD9132880"; |
| system_info->product_sku_number = "sku15"; |
| system_info->os_version = std::move(os_version); |
| |
| telemetry_info->system_result = |
| cros_healthd::mojom::SystemResult::NewSystemInfo( |
| std::move(system_info)); |
| } |
| |
| ASSERT_TRUE(cros_healthd::FakeCrosHealthdClient::Get()); |
| |
| cros_healthd::FakeCrosHealthdClient::Get() |
| ->SetProbeTelemetryInfoResponseForTesting(telemetry_info); |
| } |
| |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getVpdInfo() { |
| const result = await chrome.os.telemetry.getVpdInfo(); |
| chrome.test.assertEq("2021-50", result.activateDate); |
| chrome.test.assertEq("COOL-LAPTOP-CHROME", result.modelName); |
| chrome.test.assertEq(null, result.serialNumber); |
| chrome.test.assertEq("sku15", result.skuNumber); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F( |
| TelemetryExtensionTelemetryApiWithoutSerialNumberBrowserTest, |
| GetOemDataWithoutSerialNumberPermission) { |
| CreateExtensionAndRunServiceWorker(R"( |
| chrome.test.runTests([ |
| async function getOemData() { |
| await chrome.test.assertPromiseRejects( |
| chrome.os.telemetry.getOemData(), |
| 'Error: Unauthorized access to chrome.os.telemetry.getOemData. ' + |
| 'Extension doesn\'t have the permission.' |
| ); |
| chrome.test.succeed(); |
| } |
| ]); |
| )"); |
| } |
| |
| } // namespace chromeos |