L4Re/departure

Annotated tests/dstest_block_client_simple.cc

402:dbc8c17a4f81
2022-09-01 Paul Boddie Added an error member to the file data structure, changing the client library interface so that client_open returns a structure whose error member may be tested, directly or using the new client_opened function, to determine the reason for failure, this being done in preference to having a global, shared errno variable. Updated the tests for the above library changes, also making test configuration file naming consistent with executable naming, and introducing better output to assess the successful completion of tests.
paul@90 1
/*
paul@90 2
 * Test dataspace operations.
paul@90 3
 *
paul@237 4
 * Copyright (C) 2020, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
paul@90 5
 *
paul@90 6
 * This program is free software; you can redistribute it and/or
paul@90 7
 * modify it under the terms of the GNU General Public License as
paul@90 8
 * published by the Free Software Foundation; either version 2 of
paul@90 9
 * the License, or (at your option) any later version.
paul@90 10
 *
paul@90 11
 * This program is distributed in the hope that it will be useful,
paul@90 12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
paul@90 13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
paul@90 14
 * GNU General Public License for more details.
paul@90 15
 *
paul@90 16
 * You should have received a copy of the GNU General Public License
paul@90 17
 * along with this program; if not, write to the Free Software
paul@90 18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
paul@90 19
 * Boston, MA  02110-1301, USA
paul@90 20
 */
paul@90 21
paul@90 22
#include <systypes/fcntl.h>
paul@90 23
paul@90 24
#include <stdio.h>
paul@106 25
#include <stdlib.h>
paul@151 26
#include <string.h>
paul@90 27
paul@94 28
#include <fsclient/client.h>
paul@90 29
paul@90 30
paul@90 31
paul@90 32
int main(int argc, char *argv[])
paul@90 33
{
paul@90 34
  if (argc < 2)
paul@90 35
  {
paul@237 36
    printf("Need a filename and optional repetition.\n");
paul@90 37
    return 1;
paul@90 38
  }
paul@90 39
paul@90 40
  /* Obtain filename and access parameters. */
paul@90 41
paul@90 42
  char *filename = argv[1];
paul@237 43
  int repetition = argc > 2 ? atoi(argv[2]) : 10;
paul@144 44
  file_t *file;
paul@144 45
paul@237 46
  file = client_open(filename, O_RDWR);
paul@90 47
paul@402 48
  if (!client_opened(file))
paul@90 49
  {
paul@402 50
    client_close(file);
paul@90 51
    printf("Could not obtain file.\n");
paul@90 52
    return 1;
paul@90 53
  }
paul@90 54
paul@90 55
  /* Copy the sampled data to another file region. */
paul@90 56
paul@90 57
  offset_t size = file->size;
paul@402 58
  offset_t new_size = size * (repetition + 1);
paul@402 59
paul@90 60
  char buffer[size];
paul@90 61
  offset_t nread = client_read(file, buffer, size);
paul@90 62
paul@90 63
  if (nread != size)
paul@90 64
  {
paul@90 65
    printf("Could not read entire file: %ld out of %ld bytes.\n", nread, size);
paul@90 66
    return 1;
paul@90 67
  }
paul@90 68
paul@90 69
  printf("File contents...\n");
paul@90 70
paul@90 71
  fwrite(buffer, sizeof(char), nread, stdout);
paul@90 72
paul@90 73
  printf("Copy %ld bytes to end...\n", nread);
paul@90 74
paul@106 75
  for (int times = 0; times < repetition; times++)
paul@90 76
  {
paul@90 77
    printf("Copy #%d...\n", times);
paul@90 78
paul@90 79
    offset_t nwritten = client_write(file, buffer, nread);
paul@90 80
paul@90 81
    if (nwritten != nread)
paul@90 82
    {
paul@90 83
      printf("Could not write file section: %ld instead of %ld bytes.\n",
paul@90 84
             nwritten, nread);
paul@90 85
      return 1;
paul@90 86
    }
paul@90 87
  }
paul@90 88
paul@402 89
  printf("File now has size %ld.\n", file->size);
paul@402 90
  printf("File has expected size %ld: %s\n", new_size, new_size == file->size ? "True" : "False");
paul@90 91
paul@90 92
  printf("Seek to start...\n");
paul@90 93
paul@90 94
  client_seek(file, 0, SEEK_SET);
paul@90 95
paul@90 96
  printf("At mapped region from %ld to %ld with data at %ld to %ld.\n",
paul@90 97
         file->start_pos, file->end_pos, file->data_current, file->data_end);
paul@90 98
paul@90 99
  printf("File contents...\n");
paul@90 100
paul@90 101
  offset_t position = 0;
paul@90 102
paul@402 103
  while ((nread = client_read(file, buffer, size)) > 0)
paul@90 104
  {
paul@90 105
    if ((nread != size) && (nread != file->size - position))
paul@90 106
    {
paul@90 107
      printf("Could not read file section: %ld instead of %ld or remaining %ld bytes.\n",
paul@90 108
             nread, size, file->size - position);
paul@90 109
      return 1;
paul@90 110
    }
paul@90 111
paul@90 112
    fwrite(buffer, sizeof(char), nread, stdout);
paul@90 113
    position += nread;
paul@90 114
  }
paul@90 115
paul@402 116
  printf("File shown in its entirety: %s\n", position == file->size ? "True" : "False");
paul@402 117
  printf("End of test.\n");
paul@90 118
  return 0;
paul@90 119
}
paul@90 120
paul@90 121
// vim: tabstop=2 expandtab shiftwidth=2