| // Copyright 2019 The Chromium OS 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 "crash-reporter/anomaly_detector.h" |
| |
| #include <base/files/file_path.h> |
| #include <base/optional.h> |
| #include <chromeos/dbus/service_constants.h> |
| #include <dbus/message.h> |
| #include <dbus/mock_bus.h> |
| #include <dbus/mock_exported_object.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "crash-reporter/anomaly_detector_test_utils.h" |
| |
| namespace { |
| |
| using ::testing::_; |
| using ::testing::Eq; |
| using ::testing::IsEmpty; |
| using ::testing::Return; |
| |
| using ::anomaly::CryptohomeParser; |
| using ::anomaly::KernelParser; |
| using ::anomaly::ParserRun; |
| using ::anomaly::ParserTest; |
| using ::anomaly::SELinuxParser; |
| using ::anomaly::ServiceParser; |
| using ::anomaly::SuspendParser; |
| using ::anomaly::TcsdParser; |
| using ::anomaly::TerminaParser; |
| |
| const ParserRun simple_run; |
| const ParserRun empty{.expected_size = 0}; |
| |
| } // namespace |
| |
| TEST(AnomalyDetectorTest, KernelAth10kSNOCError) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[393652.069986] ath10k_snoc 18800000.wifi: " |
| "firmware crashed! (guid 7c8da1e6-f8fe-4665-8257-5a476a7bc786)\n" |
| "[393652.070050] ath10k_snoc 18800000.wifi: " |
| "wcn3990 hw1.0 target 0x00000008 chip_id 0x00000000 sub 0000:0000\n" |
| "[393652.070086] ath10k_snoc 18800000.wifi: " |
| "kconfig debug 1 debugfs 1 tracing 0 dfs 0 testmode 1\n" |
| "[393652.070124] ath10k_snoc 18800000.wifi: " |
| "firmware ver 1.0.0.922 api 5 features " |
| "wowlan,mfp,mgmt-tx-by-reference" |
| ",non-bmi,single-chan-info-per-channel crc32 3f19f7c1\n" |
| "[393652.070158] ath10k_snoc 18800000.wifi: " |
| "board_file api 2 bmi_id N/A crc32 00000000\n" |
| "[393652.070195] ath10k_snoc 18800000.wifi: " |
| "htt-ver 3.86 wmi-op 4 htt-op 3 cal file max-sta 32 raw 0 hwcrypto " |
| "1\n", |
| .expected_flags = {{"--kernel_ath10k_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_ATH10K_SNOC", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelAth10kSDIOError) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[10108611.994407] ath10k_sdio mmc1:0001:1: " |
| "firmware crashed! (guid bfc44e6c-4cef-425b-b9ca-5530c650d0a3)\n" |
| "[10108611.994442] ath10k_sdio mmc1:0001:1: " |
| "qca6174 hw3.2 sdio target 0x05030000 chip_id 0x00000000 sub " |
| "0000:0000\n" |
| "[10108611.994457] ath10k_sdio mmc1:0001:1: " |
| "kconfig debug 1 debugfs 1 tracing 1 dfs 0 testmode 1\n" |
| "[10108611.996680] ath10k_sdio mmc1:0001:1: " |
| "firmware ver WLAN.RMH.4.4.1-00077 api 6 features wowlan,ignore-otp " |
| "crc32 a48b7c2f\n" |
| "[10108611.999858] ath10k_sdio mmc1:0001:1: " |
| "board_file api 2 bmi_id 0:4 crc32 fe1026b8\n" |
| "[10108611.999887] ath10k_sdio mmc1:0001:1: " |
| "htt-ver 3.86 wmi-op 4 htt-op 3 cal otp max-sta 32 raw 0 hwcrypto " |
| "1\n", |
| .expected_flags = {{"--kernel_ath10k_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_ATH10K_SDIO", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelAth10kPCIError) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[ 1582.994118] ath10k_pci 0000:01:00.0: " |
| "firmware crashed! (guid cad1f078-23d2-4cfe-a58a-1e9d353acb7e)\n" |
| "[ 1582.994133] ath10k_pci 0000:01:00.0: " |
| "qca6174 hw3.2 target 0x05030000 chip_id 0x00340aff sub 17aa:0827\n" |
| "[ 1582.994141] ath10k_pci 0000:01:00.0: " |
| "kconfig debug 1 debugfs 1 tracing 1 dfs 0 testmode 1\n" |
| "[ 1582.995552] ath10k_pci 0000:01:00.0: " |
| "firmware ver WLAN.RM.4.4.1-00157-QCARMSWPZ-1 api 6 features " |
| "wowlan,ignore-otp,mfp crc32 90eebefb\n" |
| "[ 1582.996924] ath10k_pci 0000:01:00.0: " |
| "board_file api 2 bmi_id N/A crc32 bebf3597\n" |
| "[ 1582.996936] ath10k_pci 0000:01:00.0: " |
| "htt-ver 3.60 wmi-op 4 htt-op 3 cal otp max-sta 32 raw 0 hwcrypto " |
| "1\n", |
| .expected_flags = {{"--kernel_ath10k_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_ATH10K_PCI", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelAth10kErrorNoEnd) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[393652.069986] ath10k_snoc 18800000.wifi: firmware crashed! " |
| "(guid 7c8da1e6-f8fe-4665-8257-5a476a7bc786)\n" |
| "[393652.070050] ath10k_snoc 18800000.wifi: wcn3990 hw1.0 target " |
| "0x00000008 chip_id 0x00000000 sub 0000:0000\n" |
| "[393652.070086] ath10k_snoc 18800000.wifi: kconfig debug 1 debugfs " |
| "1 tracing 0 dfs 0 testmode 1\n" |
| "[393652.070124] ath10k_snoc 18800000.wifi: firmware ver 1.0.0.922 " |
| "api 5 features wowlan,mfp,mgmt-tx-by-reference,non-bmi,single-chan" |
| "-info-per-channel crc32 3f19f7c1\n" |
| "[393652.070158] ath10k_snoc 18800000.wifi: board_file api 2 bmi_id" |
| " N/A crc32 00000000\n", |
| .expected_flags = {{"--kernel_ath10k_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_ATH10K_NO_END", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelIwlwifiErrorLmacUmac) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[15883.337352] iwlwifi 0000:00:0c.0: Loaded firmware version: " |
| "46.b20aefee.0\n" |
| "[15883.337355] iwlwifi 0000:00:0c.0: 0x00000084 | " |
| "NMI_INTERRUPT_UNKNOWN\n" |
| "[15883.337357] iwlwifi 0000:00:0c.0: 0x000022F0 | trm_hw_status0\n" |
| "[15883.337359] iwlwifi 0000:00:0c.0: 0x00000000 | trm_hw_status1\n" |
| "[15883.337362] iwlwifi 0000:00:0c.0: 0x0048751E | branchlink2\n" |
| "[15883.337364] iwlwifi 0000:00:0c.0: 0x00479236 | interruptlink1\n" |
| "[15883.337366] iwlwifi 0000:00:0c.0: 0x0000AE00 | interruptlink2\n" |
| "[15883.337369] iwlwifi 0000:00:0c.0: 0x0001A2D6 | data1\n" |
| "[15883.337371] iwlwifi 0000:00:0c.0: 0xFF000000 | data2\n" |
| "[15883.337373] iwlwifi 0000:00:0c.0: 0xF0000000 | data3\n" |
| "[15883.337376] iwlwifi 0000:00:0c.0: 0x00000000 | beacon time\n" |
| "[15883.337378] iwlwifi 0000:00:0c.0: 0x158DE6F7 | tsf low\n" |
| "[15883.337380] iwlwifi 0000:00:0c.0: 0x00000000 | tsf hi\n" |
| "[15883.337383] iwlwifi 0000:00:0c.0: 0x00000000 | time gp1\n" |
| "[15883.337385] iwlwifi 0000:00:0c.0: 0x158DE6F9 | time gp2\n" |
| "[15883.337388] iwlwifi 0000:00:0c.0: 0x00000001 | uCode revision " |
| "type\n" |
| "[15883.337390] iwlwifi 0000:00:0c.0: 0x0000002E | uCode version " |
| "major\n" |
| "[15883.337392] iwlwifi 0000:00:0c.0: 0xB20AEFEE | uCode version " |
| "minor\n" |
| "[15883.337394] iwlwifi 0000:00:0c.0: 0x00000312 | hw version\n" |
| "[15883.337397] iwlwifi 0000:00:0c.0: 0x00C89008 | board version\n" |
| "[15883.337399] iwlwifi 0000:00:0c.0: 0x007B019C | hcmd\n" |
| "[15883.337401] iwlwifi 0000:00:0c.0: 0x00022000 | isr0\n" |
| "[15883.337404] iwlwifi 0000:00:0c.0: 0x00000000 | isr1\n" |
| "[15883.337406] iwlwifi 0000:00:0c.0: 0x08001802 | isr2\n" |
| "[15883.337408] iwlwifi 0000:00:0c.0: 0x40400180 | isr3\n" |
| "[15883.337411] iwlwifi 0000:00:0c.0: 0x00000000 | isr4\n" |
| "[15883.337413] iwlwifi 0000:00:0c.0: 0x007B019C | last cmd Id\n" |
| "[15883.337415] iwlwifi 0000:00:0c.0: 0x0001A2D6 | wait_event\n" |
| "[15883.337417] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_control\n" |
| "[15883.337420] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_duration\n" |
| "[15883.337422] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_mhvalid\n" |
| "[15883.337424] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_addr_match\n" |
| "[15883.337427] iwlwifi 0000:00:0c.0: 0x0000008F | lmpm_pmg_sel\n" |
| "[15883.337429] iwlwifi 0000:00:0c.0: 0x24021230 | timestamp\n" |
| "[15883.337432] iwlwifi 0000:00:0c.0: 0x0000B0D8 | flow_handler\n" |
| "[15883.337464] iwlwifi 0000:00:0c.0: Start IWL Error Log Dump:\n" |
| "[15883.337467] iwlwifi 0000:00:0c.0: Status: 0x00000100, count: 7\n" |
| "[15883.337470] iwlwifi 0000:00:0c.0: 0x20000066 | " |
| "NMI_INTERRUPT_HOST\n" |
| "[15883.337472] iwlwifi 0000:00:0c.0: 0x00000000 | umac branchlink1\n" |
| "[15883.337475] iwlwifi 0000:00:0c.0: 0xC008821A | umac branchlink2\n" |
| "[15883.337477] iwlwifi 0000:00:0c.0: 0x00000000 | umac " |
| "interruptlink1\n" |
| "[15883.337479] iwlwifi 0000:00:0c.0: 0x8044FBD2 | umac " |
| "interruptlink2\n" |
| "[15883.337481] iwlwifi 0000:00:0c.0: 0x01000000 | umac data1\n" |
| "[15883.337484] iwlwifi 0000:00:0c.0: 0x8044FBD2 | umac data2\n" |
| "[15883.337486] iwlwifi 0000:00:0c.0: 0xDEADBEEF | umac data3\n" |
| "[15883.337488] iwlwifi 0000:00:0c.0: 0x0000002E | umac major\n" |
| "[15883.337490] iwlwifi 0000:00:0c.0: 0xB20AEFEE | umac minor\n" |
| "[15883.337493] iwlwifi 0000:00:0c.0: 0x158DE6F4 | frame pointer\n" |
| "[15883.337511] iwlwifi 0000:00:0c.0: 0xC088627C | stack pointer\n" |
| "[15883.337514] iwlwifi 0000:00:0c.0: 0x007B019C | last host cmd\n" |
| "[15883.337516] iwlwifi 0000:00:0c.0: 0x00000000 | isr status reg\n", |
| .expected_flags = {{"--kernel_iwlwifi_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_IWLWIFI_LMAC_UMAC", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelIwlwifiErrorLmacTwoSpace) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[79553.430924] iwlwifi 0000:02:00.0: Loaded firmware version: " |
| "29.116a852a.0 7265D-29.ucode\n" |
| "[79553.430930] iwlwifi 0000:02:00.0: 0x00000084 | " |
| "NMI_INTERRUPT_UNKNOWN \n" |
| "[79553.430935] iwlwifi 0000:02:00.0: 0x00A002F0 | trm_hw_status0\n" |
| "[79553.430939] iwlwifi 0000:02:00.0: 0x00000000 | trm_hw_status1\n" |
| "[79553.430944] iwlwifi 0000:02:00.0: 0x00043D6C | branchlink2\n" |
| "[79553.430948] iwlwifi 0000:02:00.0: 0x0004AFD6 | interruptlink1\n" |
| "[79553.430953] iwlwifi 0000:02:00.0: 0x0004AFD6 | interruptlink2\n" |
| "[79553.430957] iwlwifi 0000:02:00.0: 0x00000000 | data1\n" |
| "[79553.430961] iwlwifi 0000:02:00.0: 0x00000080 | data2\n" |
| "[79553.430966] iwlwifi 0000:02:00.0: 0x07230000 | data3\n" |
| "[79553.430970] iwlwifi 0000:02:00.0: 0x1E00B95C | beacon time\n" |
| "[79553.430975] iwlwifi 0000:02:00.0: 0xE6A38917 | tsf low\n" |
| "[79553.430979] iwlwifi 0000:02:00.0: 0x00000011 | tsf hi\n" |
| "[79553.430983] iwlwifi 0000:02:00.0: 0x00000000 | time gp1\n" |
| "[79553.430988] iwlwifi 0000:02:00.0: 0x8540E3A4 | time gp2\n" |
| "[79553.430992] iwlwifi 0000:02:00.0: 0x00000001 | uCode revision " |
| "type\n" |
| "[79553.430996] iwlwifi 0000:02:00.0: 0x0000001D | uCode version " |
| "major\n" |
| "[79553.431013] iwlwifi 0000:02:00.0: 0x116A852A | uCode version " |
| "minor\n" |
| "[79553.431017] iwlwifi 0000:02:00.0: 0x00000210 | hw version\n" |
| "[79553.431021] iwlwifi 0000:02:00.0: 0x00489200 | board version\n" |
| "[79553.431025] iwlwifi 0000:02:00.0: 0x0000001C | hcmd\n" |
| "[79553.431030] iwlwifi 0000:02:00.0: 0x00022000 | isr0\n" |
| "[79553.431034] iwlwifi 0000:02:00.0: 0x00000000 | isr1\n" |
| "[79553.431039] iwlwifi 0000:02:00.0: 0x0000000A | isr2\n" |
| "[79553.431043] iwlwifi 0000:02:00.0: 0x0041D4C0 | isr3\n" |
| "[79553.431047] iwlwifi 0000:02:00.0: 0x00000000 | isr4\n" |
| "[79553.431052] iwlwifi 0000:02:00.0: 0x00230151 | last cmd Id\n" |
| "[79553.431056] iwlwifi 0000:02:00.0: 0x00000000 | wait_event\n" |
| "[79553.431060] iwlwifi 0000:02:00.0: 0x0000A8CB | l2p_control\n" |
| "[79553.431082] iwlwifi 0000:02:00.0: 0x00000020 | l2p_duration\n" |
| "[79553.431086] iwlwifi 0000:02:00.0: 0x00000003 | l2p_mhvalid\n" |
| "[79553.431091] iwlwifi 0000:02:00.0: 0x000000CE | l2p_addr_match\n" |
| "[79553.431095] iwlwifi 0000:02:00.0: 0x00000005 | lmpm_pmg_sel\n" |
| "[79553.431100] iwlwifi 0000:02:00.0: 0x07071159 | timestamp\n" |
| "[79553.431104] iwlwifi 0000:02:00.0: 0x00340010 | flow_handler\n", |
| .expected_flags = {{"--kernel_iwlwifi_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_IWLWIFI_LMAC_TWO_SPACE", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelIwlwifiDriverError) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "0000:01:00.0: Loaded firmware version: 17.bfb58538.0 7260-17.ucode\n" |
| "2020-09-01T11:03:11.221401-07:00 ERR kernel: [ 2448.183344] iwlwifi " |
| "0000:01:00.0: 0x00000000 | ADVANCED_SYSASSERT\n" |
| "2020-09-01T11:03:11.221407-07:00 ERR kernel: [ 2448.183349] iwlwifi " |
| "0000:01:00.0: 0x00000000 | trm_hw_status0\n" |
| "2020-09-01T11:03:11.221409-07:00 ERR kernel: [ 2448.183353] iwlwifi " |
| "0000:01:00.0: 0x00000000 | trm_hw_status1\n" |
| "2020-09-01T11:03:11.221412-07:00 ERR kernel: [ 2448.183357] iwlwifi " |
| "0000:01:00.0: 0x00000000 | branchlink2\n" |
| "2020-09-01T11:03:11.221415-07:00 ERR kernel: [ 2448.183361] iwlwifi " |
| "0000:01:00.0: 0x00000000 | interruptlink1\n" |
| "2020-09-01T11:03:11.221417-07:00 ERR kernel: [ 2448.183365] iwlwifi " |
| "0000:01:00.0: 0x00000000 | interruptlink2\n" |
| "2020-09-01T11:03:11.221420-07:00 ERR kernel: [ 2448.183368] iwlwifi " |
| "0000:01:00.0: 0x00000000 | data1\n" |
| "2020-09-01T11:03:11.221422-07:00 ERR kernel: [ 2448.183372] iwlwifi " |
| "0000:01:00.0: 0x00000000 | data2\n" |
| "2020-09-01T11:03:11.221425-07:00 ERR kernel: [ 2448.183376] iwlwifi " |
| "0000:01:00.0: 0x00000000 | data3\n" |
| "2020-09-01T11:03:11.221427-07:00 ERR kernel: [ 2448.183380] iwlwifi " |
| "0000:01:00.0: 0x00000000 | beacon time\n" |
| "2020-09-01T11:03:11.221429-07:00 ERR kernel: [ 2448.183384] iwlwifi " |
| "0000:01:00.0: 0x00000000 | tsf low\n" |
| "2020-09-01T11:03:11.221432-07:00 ERR kernel: [ 2448.183388] iwlwifi " |
| "0000:01:00.0: 0x00000000 | tsf hi\n" |
| "2020-09-01T11:03:11.221434-07:00 ERR kernel: [ 2448.183392] iwlwifi " |
| "0000:01:00.0: 0x00000000 | time gp1\n" |
| "2020-09-01T11:03:11.221436-07:00 ERR kernel: [ 2448.183396] iwlwifi " |
| "0000:01:00.0: 0x00000000 | time gp2\n" |
| "2020-09-01T11:03:11.221438-07:00 ERR kernel: [ 2448.183400] iwlwifi " |
| "0000:01:00.0: 0x00000000 | uCode revision type\n" |
| "2020-09-01T11:03:11.221440-07:00 ERR kernel: [ 2448.183404] iwlwifi " |
| "0000:01:00.0: 0x00000000 | uCode version major\n" |
| "2020-09-01T11:03:11.221443-07:00 ERR kernel: [ 2448.183408] iwlwifi " |
| "0000:01:00.0: 0x00000000 | uCode version minor\n" |
| "2020-09-01T11:03:11.221445-07:00 ERR kernel: [ 2448.183412] iwlwifi " |
| "0000:01:00.0: 0x00000000 | hw version\n" |
| "2020-09-01T11:03:11.221447-07:00 ERR kernel: [ 2448.183416] iwlwifi " |
| "0000:01:00.0: 0x00000000 | board version\n" |
| "2020-09-01T11:03:11.221449-07:00 ERR kernel: [ 2448.183419] iwlwifi " |
| "0000:01:00.0: 0x00000000 | hcmd\n" |
| "2020-09-01T11:03:11.221451-07:00 ERR kernel: [ 2448.183423] iwlwifi " |
| "0000:01:00.0: 0x00000000 | isr0\n" |
| "2020-09-01T11:03:11.221453-07:00 ERR kernel: [ 2448.183427] iwlwifi " |
| "0000:01:00.0: 0x00000000 | isr1\n" |
| "2020-09-01T11:03:11.221455-07:00 ERR kernel: [ 2448.183431] iwlwifi " |
| "0000:01:00.0: 0x00000000 | isr2\n" |
| "2020-09-01T11:03:11.221457-07:00 ERR kernel: [ 2448.183435] iwlwifi " |
| "0000:01:00.0: 0x00000000 | isr3\n" |
| "2020-09-01T11:03:11.221459-07:00 ERR kernel: [ 2448.183439] iwlwifi " |
| "0000:01:00.0: 0x00000000 | isr4\n" |
| "2020-09-01T11:03:11.221461-07:00 ERR kernel: [ 2448.183442] iwlwifi " |
| "0000:01:00.0: 0x00000000 | last cmd Id\n" |
| "2020-09-01T11:03:11.221464-07:00 ERR kernel: [ 2448.183446] iwlwifi " |
| "0000:01:00.0: 0x00000000 | wait_event\n" |
| "2020-09-01T11:03:11.221466-07:00 ERR kernel: [ 2448.183450] iwlwifi " |
| "0000:01:00.0: 0x00000000 | l2p_control\n" |
| "2020-09-01T11:03:11.221468-07:00 ERR kernel: [ 2448.183454] iwlwifi " |
| "0000:01:00.0: 0x00000000 | l2p_duration\n" |
| "2020-09-01T11:03:11.221470-07:00 ERR kernel: [ 2448.183458] iwlwifi " |
| "0000:01:00.0: 0x00000000 | l2p_mhvalid\n" |
| "2020-09-01T11:03:11.221472-07:00 ERR kernel: [ 2448.183461] iwlwifi " |
| "0000:01:00.0: 0x00000000 | l2p_addr_match\n" |
| "2020-09-01T11:03:11.221474-07:00 ERR kernel: [ 2448.183465] iwlwifi " |
| "0000:01:00.0: 0x00000000 | lmpm_pmg_sel\n" |
| "2020-09-01T11:03:11.221475-07:00 ERR kernel: [ 2448.183469] iwlwifi " |
| "0000:01:00.0: 0x00000000 | timestamp\n" |
| "2020-09-01T11:03:11.221478-07:00 ERR kernel: [ 2448.183473] iwlwifi " |
| "0000:01:00.0: 0x00000000 | flow_handler\n", |
| .expected_flags = {{"--kernel_iwlwifi_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_IWLWIFI_DRIVER_ERROR", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelIwlwifiErrorLmac) { |
| ParserRun wifi_error = { |
| .expected_text = |
| "[15883.337352] iwlwifi 0000:00:0c.0: Loaded firmware version: " |
| "46.b20aefee.0\n" |
| "[15883.337355] iwlwifi 0000:00:0c.0: 0x00000084 | " |
| "NMI_INTERRUPT_UNKNOWN\n" |
| "[15883.337357] iwlwifi 0000:00:0c.0: 0x000022F0 | trm_hw_status0\n" |
| "[15883.337359] iwlwifi 0000:00:0c.0: 0x00000000 | trm_hw_status1\n" |
| "[15883.337362] iwlwifi 0000:00:0c.0: 0x0048751E | branchlink2\n" |
| "[15883.337364] iwlwifi 0000:00:0c.0: 0x00479236 | interruptlink1\n" |
| "[15883.337366] iwlwifi 0000:00:0c.0: 0x0000AE00 | interruptlink2\n" |
| "[15883.337369] iwlwifi 0000:00:0c.0: 0x0001A2D6 | data1\n" |
| "[15883.337371] iwlwifi 0000:00:0c.0: 0xFF000000 | data2\n" |
| "[15883.337373] iwlwifi 0000:00:0c.0: 0xF0000000 | data3\n" |
| "[15883.337376] iwlwifi 0000:00:0c.0: 0x00000000 | beacon time\n" |
| "[15883.337378] iwlwifi 0000:00:0c.0: 0x158DE6F7 | tsf low\n" |
| "[15883.337380] iwlwifi 0000:00:0c.0: 0x00000000 | tsf hi\n" |
| "[15883.337383] iwlwifi 0000:00:0c.0: 0x00000000 | time gp1\n" |
| "[15883.337385] iwlwifi 0000:00:0c.0: 0x158DE6F9 | time gp2\n" |
| "[15883.337388] iwlwifi 0000:00:0c.0: 0x00000001 | uCode revision " |
| "type\n" |
| "[15883.337390] iwlwifi 0000:00:0c.0: 0x0000002E | uCode version " |
| "major\n" |
| "[15883.337392] iwlwifi 0000:00:0c.0: 0xB20AEFEE | uCode version " |
| "minor\n" |
| "[15883.337394] iwlwifi 0000:00:0c.0: 0x00000312 | hw version\n" |
| "[15883.337397] iwlwifi 0000:00:0c.0: 0x00C89008 | board version\n" |
| "[15883.337399] iwlwifi 0000:00:0c.0: 0x007B019C | hcmd\n" |
| "[15883.337401] iwlwifi 0000:00:0c.0: 0x00022000 | isr0\n" |
| "[15883.337404] iwlwifi 0000:00:0c.0: 0x00000000 | isr1\n" |
| "[15883.337406] iwlwifi 0000:00:0c.0: 0x08001802 | isr2\n" |
| "[15883.337408] iwlwifi 0000:00:0c.0: 0x40400180 | isr3\n" |
| "[15883.337411] iwlwifi 0000:00:0c.0: 0x00000000 | isr4\n" |
| "[15883.337413] iwlwifi 0000:00:0c.0: 0x007B019C | last cmd Id\n" |
| "[15883.337415] iwlwifi 0000:00:0c.0: 0x0001A2D6 | wait_event\n" |
| "[15883.337417] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_control\n" |
| "[15883.337420] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_duration\n" |
| "[15883.337422] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_mhvalid\n" |
| "[15883.337424] iwlwifi 0000:00:0c.0: 0x00000000 | l2p_addr_match\n" |
| "[15883.337427] iwlwifi 0000:00:0c.0: 0x0000008F | lmpm_pmg_sel\n" |
| "[15883.337429] iwlwifi 0000:00:0c.0: 0x24021230 | timestamp\n" |
| "[15883.337432] iwlwifi 0000:00:0c.0: 0x0000B0D8 | flow_handler\n", |
| .expected_flags = {{"--kernel_iwlwifi_error", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_IWLWIFI_LMAC", {wifi_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelSMMU_FAULT) { |
| ParserRun smmu_error = { |
| .expected_text = |
| "[ 74.047205] arm-smmu 15000000.iommu: Unhandled context fault: " |
| "fsr=0x402, iova=0x04367000, fsynr=0x30023, cbfrsynra=0x800, cb=5\n", |
| .expected_flags = {{"--kernel_smmu_fault"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_SMMU_FAULT", {smmu_error}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarning) { |
| ParserRun second{ |
| .find_this = "ttm_bo_vm.c", |
| .replace_with = "file_one.c", |
| .expected_text = "0x19e/0x1ab [ttm]()\n[ 3955.309298] Modules linked in", |
| .expected_flags = {{"--kernel_warning", "--weight=10"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING", {simple_run, second}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningNoDuplicate) { |
| ParserRun identical_warning{.expected_size = 0}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING", {simple_run, identical_warning}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningHeader) { |
| ParserRun warning_message{.expected_text = "Test Warning message asdfghjkl"}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING_HEADER", {warning_message}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningOld) { |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING_OLD", {simple_run}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningOldARM64) { |
| ParserRun unknown_function{.expected_text = "-unknown-function\n"}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING_OLD_ARM64", {unknown_function}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningWifi) { |
| ParserRun wifi_warning = { |
| .find_this = "gpu/drm/ttm", |
| .replace_with = "net/wireless", |
| .expected_flags = {{"--kernel_wifi_warning", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING", {wifi_warning}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningWifiMac80211) { |
| ParserRun wifi_warning = { |
| .expected_flags = {{"--kernel_wifi_warning", "--weight=50"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_WIFI_WARNING", {wifi_warning}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, KernelWarningSuspend) { |
| ParserRun suspend_warning = { |
| .find_this = "gpu/drm/ttm", |
| .replace_with = "idle", |
| .expected_flags = {{"--kernel_suspend_warning", "--weight=10"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_WARNING", {suspend_warning}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, CrashReporterCrash) { |
| ParserRun crash_reporter_crash = { |
| .expected_flags = {{"--crash_reporter_crashed"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_CR_CRASH", {crash_reporter_crash}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, CrashReporterCrashRateLimit) { |
| ParserRun crash_reporter_crash = { |
| .expected_flags = {{"--crash_reporter_crashed"}}}; |
| KernelParser parser(true); |
| ParserTest("TEST_CR_CRASH", {crash_reporter_crash, empty, empty}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, ServiceFailure) { |
| ParserRun one{.expected_text = "-exit2-"}; |
| ParserRun two{.find_this = "crash-crash", .replace_with = "fresh-fresh"}; |
| ServiceParser parser(true); |
| ParserTest("TEST_SERVICE_FAILURE", {one, two}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, ServiceFailureArc) { |
| ParserRun service_failure = { |
| .find_this = "crash-crash", |
| .replace_with = "arc-crash", |
| .expected_text = "-exit2-arc-", |
| .expected_flags = {{"--arc_service_failure=arc-crash"}}}; |
| ServiceParser parser(true); |
| ParserTest("TEST_SERVICE_FAILURE", {service_failure}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, ServiceFailureCamera) { |
| ParserRun service_failure = {.find_this = "crash-crash", |
| .replace_with = "cros-camera", |
| .expected_size = 0}; |
| ServiceParser parser(true); |
| ParserTest("TEST_SERVICE_FAILURE", {service_failure}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, SELinuxViolation) { |
| ParserRun selinux_violation = { |
| .expected_text = |
| "-selinux-u:r:cros_init:s0-u:r:kernel:s0-module_request-init-", |
| .expected_flags = {{"--selinux_violation"}}}; |
| SELinuxParser parser(true); |
| ParserTest("TEST_SELINUX", {selinux_violation}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, SELinuxViolationPermissive) { |
| ParserRun selinux_violation = {.find_this = "permissive=0", |
| .replace_with = "permissive=1", |
| .expected_size = 0}; |
| SELinuxParser parser(true); |
| ParserTest("TEST_SELINUX", {selinux_violation}, &parser); |
| } |
| |
| // Verify that we skip non-CrOS selinux violations |
| TEST(AnomalyDetectorTest, SELinuxViolationNonCros) { |
| ParserRun selinux_violation = { |
| .find_this = "cros_init", .replace_with = "init", .expected_size = 0}; |
| SELinuxParser parser(true); |
| ParserTest("TEST_SELINUX", {selinux_violation}, &parser); |
| } |
| |
| TEST(AnomalyDetectorTest, SuspendFailure) { |
| ParserRun suspend_failure = { |
| .expected_text = |
| "-suspend failure: device: dummy_dev step: suspend errno: -22", |
| .expected_flags = {{"--suspend_failure"}}}; |
| SuspendParser parser(true); |
| ParserTest("TEST_SUSPEND_FAILURE", {suspend_failure}, &parser); |
| } |
| |
| MATCHER_P2(SignalEq, interface, member, "") { |
| return (arg->GetInterface() == interface && arg->GetMember() == member); |
| } |
| |
| TEST(AnomalyDetectorTest, BTRFSExtentCorruption) { |
| dbus::Bus::Options options; |
| options.bus_type = dbus::Bus::SYSTEM; |
| scoped_refptr<dbus::MockBus> bus = new dbus::MockBus(options); |
| |
| auto obj_path = dbus::ObjectPath(anomaly_detector::kAnomalyEventServicePath); |
| scoped_refptr<dbus::MockExportedObject> exported_object = |
| new dbus::MockExportedObject(bus.get(), obj_path); |
| |
| EXPECT_CALL(*bus, GetExportedObject(Eq(obj_path))) |
| .WillOnce(Return(exported_object.get())); |
| EXPECT_CALL(*exported_object, |
| SendSignal(SignalEq( |
| anomaly_detector::kAnomalyEventServiceInterface, |
| anomaly_detector::kAnomalyGuestFileCorruptionSignalName))) |
| .Times(1); |
| |
| TerminaParser parser(bus); |
| |
| parser.ParseLogEntry( |
| 3, |
| "BTRFS warning (device vdb): csum failed root 5 ino 257 off 409600 csum " |
| "0x76ad9387 expected csum 0xd8d34542 mirror 1"); |
| } |
| |
| TEST(AnomalyDetectorTest, BTRFSTreeCorruption) { |
| dbus::Bus::Options options; |
| options.bus_type = dbus::Bus::SYSTEM; |
| scoped_refptr<dbus::MockBus> bus = new dbus::MockBus(options); |
| |
| auto obj_path = dbus::ObjectPath(anomaly_detector::kAnomalyEventServicePath); |
| scoped_refptr<dbus::MockExportedObject> exported_object = |
| new dbus::MockExportedObject(bus.get(), obj_path); |
| |
| EXPECT_CALL(*bus, GetExportedObject(Eq(obj_path))) |
| .WillOnce(Return(exported_object.get())); |
| EXPECT_CALL(*exported_object, |
| SendSignal(SignalEq( |
| anomaly_detector::kAnomalyEventServiceInterface, |
| anomaly_detector::kAnomalyGuestFileCorruptionSignalName))) |
| .Times(1); |
| |
| TerminaParser parser(bus); |
| |
| parser.ParseLogEntry(3, |
| "BTRFS warning (device vdb): vdb checksum verify failed " |
| "on 122798080 wanted 4E5B4C99 found 5F261FEB level 0"); |
| } |
| |
| TEST(AnomalyDetectorTest, CryptohomeMountFailure) { |
| ParserRun cryptohome_mount_failure = { |
| .expected_flags = {{"--mount_failure", "--mount_device=cryptohome"}}}; |
| ParserTest<CryptohomeParser>("TEST_CRYPTOHOME_MOUNT_FAILURE", |
| {cryptohome_mount_failure}); |
| } |
| |
| TEST(AnomalyDetectorTest, CryptohomeIgnoreMountFailure) { |
| ParserRun cryptohome_mount_failure = {.expected_size = 0}; |
| ParserTest<CryptohomeParser>("TEST_CRYPTOHOME_MOUNT_FAILURE_IGNORE", |
| {cryptohome_mount_failure}); |
| } |
| |
| TEST(AnomalyDetectorTest, CryptohomeIgnoreFailedLogin) { |
| ParserRun cryptohome_mount_failure = {.expected_size = 0}; |
| ParserTest<CryptohomeParser>("TEST_CRYPTOHOME_FAILED_LOGIN_IGNORE", |
| {cryptohome_mount_failure}); |
| } |
| |
| TEST(AnomalyDetectorTest, TcsdAuthFailure) { |
| ParserRun tcsd_auth_failure = {.expected_text = "b349c715-auth failure", |
| .expected_flags = {{"--auth_failure"}}}; |
| ParserTest<TcsdParser>("TEST_TCSD_AUTH_FAILURE", {tcsd_auth_failure}); |
| } |
| |
| TEST(AnomalyDetectorTest, TcsdAuthFailureBlocklist) { |
| ParserRun tcsd_auth_failure = {.expected_size = 0}; |
| ParserTest<TcsdParser>("TEST_TCSD_AUTH_FAILURE_BLOCKLIST", |
| {tcsd_auth_failure}); |
| } |