// Copyright 2017 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 <arpa/inet.h>
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <algorithm>
#include <memory>

#include <fbl/algorithm.h>
#include <tftp/tftp.h>
#include <zxtest/zxtest.h>

// For inspecting session state
#include "internal.h"

constexpr char kLocalFilename[] = "local-filename";
constexpr char kRemoteFilename[] = "remote-filename";

struct test_state {
  void reset(size_t ssize, size_t msize, size_t osize) {
    sess_size = ssize;
    msg_size = msize;
    out_size = osize;
    sess_buf.reset(new uint8_t[sess_size]);
    msg_data.reset(new uint8_t[msg_size]);
    out_scratch.reset(new uint8_t[out_size]);
    auto init_status = tftp_init(&session, sess_buf.get(), sess_size);
    ASSERT_EQ(TFTP_NO_ERROR, init_status, "could not initialize tftp_session");
    data = reinterpret_cast<void*>(msg_data.get());
    out = reinterpret_cast<void*>(out_scratch.get());
    outlen = out_size;
  }

  tftp_session* session = nullptr;
  size_t sess_size = 0;
  size_t msg_size = 0;
  size_t out_size = 0;
  std::unique_ptr<uint8_t[]> sess_buf;
  std::unique_ptr<uint8_t[]> msg_data;
  std::unique_ptr<uint8_t[]> out_scratch;
  void* data = nullptr;
  void* out = nullptr;
  size_t outlen = 0;
  uint32_t timeout = 0;
};

TEST(TftpSetup, test_tftp_init) {
  uint8_t buf[1024];
  tftp_session* session;
  int status = tftp_init(&session, nullptr, 4096);
  EXPECT_LT(status, 0, "tftp_init should fail for NULL buffer");
  status = tftp_init(&session, buf, 4);
  EXPECT_LT(status, 0, "tftp_init should fail for too small buffer");
  status = tftp_init(&session, buf, sizeof(buf));
  EXPECT_EQ(status, TFTP_NO_ERROR, "error creating tftp session");
  EXPECT_EQ(sizeof(tftp_session), tftp_sizeof_session(), "");
  ASSERT_GE(sizeof(buf), tftp_sizeof_session(), "need to update test for larger tftp_session size");
  status = tftp_init(&session, buf, tftp_sizeof_session());
  EXPECT_EQ(status, TFTP_NO_ERROR, "tftp_init failed on correctly sized buffer");
}

TEST(TftpSetup, test_tftp_session_options) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto open_read_fn = [](const char* filename, uint8_t session_timeout_secs,
                         void* cookie) -> ssize_t { return 0; };
  auto open_write_fn = [](const char* filename, size_t size, uint8_t session_timeout_secs,
                          void* cookie) -> tftp_status { return 0; };
  auto read_fn = [](void* data, size_t* len, off_t offset, void* cookie) -> tftp_status {
    return 0;
  };
  auto write_fn = [](const void* data, size_t* len, off_t offset, void* cookie) -> tftp_status {
    return 0;
  };
  auto close_fn = [](void* cookie) { return; };
  tftp_file_interface ifc = {open_read_fn, open_write_fn, read_fn, write_fn, close_fn};
  auto status = tftp_session_set_file_interface(ts.session, &ifc);
  EXPECT_EQ(TFTP_NO_ERROR, status, "could not set file callbacks");
  EXPECT_EQ((tftp_file_open_read_cb)open_read_fn, ts.session->file_interface.open_read,
            "bad open (read) function pointer");
  EXPECT_EQ((tftp_file_open_write_cb)open_write_fn, ts.session->file_interface.open_write,
            "bad open (write) function pointer");
  EXPECT_EQ((tftp_file_read_cb)read_fn, ts.session->file_interface.read,
            "bad read function pointer");
  EXPECT_EQ((tftp_file_write_cb)write_fn, ts.session->file_interface.write,
            "bad write function pointer");
  EXPECT_EQ((tftp_file_close_cb)close_fn, ts.session->file_interface.close,
            "bad write function pointer");
}

bool verify_write_request(const test_state& ts) {
  auto msg = reinterpret_cast<tftp_msg*>(ts.out);
  EXPECT_EQ(msg->opcode, htons(OPCODE_WRQ), "opcode should be 2 (WRQ)");
  EXPECT_STREQ(kRemoteFilename, msg->data, "bad filename");
  return true;
}

bool verify_read_request(const test_state& ts) {
  auto msg = reinterpret_cast<tftp_msg*>(ts.out);
  EXPECT_EQ(msg->opcode, htons(OPCODE_RRQ), "opcode should be 1 (RRQ)");
  EXPECT_STREQ(kRemoteFilename, msg->data, "bad filename");
  return true;
}

// Find a string (which may include NULL characters) inside a memory region.
static bool find_str_in_mem(const char* str, size_t str_len, const char* mem, size_t mem_len) {
  while (str_len <= mem_len) {
    if (!memcmp(str, mem, str_len)) {
      return true;
    }
    mem_len--;
    mem++;
  }
  return false;
}

static void test_tftp_generate_request(tftp_file_direction dir, size_t file_size,
                                       const uint16_t* block_size, const uint8_t* timeout,
                                       const uint16_t* window_size,
                                       const uint16_t* block_size_override,
                                       const uint8_t* timeout_override,
                                       const uint16_t* window_size_override) {
  tftp_status status;
  test_state ts;
  ts.reset(1024, file_size, 1500);

  // Test TFTP state, but not internal session state
  status = tftp_set_options(ts.session, block_size, timeout, window_size);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error setting session options");
  if (block_size) {
    EXPECT_EQ(*block_size, ts.session->options.block_size, "bad session options: block size");
  }
  if (timeout) {
    EXPECT_EQ(*timeout, ts.session->options.timeout, "bad session options: timeout");
  }
  if (window_size) {
    EXPECT_EQ(*window_size, ts.session->options.window_size, "bad session options: window size");
  }

  size_t request_file_size = (dir == SEND_FILE) ? file_size : 0;
  status = tftp_generate_request(ts.session, dir, kLocalFilename, kRemoteFilename, MODE_OCTET,
                                 request_file_size, block_size_override, timeout_override,
                                 window_size_override, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating request");
  if (dir == SEND_FILE) {
    EXPECT_TRUE(verify_write_request(ts), "bad write request");
  } else {
    EXPECT_TRUE(verify_read_request(ts), "bad read request");
  }

  EXPECT_EQ(REQ_SENT, ts.session->state, "bad session: state");
  if (dir == SEND_FILE) {
    EXPECT_EQ(file_size, ts.session->file_size, "bad session: file size");
  }
  EXPECT_EQ(DEFAULT_MODE, ts.session->mode, "bad session: mode");
  EXPECT_EQ(0, ts.session->offset, "bad session: offset");
  EXPECT_EQ(0, ts.session->block_number, "bad session: block number");

  // Verify the options that were set in the request
  const char* msg = static_cast<const char*>(ts.out);
  char str[256];
  size_t str_sz;

  if (block_size_override) {
    str_sz = snprintf(str, sizeof(str), "BLKSIZE!%c%d", '\0', *block_size_override) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "block size not overridden");
  } else if (block_size) {
    str_sz = snprintf(str, sizeof(str), "BLKSIZE%c%d", '\0', *block_size) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "block size not properly requested");
  } else {
    str_sz = snprintf(str, sizeof(str), "BLKSIZE") + 1;
    EXPECT_FALSE(find_str_in_mem(str, str_sz, msg, ts.outlen),
                 "block size shouldn't appear in request");
  }

  if (timeout_override) {
    str_sz = snprintf(str, sizeof(str), "TIMEOUT!%c%d", '\0', *timeout_override) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "timeout not overridden");
  } else if (timeout) {
    str_sz = snprintf(str, sizeof(str), "TIMEOUT%c%d", '\0', *timeout) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "timeout not properly requested");
  } else {
    str_sz = snprintf(str, sizeof(str), "TIMEOUT") + 1;
    EXPECT_FALSE(find_str_in_mem(str, str_sz, msg, ts.outlen),
                 "timeout shouldn't appear in request");
  }

  if (window_size_override) {
    str_sz = snprintf(str, sizeof(str), "WINDOWSIZE!%c%d", '\0', *window_size_override) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "window size not overridden");
  } else if (window_size) {
    str_sz = snprintf(str, sizeof(str), "WINDOWSIZE%c%d", '\0', *window_size) + 1;
    EXPECT_TRUE(find_str_in_mem(str, str_sz, msg, ts.outlen), "window size not properly requested");
  } else {
    str_sz = snprintf(str, sizeof(str), "WINDOWSIZE") + 1;
    EXPECT_FALSE(find_str_in_mem(str, str_sz, msg, ts.outlen),
                 "window size shouldn't appear in request");
  }
}

