Skip to content
Open
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
382506d
test(rccl): add host microtests for os/linux.cc and misc/socket.cc
aduforest Oct 15, 2026
27b5d2b
test(rccl): add host microtests for os/linux_ipcsocket.cc and os/linu…
aduforest Oct 15, 2026
16a4e5f
test(rccl): add host microtests for misc/shmutils.cc and misc/signals.cc
aduforest Oct 15, 2026
f8b8089
test(rccl): set death_test_style in a form older gtest accepts
aduforest Oct 15, 2026
c7de8b2
test(rccl): address review of the OS and socket layer microtests
aduforest Oct 15, 2026
0ee3d3d
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 16, 2026
04eed06
test(rccl): lower RLIMIT_NOFILE in the ResetFd dup2-failure microtest
aduforest Oct 16, 2026
430c691
test(rccl): name the OS/socket pins KnownBug_ and pin the SetCpuStack…
aduforest Oct 16, 2026
a97315d
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 19, 2026
818ceeb
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 19, 2026
bb7b37d
test(rccl): move rccl-UnitTestsMicroLinux onto the shared fakes
aduforest Oct 19, 2026
754a21a
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 19, 2026
21cfc69
test(rccl): name AICOMRCCL-2978 in the int/int64_t param pin
aduforest Oct 19, 2026
a73bd4f
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 20, 2026
d1770fd
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 20, 2026
972ff03
test(rccl): host-only suites declare num_gpus 0
aduforest Oct 21, 2026
69d04f0
test(rccl): move the ncclIpcFdClose fake to fakes/ipcsocket_fakes.cc
aduforest Oct 21, 2026
080d82a
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 22, 2026
888dac9
test(rccl): random ipc socket names, closed stdin, ASan-safe signal e…
aduforest Oct 22, 2026
35b18af
test(rccl): behavioural checks instead of log wording, shared fd help…
aduforest Oct 22, 2026
24c0d0a
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 22, 2026
70e6a23
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 22, 2026
54c8541
test(rccl): turn Won't Do bug pins into plain tests (pre-merge harden…
aduforest Oct 22, 2026
c4d9723
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 24, 2026
53e99a0
test(rccl): share a FailWith errno hook across the linux TUs per review
aduforest Oct 24, 2026
7004f4a
test(rccl): leave ci-precheckin.json to develop
aduforest Oct 24, 2026
3bb8da8
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 26, 2026
b850ec4
test(rccl): drop the duplicate rccl-UnitTestsMicroLinux llvm-cov entr…
aduforest Oct 26, 2026
2bcf0bd
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 27, 2026
5067e5d
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 28, 2026
c0348e5
Merge remote-tracking branch 'origin/develop' into users/aduforest/ai…
aduforest Oct 29, 2026
1a849d9
Merge branch 'develop' into users/aduforest/aicomrccl-2819-os-socket-…
aduforest Oct 30, 2026
db78963
Merge branch 'develop' into users/aduforest/aicomrccl-2819-os-socket-…
aduforest Nov 2, 2026
509e5cc
Merge develop and resolve host microtest integration conflicts
aduforest Nov 6, 2026
0acd34b
Merge commit 'f8c544d329aa967c8f782c7cdbb91876c84b6f5b' into users/ad…
aduforest Nov 6, 2026
9c3f6ec
test(rccl): preserve IPC fd fake for split transport microtests
aduforest Nov 6, 2026
11dfb28
test(rccl): avoid overlap with pending memory microtests
aduforest Nov 6, 2026
70481c9
Merge develop and reconcile host-memory microtest fakes
aduforest Nov 9, 2026
c9db8ce
Merge branch 'develop' into users/aduforest/aicomrccl-2819-os-socket-…
pvallem Nov 9, 2026
d5096a9
Merge branch 'develop' into users/aduforest/aicomrccl-2819-os-socket-…
aduforest Nov 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions projects/rccl/test/host/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,11 @@ rccl_assert_source_line("${CMAKE_CURRENT_LIST_DIR}/fakes/tuning_fakes.cc"
"int64_t g_paramMaxNchannels = -2;" "the MaxNchannels fake default")
rccl_assert_source_line("${CMAKE_CURRENT_LIST_DIR}/fakes/wrap_fakes.cc"
"static int64_t DefaultParamForceCe() { return 1; }" "the ForceCe fake default")
rccl_assert_source_line("${_rccl_src_root}/init.cc"
"NCCL_PARAM(SetCpuStackSize, \"SET_CPU_STACK_SIZE\", 1)" "fakes/linux_fakes.cc: ncclParamSetCpuStackSize()")
rccl_assert_source_line("${CMAKE_CURRENT_LIST_DIR}/fakes/linux_fakes.cc"
"int64_t ncclParamSetCpuStackSize() { return g_loadParam(\"SET_CPU_STACK_SIZE\", 1); }"
"the SetCpuStackSize fake default")
# gdr-probe-test.cc pins the GDR probe's registration flags to production's; these
# keep its kRegAccessFlags and both reg.cc copies spelling the same set.
set(_rccl_reg_access_flags
Expand Down Expand Up @@ -665,6 +670,26 @@ function(rccl_define_micro_source_lists)
../common/main_altrsmi.cpp
PARENT_SCOPE)

