// 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 PERMISSION_BROKER_MOCK_FIREWALL_H_
#define PERMISSION_BROKER_MOCK_FIREWALL_H_

#include <string>
#include <vector>

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

#include "permission_broker/firewall.h"

namespace permission_broker {

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

  // 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);

 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 permission_broker

#endif  // PERMISSION_BROKER_MOCK_FIREWALL_H_
