// Copyright (c) 2012 The Chromium OS 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 "chaps/chaps_service.h"

#include <string>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "chaps/isolate.h"
#include "chaps/object_mock.h"
#include "chaps/session_mock.h"
#include "chaps/slot_manager_mock.h"

using std::string;
using std::vector;
using chromeos::SecureBlob;
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::Return;
using ::testing::SetArgumentPointee;

namespace chaps {

// Invalid initialization test.
TEST(InitDeathTest, InvalidInit) {
  ChapsServiceImpl service(NULL);
  EXPECT_DEATH_IF_SUPPORTED(service.Init(), "Check failed");
}

// Test fixture for an initialized service instance.
class TestService : public ::testing::Test {
 protected:
  virtual void SetUp() {
    service_.reset(new ChapsServiceImpl(&slot_manager_));
    ASSERT_TRUE(service_->Init());
    // Setup parsable and un-parsable serialized attributes.
    CK_ATTRIBUTE attributes[] = {{CKA_VALUE, nullptr, 0}};
    CK_ATTRIBUTE attributes2[] = {{CKA_VALUE, const_cast<char*>("test"), 4}};
    attribute_ = attributes[0];
    attribute2_ = attributes2[0];
    Attributes tmp(attributes, 1);
    tmp.Serialize(&good_attributes_);
    Attributes tmp2(attributes2, 1);
    tmp2.Serialize(&good_attributes2_);
    bad_attributes_ = vector<uint8_t>(100, 0xAA);
    ic_ = IsolateCredentialManager::GetDefaultIsolateCredential();
  }
  virtual void TearDown() {
    service_->TearDown();
  }
  SlotManagerMock slot_manager_;
  SessionMock session_;
  ObjectMock object_;
  scoped_ptr<ChapsServiceImpl> service_;
  vector<uint8_t> bad_attributes_;
  vector<uint8_t> good_attributes_;
  vector<uint8_t> good_attributes2_;
  CK_ATTRIBUTE attribute_;
  CK_ATTRIBUTE attribute2_;
  SecureBlob ic_;
};

TEST_F(TestService, GetSlotList) {
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillRepeatedly(Return(false));
  // Try bad arguments.
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetSlotList(ic_, false, NULL));
  vector<uint64_t> slot_list;
  slot_list.push_back(0);
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetSlotList(ic_, false, &slot_list));
  // Try normal use cases.
  slot_list.clear();
  EXPECT_EQ(CKR_OK, service_->GetSlotList(ic_, true, &slot_list));
  EXPECT_EQ(0, slot_list.size());
  EXPECT_EQ(CKR_OK, service_->GetSlotList(ic_, false, &slot_list));
  EXPECT_EQ(2, slot_list.size());

  // Check that when tokens are not accessible to an isolate, the slot list is
  // filtered.
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillOnce(Return(true))
    .WillOnce(Return(false));
  slot_list.clear();
  EXPECT_EQ(CKR_OK, service_->GetSlotList(ic_, false, &slot_list));
  EXPECT_EQ(1, slot_list.size());
}