# rccl-UnitTestsMicroLinux -- src/os/linux*.cc, misc/{socket,shmutils,signals}.cc. Own binary:
# fakes/os_fakes.cc, which most targets link, defines ncclOs* symbols that os/linux.cc defines.
set(TEST_MICRO_LINUX_SOURCE_FILES
linux-test.cc
linux-ipcsocket-test.cc
linux-socket-pair-test.cc
socket-test.cc
shmutils-test.cc
signals-test.cc
fakes/dl_fakes.cc
fakes/env_fakes.cc
fakes/hip_fakes.cc
fakes/libc_fakes.cc
fakes/linux_fakes.cc
fakes/nccl_fakes.cc
${RCCL_HOST_HIPIFY_DIR}/src/misc/crypt.cc
${RCCL_HOST_HIPIFY_DIR}/src/misc/utils.cc
../common/main_altrsmi.cpp
PARENT_SCOPE)

# rccl-UnitTestsMicroRmaProxy -- REAL src/rma/rma_proxy.cc.
set(TEST_MICRO_RMA_PROXY_SOURCE_FILES
rma-proxy-test.cc
Expand Down Expand Up @@ -1969,6 +1994,23 @@ foreach(_variant "" "-uncached" "-faultinj")
endif()
endforeach()

# ---------------------------------------------------------------------------
# rccl-UnitTestsMicroLinux
# ---------------------------------------------------------------------------
rccl_mark_oracle_tus_generated(${RCCL_HOST_HIPIFY_DIR} crypt)
rccl_add_micro_binary(rccl-UnitTestsMicroLinux
SOURCES ${TEST_MICRO_LINUX_SOURCE_FILES}
EXTRA_DEFS
${_MICRO_MODE_DEFS}
RCCL_NCCL_FAKES_OMIT_IPC_FD_CLOSE
LINUX_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/os/linux.cc"
LINUX_IPCSOCKET_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/os/linux_ipcsocket.cc"
LINUX_SOCKET_PAIR_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/os/linux_socket_pair.cc"
SOCKET_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/misc/socket.cc"
SHMUTILS_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/misc/shmutils.cc"
SIGNALS_CC_PATH="${RCCL_HOST_HIPIFY_DIR}/src/misc/signals.cc"
CATEGORIES_YAML "${CMAKE_CURRENT_SOURCE_DIR}/../test_categories_micro_linux.yaml")

# ---------------------------------------------------------------------------
# rccl-UnitTestsMicroConnect -- ncclTopoPreset / ncclTopoPostset unstubbed.
# ---------------------------------------------------------------------------
Expand Down
17 changes: 14 additions & 3 deletions projects/rccl/test/host/MICROTEST_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,14 @@ export colliding non-`static` symbols; otherwise a unit needs its own binary:
`argcheck-test.cc`); suite `Argcheck*`. Its own binary because the test seams HIP,
`ncclDevrFindWindow` and `bootstrapAllGather` around a unit other binaries link whole.
See `test_categories_micro_argcheck.yaml`.
- **`rccl-UnitTestsMicroLinux`**: `os/linux.cc` (`LINUX_CC_PATH`, from `linux-test.cc`),
plus `os/linux_ipcsocket.cc`, `os/linux_socket_pair.cc`, `misc/socket.cc`,
`misc/shmutils.cc` and `misc/signals.cc`, one test TU each; suites `Linux*`,
`Socket*`, `Shmutils*`, `Signals*`. Its own binary: `fakes/os_fakes.cc`, which most
targets link, defines `ncclOsInitialize`, `ncclOsTopoGetStrFromSys` and other `ncclOs*`
symbols `os/linux.cc` defines. The units run on real sockets and files through
`fakes/libc_seam.h` with `UseRealLibc()`. See `test_categories_micro_linux.yaml`.

