This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git

commit 3cb5d475ae734d37c55a752be099ec846d9182d2
Author: chenrun1 <[email protected]>
AuthorDate: Mon May 15 20:21:37 2023 +0800

    drivertest_block:Test the availability of each sector of the block.
    
    Signed-off-by: chenrun1 <[email protected]>
---
 testing/drivertest/drivertest_block.c | 157 ++++++++++++++--------------------
 1 file changed, 64 insertions(+), 93 deletions(-)

diff --git a/testing/drivertest/drivertest_block.c 
b/testing/drivertest/drivertest_block.c
index 790b813d0..9a81521e5 100644
--- a/testing/drivertest/drivertest_block.c
+++ b/testing/drivertest/drivertest_block.c
@@ -26,6 +26,7 @@
 
 #include <sys/mount.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 
 #include <stdarg.h>
 #include <stddef.h>
@@ -43,27 +44,14 @@
  * Private Type
  ****************************************************************************/
 
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define BLKTEST_MAXLEN  255
-#define BLKTEST_LOOPS   100
-
 /****************************************************************************
  * Private Types
  ****************************************************************************/
 
-struct pre_build
+struct pre_build_s
 {
-  FAR const char *mountpt;
-};
-
-struct test_state_s
-{
-  FAR char *context[BLKTEST_MAXLEN];
-  size_t len[BLKTEST_LOOPS];
-  uint32_t crc[BLKTEST_LOOPS];
+  FAR const char *source;
+  struct geometry cfg;
   int fd;
 };
 
@@ -77,10 +65,10 @@ struct test_state_s
 
 static void show_usage(FAR const char *progname, int exitcode)
 {
-  printf("Usage: %s -m <mountpt>\n", progname);
+  printf("Usage: %s -m <source>\n", progname);
   printf("Where:\n");
-  printf("  -m <mountpt> Block device or mtd device"
-         " mount location[default location: dev/ram10].\n");
+  printf("  -m <source> Block device or mtd device"
+         " mount location.\n");
   exit(exitcode);
 }
 
@@ -89,16 +77,18 @@ static void show_usage(FAR const char *progname, int 
exitcode)
  ****************************************************************************/
 
 static void parse_commandline(int argc, FAR char **argv,
-                              FAR struct pre_build *pre_build)
+                              FAR struct pre_build_s *pre)
 {
   int option;
 
+  pre->source = NULL;
+
   while ((option = getopt(argc, argv, "m:")) != ERROR)
     {
       switch (option)
         {
           case 'm':
-            pre_build->mountpt = optarg;
+            pre->source = optarg;
             break;
           case '?':
             printf("Unknown option: %c\n", optopt);
@@ -106,6 +96,12 @@ static void parse_commandline(int argc, FAR char **argv,
             break;
         }
     }
+
+  if (pre->source == NULL)
+    {
+      printf("Missing <source>\n");
+      show_usage(argv[0], EXIT_FAILURE);
+    }
 }
 
 /****************************************************************************
@@ -137,27 +133,15 @@ static inline char blktest_randchar(void)
  * Name: blktest_randcontext
  ****************************************************************************/
 
-static void blktest_randcontext(FAR struct test_state_s *test_state)
+static void blktest_randcontext(FAR struct pre_build_s *pre, char *input)
 {
   int i;
-  int j;
-  int rnd;
-
-  for (i = 0; i < BLKTEST_LOOPS; i++)
+  for (i = 0; i < pre->cfg.geo_sectorsize - 1; i++)
     {
-      rnd = (rand() % BLKTEST_MAXLEN) + 1;
-      test_state->context[i] = malloc(rnd + 1);
-      assert_true(test_state->context[i] != NULL);
-      for (j = 0; j < rnd; j++)
-        {
-          test_state->context[i][j] = blktest_randchar();
-        }
-
-      test_state->context[i][rnd] = '\0';
-      size_t len = strlen(test_state->context[i]);
-      test_state->len[i] = len;
-      test_state->crc[i] = crc32((FAR uint8_t *)test_state->context[i], len);
+      input[i] = blktest_randchar();
     }
+
+  input[i] = '\0';
 }
 
 /****************************************************************************
@@ -166,27 +150,24 @@ static void blktest_randcontext(FAR struct test_state_s 
*test_state)
 
 static int setup(FAR void **state)
 {
-  FAR struct test_state_s *test_state;
-  FAR struct pre_build    *pre_build;
+  FAR struct pre_build_s *pre = (FAR struct pre_build_s *)*state;
+  struct stat mode;
   time_t t;
+  int ret;
 
-  pre_build = (FAR struct pre_build *)*state;
-
-  /* Allocate memory space and initialize */
+  pre->fd = open(pre->source, O_RDWR | O_DIRECT);
+  assert_false(pre->fd < 0);
 
-  test_state = zalloc(sizeof(struct test_state_s));
-  assert_false(test_state == NULL);
+  ret = fstat(pre->fd, &mode);
+  assert_int_equal(ret, 0);
+  ret = (mode.st_mode & S_IFBLK) | (mode.st_mode & S_IFMTD);
+  assert_true(ret != 0);
 
-  /* Seed the random number generated */
+  ret = ioctl(pre->fd, BIOC_GEOMETRY, (unsigned long)((uintptr_t)&pre->cfg));
+  assert_false(ret < 0);
 
   srand((unsigned)time(&t));
-
-  /* Open */
-
-  test_state->fd = open(pre_build->mountpt, O_RDWR | O_DIRECT);
-  assert_false(test_state->fd < 0);
-  *state = test_state;
-
+  *state = pre;
   return 0;
 }
 