TEST_F(TestService, GetSlotInfo) {
  CK_SLOT_INFO test_info;
  memset(&test_info, 0, sizeof(CK_SLOT_INFO));
  test_info.flags = 17;
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, GetSlotInfo(ic_, 0, _))
    .WillRepeatedly(SetArgumentPointee<2>(test_info));

  // Try bad arguments.
  void* p[7];
  for (int i = 0; i < 7; ++i) {
    memset(p, 1, sizeof(p));
    p[i] = NULL;
    EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetSlotInfo(
        ic_,
        0,
        reinterpret_cast<vector<uint8_t>*>(p[0]),
        reinterpret_cast<vector<uint8_t>*>(p[1]),
        reinterpret_cast<uint64_t*>(p[2]),
        reinterpret_cast<uint8_t*>(p[3]),
        reinterpret_cast<uint8_t*>(p[4]),
        reinterpret_cast<uint8_t*>(p[5]),
        reinterpret_cast<uint8_t*>(p[6])));
  }
  vector<uint8_t> slot_description;
  vector<uint8_t> manufacturer_id;
  uint64_t flags;
  uint8_t hardware_version_major;
  uint8_t hardware_version_minor;
  uint8_t firmware_version_major;
  uint8_t firmware_version_minor;
  // Try invalid slot ID.
  EXPECT_EQ(CKR_SLOT_ID_INVALID,
            service_->GetSlotInfo(ic_,
                                  2,
                                  &slot_description,
                                  &manufacturer_id,
                                  &flags,
                                  &hardware_version_major,
                                  &hardware_version_minor,
                                  &firmware_version_major,
                                  &firmware_version_minor));
  // Try the normal case.
  EXPECT_EQ(CKR_OK, service_->GetSlotInfo(ic_,
                                          0,
                                          &slot_description,
                                          &manufacturer_id,
                                          &flags,
                                          &hardware_version_major,
                                          &hardware_version_minor,
                                          &firmware_version_major,
                                          &firmware_version_minor));
  EXPECT_EQ(flags, 17);
}

TEST_F(TestService, GetTokenInfo) {
  CK_TOKEN_INFO test_info;
  memset(&test_info, 0, sizeof(CK_TOKEN_INFO));
  test_info.flags = 17;
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, GetTokenInfo(ic_, 0, _))
    .WillRepeatedly(SetArgumentPointee<2>(test_info));

  // Try bad arguments.
  void* p[19];
  for (int i = 0; i < 19; ++i) {
    memset(p, 1, sizeof(p));
    p[i] = NULL;
    EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetTokenInfo(
        ic_,
        0,
        reinterpret_cast<vector<uint8_t>*>(p[0]),
        reinterpret_cast<vector<uint8_t>*>(p[1]),
        reinterpret_cast<vector<uint8_t>*>(p[2]),
        reinterpret_cast<vector<uint8_t>*>(p[3]),
        reinterpret_cast<uint64_t*>(p[4]),
        reinterpret_cast<uint64_t*>(p[5]),
        reinterpret_cast<uint64_t*>(p[6]),
        reinterpret_cast<uint64_t*>(p[7]),
        reinterpret_cast<uint64_t*>(p[8]),
        reinterpret_cast<uint64_t*>(p[9]),
        reinterpret_cast<uint64_t*>(p[10]),
        reinterpret_cast<uint64_t*>(p[11]),
        reinterpret_cast<uint64_t*>(p[12]),
        reinterpret_cast<uint64_t*>(p[13]),
        reinterpret_cast<uint64_t*>(p[14]),
        reinterpret_cast<uint8_t*>(p[15]),
        reinterpret_cast<uint8_t*>(p[16]),
        reinterpret_cast<uint8_t*>(p[17]),
        reinterpret_cast<uint8_t*>(p[18])));
  }
  vector<uint8_t> label;
  vector<uint8_t> manufacturer_id;
  vector<uint8_t> model;
  vector<uint8_t> serial_number;
  uint64_t flags;
  uint64_t max_session_count;
  uint64_t session_count;
  uint64_t max_session_count_rw;
  uint64_t session_count_rw;
  uint64_t max_pin_len;
  uint64_t min_pin_len;
  uint64_t total_public_memory;
  uint64_t free_public_memory;
  uint64_t total_private_memory;
  uint64_t free_private_memory;
  uint8_t hardware_version_major;
  uint8_t hardware_version_minor;
  uint8_t firmware_version_major;
  uint8_t firmware_version_minor;
  // Try invalid slot ID.
  EXPECT_EQ(CKR_SLOT_ID_INVALID,
            service_->GetTokenInfo(ic_,
                                   3,
                                   &label,
                                   &manufacturer_id,
                                   &model,
                                   &serial_number,
                                   &flags,
                                   &max_session_count,
                                   &session_count,
                                   &max_session_count_rw,
                                   &session_count_rw,
                                   &max_pin_len,
                                   &min_pin_len,
                                   &total_public_memory,
                                   &free_public_memory,
                                   &total_private_memory,
                                   &free_private_memory,
                                   &hardware_version_major,
                                   &hardware_version_minor,
                                   &firmware_version_major,
                                   &firmware_version_minor));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT,
            service_->GetTokenInfo(ic_,
                                   0,
                                   &label,
                                   &manufacturer_id,
                                   &model,
                                   &serial_number,
                                   &flags,
                                   &max_session_count,
                                   &session_count,
                                   &max_session_count_rw,
                                   &session_count_rw,
                                   &max_pin_len,
                                   &min_pin_len,
                                   &total_public_memory,
                                   &free_public_memory,
                                   &total_private_memory,
                                   &free_private_memory,
                                   &hardware_version_major,
                                   &hardware_version_minor,
                                   &firmware_version_major,
                                   &firmware_version_minor));
  // Try the normal case.
  EXPECT_EQ(CKR_OK, service_->GetTokenInfo(ic_,
                                           0,
                                           &label,
                                           &manufacturer_id,
                                           &model,
                                           &serial_number,
                                           &flags,
                                           &max_session_count,
                                           &session_count,
                                           &max_session_count_rw,
                                           &session_count_rw,
                                           &max_pin_len,
                                           &min_pin_len,
                                           &total_public_memory,
                                           &free_public_memory,
                                           &total_private_memory,
                                           &free_private_memory,
                                           &hardware_version_major,
                                           &hardware_version_minor,
                                           &firmware_version_major,
                                           &firmware_version_minor));
  EXPECT_EQ(flags, 17);
}

