// Copyright 2017 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#include <inttypes.h>
#include <lib/debuglog.h>
#include <lib/io.h>
#include <platform.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "tests.h"

static char buf[1048];

static void uart_blocking_print_test() {
  for (int count = 0; count < 5; count++) {
    snprintf(buf, sizeof(buf),
             "Blocking Test Count %d (FIRST LINE)\n"
             "AND THIS SHOULD BE THE SECOND LINE Count %d\n",
             count, count);
    dlog_serial_write(buf);
  }
}

static void uart_nonblocking_print_test() {
  for (int count = 0; count < 5; count++) {
    snprintf(buf, sizeof(buf),
             "NON-Blocking Test Count %d (FIRST LINE)\n"
             "AND THIS SHOULD BE THE SECOND LINE Count %d\n",
             count, count);
    serial_write(buf);
  }
}

static void uart_print_lots_of_lines(bool block) {
  int count;
  char *s = buf;
  int i;
#define TOTAL_LINES 1024
#define MAX_SINGLE_LINE_LEN 128
#define MIN_SINGLE_LINE_LEN 80

  for (count = 0; count < TOTAL_LINES; count++) {
    if (block)
      snprintf(buf, 1024, "BLOCK LINE: %d ", count);
    else
      snprintf(buf, 1024, "NON-BLOCK LINE: %d ", count);
    // Pick a random line length between 80 and 128
    i = (rand() % (MAX_SINGLE_LINE_LEN - MIN_SINGLE_LINE_LEN));
    i += MIN_SINGLE_LINE_LEN;
    i -= (int)strlen(buf);  // Less what we've already snprintf'ed above
    s = buf + strlen(buf);
    while (i--) {
      if ((rand() % 2) == 0)
        *s++ = (char)((int)'a' + (int)(rand() % 26));
      else
        *s++ = (char)((int)'A' + (int)(rand() % 26));
    }
    *s++ = '\n';
    *s = '\0';
    if (block)
      dlog_serial_write(buf);
    else
      serial_write(buf);
  }
}

int uart_tests(int, const cmd_args *, uint32_t) {
  // Print out a few short lines, to test '\n' behavior
  uart_blocking_print_test();
  uart_nonblocking_print_test();
  // Print a few long lines to test bulk output,
  // both block and non-blocking
  int i = 100;

  while (i--) {
    uart_print_lots_of_lines(true);
    uart_print_lots_of_lines(false);
    printf("Printed Count = %d\n", 100 - i);
  }

  return 0;
}