TEST(TftpGenerateWrq, test_tftp_generate_wrq_default) {
  test_tftp_generate_request(SEND_FILE, 1024, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
}

TEST(TftpGenerateWrq, test_tftp_generate_wrq_options) {
  constexpr uint16_t kBlockSize = 555;
  constexpr uint8_t kTimeout = 3;
  constexpr uint16_t kWindowSize = 44;
  test_tftp_generate_request(SEND_FILE, 1024, &kBlockSize, &kTimeout, &kWindowSize, nullptr,
                             nullptr, nullptr);
}

TEST(TftpGenerateWrq, test_tftp_generate_wrq_override_blocksize) {
  constexpr uint16_t kBlockSize = 1000;
  test_tftp_generate_request(SEND_FILE, 1024, nullptr, nullptr, nullptr, &kBlockSize, nullptr,
                             nullptr);
}

TEST(TftpGenerateWrq, test_tftp_generate_wrq_override_timeout) {
  uint8_t kTimeout = 60;
  test_tftp_generate_request(SEND_FILE, 1024, nullptr, nullptr, nullptr, nullptr, &kTimeout,
                             nullptr);
}

TEST(TftpGenerateWrq, test_tftp_generate_wrq_override_windowsize) {
  uint16_t kWindowSize = 32;
  test_tftp_generate_request(SEND_FILE, 1024, nullptr, nullptr, nullptr, nullptr, nullptr,
                             &kWindowSize);
}

TEST(TftpGenerateRrq, test_tftp_generate_rrq_default) {
  test_tftp_generate_request(RECV_FILE, 1024, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
}

TEST(TftpGenerateRrq, test_tftp_generate_rrq_options) {
  constexpr uint16_t kBlockSize = 555;
  constexpr uint8_t kTimeout = 3;
  constexpr uint16_t kWindowSize = 44;
  test_tftp_generate_request(RECV_FILE, 1024, &kBlockSize, &kTimeout, &kWindowSize, nullptr,
                             nullptr, nullptr);
}

TEST(TftpGenerateRrq, test_tftp_generate_rrq_override_blocksize) {
  constexpr uint16_t kBlockSize = 1000;
  test_tftp_generate_request(RECV_FILE, 1024, nullptr, nullptr, nullptr, &kBlockSize, nullptr,
                             nullptr);
}

TEST(TftpGenerateRrq, test_tftp_generate_rrq_override_timeout) {
  uint8_t kTimeout = 60;
  test_tftp_generate_request(RECV_FILE, 1024, nullptr, nullptr, nullptr, nullptr, &kTimeout,
                             nullptr);
}

TEST(TftpGenerateRrq, test_tftp_generate_rrq_override_windowsize) {
  uint16_t kWindowSize = 32;
  test_tftp_generate_request(RECV_FILE, 1024, nullptr, nullptr, nullptr, nullptr, nullptr,
                             &kWindowSize);
}

void verify_response_opcode(const test_state& ts, uint16_t opcode) {
  ASSERT_GT(ts.outlen, 0, "outlen must not be zero");
  auto msg = reinterpret_cast<tftp_msg*>(ts.out);
  // The upper byte of the opcode is ignored
  EXPECT_EQ(ntohs(msg->opcode) & 0xff, opcode, "bad opcode");
}

static void test_tftp_receive_request_unexpected(tftp_file_direction dir) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  size_t req_file_size = (dir == SEND_FILE) ? ts.msg_size : 0;
  auto status =
      tftp_generate_request(ts.session, dir, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            req_file_size, NULL, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "could not generate request");
  if (dir == SEND_FILE) {
    ASSERT_TRUE(verify_write_request(ts), "bad write request");
  } else {
    ASSERT_TRUE(verify_read_request(ts), "bad read request");
  }

  ASSERT_LE(ts.outlen, 1500, "outlen too large");
  uint8_t buf[1500];
  memcpy(buf, ts.out, ts.outlen);

  // We are unprepared to service a request after we have sent one out
  status = tftp_process_msg(ts.session, buf, sizeof(buf), ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_EQ(TFTP_ERR_BAD_STATE, status, "receive should fail");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ERROR), "bad error response");
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_unexpected) {
  test_tftp_receive_request_unexpected(SEND_FILE);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_unexpected) {
  test_tftp_receive_request_unexpected(RECV_FILE);
}

static void test_tftp_receive_request_too_large(tftp_file_direction dir) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  uint8_t buf[1024] = {0};
  buf[1] = (dir == SEND_FILE) ? OPCODE_WRQ : OPCODE_RRQ;

  auto status =
      tftp_process_msg(ts.session, buf, sizeof(buf), ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_LT(status, 0, "receive should fail");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ERROR), "bad error response");
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_too_large) {
  test_tftp_receive_request_too_large(SEND_FILE);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_too_large) {
  test_tftp_receive_request_too_large(RECV_FILE);
}

static void test_tftp_receive_request_no_tsize(tftp_file_direction dir) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  char buf[256];
  buf[0] = 0x00;
  buf[1] = (dir == SEND_FILE) ? OPCODE_WRQ : OPCODE_RRQ;
  size_t buf_sz = 2 + snprintf(&buf[2], sizeof(buf) - 2, "%s%cOCTET", kRemoteFilename, '\0') + 1;

  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for message");
  auto status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_EQ(TFTP_ERR_BAD_STATE, status, "tftp session should fail");
  EXPECT_EQ(ERROR, ts.session->state, "tftp session in wrong state");
  EXPECT_EQ(0, ts.session->file_size, "tftp session bad file size");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ERROR), "bad error response");
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_no_tsize) {
  test_tftp_receive_request_no_tsize(SEND_FILE);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_no_tsize) {
  test_tftp_receive_request_no_tsize(RECV_FILE);
}

static void test_tftp_receive_request_send_oack(tftp_file_direction dir) {
  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_open_write_cb open_write_cb = [](const char* filename, size_t size,
                                             uint8_t session_timeout_secs,
                                             void* cookie) -> tftp_status {
    EXPECT_STREQ(filename, kRemoteFilename, "bad remote filename in open_write callback");
    EXPECT_EQ(size, 1024, "bad file size");
    return 0;
  };
  tftp_file_open_read_cb open_read_cb = [](const char* filename, uint8_t session_timeout_secs,
                                           void* cookie) -> ssize_t {
    EXPECT_STREQ(filename, kRemoteFilename, "bad remote filename in open_read callback");
    return 0;
  };
  tftp_file_interface ifc = {open_read_cb, open_write_cb, NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);
  uint16_t default_block_size = 13;
  uint8_t default_timeout = 2;
  uint16_t default_window_size = 42;
  tftp_set_options(ts.session, &default_block_size, &default_timeout, &default_window_size);

  size_t req_file_size = (dir == SEND_FILE) ? 1024 : 0;
  char buf[256];
  buf[0] = 0x00;
  buf[1] = (dir == SEND_FILE) ? OPCODE_WRQ : OPCODE_RRQ;
  size_t buf_sz = 2 +
                  snprintf(&buf[2], sizeof(buf) - 2, "%s%cOCTET%cTSIZE%c%zu", kRemoteFilename, '\0',
                           '\0', '\0', req_file_size) +
                  1;

  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for WRQ message");
  auto status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive request failed");
  EXPECT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  EXPECT_EQ(req_file_size, ts.session->file_size, "tftp session bad file size");
  EXPECT_EQ(DEFAULT_BLOCKSIZE, ts.session->block_size, "bad session: block size");
  EXPECT_EQ(DEFAULT_TIMEOUT, ts.session->timeout, "bad session: timeout");
  EXPECT_EQ(DEFAULT_WINDOWSIZE, ts.session->window_size, "bad session: window size");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  // The request was made from the client's perspective, so our state is the inverse
  tftp_file_direction our_direction = (dir == SEND_FILE) ? RECV_FILE : SEND_FILE;
  EXPECT_EQ(our_direction, ts.session->direction, "tftp session has bad direction");

  const char* msg = static_cast<const char*>(ts.out);
  const char win_sz_str[] = "WINDOWSIZE";
  EXPECT_FALSE(find_str_in_mem(win_sz_str, sizeof(win_sz_str), msg, ts.outlen),
               "window size in oack, but not in request");
  const char timeout_str[] = "TIMEOUT";
  EXPECT_FALSE(find_str_in_mem(timeout_str, sizeof(timeout_str), msg, ts.outlen),
               "timeout in oack, but not in request");
  const char block_sz_str[] = "BLKSIZE";
  EXPECT_FALSE(find_str_in_mem(block_sz_str, sizeof(block_sz_str), msg, ts.outlen),
               "block size in oack, but not in request");
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_send_oack) {
  test_tftp_receive_request_send_oack(SEND_FILE);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_send_oack) {
  test_tftp_receive_request_send_oack(RECV_FILE);
}