TEST_F(TestService, GetMechanismList) {
  MechanismMap test_list;
  CK_MECHANISM_INFO test_info;
  memset(&test_info, 0, sizeof(CK_MECHANISM_INFO));
  test_list[123UL] = test_info;
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, GetMechanismInfo(ic_, 0))
    .WillRepeatedly(Return(&test_list));
  // Try bad arguments.
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetMechanismList(ic_, 0, NULL));
  // Try invalid slot ID.
  vector<uint64_t> output;
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->GetMechanismList(ic_, 2, &output));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT, service_->GetMechanismList(ic_, 0, &output));
  // Try the normal case.
  ASSERT_EQ(CKR_OK, service_->GetMechanismList(ic_, 0, &output));
  ASSERT_EQ(output.size(), 1);
  EXPECT_EQ(output[0], 123);
}

TEST_F(TestService, GetMechanismInfo) {
  MechanismMap test_list;
  CK_MECHANISM_INFO test_info;
  memset(&test_info, 0, sizeof(CK_MECHANISM_INFO));
  test_info.flags = 17;
  test_list[123UL] = test_info;
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, GetMechanismInfo(ic_, 0))
    .WillRepeatedly(Return(&test_list));
  uint64_t min_key, max_key, flags;
  // Try bad arguments.
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetMechanismInfo(ic_, 0, 123, NULL, &max_key, &flags));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetMechanismInfo(ic_, 0, 123, &min_key, NULL, &flags));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetMechanismInfo(ic_, 0, 123, &min_key, &max_key, NULL));
  // Try invalid slot ID.
  EXPECT_EQ(CKR_SLOT_ID_INVALID,
            service_->GetMechanismInfo(ic_, 2, 123, &min_key, &max_key,
                                       &flags));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT,
            service_->GetMechanismInfo(ic_, 0, 123, &min_key, &max_key,
                                       &flags));
  // Try the normal case.
  ASSERT_EQ(CKR_OK,
            service_->GetMechanismInfo(ic_, 0, 123, &min_key, &max_key,
                                       &flags));
  EXPECT_EQ(flags, 17);
}

TEST_F(TestService, InitToken) {
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillOnce(Return(true));
  vector<uint8_t> bad_label;
  vector<uint8_t> good_label(chaps::kTokenLabelSize, 0x20);
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->InitToken(ic_, 0, NULL, bad_label));
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->InitToken(ic_, 2, NULL, good_label));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT, service_->InitToken(ic_, 0, NULL,
                                                       good_label));
  EXPECT_EQ(CKR_PIN_INCORRECT, service_->InitToken(ic_, 0, NULL, good_label));
}

