Skip to content
186 changes: 186 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,189 @@ jobs:

- name: Compare original and decrypted files and fail if different
run: diff ./tools/xutils.c ./decrypted.c || (echo "Files are different!" && exit 1)

- name: Run Valgrind Check With XTOP client/server
run: |
set -euo pipefail

LOG_DIR=$(mktemp -d)
EXEC_CMD="valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --error-exitcode=1"

$EXEC_CMD --log-file="$LOG_DIR/xtop-server.log" xtop -sva 127.0.0.1 -p 6969 &
server_pid=$!

sleep 2

$EXEC_CMD --log-file="$LOG_DIR/xtop-client.log" xtop -ca 127.0.0.1 -p 6969 &
client_pid=$!

sleep 10

client_status=0
server_status=0

kill -INT "$client_pid" "$server_pid" || true
wait "$client_pid" || client_status=$?
wait "$server_pid" || server_status=$?

cat "$LOG_DIR/xtop-server.log"
cat "$LOG_DIR/xtop-client.log"

for status in "$client_status" "$server_status"; do
if [ "$status" -eq 1 ]; then
echo "Valgrind reported errors (exit code $status)"
exit 1
fi

if [ "$status" -ne 0 ] && [ "$status" -ne 130 ]; then
echo "Unexpected exit code $status"
exit 1
fi
done

echo "Checking valgrind logs for errors"
for log in "$LOG_DIR"/xtop-client.log "$LOG_DIR"/xtop-server.log; do
if ! grep -q "ERROR SUMMARY: 0 errors" "$log"; then
echo "Valgrind errors detected in $log"
cat "$log"
exit 1
fi
done

- name: Run Valgrind Check for XAPI based HTTP client/server
run: |
set -euo pipefail

LOG_DIR=$(mktemp -d)
EXEC_CMD="valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --error-exitcode=1"

$EXEC_CMD --log-file="$LOG_DIR/http-server.log" ./examples/build/http-server -a 127.0.0.1 -p 6161 &
server_pid=$!

sleep 2

$EXEC_CMD --log-file="$LOG_DIR/http-client.log" xhttp -l 127.0.0.1:6161/get &
client_pid=$!

client_status=0
server_status=0

wait "$client_pid" || client_status=$?
kill -INT "$server_pid" || true
wait "$server_pid" || server_status=$?

cat "$LOG_DIR/http-server.log"
cat "$LOG_DIR/http-client.log"

for status in "$client_status" "$server_status"; do
if [ "$status" -eq 1 ]; then
echo "Valgrind reported errors (exit code $status)"
exit 1
fi

if [ "$status" -ne 0 ] && [ "$status" -ne 130 ]; then
echo "Unexpected exit code $status"
exit 1
fi
done

echo "Checking valgrind logs for errors"
for log in "$LOG_DIR"/http-client.log "$LOG_DIR"/http-server.log; do
if ! grep -q "ERROR SUMMARY: 0 errors" "$log"; then
echo "Valgrind errors detected in $log"
cat "$log"
exit 1
fi
done

- name: Run Valgrind Check for XEvent based HTTP client/server
run: |
set -euo pipefail

LOG_DIR=$(mktemp -d)
EXEC_CMD="valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --error-exitcode=1"

$EXEC_CMD --log-file="$LOG_DIR/event-server.log" ./examples/build/events 127.0.0.1 6262 &
server_pid=$!

sleep 2

$EXEC_CMD --log-file="$LOG_DIR/event-client.log" xhttp -l 127.0.0.1:6262/get &
client_pid=$!

client_status=0
server_status=0

wait "$client_pid" || client_status=$?
kill -INT "$server_pid" || true
wait "$server_pid" || server_status=$?

cat "$LOG_DIR/event-server.log"
cat "$LOG_DIR/event-client.log"

for status in "$client_status" "$server_status"; do
if [ "$status" -eq 1 ]; then
echo "Valgrind reported errors (exit code $status)"
exit 1
fi

