// Copyright 2019 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 <stdint.h>
#include <zircon/status.h>

#include <zxtest/zxtest.h>

namespace {

TEST(StatusString, AllOfEm) {
  EXPECT_STREQ(zx_status_get_string(ZX_OK), "ZX_OK");                                // (0)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_INTERNAL), "ZX_ERR_INTERNAL");            // (-1)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_SUPPORTED), "ZX_ERR_NOT_SUPPORTED");  // (-2)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NO_RESOURCES), "ZX_ERR_NO_RESOURCES");    //  (-3)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NO_MEMORY), "ZX_ERR_NO_MEMORY");          //  (-4)
  EXPECT_STREQ(zx_status_get_string(-5), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_INTERNAL_INTR_RETRY),
               "ZX_ERR_INTERNAL_INTR_RETRY");  //  (-6)
  EXPECT_STREQ(zx_status_get_string(-7), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-8), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-9), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_INVALID_ARGS), "ZX_ERR_INVALID_ARGS");  //  (-10)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_BAD_HANDLE), "ZX_ERR_BAD_HANDLE");      //  (-11)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_WRONG_TYPE), "ZX_ERR_WRONG_TYPE");      //  (-12)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_BAD_SYSCALL), "ZX_ERR_BAD_SYSCALL");    //  (-13)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_OUT_OF_RANGE), "ZX_ERR_OUT_OF_RANGE");  //  (-14)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_BUFFER_TOO_SMALL),
               "ZX_ERR_BUFFER_TOO_SMALL");  //  (-15)
  EXPECT_STREQ(zx_status_get_string(-16), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-17), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-18), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-19), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_BAD_STATE), "ZX_ERR_BAD_STATE");            //  (-20)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_TIMED_OUT), "ZX_ERR_TIMED_OUT");            //  (-21)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_SHOULD_WAIT), "ZX_ERR_SHOULD_WAIT");        //  (-22)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_CANCELED), "ZX_ERR_CANCELED");              //  (-23)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_PEER_CLOSED), "ZX_ERR_PEER_CLOSED");        //  (-24)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_FOUND), "ZX_ERR_NOT_FOUND");            //  (-25)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ALREADY_EXISTS), "ZX_ERR_ALREADY_EXISTS");  //  (-26)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ALREADY_BOUND), "ZX_ERR_ALREADY_BOUND");    //  (-27)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_UNAVAILABLE), "ZX_ERR_UNAVAILABLE");        //  (-28)
  EXPECT_STREQ(zx_status_get_string(-29), "(UNKNOWN)");                                //  (-29)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ACCESS_DENIED), "ZX_ERR_ACCESS_DENIED");    //  (-30)
  EXPECT_STREQ(zx_status_get_string(-31), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-32), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-33), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-34), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-35), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-36), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-37), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-38), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-39), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO), "ZX_ERR_IO");                  //  (-40)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_REFUSED), "ZX_ERR_IO_REFUSED");  //  (-41)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_DATA_INTEGRITY),
               "ZX_ERR_IO_DATA_INTEGRITY");                                            //  (-42)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_DATA_LOSS), "ZX_ERR_IO_DATA_LOSS");      //  (-43)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_NOT_PRESENT), "ZX_ERR_IO_NOT_PRESENT");  //  (-44)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_OVERRUN), "ZX_ERR_IO_OVERRUN");          //  (-45)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_MISSED_DEADLINE),
               "ZX_ERR_IO_MISSED_DEADLINE");                                   //  (-46)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_IO_INVALID), "ZX_ERR_IO_INVALID");  //  (-47)
  EXPECT_STREQ(zx_status_get_string(-48), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-49), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_BAD_PATH), "ZX_ERR_BAD_PATH");    //  (-50)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_DIR), "ZX_ERR_NOT_DIR");      //  (-51)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_FILE), "ZX_ERR_NOT_FILE");    //  (-52)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_FILE_BIG), "ZX_ERR_FILE_BIG");    //  (-53)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NO_SPACE), "ZX_ERR_NO_SPACE");    //  (-54)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_EMPTY), "ZX_ERR_NOT_EMPTY");  //  (-55)
  EXPECT_STREQ(zx_status_get_string(-56), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-57), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-58), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-59), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_STOP), "ZX_ERR_STOP");    //  (-60)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NEXT), "ZX_ERR_NEXT");    //  (-61)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ASYNC), "ZX_ERR_ASYNC");  //  (-62)
  EXPECT_STREQ(zx_status_get_string(-63), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-64), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-65), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-66), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-67), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-68), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(-69), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_PROTOCOL_NOT_SUPPORTED),
               "ZX_ERR_PROTOCOL_NOT_SUPPORTED");  //  (-70)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ADDRESS_UNREACHABLE),
               "ZX_ERR_ADDRESS_UNREACHABLE");                                          //  (-71)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_ADDRESS_IN_USE), "ZX_ERR_ADDRESS_IN_USE");  //  (-72)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_NOT_CONNECTED), "ZX_ERR_NOT_CONNECTED");    //  (-73)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_CONNECTION_REFUSED),
               "ZX_ERR_CONNECTION_REFUSED");  //  (-74)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_CONNECTION_RESET),
               "ZX_ERR_CONNECTION_RESET");  //  (-75)
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_CONNECTION_ABORTED),
               "ZX_ERR_CONNECTION_ABORTED");  //  (-76)

  // One past our current last-known should be unknown (note that all errors
  // are negative, so -1, not +1).
  ASSERT_NOT_NULL(zx_status_get_string(ZX_ERR_CONNECTION_ABORTED - 1));
  EXPECT_STREQ(zx_status_get_string(ZX_ERR_CONNECTION_ABORTED - 1), "(UNKNOWN)");

  EXPECT_STREQ(zx_status_get_string(INT32_MIN), "(UNKNOWN)");
  EXPECT_STREQ(zx_status_get_string(INT32_MAX), "(UNKNOWN)");
}

}  // namespace
