-
Notifications
You must be signed in to change notification settings - Fork 28
/
shm_test.c
74 lines (69 loc) · 2.01 KB
/
shm_test.c
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
#include <resea/ipc.h>
#include <resea/printf.h>
#include <resea/syscall.h>
#include <resea/task.h>
#include <string.h>
#include "test.h"
#define TEST_DATA "hello task"
void shm_util_test(void) {
struct message m;
error_t err;
// Create a shared memory
m.type = SHM_CREATE_MSG;
m.shm_create.size = 32;
err = ipc_call(INIT_TASK, &m);
ASSERT_OK(err);
int shm_id = m.shm_create_reply.shm_id;
TEST_ASSERT(shm_id > -1);
// Map Shared Memory to task
bzero(&m, sizeof(m));
m.type = SHM_MAP_MSG;
m.shm_map.shm_id = shm_id;
m.shm_map.writable = true;
err = ipc_call(INIT_TASK, &m);
ASSERT_OK(err);
vaddr_t vaddr = m.shm_map_reply.vaddr;
TEST_ASSERT(vaddr);
// Mapping Invalid/Unused Shared Memory will lead to Error
bzero(&m, sizeof(m));
m.type = SHM_MAP_MSG;
m.shm_map.shm_id = 5; // unused shm_id
err = ipc_call(INIT_TASK, &m);
TEST_ASSERT(err == ERR_NOT_FOUND);
// Trying to map closed Shared Memory will lead to Error
bzero(&m, sizeof(m));
m.type = SHM_CLOSE_MSG;
m.shm_close.shm_id = shm_id;
ipc_call(INIT_TASK, &m);
bzero(&m, sizeof(m));
m.type = SHM_MAP_MSG;
m.shm_map.shm_id = shm_id; // closed shm
err = ipc_call(INIT_TASK, &m);
TEST_ASSERT(err == ERR_NOT_FOUND);
}
void shm_access_test(void) {
struct message m;
error_t err;
task_t shm_test = ipc_lookup("shm_test_server");
ASSERT_OK(shm_test);
// Send read request to shm_test_server
m.type = SHM_TEST_READ_MSG;
err = ipc_call(shm_test, &m);
ASSERT_OK(err);
int shm_id = m.shm_test_read_reply.shm_id;
// Map Shared Memory to task
bzero(&m, sizeof(m));
m.type = SHM_MAP_MSG;
m.shm_map.shm_id = shm_id;
err = ipc_call(INIT_TASK, &m);
ASSERT_OK(err);
vaddr_t vaddr = m.shm_map_reply.vaddr;
// Read from shared Memory
char buf[32];
memcpy(buf, (void *) vaddr, sizeof(buf));
TEST_ASSERT(strcmp(TEST_DATA, buf) == 0);
}
void shm_test(void) {
shm_util_test();
shm_access_test();
}