#include "base_command.h"

extern "C" {
#include "command.h"
}

#include <stdio.h>
#include <stdlib.h>
#include <gtest/gtest.h>

class AuthenticateTest : public BaseCommandTest {
 public:
  AuthenticateTest() {
  }
  virtual ~AuthenticateTest() {
  }
};

TEST_F(AuthenticateTest, CommandAuthenticate) {
  TciCommand tci_command = {0};

  tci_command.cmdId = kCommandIdAuthenticate;
  tci_command.handler = handler;

  TEEC_Result status = SendCommand(tci_command);

  EXPECT_TRUE(status == TEEC_SUCCESS);
  EXPECT_EQ((uint32_t)RESP_SUCCESS, tci_command.resp);
}

TEST_F(AuthenticateTest, CommandNotValidHandlerAuthenticate) {
  PaHandler bad_handler = {0};
  TciCommand tci_command = {0};

  tci_command.cmdId = kCommandIdAuthenticate;
  tci_command.handler = bad_handler;

  TEEC_Result status = SendCommand(tci_command);

  EXPECT_TRUE(status == TEEC_SUCCESS);
  EXPECT_EQ((uint32_t)RESP_FAILED, tci_command.resp);
}

TEST_F(AuthenticateTest, CommandAuthenticatePidAndName) {
  TciCommand tci_command = {0};

  tci_command.cmdId = kAuthenticateByPidAndAppName;
  tci_command.pid = getpid();
  strncpy(tci_command.app_name, "/vendor/bin/ftest_pa_driver", sizeof(tci_command.app_name));

  TEEC_Result status = SendCommand(tci_command);

  EXPECT_EQ(TEEC_SUCCESS, status);
  EXPECT_EQ((uint32_t)RESP_SUCCESS, tci_command.resp);
}

TEST_F(AuthenticateTest, CommandAuthenticatePidAndNameFailed) {
  TciCommand tci_command = {0};

  tci_command.cmdId = kAuthenticateByPidAndAppName;
  tci_command.pid = getpid();
  strncpy(tci_command.app_name, "/vendor/bin/attacker", sizeof(tci_command.app_name));

  TEEC_Result status = SendCommand(tci_command);

  EXPECT_EQ(TEEC_SUCCESS, status);
  EXPECT_EQ(PA_TZ_AF_APPNAME_IS_INCORRECT, tci_command.tz_result);
}