if [ "$status" -ne 0 ] && [ "$status" -ne 130 ]; then
echo "Unexpected exit code $status"
exit 1
fi
done

echo "Checking valgrind logs for errors"
for log in "$LOG_DIR"/event-client.log "$LOG_DIR"/event-server.log; do
if ! grep -q "ERROR SUMMARY: 0 errors" "$log"; then
echo "Valgrind errors detected in $log"
cat "$log"
exit 1
fi
done

- name: Run Valgrind Check for non-blocking TCP client/server
run: |
set -euo pipefail

LOG_DIR=$(mktemp -d)
EXEC_CMD="valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --error-exitcode=1"

$EXEC_CMD --log-file="$LOG_DIR/async-server.log" ./examples/build/async-server -a 127.0.0.1 -p 6363 &
server_pid=$!

sleep 2

$EXEC_CMD --log-file="$LOG_DIR/async-client.log" ./examples/build/async-client -a 127.0.0.1 -p 6363 &
client_pid=$!

client_status=0
server_status=0

wait "$client_pid" || client_status=$?
kill -INT "$server_pid" || true
wait "$server_pid" || server_status=$?

cat "$LOG_DIR/async-server.log"
cat "$LOG_DIR/async-client.log"

for status in "$client_status" "$server_status"; do
if [ "$status" -eq 1 ]; then
echo "Valgrind reported errors (exit code $status)"
exit 1
fi

if [ "$status" -ne 0 ] && [ "$status" -ne 130 ]; then
echo "Unexpected exit code $status"
exit 1
fi
done

echo "Checking valgrind logs for errors"
for log in "$LOG_DIR"/async-client.log "$LOG_DIR"/async-server.log; do
if ! grep -q "ERROR SUMMARY: 0 errors" "$log"; then
echo "Valgrind errors detected in $log"
cat "$log"
exit 1
fi
done
9 changes: 5 additions & 4 deletions examples/async-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@ int handle_status(xapi_ctx_t *pCtx, xapi_data_t *pData)
{
const char *pStr = XAPI_GetStatus(pCtx);
int nFD = pData ? (int)pData->sock.nFD : XSTDERR;
int nID = pData ? (int)pData->nID : XSTDERR;

if (pCtx->eCbType == XAPI_CB_STATUS)
xlogn("%s: fd(%d)", pStr, nFD);
xlogn("%s: id(%d), fd(%d)", pStr, nID, nFD);
else if (pCtx->eCbType == XAPI_CB_ERROR)
xloge("%s: fd(%d), errno(%d)", pStr, nFD, errno);
xloge("%s: id(%d), fd(%d), errno(%d)", pStr, nID, nFD, errno);

if (pCtx->nStatus == XAPI_DESTROY)
{
Expand All @@ -66,15 +67,15 @@ int handle_request(xapi_ctx_t *pCtx, xapi_data_t *pData)
XByteBuffer_AddBuff(&pData->txBuffer, pBuffer);

// Extend timeout for another 20 seconds
XAPI_ExtendTimer(pData, 20000);
XAPI_AddTimer(pData, 20000);

return XAPI_EnableEvent(pData, XPOLLOUT);
}

int init_data(xapi_ctx_t *pCtx, xapi_data_t *pData)
{
xlogn("Accepted connection: id(%u), fd(%d)", pData->nID, (int)pData->sock.nFD);
XAPI_AddTimer(pData, 20000); // 20 seconds timeout
XAPI_AddTimer(pData, 20000); // Set 20 seconds timeout
return XAPI_SetEvents(pData, XPOLLIN);
}

Expand Down
2 changes: 1 addition & 1 deletion examples/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ int read_event(xevents_t *pEvents, xevent_data_t *pEvData)

return XEVENTS_CONTINUE;
}
else if (eStatus == XHTTP_ERRREAD)
else if (eStatus == XHTTP_EREAD)
{
const char *pError = XSock_ErrStr(&clientSock);

Expand Down
Loading
Loading