TEST_F(TestService, InitPIN) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 0, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->InitPIN(ic_, 0, NULL));
  EXPECT_EQ(CKR_USER_NOT_LOGGED_IN, service_->InitPIN(ic_, 0, NULL));
}

TEST_F(TestService, SetPIN) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 0, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->SetPIN(ic_, 0, NULL, NULL));
  EXPECT_EQ(CKR_PIN_INVALID, service_->SetPIN(ic_, 0, NULL, NULL));
}

TEST_F(TestService, OpenSession) {
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, OpenSession(ic_, 0, true))
    .WillRepeatedly(Return(10));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->OpenSession(ic_, 0, 0, NULL));
  uint64_t session;
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->OpenSession(ic_, 2, 0, &session));
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->OpenSession(ic_, 0, 0, &session));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT, service_->OpenSession(ic_, 0, 0, &session));
  EXPECT_EQ(CKR_SESSION_PARALLEL_NOT_SUPPORTED,
            service_->OpenSession(ic_, 0, 0, &session));
  ASSERT_EQ(CKR_OK, service_->OpenSession(ic_, 0, CKF_SERIAL_SESSION,
                                          &session));
  EXPECT_EQ(session, 10);
}

TEST_F(TestService, CloseSession) {
  EXPECT_CALL(slot_manager_, CloseSession(ic_, 0))
    .WillOnce(Return(false))
    .WillOnce(Return(true));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->CloseSession(ic_, 0));
  EXPECT_EQ(CKR_OK, service_->CloseSession(ic_, 0));
}

TEST_F(TestService, CloseAllSessions) {
  EXPECT_CALL(slot_manager_, GetSlotCount())
    .WillRepeatedly(Return(2));
  EXPECT_CALL(slot_manager_, IsTokenAccessible(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, IsTokenPresent(ic_, _))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(slot_manager_, CloseAllSessions(ic_, 1));
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->CloseAllSessions(ic_, 2));
  EXPECT_EQ(CKR_SLOT_ID_INVALID, service_->CloseAllSessions(ic_, 1));
  EXPECT_EQ(CKR_TOKEN_NOT_PRESENT, service_->CloseAllSessions(ic_, 1));
  EXPECT_EQ(CKR_OK, service_->CloseAllSessions(ic_, 1));
}

TEST_F(TestService, GetSessionInfo) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetSlot())
    .WillRepeatedly(Return(15));
  EXPECT_CALL(session_, GetState())
    .WillRepeatedly(Return(16));
  EXPECT_CALL(session_, IsReadOnly())
    .WillRepeatedly(Return(false));
  // Try bad arguments.
  uint64_t slot, state, flags, err;
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetSessionInfo(ic_, 1, NULL, &state, &flags, &err));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetSessionInfo(ic_, 1, &slot, NULL, &flags, &err));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetSessionInfo(ic_, 1, &slot, &state, NULL, &err));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetSessionInfo(ic_, 1, &slot, &state, &flags, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GetSessionInfo(ic_, 1, &slot, &state, &flags, &err));
  // Try normal case.
  ASSERT_EQ(CKR_OK, service_->GetSessionInfo(ic_, 1, &slot, &state, &flags,
                                             &err));
  EXPECT_EQ(slot, 15);
  EXPECT_EQ(state, 16);
  EXPECT_EQ(flags, CKF_RW_SESSION|CKF_SERIAL_SESSION);
}

TEST_F(TestService, GetOperationState) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, IsOperationActive(_))
    .WillRepeatedly(Return(false));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetOperationState(ic_, 1, NULL));
  vector<uint8_t> state;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GetOperationState(ic_, 1, &state));
  EXPECT_EQ(CKR_OPERATION_NOT_INITIALIZED,
            service_->GetOperationState(ic_, 1, &state));
  EXPECT_CALL(session_, IsOperationActive(_))
    .WillRepeatedly(Return(true));
  EXPECT_EQ(CKR_STATE_UNSAVEABLE,
            service_->GetOperationState(ic_, 1, &state));
}

