// Copyright (c) 2013 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.

// The kernel warning collector gathers logs from kernel warnings.
// Anomaly detector runs the kernel warning collector when it detects strings
// matching the expected warning pattern in /var/log/messages.

#ifndef CRASH_REPORTER_KERNEL_WARNING_COLLECTOR_H_
#define CRASH_REPORTER_KERNEL_WARNING_COLLECTOR_H_

#include <string>

#include <base/macros.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "crash-reporter/crash_collector.h"

// Kernel warning collector.
class KernelWarningCollector : public CrashCollector {
 public:
  enum WarningType {
    kGeneric,
    kWifi,
    kSMMUFault,
    kSuspend,
    // Iwlwifi is the name of Intel WiFi driver that we want to collect its
    // error dumps.
    kIwlwifi,
    // Ath10k is the name of Qualcomm WiFi driver that we want to collect its
    // error dumps.
    kAth10k,
  };

  KernelWarningCollector();
  KernelWarningCollector(const KernelWarningCollector&) = delete;
  KernelWarningCollector& operator=(const KernelWarningCollector&) = delete;

  ~KernelWarningCollector() override;

  // Collects warning.
  bool Collect(int weight, WarningType type);

  static CollectorInfo GetHandlerInfo(int32_t weight,
                                      bool kernel_warning,
                                      bool kernel_wifi_warning,
                                      bool kernel_smmu_fault,
                                      bool kernel_suspend_warning,
                                      bool kernel_iwlwifi_error,
                                      bool kernel_ath10k_error);

 protected:
  std::string warning_report_path_;

 private:
  friend class KernelWarningCollectorTest;
  FRIEND_TEST(KernelWarningCollectorTest, CollectOK);

  // Reads the full content of the kernel warn dump and its signature.
  bool LoadKernelWarning(std::string* content,
                         std::string* signature,
                         std::string* func_name,
                         WarningType type);
  bool ExtractSignature(const std::string& content,
                        std::string* signature,
                        std::string* func_name);
  bool ExtractIwlwifiSignature(const std::string& content,
                               std::string* signature,
                               std::string* func_name);
  bool ExtractSMMUFaultSignature(const std::string& content,
                                 std::string* signature,
                                 std::string* func_name);
  bool ExtractAth10kSignature(const std::string& content,
                              std::string* signature,
                              std::string* func_name);
};

#endif  // CRASH_REPORTER_KERNEL_WARNING_COLLECTOR_H_
