source: mainline/uspace/app/tester/chardev/chardev1.c@ c4c6025

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c4c6025 was 57914494, checked in by Jiri Svoboda <jiri@…>, 8 years ago

Chardev needs testing.

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 * Copyright (c) 2017 Jiri Svoboda
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 <errno.h>
30#include <ipc/services.h>
31#include <io/chardev.h>
32#include <loc.h>
33#include "../tester.h"
34
35#define SMALL_BUFFER_SIZE 64
36#define LARGE_BUFFER_SIZE (DATA_XFER_LIMIT * 4)
37
38static char small_buffer[SMALL_BUFFER_SIZE];
39static char large_buffer[LARGE_BUFFER_SIZE];
40
41/** Test device that always performs small transfers. */
42static const char *test_chardev1_smallx(void)
43{
44 chardev_t *chardev;
45 service_id_t sid;
46 async_sess_t *sess;
47 size_t nbytes;
48 int rc;
49
50 TPRINTF("Test small transfer character device operations\n");
51
52 rc = loc_service_get_id(SERVICE_NAME_CHARDEV_TEST_SMALLX, &sid, 0);
53 if (rc != EOK) {
54 return "Failed resolving test device "
55 SERVICE_NAME_CHARDEV_TEST_SMALLX;
56 }
57
58 sess = loc_service_connect(sid, INTERFACE_DDF, 0);
59 if (sess == NULL)
60 return "Failed connecting test device";
61
62 rc = chardev_open(sess, &chardev);
63 if (rc != EOK) {
64 async_hangup(sess);
65 return "Failed opening test device";
66 }
67
68 rc = chardev_write(chardev, small_buffer, SMALL_BUFFER_SIZE, &nbytes);
69 if (rc != EOK) {
70 chardev_close(chardev);
71 async_hangup(sess);
72 return "Failed sending data";
73 }
74
75 TPRINTF("Sent %zu bytes\n", nbytes);
76
77 rc = chardev_read(chardev, small_buffer, SMALL_BUFFER_SIZE, &nbytes);
78 if (rc != EOK) {
79 chardev_close(chardev);
80 async_hangup(sess);
81 return "Failed receiving data";
82 }
83
84 TPRINTF("Received %zu bytes\n", nbytes);
85
86 chardev_close(chardev);
87 async_hangup(sess);
88
89 TPRINTF("Done\n");
90 return NULL;
91}
92
93/** Test device that always performs large transfers. */
94static const char *test_chardev1_largex(void)
95{
96 chardev_t *chardev;
97 service_id_t sid;
98 async_sess_t *sess;
99 size_t nbytes;
100 int rc;
101
102 TPRINTF("Test large transfer character device operations\n");
103
104 rc = loc_service_get_id(SERVICE_NAME_CHARDEV_TEST_LARGEX, &sid, 0);
105 if (rc != EOK) {
106 return "Failed resolving test device "
107 SERVICE_NAME_CHARDEV_TEST_LARGEX;
108 }
109
110 sess = loc_service_connect(sid, INTERFACE_DDF, 0);
111 if (sess == NULL)
112 return "Failed connecting test device";
113
114 rc = chardev_open(sess, &chardev);
115 if (rc != EOK) {
116 async_hangup(sess);
117 return "Failed opening test device";
118 }
119
120 rc = chardev_write(chardev, large_buffer, LARGE_BUFFER_SIZE, &nbytes);
121 if (rc != EOK) {
122 chardev_close(chardev);
123 async_hangup(sess);
124 return "Failed sending data";
125 }
126
127 TPRINTF("Sent %zu bytes\n", nbytes);
128
129 rc = chardev_read(chardev, large_buffer, LARGE_BUFFER_SIZE, &nbytes);
130 if (rc != EOK) {
131 chardev_close(chardev);
132 async_hangup(sess);
133 return "Failed receiving data";
134 }
135
136 TPRINTF("Received %zu bytes\n", nbytes);
137
138 chardev_close(chardev);
139 async_hangup(sess);
140
141 TPRINTF("Done\n");
142 return NULL;
143}
144
145/** Test device where all transfers return partial success. */
146static const char *test_chardev1_partialx(void)
147{
148 chardev_t *chardev;
149 service_id_t sid;
150 async_sess_t *sess;
151 size_t nbytes;
152 int rc;
153
154 TPRINTF("Test partially-successful character device operations\n");
155
156 rc = loc_service_get_id(SERVICE_NAME_CHARDEV_TEST_PARTIALX, &sid, 0);
157 if (rc != EOK) {
158 return "Failed resolving test device "
159 SERVICE_NAME_CHARDEV_TEST_SMALLX;
160 }
161
162 sess = loc_service_connect(sid, INTERFACE_DDF, 0);
163 if (sess == NULL)
164 return "Failed connecting test device";
165
166 rc = chardev_open(sess, &chardev);
167 if (rc != EOK) {
168 async_hangup(sess);
169 return "Failed opening test device";
170 }
171
172 rc = chardev_write(chardev, small_buffer, SMALL_BUFFER_SIZE, &nbytes);
173 if (rc != EIO || nbytes != 1) {
174 chardev_close(chardev);
175 async_hangup(sess);
176 return "Failed sending data";
177 }
178
179 TPRINTF("Sent %zu bytes and got rc = %d (expected)\n", nbytes, rc);
180
181 rc = chardev_read(chardev, small_buffer, SMALL_BUFFER_SIZE, &nbytes);
182 if (rc != EIO || nbytes != 1) {
183 chardev_close(chardev);
184 async_hangup(sess);
185 return "Failed receiving data";
186 }
187
188 TPRINTF("Received %zu bytes and got rc = %d (expected)\n", nbytes, rc);
189
190 chardev_close(chardev);
191 async_hangup(sess);
192
193 TPRINTF("Done\n");
194 return NULL;
195}
196
197const char *test_chardev1(void)
198{
199 const char *s;
200
201 s = test_chardev1_smallx();
202 if (s != NULL)
203 return s;
204
205 s = test_chardev1_largex();
206 if (s != NULL)
207 return s;
208
209 return test_chardev1_partialx();;
210}
Note: See TracBrowser for help on using the repository browser.