// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <fcntl.h>
#include <lib/fdio/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// change this number to change how many bytes are being written/read
#define TEST_LEN 1024

int write_read_pattern_test(int fd, const char* pattern, uint32_t length, uint32_t offset) {
  char in[length];
  uint8_t pattern_len = strlen(pattern);
  lseek(fd, offset, SEEK_SET);

  printf("Copying pattern %s, across %i bytes at offset %i", pattern, length, offset);
  // repeat this pattern across the buffer
  for (uint32_t i = 0; i + pattern_len < length; i += pattern_len) {
    memcpy(in + i, pattern, pattern_len);
  }
  memcpy(in + (length - (length % pattern_len)), pattern, length % pattern_len);
  // uncomment this to print input buffer
  // for (int i = 0; i < TEST_LEN; i++) {
  //     printf("%02x ", ((unsigned char*)in)[i]);
  //     if (i % 50 == 49) {
  //         printf("\n");
  //     }
  // }
  printf("\n");
  int w = write(fd, &in, length);
  printf("Write completed. Bytes written: 0x%02x\n", w);

  // seek back to start
  lseek(fd, offset, SEEK_SET);
  char out[length];
  int r = read(fd, out, length);
  printf("Read completed. Bytes read: 0x%02x\n", r);
  // uncomment this to print output buffer
  // for (int i = 0; i < TEST_LEN; i++) {
  //     printf("%02x ", ((unsigned char*)out)[i]);
  //     if (i % 50 == 49) {
  //         printf("\n");
  //     }
  // }
  // printf("\n");

  printf("memcmp result: %i\n", memcmp(in, out, length));

  return memcmp(in, out, length);
}

// writes first block two blocks full of lowercase letters in order, then reads to verify.
// then writes them full of letters in reverse order and verifies.
int main(int argc, char** argv) {
  printf("starting\n");
  int fd = 0;
  fd = open("/dev/class/pci/004/00:14:00/xhci_usb/usb_bus/usb-dev-002/usb_mass_storage", O_RDWR);
  if (fd < 0) {
    printf("msd_test: cannot open '%d'\n", fd);
    return -1;
  }

  const char* abc = "abcdefghijklmnopqrstuvwxyz";
  int status = write_read_pattern_test(fd, abc, 1024, 0);
  if (status != 0) {
    printf("TEST FAILURE: written data and read data do not match\n");
    return -1;
  } else {
    printf("TEST PASSED\n");
  }

  const char* zyx = "zyxwvutsrqponmlkjihgfedcba";
  status = write_read_pattern_test(fd, zyx, 512, 1024);
  if (status != 0) {
    printf("TEST FAILURE: written data and read data do not match\n");
  } else {
    printf("TEST PASSED\n");
  }

  const char* asdf = "asdf";
  status = write_read_pattern_test(fd, asdf, 5120, 5120);
  if (status != 0) {
    printf("TEST FAILURE: written data and read data do not match\n");
  } else {
    printf("TEST PASSED\n");
  }

  return status;
}
