1259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
2259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
3259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
4259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// you may not use this file except in compliance with the License.
6259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// You may obtain a copy of the License at
7259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
8259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
10259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// See the License for the specific language governing permissions and
14259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// limitations under the License.
15259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
16f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
17f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <string>
18f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
19a08ddea5f4b861ddf1f4e91bb9c4c34e23dc0ba9Alex Vakulenko#include <brillo/bind_lambda.h>
20f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <dbus/mock_object_proxy.h>
21f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <gmock/gmock.h>
22f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <gtest/gtest.h>
23f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
24c9429017d51d78d516ac40531ce83fe35c48524cUtkarsh Sanghi#include "tpm_manager/client/tpm_nvram_dbus_proxy.h"
25f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
26f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnusing testing::_;
27f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnusing testing::Invoke;
28f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnusing testing::StrictMock;
29f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnusing testing::WithArgs;
30f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
31f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnnamespace tpm_manager {
32f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
33c9429017d51d78d516ac40531ce83fe35c48524cUtkarsh Sanghiclass TpmNvramDBusProxyTest : public testing::Test {
34f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn public:
35c9429017d51d78d516ac40531ce83fe35c48524cUtkarsh Sanghi  ~TpmNvramDBusProxyTest() override = default;
36f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn  void SetUp() override {
37f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn    mock_object_proxy_ = new StrictMock<dbus::MockObjectProxy>(
38f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn        nullptr, "", dbus::ObjectPath(""));
39f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn    proxy_.set_object_proxy(mock_object_proxy_.get());
40f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn  }
41644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
42f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn protected:
43f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn  scoped_refptr<StrictMock<dbus::MockObjectProxy>> mock_object_proxy_;
44c9429017d51d78d516ac40531ce83fe35c48524cUtkarsh Sanghi  TpmNvramDBusProxy proxy_;
45f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn};
46f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn
47a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, DefineSpace) {
48644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
49a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  size_t nvram_size = 32;
50a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto fake_dbus_call = [nvram_index, nvram_size](
51644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
52644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
53644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
54644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
55a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    DefineSpaceRequest request;
56644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
57644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
58644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
59a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_TRUE(request.has_size());
60a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(nvram_size, request.size());
61644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
62644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
63644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
64a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    DefineSpaceReply reply;
65a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
66644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
67644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
68644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
69644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
70644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
71644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
72644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
73a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto callback = [&callback_count](const DefineSpaceReply& reply) {
74644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
75a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
76644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
77a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  DefineSpaceRequest request;
78644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
79a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  request.set_size(nvram_size);
80a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.DefineSpace(request, base::Bind(callback));
81644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
82644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
83644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
84a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, DestroySpaceRequest) {
85644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
86644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  auto fake_dbus_call = [nvram_index](
87644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
88644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
89644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
90644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
91a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    DestroySpaceRequest request;
92644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
93644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
94644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
95644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
96644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
97644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
98a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    DestroySpaceReply reply;
99a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
100644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
101644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
102644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
103644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
104644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
105644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
106644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
107a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto callback = [&callback_count](const DestroySpaceReply& reply) {
108644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
109a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
110644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
111a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  DestroySpaceRequest request;
112644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
113a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.DestroySpace(request, base::Bind(callback));
114644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
115644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
116a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, WriteSpace) {
117644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
118644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  std::string nvram_data("nvram_data");
119644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  auto fake_dbus_call = [nvram_index, nvram_data](
120644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
121644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
122644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
123644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
124a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    WriteSpaceRequest request;
125644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
126644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
127644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
128644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_data());
129644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_data, request.data());
130644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
131644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
132644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
133a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    WriteSpaceReply reply;
134a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
135644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
136644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
137644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
138644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
139644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
140644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
141644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
142a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto callback = [&callback_count](const WriteSpaceReply& reply) {
143644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
144a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
145644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
146a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  WriteSpaceRequest request;
147644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
148644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_data(nvram_data);
149a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.WriteSpace(request, base::Bind(callback));
150644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
151644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
152644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
153a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, ReadSpace) {
154644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
155644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  std::string nvram_data("nvram_data");
156644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  auto fake_dbus_call = [nvram_index, nvram_data](
157644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
158644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
159644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
160644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
161a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ReadSpaceRequest request;
162644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
163644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
164644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
165644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
166644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
167644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
168a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ReadSpaceReply reply;
169a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
170644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    reply.set_data(nvram_data);
171644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
172644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
173644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
174644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
175644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
176644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
177644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
178a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto callback = [&callback_count, nvram_data](const ReadSpaceReply& reply) {
179644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
180a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
181644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reply.has_data());
182644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_data, reply.data());
183644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
184a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ReadSpaceRequest request;
185644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
186a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.ReadSpace(request, base::Bind(callback));
187644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
188644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
189644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
190a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, LockSpace) {
191644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
192a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto fake_dbus_call = [nvram_index](
193644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
194644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
195644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
196644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
197a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    LockSpaceRequest request;
198644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
199644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
200644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
201644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
202644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
203644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
204a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    LockSpaceReply reply;
205a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
206644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
207644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
208644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
209644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
210644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
211644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
212644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
213a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto callback = [&callback_count](const LockSpaceReply& reply) {
214644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
215a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
216644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
217a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LockSpaceRequest request;
218644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
219a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.LockSpace(request, base::Bind(callback));
220644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
221644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
222644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
223a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, ListSpaces) {
224a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  constexpr uint32_t nvram_index_list[] = {3, 4, 5};
225a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  auto fake_dbus_call = [nvram_index_list](
226644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
227644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
228644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
229644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
230a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ListSpacesRequest request;
231644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
232644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
233644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
234644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
235a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ListSpacesReply reply;
236a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
237a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    for (auto index : nvram_index_list) {
238a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      reply.add_index_list(index);
239a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    }
240644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
241644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
242644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
243644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
244644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
245644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
246644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
2474dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  auto callback = [&callback_count,
248a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                   nvram_index_list](const ListSpacesReply& reply) {
249644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
250a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
251a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(arraysize(nvram_index_list), reply.index_list_size());
252a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    for (size_t i = 0; i < 3; i++) {
253a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_EQ(nvram_index_list[i], reply.index_list(i));
254a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    }
255644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
256a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ListSpacesRequest request;
257a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.ListSpaces(request, base::Bind(callback));
258644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
259644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
260644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
261a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(TpmNvramDBusProxyTest, GetSpaceInfo) {
262644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  uint32_t nvram_index = 5;
263644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  size_t nvram_size = 32;
264644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  auto fake_dbus_call = [nvram_index, nvram_size](
265644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      dbus::MethodCall* method_call,
266644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
267644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Verify request protobuf.
268644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageReader reader(method_call);
269a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    GetSpaceInfoRequest request;
270644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request));
271644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(request.has_index());
272644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_index, request.index());
273644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    // Create reply protobuf.
274644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    auto response = dbus::Response::CreateEmpty();
275644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    dbus::MessageWriter writer(response.get());
276a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    GetSpaceInfoReply reply;
277a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reply.set_result(NVRAM_RESULT_SUCCESS);
278644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    reply.set_size(nvram_size);
279644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    writer.AppendProtoAsArrayOfBytes(reply);
280644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    response_callback.Run(response.release());
281644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
282644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
283644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
284644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  // Set expectations on the outputs.
285644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  int callback_count = 0;
2864dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  auto callback = [&callback_count,
287a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                   nvram_size](const GetSpaceInfoReply& reply) {
288644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    callback_count++;
289a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
290644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_TRUE(reply.has_size());
291644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi    EXPECT_EQ(nvram_size, reply.size());
292644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  };
293a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  GetSpaceInfoRequest request;
294644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  request.set_index(nvram_index);
295a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  proxy_.GetSpaceInfo(request, base::Bind(callback));
296644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi  EXPECT_EQ(1, callback_count);
297644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi}
298644d8287015a0be315a49863b005f1237c280d6bUtkarsh Sanghi
299f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn}  // namespace tpm_manager
300