@@ -196,49 +177,42 @@ static int setup(FAR void **state)
 
 static void blktest_stress(FAR void **state)
 {
-  FAR struct test_state_s *test_state;
-  int i;
-  int ret;
-  char *output;
+  FAR struct pre_build_s *pre;
+  FAR char *input;
+  FAR char *output;
+  uint32_t input_crc;
   uint32_t output_crc;
+  int ret;
 
-  test_state = (FAR struct test_state_s *)*state;
-
-  /* Create some random context */
-
-  blktest_randcontext(test_state);
+  pre = (FAR struct pre_build_s *)*state;
 
-  /* Writes all text to the block device bypassing the buffer cache,
-   * ensuring that reads are read from the block device.
-   * Get the value of crc32 after reading and compare it with the crc32
-   * of the previously written text.
-   */
+  input = malloc(pre->cfg.geo_sectorsize);
+  assert_true(input != NULL);
+  output = malloc(pre->cfg.geo_sectorsize);
+  assert_true(output != NULL);
 
-  for (i = 0; i < BLKTEST_LOOPS; i++)
+  for (int i = 0; i < pre->cfg.geo_nsectors; i++)
     {
-      ret = write(test_state->fd, test_state->context[i],
-                  test_state->len[i]);
-      assert_true(ret == test_state->len[i]);
-      fsync(test_state->fd);
-    }
+      input_crc = 0;
+      output_crc = 0;
 
-  /* Reset read and write position */
+      blktest_randcontext(pre, input);
+      input_crc = crc32((FAR uint8_t *)input, pre->cfg.geo_sectorsize);
+      ret = write(pre->fd, input, pre->cfg.geo_sectorsize);
+      assert_true(ret == pre->cfg.geo_sectorsize);
+      fsync(pre->fd);
 
-  lseek(test_state->fd, 0, SEEK_SET);
+      lseek(pre->fd, i * pre->cfg.geo_sectorsize, SEEK_SET);
 
-  output = malloc (BLKTEST_MAXLEN);
-  assert_true(output != NULL);
+      ret = read(pre->fd, output, pre->cfg.geo_sectorsize);
+      assert_int_equal(ret, pre->cfg.geo_sectorsize);
 
-  for (i = 0; i < BLKTEST_LOOPS; i++)
-    {
-      memset(output, 0, BLKTEST_MAXLEN);
-      ret = read(test_state->fd, output, test_state->len[i]);
-      assert_int_equal(ret, test_state->len[i]);
+      output_crc = crc32((FAR uint8_t *)output, pre->cfg.geo_sectorsize);
 
-      output_crc = crc32((FAR uint8_t *)output, test_state->len[i]);
-      assert_false(output_crc != test_state->crc[i]);
+      assert_false(output_crc != input_crc);
     }
 
+  free(input);
   free(output);
 }
 
@@ -248,12 +222,11 @@ static void blktest_stress(FAR void **state)
 
 static int teardown(FAR void **state)
 {
-  FAR struct test_state_s *test_state;
+  FAR struct pre_build_s *pre;
 
-  test_state = (FAR struct test_state_s *)*state;
+  pre = (FAR struct pre_build_s *)*state;
 
-  close(test_state->fd);
-  free(test_state);
+  close(pre->fd);
 
   return 0;
 }
@@ -268,15 +241,13 @@ static int teardown(FAR void **state)
 
 int main(int argc, FAR char *argv[])
 {
-  FAR struct pre_build pre_build = {
-    .mountpt = "dev/ram10"
-  };
+  struct pre_build_s pre;
 
-  parse_commandline(argc, argv, &pre_build);
+  parse_commandline(argc, argv, &pre);
   const struct CMUnitTest tests[] =
     {
       cmocka_unit_test_prestate_setup_teardown(blktest_stress, setup,
-                                               teardown, &pre_build),
+                                               teardown, &pre),
     };
 
   return cmocka_run_group_tests(tests, NULL, NULL);

Reply via email to