static ssize_t dummy_open_read(const char* filename, uint8_t session_timeout_secs, void* cookie) {
  return 1024;
}

static tftp_status dummy_open_write(const char* filename, size_t size, uint8_t session_timeout_secs,
                                    void* cookie) {
  return 0;
}

static void test_tftp_receive_request_options(
    tftp_file_direction dir, const uint16_t* server_block_size, const uint8_t* server_timeout,
    const uint16_t* server_window_size, const uint16_t* client_block_size,
    const uint8_t* client_timeout, const uint16_t* client_window_size, bool force_block_size,
    bool force_timeout, bool force_window_size) {
  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_interface ifc = {dummy_open_read, dummy_open_write, NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);
  tftp_status status =
      tftp_set_options(ts.session, server_block_size, server_timeout, server_window_size);
  ASSERT_EQ(TFTP_NO_ERROR, status, "failed to set server options");

  size_t req_file_size = (dir == SEND_FILE) ? 1024 : 0;
  char buf[256];
  buf[0] = 0x00;
  buf[1] = (dir == SEND_FILE) ? OPCODE_WRQ : OPCODE_RRQ;
  size_t buf_sz = 2;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "%s%cOCTET%cTSIZE%c%zu", kRemoteFilename,
                     '\0', '\0', '\0', req_file_size) +
            1;
  if (client_block_size) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "BLKSIZE%s%c%d",
                       force_block_size ? "!" : "", '\0', *client_block_size) +
              1;
  }
  if (client_timeout) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "TIMEOUT%s%c%d",
                       force_timeout ? "!" : "", '\0', *client_timeout) +
              1;
  }
  if (client_window_size) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "WINDOWSIZE%s%c%d",
                       force_window_size ? "!" : "", '\0', *client_window_size) +
              1;
  }

  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for request");
  status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  const char* msg = static_cast<const char*>(ts.out);
  char opt_str[256];
  size_t opt_str_sz;

  if (client_block_size) {
    uint16_t negotiated_block_size =
        (server_block_size && !force_block_size) ? *server_block_size : *client_block_size;
    opt_str_sz = snprintf(opt_str, sizeof(opt_str), "BLKSIZE%c%d", '\0', negotiated_block_size) + 1;
    EXPECT_TRUE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                "block size not correct in oack");
    EXPECT_EQ(negotiated_block_size, ts.session->block_size, "bad session: block size");
  } else {
    opt_str_sz = snprintf(opt_str, sizeof(opt_str), "BLKSIZE") + 1;
    EXPECT_FALSE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                 "block size appears in oack, but not in request");
    EXPECT_EQ(DEFAULT_BLOCKSIZE, ts.session->block_size, "bad session: block size");
  }

  if (client_timeout) {
    uint8_t negotiated_timeout =
        (server_timeout && !force_timeout) ? *server_timeout : *client_timeout;
    opt_str_sz = snprintf(opt_str, sizeof(opt_str), "TIMEOUT%c%d", '\0', negotiated_timeout) + 1;
    EXPECT_TRUE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                "timeout not correct in oack");
    EXPECT_EQ(negotiated_timeout, ts.session->timeout, "bad session: timeout");
  } else {
    opt_str_sz = snprintf(opt_str, sizeof(opt_str), "TIMEOUT") + 1;
    EXPECT_FALSE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                 "timeout appears in oack, but not in request");
    EXPECT_EQ(DEFAULT_TIMEOUT, ts.session->timeout, "bad session: timeout");
  }

  if (client_window_size) {
    uint16_t negotiated_window_size =
        (server_window_size && !force_window_size) ? *server_window_size : *client_window_size;
    opt_str_sz =
        snprintf(opt_str, sizeof(opt_str), "WINDOWSIZE%c%d", '\0', negotiated_window_size) + 1;
    EXPECT_TRUE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                "window size not correct in oack");
    EXPECT_EQ(negotiated_window_size, ts.session->window_size, "bad session: window size");
  } else {
    opt_str_sz = snprintf(opt_str, sizeof(opt_str), "WINDOWSIZE") + 1;
    EXPECT_FALSE(find_str_in_mem(opt_str, opt_str_sz, msg, ts.outlen),
                 "window size appears in oack, but not in request");
    EXPECT_EQ(DEFAULT_WINDOWSIZE, ts.session->window_size, "bad session: window size");
  }
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_blocksize) {
  constexpr uint8_t kDefaultTimeout = 4;
  constexpr uint16_t kBlocksize = 1024;
  test_tftp_receive_request_options(SEND_FILE, nullptr, &kDefaultTimeout, nullptr, &kBlocksize,
                                    nullptr, nullptr, false, false, false);
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_timeout) {
  constexpr uint16_t kDefaultBlocksize = 115;
  constexpr uint8_t kTimeout = 3;
  test_tftp_receive_request_options(SEND_FILE, &kDefaultBlocksize, nullptr, nullptr, nullptr,
                                    &kTimeout, nullptr, false, false, false);
}

TEST(TftpReceiveWrq, test_tftp_receive_wrq_windowsize) {
  constexpr uint16_t kWindowsize = 77;
  test_tftp_receive_request_options(SEND_FILE, nullptr, nullptr, nullptr, nullptr, nullptr,
                                    &kWindowsize, false, false, false);
}

// Verify that if override values are set, they supercede the values in a normal request
TEST(TftpReceiveWrq, test_tftp_receive_wrq_have_overrides) {
  constexpr uint16_t kServerBlockSize = 302;
  constexpr uint8_t kServerTimeout = 7;
  constexpr uint16_t kServerWindowSize = 16;
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(SEND_FILE, &kServerBlockSize, &kServerTimeout,
                                    &kServerWindowSize, &kClientBlockSize, &kClientTimeout,
                                    &kClientWindowSize, false, false, false);
}

// Verify that if a WRQ has a '!' following an option it is honored, even if overrides are set
TEST(TftpReceiveWrq, test_tftp_receive_force_wrq_no_overrides) {
  constexpr uint16_t kServerBlockSize = 302;
  constexpr uint8_t kServerTimeout = 7;
  constexpr uint16_t kServerWindowSize = 16;
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(SEND_FILE, &kServerBlockSize, &kServerTimeout,
                                    &kServerWindowSize, &kClientBlockSize, &kClientTimeout,
                                    &kClientWindowSize, true, true, true);
}

TEST(TftpReceiveWrq, test_tftp_receive_force_wrq_have_overrides) {
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(SEND_FILE, nullptr, nullptr, nullptr, &kClientBlockSize,
                                    &kClientTimeout, &kClientWindowSize, true, true, true);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_blocksize) {
  constexpr uint8_t kDefaultTimeout = 4;
  constexpr uint16_t kBlocksize = 1024;
  test_tftp_receive_request_options(RECV_FILE, nullptr, &kDefaultTimeout, nullptr, &kBlocksize,
                                    nullptr, nullptr, false, false, false);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_timeout) {
  constexpr uint16_t kDefaultBlocksize = 115;
  constexpr uint8_t kTimeout = 3;
  test_tftp_receive_request_options(RECV_FILE, &kDefaultBlocksize, nullptr, nullptr, nullptr,
                                    &kTimeout, nullptr, false, false, false);
}

TEST(TftpReceiveRrq, test_tftp_receive_rrq_windowsize) {
  constexpr uint16_t kWindowsize = 77;
  test_tftp_receive_request_options(RECV_FILE, nullptr, nullptr, nullptr, nullptr, nullptr,
                                    &kWindowsize, false, false, false);
}

// Verify that if override values are set, they supercede the values in a normal request
TEST(TftpReceiveRrq, test_tftp_receive_rrq_have_overrides) {
  constexpr uint16_t kServerBlockSize = 302;
  constexpr uint8_t kServerTimeout = 7;
  constexpr uint16_t kServerWindowSize = 16;
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(RECV_FILE, &kServerBlockSize, &kServerTimeout,
                                    &kServerWindowSize, &kClientBlockSize, &kClientTimeout,
                                    &kClientWindowSize, false, false, false);
}

