Skip to content

Commit 9bacbd5

Browse files
committed
[onert] Add MockSycallManager for customized system call mocking
It adds new MockSyscallsManager class to provide configurable hook system for mocking system calls in tests. ONE-DCO-1.0-Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
1 parent d84669e commit 9bacbd5

2 files changed

Lines changed: 234 additions & 8 deletions

File tree

runtime/onert/backend/trix/ops/test/mock_syscalls.h

Lines changed: 123 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,128 @@
2121
#include <sys/ioctl.h>
2222
#include <fcntl.h>
2323
#include <stdio.h>
24+
#include <functional>
25+
#include <memory>
26+
#include <cstdarg>
2427

25-
int open(const char *, int, ...) { return 0; }
26-
void *mmap(void *, size_t, int, int, int, off_t) { return (void *)0x1; }
27-
int munmap(void *, size_t) { return 0; }
28-
int close(int) { return 0; }
29-
int ioctl(int, unsigned long, ...) { return 0; }
30-
size_t fread(void *, size_t, size_t, FILE *) { return 1; }
31-
int fseek(FILE *, long, int) { return 0; }
28+
namespace onert
29+
{
30+
namespace backend
31+
{
32+
namespace trix
33+
{
34+
namespace ops
35+
{
36+
namespace test
37+
{
3238

33-
#endif
39+
class MockSyscallsManager
40+
{
41+
public:
42+
// Function type definitions for each syscall
43+
// Note: std::function doesn't work well with variadic functions, so we use specific signatures
44+
using OpenHook = std::function<int(const char *, int)>;
45+
using OpenCreatHook = std::function<int(const char *, int, mode_t)>;
46+
using MmapHook = std::function<void *(void *, size_t, int, int, int, off_t)>;
47+
using MunmapHook = std::function<int(void *, size_t)>;
48+
using CloseHook = std::function<int(int)>;
49+
using IoctlHook = std::function<int(int, unsigned long, void *)>;
50+
using FopenHook = std::function<FILE *(const char *, const char *)>;
51+
using FcloseHook = std::function<int(FILE *)>;
52+
using FreadHook = std::function<size_t(void *, size_t, size_t, FILE *)>;
53+
using FseekHook = std::function<int(FILE *, long, int)>;
54+
55+
static MockSyscallsManager &getInstance()
56+
{
57+
static MockSyscallsManager instance;
58+
return instance;
59+
}
60+
61+
// Hook registration functions
62+
void setOpenHook(OpenHook hook) { _openHook = hook; }
63+
void setOpenCreatHook(OpenCreatHook hook) { _openCreatHook = hook; }
64+
void setMmapHook(MmapHook hook) { _mmapHook = hook; }
65+
void setMunmapHook(MunmapHook hook) { _munmapHook = hook; }
66+
void setCloseHook(CloseHook hook) { _closeHook = hook; }
67+
void setIoctlHook(IoctlHook hook) { _ioctlHook = hook; }
68+
void setFopenHook(FopenHook hook) { _fopenHook = hook; }
69+
void setFcloseHook(FcloseHook hook) { _fcloseHook = hook; }
70+
void setFreadHook(FreadHook hook) { _freadHook = hook; }
71+
void setFseekHook(FseekHook hook) { _fseekHook = hook; }
72+
73+
// Hook retrieval functions
74+
OpenHook getOpenHook() const { return _openHook; }
75+
OpenCreatHook getOpenCreatHook() const { return _openCreatHook; }
76+
MmapHook getMmapHook() const { return _mmapHook; }
77+
MunmapHook getMunmapHook() const { return _munmapHook; }
78+
CloseHook getCloseHook() const { return _closeHook; }
79+
IoctlHook getIoctlHook() const { return _ioctlHook; }
80+
FopenHook getFopenHook() const { return _fopenHook; }
81+
FcloseHook getFcloseHook() const { return _fcloseHook; }
82+
FreadHook getFreadHook() const { return _freadHook; }
83+
FseekHook getFseekHook() const { return _fseekHook; }
84+
85+
// Hook clearing functions
86+
void clearOpenHook() { _openHook = nullptr; }
87+
void clearOpenCreatHook() { _openCreatHook = nullptr; }
88+
void clearMmapHook() { _mmapHook = nullptr; }
89+
void clearMunmapHook() { _munmapHook = nullptr; }
90+
void clearCloseHook() { _closeHook = nullptr; }
91+
void clearIoctlHook() { _ioctlHook = nullptr; }
92+
void clearFopenHook() { _fopenHook = nullptr; }
93+
void clearFcloseHook() { _fcloseHook = nullptr; }
94+
void clearFreadHook() { _freadHook = nullptr; }
95+
void clearFseekHook() { _fseekHook = nullptr; }
96+
97+
// Reset all hooks
98+
void resetAll()
99+
{
100+
clearOpenHook();
101+
clearOpenCreatHook();
102+
clearMmapHook();
103+
clearMunmapHook();
104+
clearCloseHook();
105+
clearIoctlHook();
106+
clearFopenHook();
107+
clearFcloseHook();
108+
clearFreadHook();
109+
clearFseekHook();
110+
}
111+
112+
private:
113+
MockSyscallsManager() = default;
114+
~MockSyscallsManager() = default;
115+
MockSyscallsManager(const MockSyscallsManager &) = delete;
116+
MockSyscallsManager &operator=(const MockSyscallsManager &) = delete;
117+
118+
// Hook function pointers
119+
OpenHook _openHook;
120+
OpenCreatHook _openCreatHook;
121+
MmapHook _mmapHook;
122+
MunmapHook _munmapHook;
123+
CloseHook _closeHook;
124+
IoctlHook _ioctlHook;
125+
FopenHook _fopenHook;
126+
FcloseHook _fcloseHook;
127+
FreadHook _freadHook;
128+
FseekHook _fseekHook;
129+
};
130+
131+
} // namespace test
132+
} // namespace ops
133+
} // namespace trix
134+
} // namespace backend
135+
} // namespace onert
136+
137+
// Mock syscall implementations
138+
int open(const char *pathname, int flags, ...);
139+
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
140+
int munmap(void *addr, size_t length);
141+
int close(int fd);
142+
int ioctl(int fd, unsigned long request, ...);
143+
FILE *fopen(const char *path, const char *mode);
144+
int fclose(FILE *stream);
145+
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
146+
int fseek(FILE *stream, long offset, int whence);
147+
148+
#endif // _MOCK_SYSCALLS_H_
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#include "mock_syscalls.h"
2+
3+
int open(const char *pathname, int flags, ...)
4+
{
5+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
6+
7+
// Handle variable arguments for open()
8+
if (flags & O_CREAT)
9+
{
10+
if (auto creatHook = manager.getOpenCreatHook())
11+
{
12+
va_list args;
13+
va_start(args, flags);
14+
mode_t mode = va_arg(args, mode_t);
15+
va_end(args);
16+
return creatHook(pathname, flags, mode);
17+
}
18+
}
19+
else
20+
{
21+
if (auto hook = manager.getOpenHook())
22+
{
23+
return hook(pathname, flags);
24+
}
25+
}
26+
return 0; // Default mock return value
27+
}
28+
29+
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
30+
{
31+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
32+
if (auto hook = manager.getMmapHook())
33+
{
34+
return hook(addr, length, prot, flags, fd, offset);
35+
}
36+
return (void *)0x1; // Default mock return value
37+
}
38+
39+
int munmap(void *addr, size_t length)
40+
{
41+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
42+
if (auto hook = manager.getMunmapHook())
43+
{
44+
return hook(addr, length);
45+
}
46+
return 0; // Default mock return value
47+
}
48+
49+
int close(int fd)
50+
{
51+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
52+
if (auto hook = manager.getCloseHook())
53+
{
54+
return hook(fd);
55+
}
56+
return 0; // Default mock return value
57+
}
58+
59+
int ioctl(int fd, unsigned long request, ...)
60+
{
61+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
62+
if (auto hook = manager.getIoctlHook())
63+
{
64+
va_list args;
65+
va_start(args, request);
66+
void *arg = va_arg(args, void *);
67+
va_end(args);
68+
return hook(fd, request, arg);
69+
}
70+
return 0; // Default mock return value
71+
}
72+
73+
FILE *fopen(const char *path, const char *mode)
74+
{
75+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
76+
if (auto hook = manager.getFopenHook())
77+
{
78+
return hook(path, mode);
79+
}
80+
return (FILE *)0x1; // Default mock return value
81+
}
82+
83+
int fclose(FILE *stream)
84+
{
85+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
86+
if (auto hook = manager.getFcloseHook())
87+
{
88+
return hook(stream);
89+
}
90+
return 0;
91+
}
92+
93+
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
94+
{
95+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
96+
if (auto hook = manager.getFreadHook())
97+
{
98+
return hook(ptr, size, nmemb, stream);
99+
}
100+
return 1; // Default mock return value
101+
}
102+
103+
int fseek(FILE *stream, long offset, int whence)
104+
{
105+
auto &manager = onert::backend::trix::ops::test::MockSyscallsManager::getInstance();
106+
if (auto hook = manager.getFseekHook())
107+
{
108+
return hook(stream, offset, whence);
109+
}
110+
return 0; // Default mock return value
111+
}

0 commit comments

Comments
 (0)