Subversion Repositories HelenOS

Rev

Rev 4327 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2594 cejka 1
/*
2
 * Copyright (c) 2007 Josef Cejka
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
#include <stdio.h>
30
#include <unistd.h>
31
#include <ipc/ipc.h>
32
#include <ipc/services.h>
33
#include <async.h>
34
#include <errno.h>
4581 mejdrech 35
#include <devmap.h>
2594 cejka 36
#include "../tester.h"
37
 
2635 cejka 38
#include <time.h>
39
 
40
#define TEST_DEVICE1 "TestDevice1"
41
#define TEST_DEVICE2 "TestDevice2"
42
 
43
/** Handle requests from clients
44
 *
45
 */
46
static void driver_client_connection(ipc_callid_t iid, ipc_call_t *icall)
47
{
48
    ipc_callid_t callid;
49
    ipc_call_t call;
50
    int retval;
51
 
2660 jermar 52
    printf("connected: method=%u arg1=%u, arg2=%u arg3=%u.\n",
53
        IPC_GET_METHOD(*icall), IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall),
54
        IPC_GET_ARG3(*icall));
2635 cejka 55
 
56
    printf("driver_client_connection.\n");
57
    ipc_answer_0(iid, EOK);
58
 
59
    /* Ignore parameters, the connection is already opened */
60
    while (1) {
61
        callid = async_get_call(&call);
62
        retval = EOK;
2660 jermar 63
        printf("method=%u arg1=%u, arg2=%u arg3=%u.\n",
64
            IPC_GET_METHOD(call), IPC_GET_ARG1(call),
65
            IPC_GET_ARG2(call), IPC_GET_ARG3(call));
2635 cejka 66
        switch (IPC_GET_METHOD(call)) {
67
        case IPC_M_PHONE_HUNGUP:
68
            /* TODO: Handle hangup */
69
            return;
70
        default:
2660 jermar 71
            printf("Unknown device method %u.\n",
72
                IPC_GET_METHOD(call));
2635 cejka 73
            retval = ENOENT;
74
        }
75
        ipc_answer_0(callid, retval);
76
    }
77
    return;
78
}
79
 
80
static int device_client_fibril(void *arg)
81
{
82
    int handle;
83
    int device_phone;
84
 
85
    handle = (int)arg;
86
 
4581 mejdrech 87
    device_phone = devmap_device_connect(handle, 0);
2635 cejka 88
    if (device_phone < 0) {
4581 mejdrech 89
        printf("Failed to connect to device (handle = %u).\n",
2660 jermar 90
            handle);
2635 cejka 91
        return -1;
92
    }
4581 mejdrech 93
 
2635 cejka 94
    printf("Connected to device.\n");
95
    ipc_hangup(device_phone);
96
 
97
    return EOK;
98
}
99
 
100
/** Communication test with device.
101
 * @param handle handle to tested instance.
102
 */
103
static int device_client(int handle)
104
{
105
/*  fid_t fid;
106
    ipc_call_t call;
107
    ipc_callid_t callid;
108
 
109
    fid = fibril_create(device_client_fibril, (void *)handle);
110
    fibril_add_ready(fid);
111
 
112
*/
113
    return EOK;
114
}
115
 
2594 cejka 116
/** Test DevMap from the driver's point of view.
117
 *
118
 *
119
 */
120
char * test_devmap1(bool quiet)
121
{
4581 mejdrech 122
    const char *retval = NULL;
123
 
2594 cejka 124
    /* Register new driver */
4581 mejdrech 125
    int rc = devmap_driver_register("TestDriver", driver_client_connection);
126
    if (rc < 0) {
127
        retval = "Error: Cannot register driver.\n";
128
        goto out;
2594 cejka 129
    }
4581 mejdrech 130
 
131
    /* Register new device dev1. */
132
    dev_handle_t dev1_handle;
133
    rc = devmap_device_register(TEST_DEVICE1, &dev1_handle);
134
    if (rc != EOK) {
135
        retval = "Error: cannot register device.\n";
136
        goto out;
2594 cejka 137
    }
4581 mejdrech 138
 
139
    /*
140
     * Get handle for dev2 (Should fail unless device is already registered
141
     * by someone else).
2594 cejka 142
     */
4581 mejdrech 143
    dev_handle_t handle;
144
    rc = devmap_device_get_handle(TEST_DEVICE2, &handle, 0);
145
    if (rc == EOK) {
146
        retval = "Error: got handle for dev2 before it was registered.\n";
147
        goto out;
2635 cejka 148
    }
4581 mejdrech 149
 
150
    /* Register new device dev2. */
151
    dev_handle_t dev2_handle;
152
    rc = devmap_device_register(TEST_DEVICE2, &dev2_handle);
153
    if (rc != EOK) {
154
        retval = "Error: cannot register device dev2.\n";
155
        goto out;
2594 cejka 156
    }
4581 mejdrech 157
 
158
    /* Register device dev1 again. */
159
    dev_handle_t dev3_handle;
160
    rc = devmap_device_register(TEST_DEVICE1, &dev3_handle);
161
    if (rc == EOK) {
162
        retval = "Error: dev1 registered twice.\n";
163
        goto out;
2594 cejka 164
    }
4581 mejdrech 165
 
166
    /* Get handle for dev1. */
167
    rc = devmap_device_get_handle(TEST_DEVICE1, &handle, 0);
168
    if (rc != EOK) {
169
        retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
170
        goto out;
2635 cejka 171
    }
4581 mejdrech 172
 
2635 cejka 173
    if (handle != dev1_handle) {
4581 mejdrech 174
        retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
175
        goto out;
2635 cejka 176
    }
4581 mejdrech 177
 
178
    if (device_client(dev1_handle) != EOK) {
179
        retval = "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
180
        goto out;
2635 cejka 181
    }
4581 mejdrech 182
 
183
out:
184
    devmap_hangup_phone(DEVMAP_DRIVER);
185
    devmap_hangup_phone(DEVMAP_CLIENT);
186
 
2594 cejka 187
    return NULL;
188
}
189
 
190
char *test_devmap2(bool quiet)
191
{
192
    /*TODO: Full automatic test */
193
    return NULL;
194
}
195
 
196
char *test_devmap3(bool quiet)
197
{
198
    /* TODO: allow user to call test functions in random order */
199
    return NULL;
200
}
201