// Verify that if a WRQ has a '!' following an option it is honored, even if overrides are set
TEST(TftpReceiveRrq, test_tftp_receive_force_rrq_no_overrides) {
  constexpr uint16_t kServerBlockSize = 302;
  constexpr uint8_t kServerTimeout = 7;
  constexpr uint16_t kServerWindowSize = 16;
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(RECV_FILE, &kServerBlockSize, &kServerTimeout,
                                    &kServerWindowSize, &kClientBlockSize, &kClientTimeout,
                                    &kClientWindowSize, true, true, true);
}

TEST(TftpReceiveRrq, test_tftp_receive_force_rrq_have_overrides) {
  constexpr uint16_t kClientBlockSize = 32;
  constexpr uint8_t kClientTimeout = 9;
  constexpr uint16_t kClientWindowSize = 143;
  test_tftp_receive_request_options(RECV_FILE, nullptr, nullptr, nullptr, &kClientBlockSize,
                                    &kClientTimeout, &kClientWindowSize, true, true, true);
}

struct tx_test_data {
  struct {
    uint16_t block;
    off_t offset;
    size_t len;
    uint8_t data[2048];  // for reads
  } expected;

  struct {
    // block is in the outgoing message buffer
    off_t offset;
    size_t len;
    uint8_t data[2048];  // for writes
  } actual;

  tx_test_data() {
    expected.block = 1;
    expected.offset = 0;
    expected.len = DEFAULT_BLOCKSIZE;
    expected.data[0] = 'F';
    expected.data[DEFAULT_BLOCKSIZE - 1] = 'X';
    actual.offset = -1;
    actual.len = -1;
    memset(actual.data, 0, sizeof(actual.data));
  }
};

void verify_read_data(const test_state& ts, const tx_test_data& td) {
  EXPECT_EQ(td.expected.offset, td.actual.offset, "read offset mismatch");
  EXPECT_EQ(td.expected.len, td.actual.len, "read length mismatch");
  auto msg = static_cast<tftp_data_msg*>(ts.out);
  // The upper byte of the opcode is ignored
  EXPECT_EQ(OPCODE_DATA, ntohs(msg->opcode) & 0xff, "bad opcode");
  // Don't continue if we have a bad block number or we risk OOB reads
  ASSERT_EQ(td.expected.block, ntohs(msg->block), "bad block number");
  EXPECT_BYTES_EQ(td.expected.data, msg->data, td.actual.len, "read data mismatch");
}

tftp_status mock_open_write(const char* filename, size_t size, uint8_t session_timeout_secs,
                            void* file_cookie) {
  return TFTP_NO_ERROR;
}

tftp_status mock_read(void* data, size_t* len, off_t offset, void* cookie) {
  tx_test_data* td = static_cast<tx_test_data*>(cookie);
  td->actual.len = *len;
  td->actual.offset = offset;
  memcpy(data, td->expected.data, *len);
  return static_cast<tftp_status>(*len);
}

static void test_tftp_receive_wrq_oack(const size_t file_size, const uint16_t* block_size_ptr,
                                       const uint8_t* timeout_ptr,
                                       const uint16_t* window_size_ptr) {
  uint16_t block_size = block_size_ptr ? *block_size_ptr : DEFAULT_BLOCKSIZE;
  uint8_t timeout = timeout_ptr ? *timeout_ptr : DEFAULT_TIMEOUT;
  uint16_t window_size = window_size_ptr ? *window_size_ptr : DEFAULT_WINDOWSIZE;

  test_state ts;
  ts.reset(1024, file_size, 1500);

  auto status = tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename,
                                      MODE_OCTET, ts.msg_size, block_size_ptr, timeout_ptr,
                                      window_size_ptr, ts.out, &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  ASSERT_TRUE(verify_write_request(ts), "bad write request");

  char buf[256];
  buf[0] = 0x00;
  buf[1] = 0x06;  // Opcode (OACK)
  size_t buf_sz = 2;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "%s%cOCTET%cTSIZE%c%zu", kRemoteFilename,
                     '\0', '\0', '\0', file_size) +
            1;
  if (block_size_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "BLKSIZE%c%d", '\0', block_size) + 1;
  }
  if (timeout_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "TIMEOUT%c%d", '\0', timeout) + 1;
  }
  if (window_size_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "WINDOWSIZE%c%d", '\0', window_size) + 1;
  }

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  td.expected.len = block_size;
  td.expected.data[block_size - 1] = 'X';
  status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "tftp_process_msg failed");
  bool has_pending = (block_size < file_size) && (window_size > 1);
  EXPECT_EQ(has_pending, tftp_session_has_pending(ts.session),
            "Unexpected tftp_session_has_pending()");
  EXPECT_EQ(FIRST_DATA, ts.session->state, "session should be in state FIRST_DATA");
  EXPECT_EQ(file_size, ts.session->file_size, "tftp session bad file size");
  EXPECT_EQ(block_size, ts.session->block_size, "bad session: block size");
  EXPECT_EQ(timeout, ts.session->timeout, "bad session: timeout");
  EXPECT_EQ(window_size, ts.session->window_size, "bad session: window size");

  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + block_size, "bad outlen");
  EXPECT_EQ(ts.timeout, timeout * 1000U, "timeout should be set");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");

  if (has_pending) {
    // Since pending is true, call for a second data packet to transmit
    // Updated the read offset and change a few bytes
    td.expected.block = 2;
    size_t second_block_size = std::min<size_t>(file_size - block_size, block_size);
    td.expected.offset = block_size;
    td.expected.data[0] = 'X';
    if (second_block_size > 0) {
      td.expected.data[second_block_size - 1] = 'F';
    }

    status = tftp_prepare_data(ts.session, ts.out, &ts.outlen, &td);
    EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + block_size, "bad outlen");
    ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");
    has_pending = (block_size + second_block_size < file_size) && (window_size > 2);
    EXPECT_EQ(has_pending, tftp_session_has_pending(ts.session),
              "Unexpected tftp_session_has_pending()");
  }
}

TEST(TftpReceiveOack, test_tftp_receive_wrq_oack) {
  test_tftp_receive_wrq_oack(1024, NULL, NULL, NULL);
}

TEST(TftpReceiveOack, test_tftp_receive_wrq_oack_blocksize) {
  constexpr uint16_t kBlockSize = 1024;
  test_tftp_receive_wrq_oack(2048, &kBlockSize, nullptr, nullptr);
}

TEST(TftpReceiveOack, test_tftp_receive_wrq_oack_timeout) {
  constexpr uint8_t kTimeout = 5;
  test_tftp_receive_wrq_oack(1024, nullptr, &kTimeout, nullptr);
}

TEST(TftpReceiveOack, test_tftp_receive_wrq_oack_windowsize) {
  constexpr uint16_t kWindowSize = 2;
  test_tftp_receive_wrq_oack(4096, nullptr, nullptr, &kWindowSize);
}

static void test_tftp_receive_rrq_oack(size_t file_size, const uint16_t* block_size_ptr,
                                       const uint8_t* timeout_ptr,
                                       const uint16_t* window_size_ptr) {
  uint16_t block_size = block_size_ptr ? *block_size_ptr : DEFAULT_BLOCKSIZE;
  uint8_t timeout = timeout_ptr ? *timeout_ptr : DEFAULT_TIMEOUT;
  uint16_t window_size = window_size_ptr ? *window_size_ptr : DEFAULT_WINDOWSIZE;

  test_state ts;
  ts.reset(1024, file_size, 1500);

  auto status = tftp_generate_request(ts.session, RECV_FILE, kLocalFilename, kRemoteFilename,
                                      MODE_OCTET, 0, block_size_ptr, timeout_ptr, window_size_ptr,
                                      ts.out, &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error generating read request");
  ASSERT_TRUE(verify_read_request(ts), "bad read request");

  char buf[256];
  buf[0] = 0x00;
  buf[1] = 0x06;  // Opcode (OACK)
  size_t buf_sz = 2;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "TSIZE%c%zu", '\0', file_size) + 1;
  if (block_size_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "BLKSIZE%c%d", '\0', block_size) + 1;
  }
  if (timeout_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "TIMEOUT%c%d", '\0', timeout) + 1;
  }
  if (window_size_ptr) {
    buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "WINDOWSIZE%c%d", '\0', window_size) + 1;
  }
  tftp_file_interface ifc = {NULL, mock_open_write, NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, NULL);
  EXPECT_FALSE(tftp_session_has_pending(ts.session), "session should not have pending data");
  EXPECT_EQ(FIRST_DATA, ts.session->state, "session should be in state FIRST_DATA");
  EXPECT_EQ(file_size, ts.session->file_size, "tftp session bad file size");
  EXPECT_EQ(block_size, ts.session->block_size, "bad session: block size");
  EXPECT_EQ(timeout, ts.session->timeout, "bad session: timeout");
  EXPECT_EQ(window_size, ts.session->window_size, "bad session: window size");

  uint8_t expected_ack[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x00   // Block
  };
  EXPECT_EQ(sizeof(expected_ack), ts.outlen, "response size mismatch");
  EXPECT_EQ(0, memcmp(expected_ack, ts.out, sizeof(expected_ack)), "bad response");
}

