blob: 27ee1710715f19c15a8665e7d4115e3bf58f3cdd [file] [log] [blame]
Garrick Evansf0ab7132019-06-18 14:50:42 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Garrick Evans3388a032020-03-24 11:25:55 +09005#ifndef PATCHPANEL_FAKE_PROCESS_RUNNER_H_
6#define PATCHPANEL_FAKE_PROCESS_RUNNER_H_
Garrick Evansf0ab7132019-06-18 14:50:42 +09007
8#include <string>
9#include <utility>
10#include <vector>
11
12#include <base/strings/string_util.h>
13
14#include <gtest/gtest.h>
15
Garrick Evans3388a032020-03-24 11:25:55 +090016#include "patchpanel/minijailed_process_runner.h"
Garrick Evansf0ab7132019-06-18 14:50:42 +090017
Garrick Evans3388a032020-03-24 11:25:55 +090018namespace patchpanel {
Garrick Evansf0ab7132019-06-18 14:50:42 +090019
20class FakeProcessRunner : public MinijailedProcessRunner {
21 public:
22 explicit FakeProcessRunner(std::vector<std::string>* runs = nullptr)
23 : runs_(runs ? runs : &runs_vec_) {}
24 ~FakeProcessRunner() = default;
25
26 int Run(const std::vector<std::string>& argv, bool log_failures) override {
27 if (capture_)
28 runs_->emplace_back(base::JoinString(argv, " "));
Taoyu Lica49c832019-12-06 17:56:43 +090029 if (run_override_)
30 return run_override_.Run(argv);
Garrick Evansf0ab7132019-06-18 14:50:42 +090031 return 0;
32 }
33
Garrick Evans2470caa2020-03-04 14:15:41 +090034 int RestoreDefaultNamespace(const std::string& ifname, pid_t pid) override {
Garrick Evansf0ab7132019-06-18 14:50:42 +090035 return 0;
36 }
37
Garrick Evansf0ab7132019-06-18 14:50:42 +090038 void Capture(bool on, std::vector<std::string>* runs = nullptr) {
39 capture_ = on;
40 if (runs)
41 runs_ = runs;
42 }
43
44 void VerifyRuns(const std::vector<std::string>& expected) {
45 VerifyRuns(*runs_, expected);
46 }
47
48 static void VerifyRuns(const std::vector<std::string>& got,
49 const std::vector<std::string>& expected) {
50 ASSERT_EQ(got.size(), expected.size());
51 for (int i = 0; i < got.size(); ++i) {
52 EXPECT_EQ(got[i], expected[i]);
53 }
54 }
55
56 void VerifyAddInterface(const std::string& host_ifname,
57 const std::string& con_ifname,
Garrick Evans7a1a9ee2020-01-28 11:03:57 +090058 uint32_t con_ipv4,
59 uint32_t con_prefix_len,
Garrick Evansf0ab7132019-06-18 14:50:42 +090060 bool enable_multicast,
61 const std::string& con_pid) {
62 EXPECT_EQ(host_ifname, add_host_ifname_);
63 EXPECT_EQ(con_ifname, add_con_ifname_);
64 EXPECT_EQ(con_ipv4, add_con_ipv4_);
Garrick Evans7a1a9ee2020-01-28 11:03:57 +090065 EXPECT_EQ(con_prefix_len, add_con_prefix_len_);
Garrick Evansf0ab7132019-06-18 14:50:42 +090066 EXPECT_EQ(enable_multicast, add_enable_multicast_);
67 EXPECT_EQ(con_pid, add_con_pid_);
68 }
69
Taoyu Lica49c832019-12-06 17:56:43 +090070 void SetRunOverride(
71 base::Callback<int(const std::vector<std::string>&)> callback) {
72 run_override_ = callback;
73 }
74
Garrick Evansf0ab7132019-06-18 14:50:42 +090075 private:
76 bool capture_ = false;
Taoyu Lica49c832019-12-06 17:56:43 +090077 base::Callback<int(const std::vector<std::string>&)> run_override_;
Garrick Evansf0ab7132019-06-18 14:50:42 +090078 std::vector<std::string>* runs_;
79 std::vector<std::string> runs_vec_;
80 std::string add_host_ifname_;
81 std::string add_con_ifname_;
Garrick Evans7a1a9ee2020-01-28 11:03:57 +090082 uint32_t add_con_ipv4_;
83 uint32_t add_con_prefix_len_;
Garrick Evansf0ab7132019-06-18 14:50:42 +090084 bool add_enable_multicast_;
85 std::string add_con_pid_;
Garrick Evansf0ab7132019-06-18 14:50:42 +090086
87 DISALLOW_COPY_AND_ASSIGN(FakeProcessRunner);
88};
89
Garrick Evans3388a032020-03-24 11:25:55 +090090} // namespace patchpanel
Garrick Evansf0ab7132019-06-18 14:50:42 +090091
Garrick Evans3388a032020-03-24 11:25:55 +090092#endif // PATCHPANEL_FAKE_PROCESS_RUNNER_H_