TEST_F(TestService, SetOperationState) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  vector<uint8_t> state;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->SetOperationState(ic_, 1, state, 0, 0));
  EXPECT_EQ(CKR_SAVED_STATE_INVALID,
            service_->SetOperationState(ic_, 1, state, 0, 0));
}

TEST_F(TestService, Login) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, WaitForPrivateObjects()).Times(AnyNumber());
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->Login(ic_, 1, CKU_USER, NULL));
  string bad_pin("1234");
  string good_pin("111111");
  EXPECT_EQ(CKR_PIN_INCORRECT, service_->Login(ic_, 1, CKU_SO, &good_pin));
  EXPECT_EQ(CKR_PIN_INCORRECT, service_->Login(ic_, 1, CKU_USER, &bad_pin));
  EXPECT_EQ(CKR_OK, service_->Login(ic_, 1, CKU_USER, &good_pin));
  EXPECT_EQ(CKR_OK, service_->Login(ic_, 1, CKU_USER, NULL));
}

TEST_F(TestService, Logout) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->Logout(ic_, 1));
  EXPECT_EQ(CKR_OK, service_->Logout(ic_, 1));
}

TEST_F(TestService, CreateObject) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, CreateObject(_, 1, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(2), Return(CKR_OK)));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->CreateObject(ic_, 1, good_attributes_, NULL));
  uint64_t object_handle;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->CreateObject(ic_, 1, good_attributes_, &object_handle));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->CreateObject(ic_, 1, bad_attributes_, &object_handle));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->CreateObject(ic_, 1, good_attributes_, &object_handle));
  EXPECT_EQ(CKR_OK,
            service_->CreateObject(ic_, 1, good_attributes_, &object_handle));
  EXPECT_EQ(object_handle, 2);
}

TEST_F(TestService, CopyObject) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, CopyObject(_, 1, 2, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<3>(3), Return(CKR_OK)));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->CopyObject(ic_, 1, 2, good_attributes_, NULL));
  uint64_t object_handle;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->CopyObject(ic_, 1, 2, good_attributes_, &object_handle));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->CopyObject(ic_, 1, 2, bad_attributes_, &object_handle));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->CopyObject(ic_, 1, 2, good_attributes_, &object_handle));
  EXPECT_EQ(CKR_OK,
            service_->CopyObject(ic_, 1, 2, good_attributes_, &object_handle));
  EXPECT_EQ(object_handle, 3);
}

TEST_F(TestService, DestroyObject) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, DestroyObject(_))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->DestroyObject(ic_, 1, 2));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->DestroyObject(ic_, 1, 2));
  EXPECT_EQ(CKR_OK, service_->DestroyObject(ic_, 1, 2));
}

TEST_F(TestService, GetObjectSize) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(2, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(object_, GetSize())
    .WillRepeatedly(Return(3));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->GetObjectSize(ic_, 1, 2, NULL));
  uint64_t size = 0;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->GetObjectSize(ic_, 1, 2,
                                                                &size));
  EXPECT_EQ(CKR_OBJECT_HANDLE_INVALID, service_->GetObjectSize(ic_, 1, 2,
                                                               &size));
  EXPECT_EQ(CKR_OK, service_->GetObjectSize(ic_, 1, 2, &size));
  EXPECT_EQ(size, 3);
}