TEST(TftpReceiveOack, test_tftp_receive_rrq_oack) {
  test_tftp_receive_rrq_oack(1024, nullptr, nullptr, nullptr);
}

TEST(TftpReceiveOack, test_tftp_receive_rrq_oack_blocksize) {
  constexpr uint16_t kBlockSize = 1024;
  test_tftp_receive_rrq_oack(2048, &kBlockSize, nullptr, nullptr);
}

TEST(TftpReceiveOack, test_tftp_receive_rrq_oack_timeout) {
  constexpr uint8_t kTimeout = 5;
  test_tftp_receive_rrq_oack(1024, nullptr, &kTimeout, nullptr);
}

TEST(TftpReceiveOack, test_tftp_receive_rrq_oack_windowsize) {
  constexpr uint16_t kWindowSize = 412;
  test_tftp_receive_rrq_oack(1024, nullptr, nullptr, &kWindowSize);
}

// Verify that if the server overrides our settings we use the oack'd settings it provides
TEST(TftpReceiveOack, test_tftp_receive_oack_overrides) {
  test_state ts;
  ts.reset(1024, 4096, 1500);

  uint16_t kBlockSize = 14;
  uint8_t kTimeout = 12;
  uint16_t kWindowSize = 6;

  auto status = tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename,
                                      MODE_OCTET, ts.msg_size, &kBlockSize, &kTimeout, &kWindowSize,
                                      ts.out, &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error generating write request");

  uint8_t buf[] = {
      0x00, 0x06,                                                     // Opcode (OACK)
      'T',  'S',  'I',  'Z',  'E',  0x00,                             // Option
      '4',  '0',  '9',  '6',  0x00,                                   // TSIZE value
      'B',  'L',  'K',  'S',  'I',  'Z',  'E', 0x00,                  // Option
      '5',  '5',  0x00,                                               // BLKSIZE value
      'T',  'I',  'M',  'E',  'O',  'U',  'T', 0x00,                  // Option
      '3',  0x00,                                                     // TIMEOUT value
      'W',  'I',  'N',  'D',  'O',  'W',  'S', 'I',  'Z', 'E', 0x00,  // Option
      '2',  '1',  '4',  0x00,                                         // WINDOWSIZE value
  };

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, buf, sizeof(buf), ts.out, &ts.outlen, &ts.timeout, &td);
  EXPECT_EQ(FIRST_DATA, ts.session->state, "session should be in state FIRST_DATA");
  EXPECT_EQ(4096, ts.session->file_size, "tftp session bad file size");
  EXPECT_EQ(55, ts.session->block_size, "bad session: block size");
  EXPECT_EQ(3, ts.session->timeout, "bad session: timeout");
  EXPECT_EQ(214, ts.session->window_size, "bad session: window size");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + ts.session->block_size, "bad outlen");
}

tftp_status mock_write(const void* data, size_t* len, off_t offset, void* cookie) {
  tx_test_data* td = static_cast<tx_test_data*>(cookie);
  td->actual.len = *len;
  td->actual.offset = offset;
  memcpy(td->actual.data + offset, data, *len);
  return static_cast<tftp_status>(*len);
}

void verify_write_data(const uint8_t* expected, const tx_test_data& td) {
  ASSERT_EQ(td.expected.offset, td.actual.offset, "write offset mismatch");
  ASSERT_EQ(td.expected.len, td.actual.len, "write length mismatch");
  EXPECT_BYTES_EQ(expected, td.actual.data + td.actual.offset, td.actual.len,
                  "write data mismatch");
}

TEST(TftpReceiveData, test_tftp_receive_data) {
  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 1024, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz = 2 +
                      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d",
                               kRemoteFilename, '\0', '\0', '\0', 1024) +
                      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  uint8_t data_buf[516] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x01,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[515] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(1, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(0, ts.session->window_index, "tftp session window index mismatch");
}

TEST(TftpReceiveData, test_tftp_receive_data_final_block) {
  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 1024, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz = 2 +
                      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d",
                               kRemoteFilename, '\0', '\0', '\0', 1024) +
                      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  uint8_t data_buf[516] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x01,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[515] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");

  // Update block number and first/last bytes of the data packet
  data_buf[3]++;
  data_buf[4]++;
  data_buf[515]++;
  td.expected.block++;
  td.expected.offset = DEFAULT_BLOCKSIZE;

  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");

  // Last data packet. Empty, indicating end of data.
  data_buf[3]++;
  status = tftp_process_msg(ts.session, data_buf, 4, ts.out, &ts.outlen, &ts.timeout, nullptr);
  EXPECT_EQ(TFTP_TRANSFER_COMPLETED, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
}

TEST(TftpReceiveData, test_tftp_receive_data_blocksize) {
  test_state ts;
  ts.reset(1024, 2048, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 2048, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz =
      2 +
      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d%cBLKSIZE%c%d",
               kRemoteFilename, '\0', '\0', '\0', 2048, '\0', '\0', 1024) +
      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  uint8_t data_buf[1028] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x01,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[1027] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  td.expected.len = 1024;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(1, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(0, ts.session->window_index, "tftp session window index mismatch");
}

TEST(TftpReceiveData, test_tftp_receive_data_windowsize) {
  test_state ts;
  ts.reset(1024, 1025, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 1025, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz =
      2 +
      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d%cWINDOWSIZE%c%d",
               kRemoteFilename, '\0', '\0', '\0', 1025, '\0', '\0', 2) +
      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  uint8_t data_buf[516] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x01,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[515] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  EXPECT_EQ(0, ts.outlen, "no response expected");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(1, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(1, ts.session->window_index, "tftp session window index mismatch");

  // Update block number and first/last bytes of the data packet
  data_buf[3]++;
  data_buf[4]++;
  data_buf[515]++;
  td.expected.block++;
  td.expected.offset += DEFAULT_BLOCKSIZE;

  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_ACK), "bad response");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(2, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(0, ts.session->window_index, "tftp session window index mismatch");
}

TEST(TftpReceiveData, test_tftp_receive_data_skipped_block) {
  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 1024, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz = 2 +
                      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d",
                               kRemoteFilename, '\0', '\0', '\0', 1024) +
                      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  // This is block 2, meaning we missed block 1 somehow.
  uint8_t data_buf[516] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x02,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[515] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            nullptr);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_GT(ts.outlen, 0, "outlen must not be zero");
  auto msg = reinterpret_cast<tftp_data_msg*>(ts.out);
  EXPECT_EQ(ntohs(msg->opcode) & 0xff, OPCODE_ACK, "bad opcode");
  // The opcode prefix should have been advanced when we saw a dropped block
  EXPECT_EQ((ntohs(msg->opcode) & 0xff00) >> 8, 1, "bad opcode prefix");
  EXPECT_EQ(ntohs(msg->block), 0, "bad block number");
  EXPECT_EQ(0, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(0, ts.session->window_index, "tftp session window index mismatch");

  // Verify with the opcode prefix disabled
  tftp_session_set_opcode_prefix_use(ts.session, false);
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            nullptr);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_GT(ts.outlen, 0, "outlen must not be zero");
  msg = reinterpret_cast<tftp_data_msg*>(ts.out);
  EXPECT_EQ(ntohs(msg->opcode) & 0xff, OPCODE_ACK, "bad opcode");
  EXPECT_EQ((ntohs(msg->opcode) & 0xff00) >> 8, 0, "bad opcode prefix");
  EXPECT_EQ(ntohs(msg->block), 0, "bad block number");
}

