source: rtems/testsuites/libtests/block11/init.c @ 0b038bd4

Last change on this file since 0b038bd4 was 0b038bd4, checked in by Sebastian Huber <sebastian.huber@…>, on Aug 4, 2018 at 8:38:48 AM

libblock: Add RTEMS_DEPRECATED

Close #3358.

  • Property mode set to 100644
File size: 8.7 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 *  Dornierstr. 4
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.org/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#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
41
42const char rtems_test_name[] = "BLOCK 11";
43
44#define ASSERT_SC(sc) rtems_test_assert((sc) == RTEMS_SUCCESSFUL)
45
46#define CHUNK_MAX 32U
47
48#define AREA_SIZE ((CHUNK_MAX * (CHUNK_MAX + 1U)) / 2U)
49
50#define BLOCK_SIZE 4U
51
52#define BLOCK_COUNT (AREA_SIZE / BLOCK_SIZE)
53
54static const char rda [] = "/dev/rda";
55
56static const char rda1 [] = "/dev/rda1";
57
58static const char dev_invalid [] = "/dev/invalid";
59
60static const char not_exist [] = "not_exist";
61
62static const char not_blkdev [] = "not_blkdev";
63
64static const char invalid_blkdev [] = "invalid_blkdev";
65
66static long area_a [AREA_SIZE / sizeof(long)];
67
68static long area_b [AREA_SIZE / sizeof(long)];
69
70static rtems_status_code invalid_initialize(
71  rtems_device_major_number major,
72  rtems_device_minor_number minor,
73  void *arg
74)
75{
76  rtems_status_code sc;
77
78  sc = rtems_io_register_name(&dev_invalid[0], major, 0);
79  ASSERT_SC(sc);
80
81  return sc;
82}
83
84static rtems_status_code invalid_control(
85  rtems_device_major_number major,
86  rtems_device_minor_number minor,
87  void *arg
88)
89{
90  return RTEMS_INVALID_NUMBER;
91}
92
93static void area_init(long *area)
94{
95  size_t i;
96  size_t n = AREA_SIZE / sizeof(long);
97
98  for (i = 0; i < n; ++i) {
99    area [i] = mrand48();
100  }
101}
102
103static void area_read(int fd, long *area)
104{
105  size_t i;
106  size_t n = CHUNK_MAX;
107  char *dst = (char *) area;
108
109  for (i = 0; i <= n; ++i) {
110    ssize_t m = read(fd, dst, i);
111    rtems_test_assert(m == (ssize_t) i);
112    dst += i;
113  }
114}
115
116static void area_write(int fd, const long *area)
117{
118  size_t i;
119  size_t n = CHUNK_MAX;
120  const char *src = (const char *) area;
121
122  for (i = 0; i <= n; ++i) {
123    ssize_t m = write(fd, src, i);
124    rtems_test_assert(m == (ssize_t) i);
125    src += i;
126  }
127}
128
129static void area_compare(const long *area_a, const long *area_b, bool equal)
130{
131  bool actual_equal = memcmp(area_a, area_b, AREA_SIZE) == 0;
132  rtems_test_assert(actual_equal == equal);
133}
134
135static void test_blkdev_imfs_read_and_write(void)
136{
137  rtems_status_code sc;
138  int rv;
139  ramdisk *rd;
140  int fd;
141  off_t off;
142
143  rd = ramdisk_allocate(area_a, BLOCK_SIZE, BLOCK_COUNT, false);
144  rtems_test_assert(rd != NULL);
145
146  ramdisk_enable_free_at_delete_request(rd);
147
148  sc = rtems_blkdev_create(
149    rda,
150    BLOCK_SIZE,
151    BLOCK_COUNT,
152    ramdisk_ioctl,
153    rd
154  );
155  ASSERT_SC(sc);
156
157  fd = open(rda, O_RDWR);
158  rtems_test_assert(fd >= 0);
159
160  area_init(area_a);
161  area_read(fd, area_b);
162  area_compare(area_a, area_b, true);
163
164  off = lseek(fd, 0, SEEK_SET);
165  rtems_test_assert(off == 0);
166
167  area_init(area_b);
168  area_write(fd, area_b);
169  area_compare(area_a, area_b, false);
170
171  rv = close(fd);
172  rtems_test_assert(rv == 0);
173
174  rv = unlink(rda);
175  rtems_test_assert(rv == 0);
176
177  area_compare(area_a, area_b, true);
178}
179
180static void test_blkdev_imfs_parameters(void)
181{
182  rtems_status_code sc;
183  int rv;
184  ramdisk *rd;
185  int fd;
186  rtems_disk_device *dd;
187  struct stat st;
188
189  rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false);
190  rtems_test_assert(rd != NULL);
191
192  ramdisk_enable_free_at_delete_request(rd);
193
194  sc = rtems_blkdev_create(
195    rda,
196    BLOCK_SIZE,
197    BLOCK_COUNT,
198    ramdisk_ioctl,
199    rd
200  );
201  ASSERT_SC(sc);
202
203  sc = rtems_blkdev_create_partition(
204    rda1,
205    rda,
206    1,
207    BLOCK_COUNT - 1
208  );
209  ASSERT_SC(sc);
210
211  fd = open(rda, O_RDWR);
212  rtems_test_assert(fd >= 0);
213
214  rv = fstat(fd, &st);
215  rtems_test_assert(rv == 0);
216
217  rv = rtems_disk_fd_get_disk_device(fd, &dd);
218  rtems_test_assert(rv == 0);
219
220  rtems_test_assert(rtems_disk_get_driver_data(dd) == rd);
221  rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev);
222  rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE);
223  rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE);
224  rtems_test_assert(rtems_disk_get_block_begin(dd) == 0);
225  rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT);
226
227  rv = close(fd);
228  rtems_test_assert(rv == 0);
229
230  fd = open(rda1, O_RDWR);
231  rtems_test_assert(fd >= 0);
232
233  rv = fstat(fd, &st);
234  rtems_test_assert(rv == 0);
235
236  rv = rtems_disk_fd_get_disk_device(fd, &dd);
237  rtems_test_assert(rv == 0);
238
239  rtems_test_assert(rtems_disk_get_driver_data(dd) == rd);
240  rtems_test_assert(rtems_disk_get_device_identifier(dd) == st.st_rdev);
241  rtems_test_assert(rtems_disk_get_media_block_size(dd) == BLOCK_SIZE);
242  rtems_test_assert(rtems_disk_get_block_size(dd) == BLOCK_SIZE);
243  rtems_test_assert(rtems_disk_get_block_begin(dd) == 1);
244  rtems_test_assert(rtems_disk_get_block_count(dd) == BLOCK_COUNT - 1);
245
246  rv = close(fd);
247  rtems_test_assert(rv == 0);
248
249  rv = unlink(rda1);
250  rtems_test_assert(rv == 0);
251
252  rv = unlink(rda);
253  rtems_test_assert(rv == 0);
254}
255
256static void test_blkdev_imfs_errors(void)
257{
258  static uintptr_t disk_size [] = { sizeof(rtems_disk_device) + sizeof(int) };
259
260  rtems_status_code sc;
261  int rv;
262  ramdisk *rd;
263  void *opaque;
264  struct stat st;
265
266  rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false);
267  rtems_test_assert(rd != NULL);
268
269  ramdisk_enable_free_at_delete_request(rd);
270
271  sc = rtems_blkdev_create(
272    rda,
273    0,
274    BLOCK_COUNT,
275    ramdisk_ioctl,
276    rd
277  );
278  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
279
280  sc = rtems_blkdev_create(
281    rda,
282    BLOCK_SIZE,
283    0,
284    ramdisk_ioctl,
285    rd
286  );
287  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
288
289  opaque = rtems_heap_greedy_allocate(NULL, 0);
290  sc = rtems_blkdev_create(
291    rda,
292    BLOCK_SIZE,
293    BLOCK_COUNT,
294    ramdisk_ioctl,
295    rd
296  );
297  rtems_test_assert(sc == RTEMS_NO_MEMORY);
298  rtems_heap_greedy_free(opaque);
299
300  opaque = rtems_heap_greedy_allocate(disk_size, 1);
301  sc = rtems_blkdev_create(
302    rda,
303    BLOCK_SIZE,
304    BLOCK_COUNT,
305    ramdisk_ioctl,
306    rd
307  );
308  rtems_test_assert(sc == RTEMS_UNSATISFIED);
309  rtems_heap_greedy_free(opaque);
310
311  sc = rtems_blkdev_create(
312    rda,
313    BLOCK_SIZE,
314    BLOCK_COUNT,
315    ramdisk_ioctl,
316    rd
317  );
318  ASSERT_SC(sc);
319
320  sc = rtems_blkdev_create_partition(
321    rda1,
322    not_exist,
323    0,
324    BLOCK_COUNT
325  );
326  rtems_test_assert(sc == RTEMS_INVALID_ID);
327
328  rv = lstat(&dev_invalid[0], &st);
329  rtems_test_assert(rv == 0);
330
331  rv = mknod(not_blkdev, S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO, st.st_rdev);
332  rtems_test_assert(rv == 0);
333
334  sc = rtems_blkdev_create_partition(
335    rda1,
336    not_blkdev,
337    0,
338    BLOCK_COUNT
339  );
340  rtems_test_assert(sc == RTEMS_INVALID_NODE);
341
342  rv = mknod(invalid_blkdev, S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO, st.st_rdev);
343  rtems_test_assert(rv == 0);
344
345  sc = rtems_blkdev_create_partition(
346    rda1,
347    invalid_blkdev,
348    0,
349    BLOCK_COUNT
350  );
351  rtems_test_assert(sc == RTEMS_NOT_IMPLEMENTED);
352
353  sc = rtems_blkdev_create_partition(
354    rda1,
355    rda,
356    0,
357    0
358  );
359  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
360
361  sc = rtems_blkdev_create_partition(
362    rda1,
363    rda,
364    BLOCK_COUNT,
365    BLOCK_COUNT
366  );
367  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
368
369  sc = rtems_blkdev_create_partition(
370    rda1,
371    rda,
372    0,
373    BLOCK_COUNT + 1
374  );
375  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
376
377  opaque = rtems_heap_greedy_allocate(NULL, 0);
378  sc = rtems_blkdev_create_partition(
379    rda1,
380    rda,
381    0,
382    BLOCK_COUNT
383  );
384  rtems_test_assert(sc == RTEMS_NO_MEMORY);
385  rtems_heap_greedy_free(opaque);
386
387  opaque = rtems_heap_greedy_allocate(disk_size, 1);
388  sc = rtems_blkdev_create_partition(
389    rda1,
390    rda,
391    0,
392    BLOCK_COUNT
393  );
394  rtems_test_assert(sc == RTEMS_UNSATISFIED);
395  rtems_heap_greedy_free(opaque);
396
397  rv = unlink(rda);
398  rtems_test_assert(rv == 0);
399}
400
401static rtems_task Init(rtems_task_argument argument)
402{
403  TEST_BEGIN();
404
405  test_blkdev_imfs_read_and_write();
406  test_blkdev_imfs_parameters();
407  test_blkdev_imfs_errors();
408
409  TEST_END();
410  exit(0);
411}
412
413#define CONFIGURE_INIT
414
415#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
416#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
417#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
418
419#define CONFIGURE_APPLICATION_EXTRA_DRIVERS \
420  { .initialization_entry = invalid_initialize, \
421    .control_entry = invalid_control }
422
423#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 5
424
425#define CONFIGURE_MAXIMUM_TASKS 1
426
427#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
428
429#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
430
431#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.