// Copyright 2017 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.

#ifndef PATCHPANEL_MOCK_FIREWALL_H_
#define PATCHPANEL_MOCK_FIREWALL_H_

#include <string>
#include <vector>

#include <base/macros.h>
#include <gmock/gmock.h>

#include "patchpanel/firewall.h"

namespace patchpanel {

class MockFirewall : public Firewall {
 public:
  MockFirewall() = default;
  ~MockFirewall() = default;

  int SetRunInMinijailFailCriterion(const std::vector<std::string>& keywords,
                                    bool repeat,
                                    bool omit_failure);
  int GetRunInMinijailCriterionMatchCount(int id);
  bool CheckCommandsUndone();
  int CountActiveCommands();
  void ResetStoredCommands();

  // Check if the current command matches a failure rule,
  // if the failure rule is not a repeat rule, remove it
  // from the match criteria.
  bool MatchAndUpdate(const std::vector<std::string>& argv);

  // Returns all commands issued with RunInMinijail during the test.
  std::vector<std::string> GetAllCommands();

 private:
  struct Criterion {
    std::vector<std::string> keywords;
    // If false, remove the criterion after it's matched.
    bool repeat;
    // If false, treat matching commands as failures, otherwise,
    // omit failing.
    bool omit_failure;
    // Count the number of times the criterion is matched.
    int match_count;

    // Don't take into account match_count.
    bool operator==(const Criterion& c) const {
      return (
          std::equal(keywords.begin(), keywords.end(), c.keywords.begin()) &&
          (repeat == c.repeat) && (c.omit_failure == omit_failure));
    }
  };

  // A list of collections of keywords that a command
  // must have in order for it to fail.
  std::vector<Criterion> match_criteria_;

  // A log of commands issued with RunInMinijail during the test.
  std::vector<std::vector<std::string>> commands_;

  // The mock's implementation simply logs the command issued if
  // successful.
  int RunInMinijail(const std::vector<std::string>& argv) override;

  // Given an ip/iptables command, return the command that undoes its effect.
  std::vector<std::string> GetInverseCommand(
      const std::vector<std::string>& command);

  DISALLOW_COPY_AND_ASSIGN(MockFirewall);
};

}  // namespace patchpanel

#endif  // PATCHPANEL_MOCK_FIREWALL_H_