TEST(TftpReceiveData, test_tftp_receive_data_windowsize_skipped_block) {
  test_state ts;
  ts.reset(1024, 2048, 1500);
  tftp_file_interface ifc = {NULL,
                             [](const char* filename, size_t size, uint8_t session_timeout_secs,
                                void* cookie) -> tftp_status {
                               EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
                               EXPECT_EQ(size, 2048, "bad file size");
                               return 0;
                             },
                             NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[256];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  size_t req_buf_sz =
      2 +
      snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%d%cWINDOWSIZE%c%d",
               kRemoteFilename, '\0', '\0', '\0', 2048, '\0', '\0', 3) +
      1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  uint8_t data_buf[516] = {
      0x00, 0x03,                          // Opcode (DATA)
      0x00, 0x01,                          // Block
      0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,  // Data; compiler will fill out the rest with zeros
  };
  data_buf[515] = 0x79;  // set the last byte to make sure it all gets copied

  ifc.write = mock_write;
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(1, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(1, ts.session->window_index, "tftp session window index mismatch");

  // Update block number and first/last bytes of the data packet
  data_buf[3]++;
  data_buf[4]++;
  data_buf[515]++;
  td.expected.block++;
  td.expected.offset += DEFAULT_BLOCKSIZE;

  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_NO_FATAL_FAILURE(verify_write_data(data_buf + 4, td), "bad write data");
  EXPECT_EQ(2, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(2, ts.session->window_index, "tftp session window index mismatch");

  // Update block number and first/last bytes of the data packet. Block number
  // goes up by 2 to indicate a skipped block.
  data_buf[3] = 4u;
  data_buf[4]++;
  data_buf[515]++;
  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            nullptr);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive data failed");
  ASSERT_GT(ts.outlen, 0, "outlen must not be zero");
  auto msg = reinterpret_cast<tftp_data_msg*>(ts.out);
  EXPECT_EQ(ntohs(msg->opcode) & 0xff, OPCODE_ACK, "bad opcode");
  // Opcode prefix should have been incremented when a packet was not received
  EXPECT_EQ((ntohs(msg->opcode) & 0xff00) >> 8, 1, "bad opcode prefix");
  EXPECT_EQ(ntohs(msg->block), 2, "bad block number");
  EXPECT_EQ(0, td.actual.data[1024], "block 3 should be empty");
  EXPECT_EQ(2, ts.session->block_number, "tftp session block number mismatch");
  // Reset the window index after sending the ack with the last known block
  EXPECT_EQ(0, ts.session->window_index, "tftp session window index mismatch");
}

namespace {

constexpr const unsigned long kWrapAt = 0x3ffff;
constexpr const int kBlockSize = 8;
constexpr const unsigned long kFileSize = (kWrapAt + 2) * kBlockSize;

TEST(TftpReceiveData, test_tftp_receive_data_block_wrapping) {
  test_state ts;
  static bool write_called;
  write_called = false;
  ts.reset(1024, 2048, 2048);

  tftp_file_interface ifc = {NULL, NULL, NULL, NULL, NULL};
  ifc.open_write = [](const char* filename, size_t size, uint8_t session_timeout_secs,
                      void* cookie) -> tftp_status {
    EXPECT_STREQ(filename, kRemoteFilename, "bad filename");
    EXPECT_EQ(size, kFileSize, "bad file size");
    return 0;
  };
  ifc.write = [](const void* data, size_t* length, off_t offset, void* file_cookie) -> tftp_status {
    // Remember that the block count starts at zero, which makes the offset
    // calculation a bit counter-intuitive (one might expect that we would
    // be writing to (kWrapAt + 1) * kBlockSize).
    EXPECT_EQ(kWrapAt * kBlockSize, offset, "block count failed to wrap");
    write_called = true;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);

  char req_buf[1024];
  req_buf[0] = 0x00;
  req_buf[1] = OPCODE_WRQ;
  int req_buf_sz = 2 +
                   snprintf(&req_buf[2], sizeof(req_buf) - 2, "%s%cOCTET%cTSIZE%c%lu%cBLKSIZE%c%d",
                            kRemoteFilename, '\0', '\0', '\0', kFileSize, '\0', '\0', kBlockSize) +
                   1;

  ASSERT_LT(req_buf_sz, (int)sizeof(req_buf), "insufficient space for WRQ message");
  auto status =
      tftp_process_msg(ts.session, req_buf, req_buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive write request failed");
  ASSERT_EQ(REQ_RECEIVED, ts.session->state, "tftp session in wrong state");
  ASSERT_NO_FATAL_FAILURE(verify_response_opcode(ts, OPCODE_OACK), "bad response");

  // Artificially advance to force block wrapping
  ts.session->block_number = kWrapAt;
  ts.session->window_index = 0;

  uint8_t data_buf[] = {
      0x00, 0x03,                                     // Opcode (DATA)
      0x00, 0x00,                                     // Block
      0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08  // Data
  };

  status = tftp_process_msg(ts.session, data_buf, sizeof(data_buf), ts.out, &ts.outlen, &ts.timeout,
                            NULL);
  EXPECT_EQ(TFTP_NO_ERROR, status, "failed to process data");
  EXPECT_TRUE(write_called, "no attempt to write data");
  EXPECT_EQ(kWrapAt + 1, ts.session->block_number, "failed to advance block number");

  uint8_t expected_ack[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x00   // Block
  };
  EXPECT_EQ(sizeof(expected_ack), ts.outlen, "response size mismatch");
  EXPECT_EQ(0, memcmp(expected_ack, ts.out, sizeof(expected_ack)), "bad response");
}

}  // namespace

TEST(TftpSendData, test_tftp_send_data_receive_ack) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            ts.msg_size, NULL, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  uint8_t oack_buf[] = {
      0x00, 0x06,                        // Opcode (OACK)
      'T',  'S',  'I', 'Z', 'E',  0x00,  // Option
      '1',  '0',  '2', '4', 0x00,        // TSIZE value
  };

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, oack_buf, sizeof(oack_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");

  uint8_t ack_buf[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x01,  // Block
  };

  td.expected.block = 2;
  td.expected.offset += DEFAULT_BLOCKSIZE;
  td.expected.data[1] = 'f';
  status =
      tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout, &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive error");
  EXPECT_EQ(SENDING_DATA, ts.session->state, "session should be in state SENDING_DATA");
  // The block number will not advance until we see an ACK for block 2
  EXPECT_EQ(1, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(1, ts.session->window_index, "tftp session window index mismatch");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");
}

TEST(TftpSendData, test_tftp_send_data_receive_final_ack) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            ts.msg_size, NULL, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  uint8_t oack_buf[] = {
      0x00, 0x06,                        // Opcode (OACK)
      'T',  'S',  'I', 'Z', 'E',  0x00,  // Option
      '1',  '0',  '2', '4', 0x00,        // TSIZE value
  };

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, oack_buf, sizeof(oack_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");

  uint8_t ack_buf[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x01,  // Block
  };

  td.expected.block = 2;
  td.expected.offset += DEFAULT_BLOCKSIZE;
  status =
      tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout, &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");

  // second block
  ack_buf[3]++;
  status =
      tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout, &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive block 2 error");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg), "block 3 not empty");

  // Do not expect any more sends.
  ack_buf[3]++;
  status = tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout,
                            nullptr);
  EXPECT_EQ(TFTP_TRANSFER_COMPLETED, status, "tftp transfer should be complete");
  EXPECT_EQ(ts.outlen, 0, "no outgoing message expected");
}

TEST(TftpSendData, test_tftp_send_data_receive_ack_skipped_block) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            ts.msg_size, NULL, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  uint8_t oack_buf[] = {
      0x00, 0x06,                        // Opcode (OACK)
      'T',  'S',  'I', 'Z', 'E',  0x00,  // Option
      '1',  '0',  '2', '4', 0x00,        // TSIZE value
  };

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, oack_buf, sizeof(oack_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");

  uint8_t ack_buf[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x00,  // Block
  };

  tx_test_data td2;
  status =
      tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout, &td2);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive error");
  EXPECT_EQ(SENDING_DATA, ts.session->state, "session should be in state SENDING_DATA");
  EXPECT_EQ(0, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(1, ts.session->window_index, "tftp window index mismatch");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td2), "bad test data");
}

