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

4.115
Last change on this file since b6911069 was b6911069, checked in by Sebastian Huber <sebastian.huber@…>, on 05/29/12 at 16:02:52

libblock: Add task stack size bdbuf configuration

The task stack size for the swap-out and worker tasks is now
configurable. The bdbuf task resources are now included in the work
space size estimate.

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