Home | History | Annotate | Download | only in client
      1 //
      2 // Copyright (C) 2015 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include <string>
     18 
     19 #include <brillo/bind_lambda.h>
     20 #include <dbus/mock_object_proxy.h>
     21 #include <gmock/gmock.h>
     22 #include <gtest/gtest.h>
     23 
     24 #include "tpm_manager/client/tpm_nvram_dbus_proxy.h"
     25 
     26 using testing::_;
     27 using testing::Invoke;
     28 using testing::StrictMock;
     29 using testing::WithArgs;
     30 
     31 namespace tpm_manager {
     32 
     33 class TpmNvramDBusProxyTest : public testing::Test {
     34  public:
     35   ~TpmNvramDBusProxyTest() override = default;
     36   void SetUp() override {
     37     mock_object_proxy_ = new StrictMock<dbus::MockObjectProxy>(
     38         nullptr, "", dbus::ObjectPath(""));
     39     proxy_.set_object_proxy(mock_object_proxy_.get());
     40   }
     41 
     42  protected:
     43   scoped_refptr<StrictMock<dbus::MockObjectProxy>> mock_object_proxy_;
     44   TpmNvramDBusProxy proxy_;
     45 };
     46 
     47 TEST_F(TpmNvramDBusProxyTest, DefineNvram) {
     48   uint32_t nvram_index = 5;
     49   size_t nvram_length = 32;
     50   auto fake_dbus_call = [nvram_index, nvram_length](
     51       dbus::MethodCall* method_call,
     52       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
     53     // Verify request protobuf.
     54     dbus::MessageReader reader(method_call);
     55     DefineNvramRequest request;
     56     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
     57     EXPECT_TRUE(request.has_index());
     58     EXPECT_EQ(nvram_index, request.index());
     59     EXPECT_TRUE(request.has_length());
     60     EXPECT_EQ(nvram_length, request.length());
     61     // Create reply protobuf.
     62     auto response = dbus::Response::CreateEmpty();
     63     dbus::MessageWriter writer(response.get());
     64     DefineNvramReply reply;
     65     reply.set_status(STATUS_SUCCESS);
     66     writer.AppendProtoAsArrayOfBytes(reply);
     67     response_callback.Run(response.release());
     68   };
     69   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
     70       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
     71   // Set expectations on the outputs.
     72   int callback_count = 0;
     73   auto callback = [&callback_count](const DefineNvramReply& reply) {
     74     callback_count++;
     75     EXPECT_EQ(STATUS_SUCCESS, reply.status());
     76   };
     77   DefineNvramRequest request;
     78   request.set_index(nvram_index);
     79   request.set_length(nvram_length);
     80   proxy_.DefineNvram(request, base::Bind(callback));
     81   EXPECT_EQ(1, callback_count);
     82 }
     83 
     84 TEST_F(TpmNvramDBusProxyTest, DestroyNvram) {
     85   uint32_t nvram_index = 5;
     86   auto fake_dbus_call = [nvram_index](
     87       dbus::MethodCall* method_call,
     88       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
     89     // Verify request protobuf.
     90     dbus::MessageReader reader(method_call);
     91     DestroyNvramRequest request;
     92     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
     93     EXPECT_TRUE(request.has_index());
     94     EXPECT_EQ(nvram_index, request.index());
     95     // Create reply protobuf.
     96     auto response = dbus::Response::CreateEmpty();
     97     dbus::MessageWriter writer(response.get());
     98     DestroyNvramReply reply;
     99     reply.set_status(STATUS_SUCCESS);
    100     writer.AppendProtoAsArrayOfBytes(reply);
    101     response_callback.Run(response.release());
    102   };
    103   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    104       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    105   // Set expectations on the outputs.
    106   int callback_count = 0;
    107   auto callback = [&callback_count](const DestroyNvramReply& reply) {
    108     callback_count++;
    109     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    110   };
    111   DestroyNvramRequest request;
    112   request.set_index(nvram_index);
    113   proxy_.DestroyNvram(request, base::Bind(callback));
    114   EXPECT_EQ(1, callback_count);
    115 }
    116 TEST_F(TpmNvramDBusProxyTest, WriteNvram) {
    117   uint32_t nvram_index = 5;
    118   std::string nvram_data("nvram_data");
    119   auto fake_dbus_call = [nvram_index, nvram_data](
    120       dbus::MethodCall* method_call,
    121       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
    122     // Verify request protobuf.
    123     dbus::MessageReader reader(method_call);
    124     WriteNvramRequest request;
    125     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
    126     EXPECT_TRUE(request.has_index());
    127     EXPECT_EQ(nvram_index, request.index());
    128     EXPECT_TRUE(request.has_data());
    129     EXPECT_EQ(nvram_data, request.data());
    130     // Create reply protobuf.
    131     auto response = dbus::Response::CreateEmpty();
    132     dbus::MessageWriter writer(response.get());
    133     WriteNvramReply reply;
    134     reply.set_status(STATUS_SUCCESS);
    135     writer.AppendProtoAsArrayOfBytes(reply);
    136     response_callback.Run(response.release());
    137   };
    138   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    139       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    140   // Set expectations on the outputs.
    141   int callback_count = 0;
    142   auto callback = [&callback_count](const WriteNvramReply& reply) {
    143     callback_count++;
    144     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    145   };
    146   WriteNvramRequest request;
    147   request.set_index(nvram_index);
    148   request.set_data(nvram_data);
    149   proxy_.WriteNvram(request, base::Bind(callback));
    150   EXPECT_EQ(1, callback_count);
    151 }
    152 
    153 TEST_F(TpmNvramDBusProxyTest, ReadNvram) {
    154   uint32_t nvram_index = 5;
    155   std::string nvram_data("nvram_data");
    156   auto fake_dbus_call = [nvram_index, nvram_data](
    157       dbus::MethodCall* method_call,
    158       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
    159     // Verify request protobuf.
    160     dbus::MessageReader reader(method_call);
    161     ReadNvramRequest request;
    162     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
    163     EXPECT_TRUE(request.has_index());
    164     EXPECT_EQ(nvram_index, request.index());
    165     // Create reply protobuf.
    166     auto response = dbus::Response::CreateEmpty();
    167     dbus::MessageWriter writer(response.get());
    168     ReadNvramReply reply;
    169     reply.set_status(STATUS_SUCCESS);
    170     reply.set_data(nvram_data);
    171     writer.AppendProtoAsArrayOfBytes(reply);
    172     response_callback.Run(response.release());
    173   };
    174   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    175       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    176   // Set expectations on the outputs.
    177   int callback_count = 0;
    178   auto callback = [&callback_count, nvram_data](const ReadNvramReply& reply) {
    179     callback_count++;
    180     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    181     EXPECT_TRUE(reply.has_data());
    182     EXPECT_EQ(nvram_data, reply.data());
    183   };
    184   ReadNvramRequest request;
    185   request.set_index(nvram_index);
    186   proxy_.ReadNvram(request, base::Bind(callback));
    187   EXPECT_EQ(1, callback_count);
    188 }
    189 
    190 TEST_F(TpmNvramDBusProxyTest, IsNvramDefined) {
    191   uint32_t nvram_index = 5;
    192   bool nvram_defined = true;
    193   auto fake_dbus_call = [nvram_index, nvram_defined](
    194       dbus::MethodCall* method_call,
    195       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
    196     // Verify request protobuf.
    197     dbus::MessageReader reader(method_call);
    198     IsNvramDefinedRequest request;
    199     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
    200     EXPECT_TRUE(request.has_index());
    201     EXPECT_EQ(nvram_index, request.index());
    202     // Create reply protobuf.
    203     auto response = dbus::Response::CreateEmpty();
    204     dbus::MessageWriter writer(response.get());
    205     IsNvramDefinedReply reply;
    206     reply.set_status(STATUS_SUCCESS);
    207     reply.set_is_defined(nvram_defined);
    208     writer.AppendProtoAsArrayOfBytes(reply);
    209     response_callback.Run(response.release());
    210   };
    211   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    212       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    213   // Set expectations on the outputs.
    214   int callback_count = 0;
    215   auto callback = [&callback_count, nvram_defined](
    216       const IsNvramDefinedReply& reply) {
    217     callback_count++;
    218     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    219     EXPECT_TRUE(reply.has_is_defined());
    220     EXPECT_EQ(nvram_defined, reply.is_defined());
    221   };
    222   IsNvramDefinedRequest request;
    223   request.set_index(nvram_index);
    224   proxy_.IsNvramDefined(request, base::Bind(callback));
    225   EXPECT_EQ(1, callback_count);
    226 }
    227 
    228 TEST_F(TpmNvramDBusProxyTest, IsNvramLocked) {
    229   uint32_t nvram_index = 5;
    230   bool nvram_locked = true;
    231   auto fake_dbus_call = [nvram_index, nvram_locked](
    232       dbus::MethodCall* method_call,
    233       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
    234     // Verify request protobuf.
    235     dbus::MessageReader reader(method_call);
    236     IsNvramLockedRequest request;
    237     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
    238     EXPECT_TRUE(request.has_index());
    239     EXPECT_EQ(nvram_index, request.index());
    240     // Create reply protobuf.
    241     auto response = dbus::Response::CreateEmpty();
    242     dbus::MessageWriter writer(response.get());
    243     IsNvramLockedReply reply;
    244     reply.set_status(STATUS_SUCCESS);
    245     reply.set_is_locked(nvram_locked);
    246     writer.AppendProtoAsArrayOfBytes(reply);
    247     response_callback.Run(response.release());
    248   };
    249   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    250       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    251   // Set expectations on the outputs.
    252   int callback_count = 0;
    253   auto callback = [&callback_count, nvram_locked](
    254       const IsNvramLockedReply& reply) {
    255     callback_count++;
    256     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    257     EXPECT_TRUE(reply.has_is_locked());
    258     EXPECT_EQ(nvram_locked, reply.is_locked());
    259   };
    260   IsNvramLockedRequest request;
    261   request.set_index(nvram_index);
    262   proxy_.IsNvramLocked(request, base::Bind(callback));
    263   EXPECT_EQ(1, callback_count);
    264 }
    265 
    266 TEST_F(TpmNvramDBusProxyTest, GetNvramSize) {
    267   uint32_t nvram_index = 5;
    268   size_t nvram_size = 32;
    269   auto fake_dbus_call = [nvram_index, nvram_size](
    270       dbus::MethodCall* method_call,
    271       const dbus::MockObjectProxy::ResponseCallback& response_callback) {
    272     // Verify request protobuf.
    273     dbus::MessageReader reader(method_call);
    274     GetNvramSizeRequest request;
    275     EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
    276     EXPECT_TRUE(request.has_index());
    277     EXPECT_EQ(nvram_index, request.index());
    278     // Create reply protobuf.
    279     auto response = dbus::Response::CreateEmpty();
    280     dbus::MessageWriter writer(response.get());
    281     GetNvramSizeReply reply;
    282     reply.set_status(STATUS_SUCCESS);
    283     reply.set_size(nvram_size);
    284     writer.AppendProtoAsArrayOfBytes(reply);
    285     response_callback.Run(response.release());
    286   };
    287   EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
    288       .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
    289   // Set expectations on the outputs.
    290   int callback_count = 0;
    291   auto callback = [&callback_count, nvram_size](
    292       const GetNvramSizeReply& reply) {
    293     callback_count++;
    294     EXPECT_EQ(STATUS_SUCCESS, reply.status());
    295     EXPECT_TRUE(reply.has_size());
    296     EXPECT_EQ(nvram_size, reply.size());
    297   };
    298   GetNvramSizeRequest request;
    299   request.set_index(nvram_index);
    300   proxy_.GetNvramSize(request, base::Bind(callback));
    301   EXPECT_EQ(1, callback_count);
    302 }
    303 
    304 }  // namespace tpm_manager
    305