TEST(TftpSendData, test_tftp_send_data_receive_ack_window_size) {
  uint16_t kWindowSize = 2;
  test_state ts;
  ts.reset(1024, 2048, 1500);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            ts.msg_size, NULL, NULL, &kWindowSize, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  uint8_t oack_buf[] = {
      0x00, 0x06,                                                  // Opcode (OACK)
      'T',  'S',  'I', 'Z', 'E',  0x00,                            // Option
      '2',  '0',  '4', '8', 0x00,                                  // TSIZE value
      'W',  'I',  'N', 'D', 'O',  'W',  'S', 'I', 'Z', 'E', 0x00,  // Option
      '2',  0x00,                                                  // WINDOWSIZE value
  };

  tftp_file_interface ifc = {NULL, NULL, mock_read, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  tx_test_data td;
  status = tftp_process_msg(ts.session, oack_buf, sizeof(oack_buf), ts.out, &ts.outlen, &ts.timeout,
                            &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  ASSERT_EQ(0, ts.session->block_number, "tftp session block number mismatch");
  ASSERT_EQ(1, ts.session->window_index, "tftp session window index mismatch");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");
  ASSERT_TRUE(tftp_session_has_pending(ts.session), "expected pending data to transmit");

  td.expected.block++;
  td.expected.offset += DEFAULT_BLOCKSIZE;
  td.expected.data[0]++;
  status = tftp_prepare_data(ts.session, ts.out, &ts.outlen, &td);
  ASSERT_EQ(TFTP_NO_ERROR, status, "receive error");
  // Window index doesn't roll until we receive an ACK
  ASSERT_EQ(0, ts.session->block_number, "tftp session block number mismatch");
  ASSERT_EQ(2, ts.session->window_index, "tftp session window index mismatch");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");
  ASSERT_FALSE(tftp_session_has_pending(ts.session), "expected to wait for ack");

  uint8_t ack_buf[] = {
      0x00, 0x04,  // Opcode (ACK)
      0x00, 0x02,  // Block
  };

  td.expected.block++;
  td.expected.offset += DEFAULT_BLOCKSIZE;
  td.expected.data[1]++;
  status =
      tftp_process_msg(ts.session, ack_buf, sizeof(ack_buf), ts.out, &ts.outlen, &ts.timeout, &td);
  EXPECT_EQ(TFTP_NO_ERROR, status, "receive error");
  EXPECT_EQ(SENDING_DATA, ts.session->state, "session should be in state SENDING_DATA");
  EXPECT_EQ(2, ts.session->block_number, "tftp session block number mismatch");
  EXPECT_EQ(1, ts.session->window_index, "tftp session window index mismatch");
  EXPECT_EQ(ts.outlen, sizeof(tftp_data_msg) + DEFAULT_BLOCKSIZE, "bad outlen");
  ASSERT_NO_FATAL_FAILURE(verify_read_data(ts, td), "bad test data");
  EXPECT_TRUE(tftp_session_has_pending(ts.session), "expected pending data to transmit");
}

TEST(TftpSendData, test_tftp_send_data_receive_ack_block_wrapping) {
  constexpr unsigned long kWrapAt = 0x3ffff;
  constexpr uint16_t kBlockSize = 8;
  constexpr unsigned long kFileSize = (kWrapAt + 2) * kBlockSize;

  static int reads_performed;
  reads_performed = 0;

  test_state ts;
  ts.reset(1024, 2048, 2048);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            kFileSize, &kBlockSize, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  char oack_buf[256];
  oack_buf[0] = 0x00;
  oack_buf[1] = 0x06;
  size_t oack_buf_sz = 2 +
                       snprintf(&oack_buf[2], sizeof(oack_buf) - 2, "TSIZE%c%lu%cBLKSIZE%c%d", '\0',
                                kFileSize, '\0', '\0', kBlockSize) +
                       1;

  ASSERT_LT(oack_buf_sz, (int)sizeof(oack_buf), "insufficient space for OACK message");
  tftp_file_interface ifc = {NULL, NULL, NULL, NULL, NULL};
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    EXPECT_EQ(0, offset, "incorrect initial read");
    reads_performed++;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);

  status =
      tftp_process_msg(ts.session, oack_buf, oack_buf_sz, ts.out, &ts.outlen, &ts.timeout, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "failure to process OACK");
  EXPECT_EQ(1, reads_performed, "failed to call read function");

  // Artificially advance the session to a point where wrapping will occur
  ts.session->block_number = kWrapAt;
  ts.session->window_index = 0;

  uint8_t data_buf[4 + kBlockSize];
  size_t data_buf_len = sizeof(data_buf);
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    // Keep in mind that the block index starts at 1, so the offset calculation
    // is not necessarily intuitive
    EXPECT_EQ(kWrapAt * kBlockSize, offset, "incorrect wrapping read");
    reads_performed++;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);
  status = tftp_prepare_data(ts.session, data_buf, &data_buf_len, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "failed to generate DATA packet");
  EXPECT_EQ(2, reads_performed, "failed to call read function");
  EXPECT_EQ(sizeof(data_buf), data_buf_len, "improperly formatted DATA packet");
  unsigned int opcode = data_buf[0] << 8 | data_buf[1];
  EXPECT_EQ(0x0003, opcode, "incorrect DATA packet opcode");
  unsigned int block = data_buf[2] << 8 | data_buf[3];
  EXPECT_EQ(0x0000, block, "incorrect DATA packet block");
}

TEST(TftpSendData, test_tftp_send_data_receive_ack_skip_block_wrap) {
  constexpr unsigned long kLastBlockSent = 0x40003;
  constexpr unsigned long kAckBlock = 0x3fffb;
  constexpr uint16_t kBlockSize = 8;
  constexpr unsigned long kFileSize = 0x50000 * kBlockSize;

  static int reads_performed;
  reads_performed = 0;

  test_state ts;
  ts.reset(1024, 2048, 2048);

  // Create a write request
  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            kFileSize, &kBlockSize, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  EXPECT_EQ(TFTP_NO_ERROR, status, "error generating write request");
  EXPECT_TRUE(verify_write_request(ts), "bad write request");

  // Simulate a response (OACK)
  char oack_buf[256];
  oack_buf[0] = 0x00;
  oack_buf[1] = 0x06;
  size_t oack_buf_sz = 2 +
                       snprintf(&oack_buf[2], sizeof(oack_buf) - 2, "TSIZE%c%lu%cBLKSIZE%c%d", '\0',
                                kFileSize, '\0', '\0', kBlockSize) +
                       1;

  ASSERT_LT(oack_buf_sz, (int)sizeof(oack_buf), "insufficient space for OACK message");
  tftp_file_interface ifc = {NULL, NULL, NULL, NULL, NULL};
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    EXPECT_EQ(0, offset, "incorrect initial read");
    reads_performed++;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);

  // Process OACK and generate write of first block
  status =
      tftp_process_msg(ts.session, oack_buf, oack_buf_sz, ts.out, &ts.outlen, &ts.timeout, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "failure to process OACK");
  EXPECT_EQ(1, reads_performed, "failed to call read function");

  // Artificially advance the session so we can test wrapping
  ts.session->block_number = kLastBlockSent;
  ts.session->window_index = 0;

  // Create a DATA packet for block kLastBlockSent + 1
  uint8_t data_buf[4 + kBlockSize] = {0};
  size_t data_buf_len = sizeof(data_buf);
  tftp_data_msg* msg = reinterpret_cast<tftp_data_msg*>(data_buf);
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    // Keep in mind that the block index starts at 1, so the offset calculation
    // is not necessarily intuitive
    EXPECT_EQ(kLastBlockSent * kBlockSize, offset, "incorrect read offset");
    reads_performed++;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);
  status = tftp_prepare_data(ts.session, data_buf, &data_buf_len, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "failed to generate DATA packet");
  EXPECT_EQ(2, reads_performed, "failed to call read function");
  EXPECT_EQ(sizeof(data_buf), data_buf_len, "improperly formatted DATA packet");
  unsigned int opcode = htons(msg->opcode);
  EXPECT_EQ(OPCODE_DATA, opcode, "incorrect DATA packet opcode");
  uint16_t offset = ntohs(msg->block);
  ASSERT_EQ((kLastBlockSent + 1) & 0xffff, offset, "incorrect DATA packet block");

  // Simulate an ACK response that is before our last block wrap
  tftp_data_msg ack_msg;
  ack_msg.opcode = htons(OPCODE_ACK);
  ack_msg.block = htons(kAckBlock & 0xffff);
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    EXPECT_EQ(kAckBlock * kBlockSize, offset, "incorrect read offset");
    reads_performed++;
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);

  // Next DATA packet should backup to proper address (before wrap)
  status = tftp_process_msg(ts.session, reinterpret_cast<void*>(&ack_msg), sizeof(ack_msg), ts.out,
                            &ts.outlen, &ts.timeout, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "no ACK generated");
  EXPECT_EQ(3, reads_performed, "failed to call read function");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + kBlockSize, "improper DATA packet size");
  msg = reinterpret_cast<tftp_data_msg*>(ts.out);
  EXPECT_EQ(OPCODE_DATA, ntohs(msg->opcode) & 0xff, "incorrect DATA packet opcode");
  // Opcode prefix should have been incremented when a packet was dropped
  EXPECT_EQ(1, (ntohs(msg->opcode) & 0xff00) >> 8, "incorrect opcode prefix");
  EXPECT_EQ((kAckBlock + 1) & 0xffff, ntohs(msg->block), "incorrect DATA packet block");
  EXPECT_EQ(ts.session->block_number, kAckBlock, "session offset not rewound correctly");
  EXPECT_EQ(ts.session->window_index, 1, "window index not set correctly");

  // Try again, this time disabling opcode prefixes
  ifc.read = [](void* data, size_t* length, off_t offset, void* cookie) -> tftp_status {
    return TFTP_NO_ERROR;
  };
  tftp_session_set_file_interface(ts.session, &ifc);
  tftp_session_set_opcode_prefix_use(ts.session, false);
  ack_msg.block = htons((kAckBlock + 1) & 0xffff);
  status = tftp_process_msg(ts.session, reinterpret_cast<void*>(&ack_msg), sizeof(ack_msg), ts.out,
                            &ts.outlen, &ts.timeout, NULL);
  ASSERT_EQ(TFTP_NO_ERROR, status, "no ACK generated");
  ASSERT_EQ(ts.outlen, sizeof(tftp_data_msg) + kBlockSize, "improper DATA packet size");
  msg = reinterpret_cast<tftp_data_msg*>(ts.out);
  EXPECT_EQ(OPCODE_DATA, ntohs(msg->opcode) & 0xff, "incorrect DATA packet opcode");
  EXPECT_EQ(0, (ntohs(msg->opcode) & 0xff00) >> 8, "incorrect opcode prefix");
  EXPECT_EQ((kAckBlock + 2) & 0xffff, ntohs(msg->block), "incorrect DATA packet block");
}

