chore: rework test cases

This commit is contained in:
Paul Pan 2024-01-01 17:28:39 +08:00
parent c50d6d83e9
commit b6e7a328ff

103
test.c
View File

@ -1,40 +1,89 @@
#include "utils/log.h" #include "utils/log.h"
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
int main() { #define LOG_AND_EXECUTE(func) \
LOG_INFO("Testing Memory Limit"); do { \
LOG_INFO("Testing " #func); \
do_##func(); \
} while (0)
void *p; #pragma GCC push_options
int counter = 0; #pragma GCC optimize("O0")
do {
p = malloc(1); void do_tle() {
if (!p) { for (volatile int i = 0; i != -1; i++) asm("nop");
LOG_ERR("malloc failed, cnt=%d", counter); }
void do_re1() {
char *p = NULL;
*p = 'a';
printf("%c", *p);
}
void do_re2() {
int a = 0;
int b = 2 / a;
printf("%d", b);
}
void do_mle1() {
for (volatile int i = 0; i != -1; i++) {
int *p = malloc(1);
if (p == NULL) {
LOG_INFO("OK: malloc failed: i=%d", i);
break;
} }
counter++;
} while (p);
LOG_INFO("Testing NPROC Limit");
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
} else if (pid == 0) {
LOG_WARN("Child process");
LOG_WARN("Exiting...");
exit(0);
} else {
LOG_INFO("Parent process");
} }
}
LOG_INFO("Testing Time Limit 1"); // void do_mle2() {
sleep(5); // static int a[1 << 30];
// printf("%d", a[0]);
// }
LOG_INFO("Testing Time Limit 2"); void do_block1() {
for (volatile int i = 0; i != -1; i++) int a;
; for (volatile int i = 0; i != -1; i++) scanf("%d", &a);
printf("%d", a);
}
LOG_INFO("Exiting..."); void do_block2() { sleep(10); }
void do_nproc() {
while (1) {
pid_t pid = fork();
if (pid == -1) {
LOG_INFO("OK: fork failed");
break;
} else if (pid == 0)
LOG_ERR("FAIL: Child process, pid = %d", getpid());
else
LOG_ERR("FAIL: Parent process, pid = %d", pid);
}
}
#pragma GCC pop_options
int main() {
int op;
scanf("%d", &op);
switch (op) {
case 1: LOG_AND_EXECUTE(tle); break;
case 2: LOG_AND_EXECUTE(re1); break;
case 3: LOG_AND_EXECUTE(re2); break;
case 4: LOG_AND_EXECUTE(mle1); break;
// case 5: LOG_AND_EXECUTE(mle2); break;
case 6: LOG_AND_EXECUTE(block1); break;
case 7: LOG_AND_EXECUTE(block2); break;
case 8: LOG_AND_EXECUTE(nproc); break;
default: {
LOG_INFO("NO TEST SPECIFIED");
break;
}
}
// destroy stdin, stdout, stderr // destroy stdin, stdout, stderr
close(0); close(0);