source: rtems/testsuites/libtests/block11/init.c @ 01211720

4.115
Last change on this file since 01211720 was 01211720, checked in by Sebastian Huber <sebastian.huber@…>, on 03/05/12 at 14:06:02

libblock: Add generic IMFS block device nodes

New functions

o rtems_blkdev_create(), and
o rtems_blkdev_create_partition().

New test libtests/block11.

  • Property mode set to 100644
File size: 8.1 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup tests
5 *
6 * @brief Block device tests.
7 */
8
9/*
10 * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#ifdef HAVE_CONFIG_H
24  #include "config.h"
25#endif
26
27#include "tmacros.h"
28
29#include <sys/stat.h>
30#include <stdio.h>
31#include <fcntl.h>
32#include <stdlib.h>
33#include <unistd.h>
34
35#include <rtems.h>
36#include <rtems/ramdisk.h>
37#include <rtems/diskdevs.h>
38#include <rtems/malloc.h>
39
40#define ASSERT_SC(sc) rtems_test_assert((sc) == RTEMS_SUCCESSFUL)
41
42#define CHUNK_MAX 32U
43
44#define AREA_SIZE ((CHUNK_MAX * (CHUNK_MAX + 1U)) / 2U)
45
46#define BLOCK_SIZE 4U
47
48#define BLOCK_COUNT (AREA_SIZE / BLOCK_SIZE)
49
50static const char rda [] = "/dev/rda";
51
52static const char rda1 [] = "/dev/rda1";
53
54static const char not_exist [] = "not_exist";
55
56static const char not_blkdev [] = "not_blkdev";
57
58static const char invalid_blkdev [] = "invalid_blkdev";
59
60static long area_a [AREA_SIZE / sizeof(long)];
61
62static long area_b [AREA_SIZE / sizeof(long)];
63
64static void area_init(long *area)
65{
66  size_t i;
67  size_t n = AREA_SIZE / sizeof(long);
68
69  for (i = 0; i < n; ++i) {
70    area [i] = mrand48();
71  }
72}
73
74static void area_read(int fd, long *area)
75{
76  size_t i;
77  size_t n = CHUNK_MAX;
78  char *dst = (char *) area;
79
80  for (i = 0; i <= n; ++i) {
81    ssize_t m = read(fd, dst, i);
82    rtems_test_assert(m == (ssize_t) i);
83    dst += i;
84  }
85}
86
87static void area_write(int fd, const long *area)
88{
89  size_t i;
90  size_t n = CHUNK_MAX;
91  const char *src = (const char *) area;
92
93  for (i = 0; i <= n; ++i) {
94    ssize_t m = write(fd, src, i);
95    rtems_test_assert(m == (ssize_t) i);
96    src += i;
97  }
98}
99
100static void area_compare(const long *area_a, const long *area_b, bool equal)
101{
102  bool actual_equal = memcmp(area_a, area_b, AREA_SIZE) == 0;
103  rtems_test_assert(actual_equal == equal);
104}
105
106static void test_blkdev_imfs_read_and_write(void)
107{
108  rtems_status_code sc;
109  int rv;
110  ramdisk *rd;
111  int fd;
112  off_t off;
113
114  rd = ramdisk_allocate(area_a, BLOCK_SIZE, BLOCK_COUNT, false);
115  rtems_test_assert(rd != NULL);
116
117  ramdisk_enable_free_at_delete_request(rd);
118
119  sc = rtems_blkdev_create(
120    rda,
121    BLOCK_SIZE,
122    BLOCK_COUNT,
123    ramdisk_ioctl,
124    rd
125  );
126  ASSERT_SC(sc);
127
128  fd = open(rda, O_RDWR);
129  rtems_test_assert(fd >= 0);
130
131  area_init(area_a);
132  area_read(fd, area_b);
133  area_compare(area_a, area_b, true);
134
135  off = lseek(fd, 0, SEEK_SET);
136  rtems_test_assert(off == 0);
137
138  area_init(area_b);
139  area_write(fd, area_b);
140  area_compare(area_a, area_b, false);
141
142  rv = close(fd);
143  rtems_test_assert(rv == 0);
144
145  rv = unlink(rda);
146  rtems_test_assert(rv == 0);
147
148  area_compare(area_a, area_b, true);
149}
150
151static void test_blkdev_imfs_parameters(void)
152{
153  rtems_status_code sc;
154  int rv;
155  ramdisk *rd;
156  int fd;
157  const rtems_disk_device *dd;
158  struct stat st;
159
160  rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false);
161  rtems_test_assert(rd != NULL);
162
163  ramdisk_enable_free_at_delete_request(rd);
164
165  sc = rtems_blkdev_create(
166    rda,
167    BLOCK_SIZE,
168    BLOCK_COUNT,
169    ramdisk_ioctl,
170    rd
171  );
172  ASSERT_SC(sc);
173
174  sc = rtems_blkdev_create_partition(
175    rda1,
176    rda,
177    1,
178    BLOCK_COUNT - 1
179  );
180  ASSERT_SC(sc);
181
182  fd = open(rda, O_RDWR);
183  rtems_test_assert(fd >= 0);
184
185  rv = fstat(fd, &st);
186  rtems_test_assert(rv == 0);
187
188  rv = rtems_disk_fd_get_disk_device(fd, &dd);
189  rtems_test_assert(rv == 0);
190
191  rtems_test_assert(rtems_disk_get_driver_data(dd) == rd);
192  rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev);
193  rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE);
194  rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE);
195  rtems_test_assert(rtems_disk_get_block_begin(dd) == 0);
196  rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT);
197
198  rv = close(fd);
199  rtems_test_assert(rv == 0);
200
201  fd = open(rda1, O_RDWR);
202  rtems_test_assert(fd >= 0);
203
204  rv = fstat(fd, &st);
205  rtems_test_assert(rv == 0);
206
207  rv = rtems_disk_fd_get_disk_device(fd, &dd);
208  rtems_test_assert(rv == 0);
209
210  rtems_test_assert(rtems_disk_get_driver_data(dd) == rd);
211  rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev);
212  rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE);
213  rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE);
214  rtems_test_assert(rtems_disk_get_block_begin(dd) == 1);
215  rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT - 1);
216
217  rv = close(fd);
218  rtems_test_assert(rv == 0);
219
220  rv = unlink(rda1);
221  rtems_test_assert(rv == 0);
222
223  rv = unlink(rda);
224  rtems_test_assert(rv == 0);
225}
226
227static void test_blkdev_imfs_errors(void)
228{
229  rtems_status_code sc;
230  int rv;
231  ramdisk *rd;
232  void *opaque;
233
234  rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false);
235  rtems_test_assert(rd != NULL);
236
237  ramdisk_enable_free_at_delete_request(rd);
238
239  sc = rtems_blkdev_create(
240    rda,
241    0,
242    BLOCK_COUNT,
243    ramdisk_ioctl,
244    rd
245  );
246  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
247
248  sc = rtems_blkdev_create(
249    rda,
250    BLOCK_SIZE,
251    0,
252    ramdisk_ioctl,
253    rd
254  );
255  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
256
257  opaque = rtems_heap_greedy_allocate(0);
258  sc = rtems_blkdev_create(
259    rda,
260    BLOCK_SIZE,
261    BLOCK_COUNT,
262    ramdisk_ioctl,
263    rd
264  );
265  rtems_test_assert(sc == RTEMS_NO_MEMORY);
266  rtems_heap_greedy_free(opaque);
267
268  opaque = rtems_heap_greedy_allocate(sizeof(rtems_disk_device) + sizeof(int));
269  sc = rtems_blkdev_create(
270    rda,
271    BLOCK_SIZE,
272    BLOCK_COUNT,
273    ramdisk_ioctl,
274    rd
275  );
276  rtems_test_assert(sc == RTEMS_UNSATISFIED);
277  rtems_heap_greedy_free(opaque);
278
279  sc = rtems_blkdev_create(
280    rda,
281    BLOCK_SIZE,
282    BLOCK_COUNT,
283    ramdisk_ioctl,
284    rd
285  );
286  ASSERT_SC(sc);
287
288  sc = rtems_blkdev_create_partition(
289    rda1,
290    not_exist,
291    0,
292    BLOCK_COUNT
293  );
294  rtems_test_assert(sc == RTEMS_INVALID_ID);
295
296  rv = mknod(not_blkdev, S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO, 0);
297  rtems_test_assert(rv == 0);
298
299  sc = rtems_blkdev_create_partition(
300    rda1,
301    not_blkdev,
302    0,
303    BLOCK_COUNT
304  );
305  rtems_test_assert(sc == RTEMS_INVALID_NODE);
306
307  rv = mknod(invalid_blkdev, S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO, 0);
308  rtems_test_assert(rv == 0);
309
310  sc = rtems_blkdev_create_partition(
311    rda1,
312    invalid_blkdev,
313    0,
314    BLOCK_COUNT
315  );
316  rtems_test_assert(sc == RTEMS_NOT_IMPLEMENTED);
317
318  sc = rtems_blkdev_create_partition(
319    rda1,
320    rda,
321    0,
322    0
323  );
324  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
325
326  sc = rtems_blkdev_create_partition(
327    rda1,
328    rda,
329    BLOCK_COUNT,
330    BLOCK_COUNT
331  );
332  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
333
334  sc = rtems_blkdev_create_partition(
335    rda1,
336    rda,
337    0,
338    BLOCK_COUNT + 1
339  );
340  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
341
342  opaque = rtems_heap_greedy_allocate(0);
343  sc = rtems_blkdev_create_partition(
344    rda1,
345    rda,
346    0,
347    BLOCK_COUNT
348  );
349  rtems_test_assert(sc == RTEMS_NO_MEMORY);
350  rtems_heap_greedy_free(opaque);
351
352  opaque = rtems_heap_greedy_allocate(sizeof(rtems_disk_device) + sizeof(int));
353  sc = rtems_blkdev_create_partition(
354    rda1,
355    rda,
356    0,
357    BLOCK_COUNT
358  );
359  rtems_test_assert(sc == RTEMS_UNSATISFIED);
360  rtems_heap_greedy_free(opaque);
361
362  rv = unlink(rda);
363  rtems_test_assert(rv == 0);
364}
365
366static rtems_task Init(rtems_task_argument argument)
367{
368  rtems_status_code sc;
369
370  puts("\n\n*** TEST BLOCK 11 ***");
371
372  sc = rtems_disk_io_initialize();
373  ASSERT_SC(sc);
374
375  test_blkdev_imfs_read_and_write();
376  test_blkdev_imfs_parameters();
377  test_blkdev_imfs_errors();
378
379  sc = rtems_disk_io_done();
380  ASSERT_SC(sc);
381
382  puts("*** END OF TEST BLOCK 11 ***");
383
384  exit(0);
385}
386
387#define CONFIGURE_INIT
388
389#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
390#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
391#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
392
393#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
394#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5
395
396#define CONFIGURE_MAXIMUM_TASKS 2
397#define CONFIGURE_MAXIMUM_DRIVERS 2
398#define CONFIGURE_EXTRA_TASK_STACKS (8 * 1024)
399
400#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
401
402#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.