static ssize_t open_read_should_wait(const char* filename, uint8_t session_timeout_secs,
                                     void* cookie) {
  return TFTP_ERR_SHOULD_WAIT;
}

static tftp_status open_write_should_wait(const char* filename, size_t size,
                                          uint8_t session_timeout_secs, void* cookie) {
  return TFTP_ERR_SHOULD_WAIT;
}

/* Verify behavior when one of our open_file interface functions returns TFTP_ERR_SHOULD_WAIT. */
static void test_tftp_open_should_wait(tftp_file_direction dir) {
  const uint16_t block_size = 456;
  const uint8_t timeout = 3;
  const uint16_t window_size = 128;

  test_state ts;
  ts.reset(1024, 1024, 1500);
  tftp_file_interface ifc = {open_read_should_wait, open_write_should_wait, NULL, NULL, NULL};
  tftp_session_set_file_interface(ts.session, &ifc);

  // Construct a RRQ or WRQ packet
  size_t req_file_size = (dir == SEND_FILE) ? 1024 : 0;
  char buf[256];
  buf[0] = 0x00;
  buf[1] = (dir == SEND_FILE) ? OPCODE_WRQ : OPCODE_RRQ;
  size_t buf_sz = 2;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz,
                     "%s%cOCTET%cTSIZE%c%zu%cBLKSIZE%c%d%cTIMEOUT%c%d%cWINDOWSIZE%c%d",
                     kRemoteFilename, '\0', '\0', '\0', req_file_size, '\0', '\0', block_size, '\0',
                     '\0', timeout, '\0', '\0', window_size) +
            1;
  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for request");

  tftp_status status =
      tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);

  // Check API return value
  EXPECT_EQ(TFTP_ERR_SHOULD_WAIT, status, "expected SHOULD_WAIT status");

  // tftp_process_msg should have generated an error packet response - verify its fields
  ASSERT_GT(ts.outlen, 0);
  auto msg = reinterpret_cast<tftp_err_msg*>(ts.out);
  EXPECT_EQ(msg->opcode, htons(OPCODE_ERROR));
  EXPECT_EQ(msg->err_code, htons(TFTP_ERR_CODE_BUSY));
  if (dir == SEND_FILE) {
    const char expected_err[] = "not ready to receive";
    EXPECT_STREQ(expected_err, msg->msg, "bad error message");
  } else {
    const char expected_err[] = "not ready to send";
    EXPECT_STREQ(expected_err, msg->msg, "bad error message");
  }
}

TEST(TftpSendErr, test_tftp_open_read_should_wait) {
  // RECV is from the perspective of the client, not the server
  test_tftp_open_should_wait(RECV_FILE);
}

TEST(TftpSendErr, test_tftp_open_write_should_wait) {
  // SEND is from the perspective of the client, not the server
  test_tftp_open_should_wait(SEND_FILE);
}

static void test_tftp_recv_busy(tftp_file_direction dir) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto status = tftp_generate_request(ts.session, dir, kLocalFilename, kRemoteFilename, MODE_OCTET,
                                      dir == SEND_FILE ? ts.msg_size : 0, NULL, NULL, NULL, ts.out,
                                      &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error generating request");
  if (dir == SEND_FILE) {
    ASSERT_TRUE(verify_write_request(ts), "bad write request");
  } else {
    ASSERT_TRUE(verify_read_request(ts), "bad read request");
  }

  // Simulate a BUSY error response
  char buf[256];
  buf[0] = 0x00;
  buf[1] = OPCODE_ERROR;
  buf[2] = (TFTP_ERR_CODE_BUSY & 0xff00) >> 8;
  buf[3] = TFTP_ERR_CODE_BUSY & 0xff;
  size_t buf_sz = 4;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "not ready") + 1;
  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for request");

  status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);

  // Check API return value
  EXPECT_EQ(TFTP_ERR_SHOULD_WAIT, status, "expected SHOULD_WAIT status");

  // tftp_process_msg should not have generated a response
  EXPECT_EQ(ts.outlen, 0);

  // Verify session state
  EXPECT_EQ(NONE, ts.session->state, "bad session: state");
}

/* Verify handling of a BUSY error packet when we send a WRQ. */
TEST(TftpRecvErr, test_tftp_recv_busy_from_wrq) { test_tftp_recv_busy(SEND_FILE); }

/* Verify handling of a BUSY error packet when we send a RRQ. */
TEST(TftpRecvErr, test_tftp_recv_busy_from_rrq) { test_tftp_recv_busy(RECV_FILE); }

/* Verify that receiving an error other than BUSY puts the session into an error state. */
TEST(TftpRecvErr, test_tftp_recv_other_err) {
  test_state ts;
  ts.reset(1024, 1024, 1500);

  auto status =
      tftp_generate_request(ts.session, SEND_FILE, kLocalFilename, kRemoteFilename, MODE_OCTET,
                            ts.msg_size, NULL, NULL, NULL, ts.out, &ts.outlen, &ts.timeout);
  ASSERT_EQ(TFTP_NO_ERROR, status, "error generating request");
  ASSERT_TRUE(verify_write_request(ts), "bad write request");

  // Simulate a BUSY error response
  char buf[256];
  buf[0] = 0x00;
  buf[1] = OPCODE_ERROR;
  buf[2] = (TFTP_ERR_CODE_DISK_FULL & 0xff00) >> 8;
  buf[3] = TFTP_ERR_CODE_DISK_FULL & 0xff;
  size_t buf_sz = 4;
  buf_sz += snprintf(&buf[buf_sz], sizeof(buf) - buf_sz, "disk full") + 1;
  ASSERT_LT(buf_sz, (int)sizeof(buf), "insufficient space for request");

  status = tftp_process_msg(ts.session, buf, buf_sz, ts.out, &ts.outlen, &ts.timeout, nullptr);

  // Check API return value
  EXPECT_EQ(TFTP_ERR_INTERNAL, status, "expected TFTP_ERR_INTERNAL status");

  // tftp_process_msg should not have generated a response
  EXPECT_EQ(ts.outlen, 0);

  // Verify session state
  EXPECT_EQ(ERROR, ts.session->state, "bad session: state");
}
