Loading system/gd/hal/snoop_logger.cc +21 −8 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ const std::string SnoopLogger::kBtSnoopMaxPacketsPerFileProperty = "persist.blue const std::string SnoopLogger::kIsDebuggableProperty = "ro.debuggable"; const std::string SnoopLogger::kBtSnoopLogModeProperty = "persist.bluetooth.btsnooplogmode"; const std::string SnoopLogger::kBtSnoopDefaultLogModeProperty = "persist.bluetooth.btsnoopdefaultmode"; const std::string SnoopLogger::kBtSnoopLogPersists = "persist.bluetooth.btsnooplogpersists"; const std::string SnoopLogger::kSoCManufacturerProperty = "ro.soc.manufacturer"; SnoopLogger::SnoopLogger( Loading @@ -199,14 +200,16 @@ SnoopLogger::SnoopLogger( const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled, const std::chrono::milliseconds snooz_log_life_time, const std::chrono::milliseconds snooz_log_delete_alarm_interval) const std::chrono::milliseconds snooz_log_delete_alarm_interval, bool snoop_log_persists) : snoop_log_path_(std::move(snoop_log_path)), snooz_log_path_(std::move(snooz_log_path)), max_packets_per_file_(max_packets_per_file), btsnooz_buffer_(max_packets_per_buffer), qualcomm_debug_log_enabled_(qualcomm_debug_log_enabled), snooz_log_life_time_(snooz_log_life_time), snooz_log_delete_alarm_interval_(snooz_log_delete_alarm_interval) { snooz_log_delete_alarm_interval_(snooz_log_delete_alarm_interval), snoop_log_persists(snoop_log_persists) { if (false && btsnoop_mode == kBtSnoopLogModeFiltered) { // TODO(b/163733538): implement filtered snoop log in GD, currently filtered == disabled LOG_INFO("Filtered Snoop Logs enabled"); Loading @@ -220,10 +223,12 @@ SnoopLogger::SnoopLogger( LOG_INFO("Snoop Logs fully enabled"); is_enabled_ = true; is_filtered_ = false; if (!snoop_log_persists) { // delete filtered logs delete_btsnoop_files(get_btsnoop_log_path(snoop_log_path_, true)); // delete snooz logs delete_btsnoop_files(snooz_log_path_); } } else { LOG_INFO("Snoop Logs disabled"); is_enabled_ = false; Loading Loading @@ -441,8 +446,10 @@ void SnoopLogger::Stop() { alarm_->Cancel(); alarm_.reset(); // delete any existing snooz logs if (!snoop_log_persists) { delete_btsnoop_files(snooz_log_path_); } } DumpsysDataFinisher SnoopLogger::GetDumpsysData(flatbuffers::FlatBufferBuilder* builder) const { LOG_DEBUG("Dumping btsnooz log data to %s", snooz_log_path_.c_str()); Loading Loading @@ -505,6 +512,11 @@ void SnoopLogger::RegisterSocket(SnoopLoggerSocketInterface* socket) { socket_ = socket; } bool SnoopLogger::IsBtSnoopLogPersisted() { auto is_debuggable = os::GetSystemPropertyBool(kIsDebuggableProperty, false); return is_debuggable && os::GetSystemPropertyBool(kBtSnoopLogPersists, false); } bool SnoopLogger::IsQualcommDebugLogEnabled() { // Check system prop if the soc manufacturer is Qualcomm bool qualcomm_debug_log_enabled = false; Loading @@ -525,7 +537,8 @@ const ModuleFactory SnoopLogger::Factory = ModuleFactory([]() { GetBtSnoopMode(), IsQualcommDebugLogEnabled(), kBtSnoozLogLifeTime, kBtSnoozLogDeleteRepeatingAlarmInterval); kBtSnoozLogDeleteRepeatingAlarmInterval, IsBtSnoopLogPersisted()); }); } // namespace hal Loading system/gd/hal/snoop_logger.h +7 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ class SnoopLogger : public ::bluetooth::Module { static const std::string kBtSnoopMaxPacketsPerFileProperty; static const std::string kIsDebuggableProperty; static const std::string kBtSnoopLogModeProperty; static const std::string kBtSnoopLogPersists; static const std::string kBtSnoopDefaultLogModeProperty; static const std::string kSoCManufacturerProperty; Loading Loading @@ -74,6 +75,9 @@ class SnoopLogger : public ::bluetooth::Module { // Changes to this value is only effective after restarting Bluetooth static bool IsQualcommDebugLogEnabled(); // Returns whether snoop log persists even after restarting Bluetooth static bool IsBtSnoopLogPersisted(); // Has to be defined from 1 to 4 per btsnoop format enum PacketType { CMD = 1, Loading Loading @@ -110,7 +114,8 @@ class SnoopLogger : public ::bluetooth::Module { const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled, const std::chrono::milliseconds snooz_log_life_time, const std::chrono::milliseconds snooz_log_delete_alarm_interval); const std::chrono::milliseconds snooz_log_delete_alarm_interval, bool snoop_log_persists); void CloseCurrentSnoopLogFile(); void OpenNextSnoopLogFile(); void DumpSnoozLogToFile(const std::vector<std::string>& data) const; Loading @@ -133,6 +138,7 @@ class SnoopLogger : public ::bluetooth::Module { std::chrono::milliseconds snooz_log_delete_alarm_interval_; SnoopLoggerSocketInterface* socket_; SyscallWrapperImpl syscall_if; bool snoop_log_persists = false; }; } // namespace hal Loading system/gd/hal/snoop_logger_test.cc +154 −27 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ class TestSnoopLoggerModule : public SnoopLogger { std::string snooz_log_path, size_t max_packets_per_file, const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled) bool qualcomm_debug_log_enabled, bool snoop_log_persists) : SnoopLogger( std::move(snoop_log_path), std::move(snooz_log_path), Loading @@ -97,7 +98,8 @@ class TestSnoopLoggerModule : public SnoopLogger { btsnoop_mode, qualcomm_debug_log_enabled, 20ms, 5ms) {} 5ms, snoop_log_persists) {} std::string ToString() const override { return std::string("TestSnoopLoggerModule"); Loading Loading @@ -170,7 +172,12 @@ class SnoopLoggerModuleTest : public Test { TEST_F(SnoopLoggerModuleTest, empty_snoop_log_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); test_registry->StopAll(); Loading @@ -183,7 +190,12 @@ TEST_F(SnoopLoggerModuleTest, empty_snoop_log_test) { TEST_F(SnoopLoggerModuleTest, disable_snoop_log_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); test_registry->StopAll(); Loading @@ -196,7 +208,12 @@ TEST_F(SnoopLoggerModuleTest, disable_snoop_log_test) { TEST_F(SnoopLoggerModuleTest, capture_one_packet_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); Loading @@ -214,7 +231,12 @@ TEST_F(SnoopLoggerModuleTest, capture_one_packet_test) { TEST_F(SnoopLoggerModuleTest, capture_hci_cmd_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); Loading @@ -236,7 +258,12 @@ TEST_F(SnoopLoggerModuleTest, capture_hci_cmd_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_signal_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kSdpConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -258,7 +285,12 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_signal_packet_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_short_data_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kAvdtpSuspend, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -280,7 +312,12 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_short_data_packet_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_long_data_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -299,10 +336,39 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_long_data_packet_btsnooz_test) { ASSERT_FALSE(std::filesystem::exists(temp_snooz_log_)); } TEST_F(SnoopLoggerModuleTest, snoop_log_persists) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, true); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture( kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); ASSERT_EQ( std::filesystem::file_size(temp_snooz_log_), sizeof(SnoopLoggerCommon::FileHeaderType) + sizeof(SnoopLogger::PacketHeaderType) + 14); test_registry->StopAll(); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); } TEST_F(SnoopLoggerModuleTest, delete_old_snooz_log_files) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); std::filesystem::create_directories(temp_snooz_log_); Loading @@ -321,9 +387,15 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { // Start once { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); test_registry->StopAll(); } Loading @@ -337,10 +409,17 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { // Start again { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); test_registry->StopAll(); } Loading @@ -359,7 +438,12 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { TEST_F(SnoopLoggerModuleTest, rotate_file_after_full_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); for (int i = 0; i < 11; i++) { Loading @@ -383,9 +467,15 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_after_full_test) { TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -405,9 +495,15 @@ TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_test) { TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_regression_test) { { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -424,9 +520,15 @@ TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_regression_test) { { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -446,7 +548,12 @@ static constexpr int INVALID_FD = -1; TEST_F(SnoopLoggerModuleTest, socket_disabled_connect_fail_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); // // Create a TCP socket file descriptor Loading @@ -470,7 +577,12 @@ TEST_F(SnoopLoggerModuleTest, socket_disabled_connect_fail_test) { TEST_F(SnoopLoggerModuleTest, default_socket_enabled_capture_recv_test) { int ret; auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); // // Create a TCP socket file descriptor Loading Loading @@ -513,7 +625,12 @@ TEST_F(SnoopLoggerModuleTest, default_socket_enabled_capture_recv_test) { TEST_F(SnoopLoggerModuleTest, custom_socket_register_enabled_capture_recv_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); int new_port = 8873; Loading Loading @@ -567,7 +684,12 @@ TEST_F(SnoopLoggerModuleTest, custom_socket_register_enabled_capture_recv_test) TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_disabled_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); class SnoopLoggerSocketMock : public SnoopLoggerSocketInterface { Loading @@ -593,7 +715,12 @@ TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_disabled_ TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_enabled_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); class SnoopLoggerSocketMock : public SnoopLoggerSocketInterface { Loading Loading
system/gd/hal/snoop_logger.cc +21 −8 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ const std::string SnoopLogger::kBtSnoopMaxPacketsPerFileProperty = "persist.blue const std::string SnoopLogger::kIsDebuggableProperty = "ro.debuggable"; const std::string SnoopLogger::kBtSnoopLogModeProperty = "persist.bluetooth.btsnooplogmode"; const std::string SnoopLogger::kBtSnoopDefaultLogModeProperty = "persist.bluetooth.btsnoopdefaultmode"; const std::string SnoopLogger::kBtSnoopLogPersists = "persist.bluetooth.btsnooplogpersists"; const std::string SnoopLogger::kSoCManufacturerProperty = "ro.soc.manufacturer"; SnoopLogger::SnoopLogger( Loading @@ -199,14 +200,16 @@ SnoopLogger::SnoopLogger( const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled, const std::chrono::milliseconds snooz_log_life_time, const std::chrono::milliseconds snooz_log_delete_alarm_interval) const std::chrono::milliseconds snooz_log_delete_alarm_interval, bool snoop_log_persists) : snoop_log_path_(std::move(snoop_log_path)), snooz_log_path_(std::move(snooz_log_path)), max_packets_per_file_(max_packets_per_file), btsnooz_buffer_(max_packets_per_buffer), qualcomm_debug_log_enabled_(qualcomm_debug_log_enabled), snooz_log_life_time_(snooz_log_life_time), snooz_log_delete_alarm_interval_(snooz_log_delete_alarm_interval) { snooz_log_delete_alarm_interval_(snooz_log_delete_alarm_interval), snoop_log_persists(snoop_log_persists) { if (false && btsnoop_mode == kBtSnoopLogModeFiltered) { // TODO(b/163733538): implement filtered snoop log in GD, currently filtered == disabled LOG_INFO("Filtered Snoop Logs enabled"); Loading @@ -220,10 +223,12 @@ SnoopLogger::SnoopLogger( LOG_INFO("Snoop Logs fully enabled"); is_enabled_ = true; is_filtered_ = false; if (!snoop_log_persists) { // delete filtered logs delete_btsnoop_files(get_btsnoop_log_path(snoop_log_path_, true)); // delete snooz logs delete_btsnoop_files(snooz_log_path_); } } else { LOG_INFO("Snoop Logs disabled"); is_enabled_ = false; Loading Loading @@ -441,8 +446,10 @@ void SnoopLogger::Stop() { alarm_->Cancel(); alarm_.reset(); // delete any existing snooz logs if (!snoop_log_persists) { delete_btsnoop_files(snooz_log_path_); } } DumpsysDataFinisher SnoopLogger::GetDumpsysData(flatbuffers::FlatBufferBuilder* builder) const { LOG_DEBUG("Dumping btsnooz log data to %s", snooz_log_path_.c_str()); Loading Loading @@ -505,6 +512,11 @@ void SnoopLogger::RegisterSocket(SnoopLoggerSocketInterface* socket) { socket_ = socket; } bool SnoopLogger::IsBtSnoopLogPersisted() { auto is_debuggable = os::GetSystemPropertyBool(kIsDebuggableProperty, false); return is_debuggable && os::GetSystemPropertyBool(kBtSnoopLogPersists, false); } bool SnoopLogger::IsQualcommDebugLogEnabled() { // Check system prop if the soc manufacturer is Qualcomm bool qualcomm_debug_log_enabled = false; Loading @@ -525,7 +537,8 @@ const ModuleFactory SnoopLogger::Factory = ModuleFactory([]() { GetBtSnoopMode(), IsQualcommDebugLogEnabled(), kBtSnoozLogLifeTime, kBtSnoozLogDeleteRepeatingAlarmInterval); kBtSnoozLogDeleteRepeatingAlarmInterval, IsBtSnoopLogPersisted()); }); } // namespace hal Loading
system/gd/hal/snoop_logger.h +7 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ class SnoopLogger : public ::bluetooth::Module { static const std::string kBtSnoopMaxPacketsPerFileProperty; static const std::string kIsDebuggableProperty; static const std::string kBtSnoopLogModeProperty; static const std::string kBtSnoopLogPersists; static const std::string kBtSnoopDefaultLogModeProperty; static const std::string kSoCManufacturerProperty; Loading Loading @@ -74,6 +75,9 @@ class SnoopLogger : public ::bluetooth::Module { // Changes to this value is only effective after restarting Bluetooth static bool IsQualcommDebugLogEnabled(); // Returns whether snoop log persists even after restarting Bluetooth static bool IsBtSnoopLogPersisted(); // Has to be defined from 1 to 4 per btsnoop format enum PacketType { CMD = 1, Loading Loading @@ -110,7 +114,8 @@ class SnoopLogger : public ::bluetooth::Module { const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled, const std::chrono::milliseconds snooz_log_life_time, const std::chrono::milliseconds snooz_log_delete_alarm_interval); const std::chrono::milliseconds snooz_log_delete_alarm_interval, bool snoop_log_persists); void CloseCurrentSnoopLogFile(); void OpenNextSnoopLogFile(); void DumpSnoozLogToFile(const std::vector<std::string>& data) const; Loading @@ -133,6 +138,7 @@ class SnoopLogger : public ::bluetooth::Module { std::chrono::milliseconds snooz_log_delete_alarm_interval_; SnoopLoggerSocketInterface* socket_; SyscallWrapperImpl syscall_if; bool snoop_log_persists = false; }; } // namespace hal Loading
system/gd/hal/snoop_logger_test.cc +154 −27 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ class TestSnoopLoggerModule : public SnoopLogger { std::string snooz_log_path, size_t max_packets_per_file, const std::string& btsnoop_mode, bool qualcomm_debug_log_enabled) bool qualcomm_debug_log_enabled, bool snoop_log_persists) : SnoopLogger( std::move(snoop_log_path), std::move(snooz_log_path), Loading @@ -97,7 +98,8 @@ class TestSnoopLoggerModule : public SnoopLogger { btsnoop_mode, qualcomm_debug_log_enabled, 20ms, 5ms) {} 5ms, snoop_log_persists) {} std::string ToString() const override { return std::string("TestSnoopLoggerModule"); Loading Loading @@ -170,7 +172,12 @@ class SnoopLoggerModuleTest : public Test { TEST_F(SnoopLoggerModuleTest, empty_snoop_log_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); test_registry->StopAll(); Loading @@ -183,7 +190,12 @@ TEST_F(SnoopLoggerModuleTest, empty_snoop_log_test) { TEST_F(SnoopLoggerModuleTest, disable_snoop_log_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); test_registry->StopAll(); Loading @@ -196,7 +208,12 @@ TEST_F(SnoopLoggerModuleTest, disable_snoop_log_test) { TEST_F(SnoopLoggerModuleTest, capture_one_packet_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); Loading @@ -214,7 +231,12 @@ TEST_F(SnoopLoggerModuleTest, capture_one_packet_test) { TEST_F(SnoopLoggerModuleTest, capture_hci_cmd_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); Loading @@ -236,7 +258,12 @@ TEST_F(SnoopLoggerModuleTest, capture_hci_cmd_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_signal_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kSdpConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -258,7 +285,12 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_signal_packet_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_short_data_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kAvdtpSuspend, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -280,7 +312,12 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_short_data_packet_btsnooz_test) { TEST_F(SnoopLoggerModuleTest, capture_l2cap_long_data_packet_btsnooz_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); Loading @@ -299,10 +336,39 @@ TEST_F(SnoopLoggerModuleTest, capture_l2cap_long_data_packet_btsnooz_test) { ASSERT_FALSE(std::filesystem::exists(temp_snooz_log_)); } TEST_F(SnoopLoggerModuleTest, snoop_log_persists) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, true); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture( kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); ASSERT_EQ( std::filesystem::file_size(temp_snooz_log_), sizeof(SnoopLoggerCommon::FileHeaderType) + sizeof(SnoopLogger::PacketHeaderType) + 14); test_registry->StopAll(); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); } TEST_F(SnoopLoggerModuleTest, delete_old_snooz_log_files) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); std::filesystem::create_directories(temp_snooz_log_); Loading @@ -321,9 +387,15 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { // Start once { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); test_registry->StopAll(); } Loading @@ -337,10 +409,17 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { // Start again { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture(kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); snoop_logger->Capture( kInformationRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD); test_registry->StopAll(); } Loading @@ -359,7 +438,12 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_at_new_session_test) { TEST_F(SnoopLoggerModuleTest, rotate_file_after_full_test) { // Actual test auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); for (int i = 0; i < 11; i++) { Loading @@ -383,9 +467,15 @@ TEST_F(SnoopLoggerModuleTest, rotate_file_after_full_test) { TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -405,9 +495,15 @@ TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_test) { TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_regression_test) { { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kHfpAtNrec0, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -424,9 +520,15 @@ TEST_F(SnoopLoggerModuleTest, qualcomm_debug_log_regression_test) { { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, false, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); snoop_logger->Capture(kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->Capture( kQualcommConnectionRequest, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL); snoop_logger->CallGetDumpsysData(builder_); ASSERT_TRUE(std::filesystem::exists(temp_snooz_log_)); Loading @@ -446,7 +548,12 @@ static constexpr int INVALID_FD = -1; TEST_F(SnoopLoggerModuleTest, socket_disabled_connect_fail_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); // // Create a TCP socket file descriptor Loading @@ -470,7 +577,12 @@ TEST_F(SnoopLoggerModuleTest, socket_disabled_connect_fail_test) { TEST_F(SnoopLoggerModuleTest, default_socket_enabled_capture_recv_test) { int ret; auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); // // Create a TCP socket file descriptor Loading Loading @@ -513,7 +625,12 @@ TEST_F(SnoopLoggerModuleTest, default_socket_enabled_capture_recv_test) { TEST_F(SnoopLoggerModuleTest, custom_socket_register_enabled_capture_recv_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); int new_port = 8873; Loading Loading @@ -567,7 +684,12 @@ TEST_F(SnoopLoggerModuleTest, custom_socket_register_enabled_capture_recv_test) TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_disabled_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeDisabled, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); class SnoopLoggerSocketMock : public SnoopLoggerSocketInterface { Loading @@ -593,7 +715,12 @@ TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_disabled_ TEST_F(SnoopLoggerModuleTest, custom_socket_interface_register_logging_enabled_test) { auto* snoop_logger = new TestSnoopLoggerModule( temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true); temp_snoop_log_.string(), temp_snooz_log_.string(), 10, SnoopLogger::kBtSnoopLogModeFull, true, false); test_registry->InjectTestModule(&SnoopLogger::Factory, snoop_logger); class SnoopLoggerSocketMock : public SnoopLoggerSocketInterface { Loading