os_labs/lab13/testing.ic

90 lines
1.8 KiB
Plaintext

#pragma once
#include <unistd.h>
void queue_test() {
int i;
int item;
int length = 128;
Queue *queue = make_queue(length);
assert(queue_empty(queue));
for (i = 0; i < length - 1; i++) {
queue_push(queue, i);
}
assert(queue_full(queue));
for (i = 0; i < 10; i++) {
item = queue_pop(queue);
assert(i == item);
}
assert(!queue_empty(queue));
assert(!queue_full(queue));
for (i = 0; i < 10; i++) {
queue_push(queue, i);
}
assert(queue_full(queue));
for (i = 0; i < 10; i++) {
item = queue_pop(queue);
}
assert(item == 19);
}
void empty_queue_test() {
int i;
pthread_t child[NUM_CHILDREN];
Shared *shared = make_shared();
child[1] = make_thread(consumer_entry, shared);
sleep(1);
child[0] = make_thread(producer_entry, shared);
for (i = 0; i < NUM_CHILDREN; i++) {
join_thread(child[i]);
}
}
void *producer_positive(void *arg)
{
int i;
Shared *shared = (Shared *)arg;
for (i = 0; i < (QUEUE_LENGTH - 1) / 2; i++) {
queue_push(shared->queue, 1);
}
pthread_exit(NULL);
}
void *producer_negative(void *arg)
{
int i;
int item;
Shared *shared = (Shared *)arg;
for (i = 0; i < (QUEUE_LENGTH - 1) - ((QUEUE_LENGTH - 1) / 2); i++) {
queue_push(shared->queue, -1);
}
pthread_exit(NULL);
}
void thread_safe_test() {
int i;
pthread_t child[NUM_CHILDREN];
Shared *shared = make_shared();
for (unsigned int k = 0; k < QUEUE_LENGTH; k++) {
shared->queue->array[k] = 0;
}
child[0] = make_thread(producer_positive, shared);
child[1] = make_thread(producer_negative, shared);
for (i=0; i<NUM_CHILDREN; i++) {
join_thread(child[i]);
}
int was_zero = 0;
for (unsigned int k = 0; k < QUEUE_LENGTH; k++) {
assert(!(was_zero && shared->queue->array[k]));
was_zero = was_zero || !shared->queue->array[k];
}
}