TEST_F(TestService, GetAttributeValue) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(2, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(object_, GetAttributes(_, 1))
    .WillOnce(Return(CKR_TEMPLATE_INCONSISTENT))
    .WillOnce(Return(CKR_ATTRIBUTE_SENSITIVE))
    .WillOnce(Return(CKR_ATTRIBUTE_TYPE_INVALID))
    .WillRepeatedly(Return(CKR_OK));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, NULL));
  vector<uint8_t> output;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, &output));
  EXPECT_EQ(CKR_OBJECT_HANDLE_INVALID,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, &output));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->GetAttributeValue(ic_, 1, 2, bad_attributes_, &output));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, &output));
  EXPECT_EQ(output.size(), 0);
  EXPECT_EQ(CKR_ATTRIBUTE_SENSITIVE,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, &output));

  // Construct a template with a valid pointer to test serialization when the
  // mock returns CKR_ATTRIBUTE_TYPE_INVALID.
  int out_value = 1234;
  CK_ATTRIBUTE invalid_type = {0, &out_value, ~0UL};
  Attributes tmp(&invalid_type, 1);
  vector<uint8_t> tmp_serialized;
  tmp.Serialize(&tmp_serialized);
  EXPECT_EQ(CKR_ATTRIBUTE_TYPE_INVALID,
            service_->GetAttributeValue(ic_, 1, 2, tmp_serialized, &output));
  EXPECT_EQ(CKR_OK,
            service_->GetAttributeValue(ic_, 1, 2, good_attributes_, &output));
}

TEST_F(TestService, SetAttributeValue) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetModifiableObject(2, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(session_, FlushModifiableObject(_))
    .WillOnce(Return(false))
    .WillRepeatedly(Return(true));
  EXPECT_CALL(object_, SetAttributes(_, 1))
    .WillOnce(Return(CKR_TEMPLATE_INCONSISTENT))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> output;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->SetAttributeValue(ic_, 1, 2, good_attributes_));
  EXPECT_EQ(CKR_OBJECT_HANDLE_INVALID,
            service_->SetAttributeValue(ic_, 1, 2, good_attributes_));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->SetAttributeValue(ic_, 1, 2, bad_attributes_));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->SetAttributeValue(ic_, 1, 2, good_attributes_));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->SetAttributeValue(ic_, 1, 2, good_attributes_));
  EXPECT_EQ(CKR_OK, service_->SetAttributeValue(ic_, 1, 2, good_attributes_));
}

TEST_F(TestService, FindObjectsInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, FindObjectsInit(_, 1))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->FindObjectsInit(ic_, 1, good_attributes_));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->FindObjectsInit(ic_, 1, bad_attributes_));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->FindObjectsInit(ic_, 1, good_attributes_));
  EXPECT_EQ(CKR_OK, service_->FindObjectsInit(ic_, 1, good_attributes_));
}

TEST_F(TestService, FindObjects) {
  vector<uint64_t> objects_ret(12, 12);
  vector<int> objects_mock(12, 12);
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, FindObjects(2, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(objects_mock), Return(CKR_OK)));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->FindObjects(ic_, 1, 2, NULL));
  vector<uint64_t> objects(1, 1);
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->FindObjects(ic_, 1, 2, &objects));
  objects.clear();
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->FindObjects(ic_, 1, 2,
                                                              &objects));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->FindObjects(ic_, 1, 2, &objects));
  EXPECT_EQ(CKR_OK, service_->FindObjects(ic_, 1, 2, &objects));
  EXPECT_TRUE(objects == objects_ret);
}

TEST_F(TestService, FindObjectsFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, FindObjectsFinal())
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->FindObjectsFinal(ic_, 1));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->FindObjectsFinal(ic_, 1));
  EXPECT_EQ(CKR_OK, service_->FindObjectsFinal(ic_, 1));
}

