|
21 | 21 | #include <sys/ioctl.h> |
22 | 22 | #include <fcntl.h> |
23 | 23 | #include <stdio.h> |
| 24 | +#include <functional> |
| 25 | +#include <memory> |
| 26 | +#include <cstdarg> |
24 | 27 |
|
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 | +{ |
32 | 38 |
|
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_ |
0 commit comments