aboutsummaryrefslogtreecommitdiffstats
path: root/tests/process_iterator_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/process_iterator_test.c')
-rw-r--r--tests/process_iterator_test.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/tests/process_iterator_test.c b/tests/process_iterator_test.c
new file mode 100644
index 0000000..f5b7586
--- /dev/null
+++ b/tests/process_iterator_test.c
@@ -0,0 +1,196 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+
+#include <process_iterator.h>
+#include <process_group.h>
+
+volatile sig_atomic_t child;
+
+void kill_child(int sig)
+{
+ kill(child, SIGINT);
+}
+
+void test_single_process()
+{
+ struct process_iterator it;
+ struct process process;
+ struct process_filter filter;
+ int count;
+ //don't iterate children
+ filter.pid = getpid();
+ filter.include_children = 0;
+ count = 0;
+// time_t now = time(NULL);
+ init_process_iterator(&it, &filter);
+ while (get_next_process(&it, &process) == 0)
+ {
+ assert(process.pid == getpid());
+ assert(process.ppid == getppid());
+ assert(process.cputime < 100);
+// assert(process.starttime == now || process.starttime == now - 1);
+ count++;
+ }
+ assert(count == 1);
+ close_process_iterator(&it);
+ //iterate children
+ filter.pid = getpid();
+ filter.include_children = 0;
+ count = 0;
+// now = time(NULL);
+ init_process_iterator(&it, &filter);
+ while (get_next_process(&it, &process) == 0)
+ {
+ assert(process.pid == getpid());
+ assert(process.ppid == getppid());
+ assert(process.cputime < 100);
+// assert(process.starttime == now || process.starttime == now - 1);
+ count++;
+ }
+ assert(count == 1);
+ close_process_iterator(&it);
+}
+
+void test_multiple_process()
+{
+ struct process_iterator it;
+ struct process process;
+ struct process_filter filter;
+ pid_t child = fork();
+ if (child == 0)
+ {
+ //child is supposed to be killed by the parent :/
+ sleep(1);
+ exit(1);
+ }
+ filter.pid = getpid();
+ filter.include_children = 1;
+ init_process_iterator(&it, &filter);
+ int count = 0;
+// time_t now = time(NULL);
+ while (get_next_process(&it, &process) == 0)
+ {
+ if (process.pid == getpid()) assert(process.ppid == getppid());
+ else if (process.pid == child) assert(process.ppid == getpid());
+ else assert(0);
+ assert(process.cputime < 100);
+// assert(process.starttime == now || process.starttime == now - 1);
+ count++;
+ }
+ assert(count == 2);
+ close_process_iterator(&it);
+ kill(child, SIGINT);
+}
+
+void test_all_processes()
+{
+ struct process_iterator it;
+ struct process process;
+ struct process_filter filter;
+ filter.pid = 0;
+ filter.include_children = 0;
+ init_process_iterator(&it, &filter);
+ int count = 0;
+// time_t now = time(NULL);
+ while (get_next_process(&it, &process) == 0)
+ {
+ if (process.pid == getpid())
+ {
+ assert(process.ppid == getppid());
+ assert(process.cputime < 100);
+// assert(process.starttime == now || process.starttime == now - 1);
+ }
+ count++;
+ }
+ assert(count >= 10);
+ close_process_iterator(&it);
+}
+
+void test_process_group_all()
+{
+ struct process_group pgroup;
+ assert(init_process_group(&pgroup, 0, 0) == 0);
+ update_process_group(&pgroup);
+ struct list_node *node = NULL;
+ int count = 0;
+ for (node=pgroup.proclist->first; node!= NULL; node=node->next) {
+ count++;
+ }
+ assert(count > 10);
+ update_process_group(&pgroup);
+ assert(close_process_group(&pgroup) == 0);
+}
+
+void test_process_group_single(int include_children)
+{
+ struct process_group pgroup;
+ child = fork();
+ if (child == 0)
+ {
+ //child is supposed to be killed by the parent :/
+ while(1);
+ exit(1);
+ }
+ signal(SIGABRT, &kill_child);
+ signal(SIGTERM, &kill_child);
+ assert(init_process_group(&pgroup, child, include_children) == 0);
+ int i;
+ double tot_usage = 0;
+ for (i=0; i<100; i++)
+ {
+ update_process_group(&pgroup);
+ struct list_node *node = NULL;
+ int count = 0;
+ for (node=pgroup.proclist->first; node!= NULL; node=node->next) {
+ struct process *p = (struct process*)(node->data);
+ assert(p->pid == child);
+ assert(p->ppid == getpid());
+ assert(p->cpu_usage <= 1.2);
+ tot_usage += p->cpu_usage;
+ count++;
+ }
+ assert(count == 1);
+ struct timespec interval;
+ interval.tv_sec = 0;
+ interval.tv_nsec = 50000000;
+ nanosleep(&interval, NULL);
+ }
+ assert(tot_usage / i < 1.1 && tot_usage / i > 0.8);
+ assert(close_process_group(&pgroup) == 0);
+ kill(child, SIGINT);
+}
+
+void test_process_name(const char * command)
+{
+ struct process_iterator it;
+ struct process process;
+ struct process_filter filter;
+ filter.pid = getpid();
+ filter.include_children = 0;
+ init_process_iterator(&it, &filter);
+ assert(get_next_process(&it, &process) == 0);
+ assert(process.pid == getpid());
+ assert(process.ppid == getppid());
+ assert(strncmp(command, process.command, strlen(process.command)) == 0);
+ assert(get_next_process(&it, &process) != 0);
+ close_process_iterator(&it);
+}
+
+int main(int argc, char **argv)
+{
+// printf("Pid %d\n", getpid());
+ test_single_process();
+ test_multiple_process();
+ test_all_processes();
+ test_process_group_all();
+ test_process_group_single(0);
+ test_process_group_single(1);
+ test_process_name(argv[0]);
+ return 0;
+}
Un proyecto texto-plano.xyz