- **`rccl-UnitTestsMicroCpuset`** — header-only `include/cpuset.h` (from `cpuset-test.cc`);
suite `Cpuset*`. Its own binary because the test defines `os/linux.cc`'s
`ncclOsCpuZero` / `ncclOsCpuSet` / `ncclOsCpuIsSet` one-liners, which would
Expand Down Expand Up @@ -884,8 +892,9 @@ symbol.
| `src/transport/p2p.cc` registration entry points, macro-renamed in one unit via `fakes/transport_p2p_reg_seam.h` (`rccl-UnitTestsMicro`, which compiles the real file) | `fakes/transport_p2p_reg_fakes.cc` |
| selected entry points from `src/{transport,proxy}.cc`, `src/transport/{generic,coll_net,net,nvls}.cc`, `src/{graph/paths,tuning/tuning,plugin/net}.cc` (targets that do not compile the real files) | `fakes/transport_stubs.cc` |
| libc (`gethostname`, `dladdr`), process-wide for units linking libc directly | `fakes/libc_interposers.cc` |
| libc macro-renamed in one unit via `fakes/libc_seam.h` (sockets/stdio/exit for `ras/client.cc` and `ras/client_support.cc`; `gethostname`/`access` for `diagnostics/ib_write_bw.cc`; heap for `graph/rccl_graph_gen.cc`; files, `ioctl`, `atexit`, clock, aligned allocation, thread start and sleep for `transport/net_telemetry.cc`; `opendir` for `misc/gdr_peermem.cc`; `open`/`read`/`close` for `transport/net_socket.cc`; `clock_gettime` for `transport/net_ib/wqe_lat_mon.cc` and `transport/net_ib_cast/scheduler.cc`) | `fakes/libc_fakes.cc` |
| libdl macro-renamed in one unit via `fakes/dl_seam.h` (the `misc/*symbols.cc` builders) | `fakes/dl_fakes.cc` |
| libc macro-renamed in one unit via `fakes/libc_seam.h` (sockets/stdio/exit for `ras/client.cc` and `ras/client_support.cc`; `gethostname`/`access` for `diagnostics/ib_write_bw.cc`; heap for `graph/rccl_graph_gen.cc`; files, `ioctl`, `atexit`, clock, aligned allocation, thread start and sleep for `transport/net_telemetry.cc`; `opendir` for `misc/gdr_peermem.cc`; `open`/`read`/`close` for `transport/net_socket.cc`; `clock_gettime` for `transport/net_ib/wqe_lat_mon.cc` and `transport/net_ib_cast/scheduler.cc`; the OS surface of `os/linux*.cc` and `misc/{socket,signals}.cc`) | `fakes/libc_fakes.cc` |
| libdl macro-renamed in one unit via `fakes/dl_seam.h` (the `misc/*symbols.cc` builders and `os/linux.cc`) | `fakes/dl_fakes.cc` |
| `src/init.cc`'s `SetCpuStackSize` param (`rccl-UnitTestsMicroLinux`, which cannot link `init_fakes.cc`) | `fakes/linux_fakes.cc` |
| reusable RAS poll-entry, message, and diagnostics-context seams | `fakes/ras_fakes.cc` |
| core/lifecycle floor + data symbols | `fakes/nccl_stubs.cc` |
| reusable `nccl*` seams | `fakes/nccl_fakes.cc` |
Expand Down Expand Up @@ -1131,7 +1140,8 @@ triage it into the right bucket:
`fakes/utils_fakes.cc`, since `src/misc/utils.cc` owns them). Only
when the symbol has no owning TU does it belong in the test itself.
- **It's a logging or env-param helper** → already covered by
`ncclDebugLog` (prints to stderr) / `ncclLoadParam` (parses the value
`ncclDebugLog` (prints to stderr; a test that asserts on what was logged
hooks `g_ncclDebugLog`) / `ncclLoadParam` (parses the value
`SetMicroEnv` scripted for that name, and the param's compile-time default
when the name is unmapped). If a new logging primitive
appears, follow the same pattern.
Expand Down Expand Up @@ -1432,6 +1442,7 @@ cmake --build build -j"$(nproc)"
./build/rccl-UnitTestsMicroSymKernels # sym_kernels.cc tests
./build/rccl-UnitTestsMicroGinHostProxy # src/gin/gin_host_proxy.cc + proxy_gpucontext/
./build/rccl-UnitTestsMicroTaskPrep # src/enqueue/task_prep/ + task_sched/ tests
./build/rccl-UnitTestsMicroLinux # src/os/linux*.cc, misc/{socket,shmutils,signals}.cc
./build/rccl-UnitTestsMicroConnect # src/graph/connect.cc Preset/Postset tests
./build/rccl-UnitTestsMicroDiagnostics # src/diagnostics.cc + src/diagnostics/ tests
./build/rccl-UnitTestsMicroGraph # src/graph/{xml,topo,paths,search,rome_models}.cc tests
Expand Down
20 changes: 19 additions & 1 deletion projects/rccl/test/host/fakes/hip_fakes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ ASSERT_HOOK_MATCHES_PROD(g_hipFuncSetAttribute, hipFuncSetAttribute);
RCCL_HIP_PROFILE_INTERCEPTORS_HOOKED(RCCL_ASSERT_INTERCEPTOR_HOOK)
#undef RCCL_ASSERT_INTERCEPTOR_HOOK

ASSERT_HOOK_MATCHES_PROD(g_hipHostRegister, hipHostRegister);
ASSERT_HOOK_MATCHES_PROD(g_hipHostGetDevicePointer, hipHostGetDevicePointer);
ASSERT_HOOK_MATCHES_PROD(g_hipHostUnregister, hipHostUnregister);

#undef ASSERT_HOOK_MATCHES_PROD

// ===========================================================================
Expand Down Expand Up @@ -438,6 +442,12 @@ std::function<hipError_t(hipStream_t)> g_hipStreamDestroy = DefaultHipStreamDest
std::function<hipError_t(hipStreamCaptureMode*)>
g_hipThreadExchangeStreamCaptureMode = DefaultHipThreadExchangeStreamCaptureMode;
std::function<hipError_t(void)> g_hipGetLastError = DefaultHipGetLastError;
static hipError_t DefaultHipHostRegister(void*, size_t, unsigned int) { return hipErrorInvalidValue; }
static hipError_t DefaultHipHostGetDevicePointer(void**, void*, unsigned int) { return hipErrorInvalidValue; }
static hipError_t DefaultHipHostUnregister(void*) { return hipErrorInvalidValue; }
std::function<hipError_t(void*, size_t, unsigned int)> g_hipHostRegister = DefaultHipHostRegister;
std::function<hipError_t(void**, void*, unsigned int)> g_hipHostGetDevicePointer = DefaultHipHostGetDevicePointer;
std::function<hipError_t(void*)> g_hipHostUnregister = DefaultHipHostUnregister;
static hipError_t DefaultHipExtLaunchKernel(const void*, dim3, dim3, void**, size_t, hipStream_t, hipEvent_t,
hipEvent_t, int) {
FailLoudUnfaked("hip_fakes", "hipExtLaunchKernel");
Expand Down Expand Up @@ -715,6 +725,9 @@ void ResetHipFakes()
g_hipStreamDestroy = DefaultHipStreamDestroy;
g_hipThreadExchangeStreamCaptureMode = DefaultHipThreadExchangeStreamCaptureMode;
g_hipGetLastError = DefaultHipGetLastError;
g_hipHostRegister = DefaultHipHostRegister;
g_hipHostGetDevicePointer = DefaultHipHostGetDevicePointer;
g_hipHostUnregister = DefaultHipHostUnregister;
g_hipExtLaunchKernel = DefaultHipExtLaunchKernel;
g_hipLaunchKernel = DefaultHipLaunchKernel;
g_hipEventRecord = DefaultHipEventRecord;
Expand Down Expand Up @@ -1085,7 +1098,12 @@ hipError_t hipStreamCreate(hipStream_t*) { return hipErrorInvalidValue; }
// hipStreamCreateWithPriority / hipDeviceGetStreamPriorityRange are defined
// above (seam-routed) -- the develop merge added plainer duplicates here.
hipError_t hipPointerGetAttributes(hipPointerAttribute_t*, const void*) { return hipErrorInvalidValue; }
hipError_t hipHostGetDevicePointer(void**, void*, unsigned int) { return hipErrorInvalidValue; }
hipError_t hipHostGetDevicePointer(void** dptr, void* hptr, unsigned int flags)
{
return g_hipHostGetDevicePointer(dptr, hptr, flags);
}
hipError_t hipHostRegister(void* ptr, size_t size, unsigned int flags) { return g_hipHostRegister(ptr, size, flags); }
hipError_t hipHostUnregister(void* ptr) { return g_hipHostUnregister(ptr); }
hipError_t hipIpcGetEventHandle(hipIpcEventHandle_t*, hipEvent_t) { return hipErrorInvalidValue; }
hipError_t hipEventSynchronize(hipEvent_t event) { return g_hipEventSynchronize(event); }

Expand Down
4 changes: 4 additions & 0 deletions projects/rccl/test/host/fakes/hip_fakes.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,10 @@ extern std::function<hipError_t(hipStream_t /*stream*/)> g_hipStreamSynchronize;
extern std::function<hipError_t(hipStream_t /*stream*/)> g_hipStreamDestroy;
extern std::function<hipError_t(hipStreamCaptureMode* /*mode*/)> g_hipThreadExchangeStreamCaptureMode;
extern std::function<hipError_t(void)> g_hipGetLastError;
// Host-memory registration, which os/linux.cc's SHM device mapping drives.
extern std::function<hipError_t(void* /*ptr*/, size_t /*size*/, unsigned int /*flags*/)> g_hipHostRegister;
extern std::function<hipError_t(void** /*dptr*/, void* /*hptr*/, unsigned int /*flags*/)> g_hipHostGetDevicePointer;
extern std::function<hipError_t(void* /*ptr*/)> g_hipHostUnregister;
// hipExtLaunchKernel (what hipExtLaunchKernelGGL calls). The default aborts: an unhooked launch is a broken test.
extern std::function<hipError_t(const void* /*function*/, dim3 /*grid*/, dim3 /*block*/, void** /*args*/,
size_t /*sharedMemBytes*/, hipStream_t /*stream*/, hipEvent_t /*startEvent*/,
Expand Down
115 changes: 115 additions & 0 deletions projects/rccl/test/host/fakes/libc_fakes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/mman.h>
#include <sys/time.h>

#include <algorithm>
Expand Down Expand Up @@ -374,9 +375,53 @@ std::function<int(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)> g
DefaultPthreadCreate;
std::function<int(const struct timespec*, struct timespec*)> g_nanosleep = DefaultNanosleep;

static int RealFcntl(int fd, int cmd, int arg) { return ::fcntl(fd, cmd, arg); }
static void RealExit(int status) { ::exit(status); }

std::function<int(struct pollfd*, nfds_t, int)> g_poll = ::poll;
std::function<int(int, int, int, void*, socklen_t*)> g_getsockopt = ::getsockopt;
std::function<int(int, struct sockaddr*, socklen_t*)> g_getsockname = ::getsockname;
std::function<int(int, int)> g_shutdown = ::shutdown;
std::function<ssize_t(int, struct msghdr*, int)> g_recvmsg = ::recvmsg;
std::function<ssize_t(int, const struct msghdr*, int)> g_sendmsg = ::sendmsg;
std::function<int(int*)> g_pipe = ::pipe;
std::function<int(struct ifaddrs**)> g_getifaddrs = ::getifaddrs;
std::function<void(struct ifaddrs*)> g_freeifaddrs = ::freeifaddrs;
std::function<int(int, struct rlimit*)> g_getrlimit = ::getrlimit;
std::function<int(int, const struct rlimit*)> g_setrlimit = ::setrlimit;
std::function<int(pid_t, size_t, cpu_set_t*)> g_schedGetaffinity = ::sched_getaffinity;
std::function<char*(const char*, char*)> g_realpath = ::realpath;
std::function<int(char*)> g_mkstemp = ::mkstemp;
std::function<int(int, int, off_t, off_t)> g_fallocate = ::fallocate;
std::function<void*(void*, size_t, int, int, int, off_t)> g_mmap = ::mmap;
std::function<int(void*, size_t)> g_munmap = ::munmap;
std::function<int(const char*)> g_unlink = ::unlink;
std::function<sighandler_t(int, sighandler_t)> g_signal = ::signal;

ASSERT_HOOK_MATCHES_PROD(g_accept, ::accept);
ASSERT_HOOK_MATCHES_PROD(g_recv, ::recv);
ASSERT_HOOK_MATCHES_PROD(g_send, ::send);
ASSERT_HOOK_MATCHES_PROD(g_poll, ::poll);
ASSERT_HOOK_MATCHES_PROD(g_getsockopt, ::getsockopt);
ASSERT_HOOK_MATCHES_PROD(g_getsockname, ::getsockname);
ASSERT_HOOK_MATCHES_PROD(g_shutdown, ::shutdown);
ASSERT_HOOK_MATCHES_PROD(g_recvmsg, ::recvmsg);
ASSERT_HOOK_MATCHES_PROD(g_sendmsg, ::sendmsg);
ASSERT_HOOK_MATCHES_PROD(g_pipe, ::pipe);
ASSERT_HOOK_MATCHES_PROD(g_getifaddrs, ::getifaddrs);
ASSERT_HOOK_MATCHES_PROD(g_freeifaddrs, ::freeifaddrs);
ASSERT_HOOK_MATCHES_PROD(g_getrlimit, ::getrlimit);
ASSERT_HOOK_MATCHES_PROD(g_setrlimit, ::setrlimit);
ASSERT_HOOK_MATCHES_PROD(g_schedGetaffinity, ::sched_getaffinity);
ASSERT_HOOK_MATCHES_PROD(g_realpath, ::realpath);
ASSERT_HOOK_MATCHES_PROD(g_fopen, ::fopen);
ASSERT_HOOK_MATCHES_PROD(g_opendir, ::opendir);
ASSERT_HOOK_MATCHES_PROD(g_mkstemp, ::mkstemp);
ASSERT_HOOK_MATCHES_PROD(g_fallocate, ::fallocate);
ASSERT_HOOK_MATCHES_PROD(g_mmap, ::mmap);
ASSERT_HOOK_MATCHES_PROD(g_munmap, ::munmap);
ASSERT_HOOK_MATCHES_PROD(g_unlink, ::unlink);
ASSERT_HOOK_MATCHES_PROD(g_signal, ::signal);

#undef ASSERT_HOOK_MATCHES_PROD

Expand Down Expand Up @@ -436,6 +481,25 @@ void ResetLibcFakes() {
g_posixMemalign = DefaultPosixMemalign;
g_pthreadCreate = DefaultPthreadCreate;
g_nanosleep = DefaultNanosleep;
g_poll = ::poll;
g_getsockopt = ::getsockopt;
g_getsockname = ::getsockname;
g_shutdown = ::shutdown;
g_recvmsg = ::recvmsg;
g_sendmsg = ::sendmsg;
g_pipe = ::pipe;
g_getifaddrs = ::getifaddrs;
g_freeifaddrs = ::freeifaddrs;
g_getrlimit = ::getrlimit;
g_setrlimit = ::setrlimit;
g_schedGetaffinity = ::sched_getaffinity;
g_realpath = ::realpath;
g_mkstemp = ::mkstemp;
g_fallocate = ::fallocate;
g_mmap = ::mmap;
g_munmap = ::munmap;
g_unlink = ::unlink;
g_signal = ::signal;

g_writtenData.clear();
g_stdoutData.clear();
Expand Down Expand Up @@ -483,6 +547,34 @@ void ResetLibcFakes() {
errno = 0;
}

void UseRealLibc() {
ResetLibcFakes();
g_write = ::write;
g_read = ::read;
g_close = ::close;
g_socket = ::socket;
g_connect = ::connect;
g_bind = ::bind;
g_listen = ::listen;
g_accept = ::accept;
g_fcntl = RealFcntl;
g_recv = ::recv;
g_send = ::send;
g_setsockopt = ::setsockopt;
g_getaddrinfo = ::getaddrinfo;
g_freeaddrinfo = ::freeaddrinfo;
g_getnameinfo = ::getnameinfo;
g_fwrite = ::fwrite;
g_fflush = ::fflush;
g_perror = ::perror;
g_exit = RealExit;
g_free = ::free;
g_open = [](const char* path, int flags, mode_t mode) { return ::open(path, flags, mode); };
g_fopen = ::fopen;
g_opendir = ::opendir;
g_readlink = ::readlink;
}

// ---------------------------------------------------------------------------
// Trampolines. fakes/libc_seam.h macro-renames each libc call in the unit
// under test to the matching micro_* name; these dispatch through the slots
Expand Down Expand Up @@ -561,6 +653,29 @@ int micro_pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*
return g_pthreadCreate(thread, attr, fn, arg);
}
int micro_nanosleep(const struct timespec* req, struct timespec* rem) { return g_nanosleep(req, rem); }
int micro_poll(struct pollfd* fds, nfds_t nfds, int timeout) { return g_poll(fds, nfds, timeout); }
int micro_getsockopt(int fd, int level, int optname, void* optval, socklen_t* optlen) {
return g_getsockopt(fd, level, optname, optval, optlen);
}
int micro_getsockname(int fd, struct sockaddr* addr, socklen_t* len) { return g_getsockname(fd, addr, len); }
int micro_shutdown(int fd, int how) { return g_shutdown(fd, how); }
ssize_t micro_recvmsg(int fd, struct msghdr* msg, int flags) { return g_recvmsg(fd, msg, flags); }
ssize_t micro_sendmsg(int fd, const struct msghdr* msg, int flags) { return g_sendmsg(fd, msg, flags); }
int micro_pipe(int* fds) { return g_pipe(fds); }
int micro_getifaddrs(struct ifaddrs** ifap) { return g_getifaddrs(ifap); }
void micro_freeifaddrs(struct ifaddrs* ifa) { g_freeifaddrs(ifa); }
int micro_getrlimit(int resource, struct rlimit* lim) { return g_getrlimit(resource, lim); }
int micro_setrlimit(int resource, const struct rlimit* lim) { return g_setrlimit(resource, lim); }
int micro_sched_getaffinity(pid_t pid, size_t size, cpu_set_t* set) { return g_schedGetaffinity(pid, size, set); }
char* micro_realpath(const char* path, char* resolved) { return g_realpath(path, resolved); }
int micro_mkstemp(char* tmpl) { return g_mkstemp(tmpl); }
int micro_fallocate(int fd, int mode, off_t offset, off_t len) { return g_fallocate(fd, mode, offset, len); }
void* micro_mmap(void* addr, size_t len, int prot, int flags, int fd, off_t offset) {
return g_mmap(addr, len, prot, flags, fd, offset);
}
int micro_munmap(void* addr, size_t len) { return g_munmap(addr, len); }
int micro_unlink(const char* path) { return g_unlink(path); }
sighandler_t micro_signal(int sig, sighandler_t handler) { return g_signal(sig, handler); }

// Always forwards to the real vfprintf so stderr output still happens; records only the FILE* and never the
// formatted text, since no test needs the diagnostic's wording, only whether and where one was printed.
Expand Down
Loading
Loading