TEST_F(TestService, EncryptInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(3, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(session_, OperationInit(kEncrypt, 2, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> p(10, 0x10);
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->EncryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_KEY_HANDLE_INVALID, service_->EncryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->EncryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_OK, service_->EncryptInit(ic_, 1, 2, p, 3));
}

TEST_F(TestService, Encrypt) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationSinglePart(kEncrypt, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Encrypt(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Encrypt(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->Encrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->Encrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->Encrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, EncryptUpdate) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kEncrypt, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->EncryptUpdate(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->EncryptUpdate(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->EncryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->EncryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->EncryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, EncryptFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationFinal(kEncrypt, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->EncryptFinal(ic_, 1, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->EncryptFinal(ic_, 1, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->EncryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->EncryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->EncryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, DecryptInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(3, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(session_, OperationInit(kDecrypt, 2, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> p(10, 0x10);
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->DecryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_KEY_HANDLE_INVALID, service_->DecryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->DecryptInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_OK, service_->DecryptInit(ic_, 1, 2, p, 3));
}

TEST_F(TestService, Decrypt) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationSinglePart(kDecrypt, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Decrypt(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Decrypt(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->Decrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->Decrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->Decrypt(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, DecryptUpdate) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kDecrypt, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->DecryptUpdate(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD,
            service_->DecryptUpdate(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->DecryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->DecryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->DecryptUpdate(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, DecryptFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationFinal(kDecrypt, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->DecryptFinal(ic_, 1, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->DecryptFinal(ic_, 1, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->DecryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->DecryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->DecryptFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, DigestInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationInit(kDigest, 2, _, NULL))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> p(10, 0x10);
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->DigestInit(ic_, 1, 2, p));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->DigestInit(ic_, 1, 2, p));
  EXPECT_EQ(CKR_OK, service_->DigestInit(ic_, 1, 2, p));
}

TEST_F(TestService, Digest) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationSinglePart(kDigest, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Digest(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Digest(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->Digest(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->Digest(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->Digest(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, DigestUpdate) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kDigest, _, NULL, NULL))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> data;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->DigestUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->DigestUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_OK, service_->DigestUpdate(ic_, 1, data));
}

TEST_F(TestService, DigestFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationFinal(kDigest, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->DigestFinal(ic_, 1, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->DigestFinal(ic_, 1, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->DigestFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->DigestFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->DigestFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, SignInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(3, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(session_, OperationInit(kSign, 2, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> p(10, 0x10);
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->SignInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_KEY_HANDLE_INVALID, service_->SignInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->SignInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_OK, service_->SignInit(ic_, 1, 2, p, 3));
}

TEST_F(TestService, Sign) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationSinglePart(kSign, _, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Sign(ic_, 1, data, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->Sign(ic_, 1, data, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->Sign(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->Sign(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->Sign(ic_, 1, data, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, SignUpdate) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kSign, _, NULL, NULL))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> data;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->SignUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->SignUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_OK, service_->SignUpdate(ic_, 1, data));
}

TEST_F(TestService, SignFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationFinal(kSign, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(7), Return(CKR_OK)));
  vector<uint8_t> data;
  uint64_t len = 0;
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->SignFinal(ic_, 1, 2, NULL, &data));
  EXPECT_EQ(CKR_ARGUMENTS_BAD, service_->SignFinal(ic_, 1, 2, &len, NULL));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->SignFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->SignFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(CKR_OK, service_->SignFinal(ic_, 1, 2, &len, &data));
  EXPECT_EQ(len, 7);
}

TEST_F(TestService, VerifyInit) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GetObject(3, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(&object_), Return(true)));
  EXPECT_CALL(session_, OperationInit(kVerify, 2, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> p(10, 0x10);
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->VerifyInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_KEY_HANDLE_INVALID, service_->VerifyInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->VerifyInit(ic_, 1, 2, p, 3));
  EXPECT_EQ(CKR_OK, service_->VerifyInit(ic_, 1, 2, p, 3));
}

TEST_F(TestService, Verify) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kVerify, _, NULL, NULL))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  EXPECT_CALL(session_, VerifyFinal(_))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> data;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->Verify(ic_, 1, data, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->Verify(ic_, 1, data, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->Verify(ic_, 1, data, data));
  EXPECT_EQ(CKR_OK, service_->Verify(ic_, 1, data, data));
}

TEST_F(TestService, VerifyUpdate) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, OperationUpdate(kVerify, _, NULL, NULL))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> data;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->VerifyUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->VerifyUpdate(ic_, 1, data));
  EXPECT_EQ(CKR_OK, service_->VerifyUpdate(ic_, 1, data));
}

TEST_F(TestService, VerifyFinal) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, VerifyFinal(_))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(Return(CKR_OK));
  vector<uint8_t> data;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->VerifyFinal(ic_, 1, data));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->VerifyFinal(ic_, 1, data));
  EXPECT_EQ(CKR_OK, service_->VerifyFinal(ic_, 1, data));
}

TEST_F(TestService, GenerateKey) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GenerateKey(2, _, _, 1, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<4>(3), Return(CKR_OK)));
  vector<uint8_t> param;
  uint64_t handle;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GenerateKey(ic_, 1, 2, param, good_attributes_, &handle));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->GenerateKey(ic_, 1, 2, param, bad_attributes_, &handle));
  EXPECT_EQ(CKR_FUNCTION_FAILED,
            service_->GenerateKey(ic_, 1, 2, param, good_attributes_, &handle));
  EXPECT_EQ(CKR_OK,
            service_->GenerateKey(ic_, 1, 2, param, good_attributes_, &handle));
  EXPECT_EQ(handle, 3);
}

TEST_F(TestService, GenerateKeyPair) {
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GenerateKeyPair(2, _, _, 1, _, 1, _, _))
    .WillOnce(Return(CKR_FUNCTION_FAILED))
    .WillRepeatedly(DoAll(SetArgumentPointee<6>(3),
                          SetArgumentPointee<7>(4),
                          Return(CKR_OK)));
  vector<uint8_t> param;
  uint64_t handle[2];
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GenerateKeyPair(ic_, 1, 2, param,
                                      good_attributes_, good_attributes2_,
                                      &handle[0], &handle[1]));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->GenerateKeyPair(ic_, 1, 2, param,
                                      bad_attributes_, good_attributes2_,
                                      &handle[0], &handle[1]));
  EXPECT_EQ(CKR_TEMPLATE_INCONSISTENT,
            service_->GenerateKeyPair(ic_, 1, 2, param,
                                      good_attributes_, bad_attributes_,
                                      &handle[0], &handle[1]));
  EXPECT_EQ(CKR_FUNCTION_FAILED, service_->GenerateKeyPair(ic_, 1, 2, param,
                                                           good_attributes_,
                                                           good_attributes2_,
                                                           &handle[0],
                                                           &handle[1]));
  EXPECT_EQ(CKR_OK, service_->GenerateKeyPair(ic_, 1, 2, param,
                                              good_attributes_,
                                              good_attributes2_,
                                              &handle[0],
                                              &handle[1]));
  EXPECT_EQ(handle[0], 3);
  EXPECT_EQ(handle[1], 4);
}

TEST_F(TestService, SeedRandom) {
  vector<uint8_t> seed(3, 'A');
  string seed_str("AAA");
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, SeedRandom(seed_str)).WillRepeatedly(Return(CKR_OK));
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID, service_->SeedRandom(ic_, 1, seed));
  EXPECT_EQ(CKR_OK, service_->SeedRandom(ic_, 1, seed));
}

TEST_F(TestService, GenerateRandom) {
  vector<uint8_t> random_data(3, 'B');
  string random_data_str("BBB");
  EXPECT_CALL(slot_manager_, GetSession(ic_, 1, _))
    .WillOnce(Return(false))
    .WillRepeatedly(DoAll(SetArgumentPointee<2>(&session_), Return(true)));
  EXPECT_CALL(session_, GenerateRandom(8, _))
    .WillRepeatedly(DoAll(SetArgumentPointee<1>(random_data_str),
                          Return(CKR_OK)));
  vector<uint8_t> output;
  EXPECT_EQ(CKR_SESSION_HANDLE_INVALID,
            service_->GenerateRandom(ic_, 1, 8, &output));
  EXPECT_EQ(CKR_OK, service_->GenerateRandom(ic_, 1, 8, &output));
  EXPECT_TRUE(output == random_data);
}

}  // namespace chaps

int main(int argc, char** argv) {
  ::testing::InitGoogleMock(&argc, argv);
  return RUN_ALL_TESTS();
}
