8 #include "baseproc-sys.h"
12 std::vector<bool> usedfds = {true, true, true};
16 read_result(int errcode_p) : errcode(errcode_p) {}
18 read_result(std::vector<char> &data_p) : errcode(0), data(data_p) {}
19 read_result(std::vector<char> &&data_p) : errcode(0), data(std::move(data_p)) {}
21 int errcode; // errno return
22 std::vector<char> data; // data (if errcode == 0)
25 // map of fd to read results to supply for reads of that fd
26 std::map<int,std::vector<read_result>> read_data;
28 // map of data written to each fd
29 std::map<int,std::vector<char>> written_data;
35 int last_sig_sent = -1; // last signal number sent, accessible for tests.
36 pid_t last_forked_pid = 1; // last forked process id (incremented each 'fork')
38 // Test helper methods:
40 // Allocate a file descriptor
43 auto f = std::find(usedfds.begin(), usedfds.end(), false);
44 if (f == usedfds.end()) {
45 int r = usedfds.size();
46 usedfds.push_back(true);
51 return f - usedfds.begin();
54 // Supply data to be returned by read()
55 void supply_read_data(int fd, std::vector<char> &data)
57 read_data[fd].emplace_back(data);
60 void supply_read_data(int fd, std::vector<char> &&data)
62 read_data[fd].emplace_back(std::move(data));
65 // retrieve data written via write()
66 void extract_written_data(int fd, std::vector<char> &data)
68 data = std::move(written_data[fd]);
72 // Mock implementations of system calls:
74 int pipe2(int fds[2], int flags)
83 if (size_t(fd) >= usedfds.size()) abort();
89 int kill(pid_t pid, int sig)
95 ssize_t read(int fd, void *buf, size_t count)
97 std::vector<read_result> rrs = read_data[fd];
102 read_result &rr = rrs.front();
103 if (rr.errcode != 0) {
105 // Remove the result record:
106 auto i = rrs.begin();
108 rrs.erase(rrs.begin(), i);
112 auto dsize = rr.data.size();
113 if (dsize <= count) {
114 // Consume entire result:
115 std::copy_n(rr.data.begin(), dsize, (char *)buf);
116 // Remove the result record:
117 auto i = rrs.begin();
119 rrs.erase(rrs.begin(), i);
123 // Consume partial result:
124 std::copy_n(rr.data.begin(), count, (char *)buf);
125 rr.data.erase(rr.data.begin(), rr.data.begin() + count);
129 ssize_t write(int fd, const void *buf, size_t count)
131 std::vector<char> &wd = written_data[fd];
132 wd.insert(wd.end(), (char *)buf, (char *)buf + count);