aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/testcases/scheduler_test.c
blob: a34527c8ae508963b45f9d680fb5d31c9ce65743 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
 * @file scheduler_test.c
 * 
 * @brief Tests for the scheduler_t class.
 * 
 */

/*
 * Copyright (C) 2005 Jan Hutter, Martin Willi
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */
 
#include <string.h>
#include <unistd.h>

#include "scheduler_test.h"

#include <daemon.h>
#include <threads/scheduler.h>
#include <queues/event_queue.h>
#include <queues/job_queue.h>
#include <queues/jobs/incoming_packet_job.h>


/**
 * @brief implementation of a scheduler test
 * 
 * This one uses relative time events, which are not that exact.
 * Test may fail on too slow machines.
 */
void test_scheduler(tester_t *tester)
{
	int job_count = 5;
	job_t *jobs[job_count];
	int current;
	scheduler_t *scheduler = scheduler_create();
	
	/* schedule 5 jobs */
	for (current = 0; current < job_count; current++)
	{
		/* misusing for testing only */
		jobs[current] = (job_t *) incoming_packet_job_create((packet_t*)(current+1));
		charon->event_queue->add_relative(charon->event_queue, jobs[current], (current+1) * 500);
	}
	
	
	for (current = 0; current < job_count; current++)
	{
		jobs[current] = NULL;
	}
	
	usleep(50 * 1000);
	
	/* check if times are correct */
	for (current = 0; current < job_count; current++)
	{
		usleep(400 * 1000); 
		
		tester->assert_true(tester, (charon->job_queue->get_count(charon->job_queue) == current ), "job-queue size before event");
		tester->assert_true(tester, (charon->event_queue->get_count(charon->event_queue) == job_count - current), "event-queue size before event");
		usleep(100 * 1000);

		tester->assert_true(tester, (charon->job_queue->get_count(charon->job_queue) == current + 1), "job-queue size after event");
		tester->assert_true(tester, (charon->event_queue->get_count(charon->event_queue) == job_count - current - 1), "event-queue size after event");
	}
	
	/* check job order */
	for (current = 0; current < job_count; current++)
	{
		jobs[current] =	charon->job_queue->get(charon->job_queue);
		incoming_packet_job_t *current_job;
		current_job = (incoming_packet_job_t*) jobs[current];
		packet_t *packet;
		packet = current_job->get_packet(current_job);
		
		tester->assert_true(tester, (((int)packet) == current+1), "job order");
		jobs[current]->destroy(jobs[current]);
	}

	/* destruction test */
	scheduler->destroy(scheduler);
}