Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fbdae76 authored by bidsharma's avatar bidsharma
Browse files

GD: Perist snoop log if flag is true

Test: atest bluetooth_test_gd
Bug: 206700316
Tag: #refactor

Change-Id: I9a702a30f3e43bc9c3d1488e43f4b43fb4244e07
parent 49c3d0de
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -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(
@@ -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");
@@ -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;
@@ -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());
@@ -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;
@@ -525,7 +537,8 @@ const ModuleFactory SnoopLogger::Factory = ModuleFactory([]() {
      GetBtSnoopMode(),
      IsQualcommDebugLogEnabled(),
      kBtSnoozLogLifeTime,
      kBtSnoozLogDeleteRepeatingAlarmInterval);
      kBtSnoozLogDeleteRepeatingAlarmInterval,
      IsBtSnoopLogPersisted());
});

}  // namespace hal
+7 −1
Original line number Diff line number Diff line
@@ -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;

@@ -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,
@@ -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;
@@ -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
+154 −27
Original line number Diff line number Diff line
@@ -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),
@@ -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");
@@ -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();

@@ -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();

@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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_);
@@ -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();
  }

@@ -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();
  }

@@ -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++) {
@@ -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_));
@@ -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_));
@@ -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_));
@@ -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
@@ -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
@@ -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;
@@ -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 {
@@ -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 {