13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License.
63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at
73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and
143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License.
153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
16b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
17b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string>
18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
19e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/bind_lambda.h>
20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/mock_object_proxy.h>
21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gmock/gmock.h>
22b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gtest/gtest.h>
23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/client/dbus_proxy.h"
25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::_;
27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::Invoke;
28b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::StrictMock;
29b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::WithArgs;
30b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation {
32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnclass DBusProxyTest : public testing::Test {
34b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn public:
35b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  ~DBusProxyTest() override = default;
36b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  void SetUp() override {
37b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    mock_object_proxy_ = new StrictMock<dbus::MockObjectProxy>(
38b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn        nullptr, "", dbus::ObjectPath(""));
39b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    proxy_.set_object_proxy(mock_object_proxy_.get());
40b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  }
41b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn protected:
42b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  scoped_refptr<StrictMock<dbus::MockObjectProxy>> mock_object_proxy_;
43b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  DBusProxy proxy_;
44b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn};
45b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
466222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, CreateGoogleAttestedKey) {
470752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  auto fake_dbus_call = [](
480752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      dbus::MethodCall* method_call,
490752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
50b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Verify request protobuf.
51b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageReader reader(method_call);
52b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyRequest request_proto;
53b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
54b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
55b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
56b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
57b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(ENTERPRISE_MACHINE_CERTIFICATE,
58b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn              request_proto.certificate_profile());
5959d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("user", request_proto.username());
6059d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("origin", request_proto.origin());
61b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Create reply protobuf.
622e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
63b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageWriter writer(response.get());
64b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyReply reply_proto;
65d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
660752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    reply_proto.set_certificate_chain("certificate");
67b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    reply_proto.set_server_error("server_error");
68b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
690752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response_callback.Run(response.release());
70b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  };
716222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
720752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
730752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
740752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // Set expectations on the outputs.
75d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  int callback_count = 0;
76b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  auto callback = [&callback_count](const CreateGoogleAttestedKeyReply& reply) {
77d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    callback_count++;
78b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
79b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("certificate", reply.certificate_chain());
80b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("server_error", reply.server_error());
810752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
82b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyRequest request;
83b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_label("label");
84b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
85b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
86b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_certificate_profile(ENTERPRISE_MACHINE_CERTIFICATE);
87b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_username("user");
88b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_origin("origin");
89b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  proxy_.CreateGoogleAttestedKey(request, base::Bind(callback));
90d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  EXPECT_EQ(1, callback_count);
91b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
92b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
936222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, GetKeyInfo) {
946222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto fake_dbus_call = [](
956222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      dbus::MethodCall* method_call,
966222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
976222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Verify request protobuf.
986222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageReader reader(method_call);
996222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoRequest request_proto;
1006222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
1016222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
1026222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("username", request_proto.username());
1036222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Create reply protobuf.
1042e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
1056222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageWriter writer(response.get());
1066222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoReply reply_proto;
1076222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
1086222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_type(KEY_TYPE_ECC);
1096222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_usage(KEY_USAGE_SIGN);
1106222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_public_key("public_key");
1116222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info("certify_info");
1126222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info_signature("signature");
1136222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certificate("certificate");
1146222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
1156222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    response_callback.Run(response.release());
1166222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1176222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
1186222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
1196222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
1206222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // Set expectations on the outputs.
1216222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  int callback_count = 0;
1226222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto callback = [&callback_count](const GetKeyInfoReply& reply) {
1236222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    callback_count++;
1246222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
1256222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, reply.key_type());
1266222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, reply.key_usage());
1276222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
1286222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
1296222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
1306222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
1316222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1326222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  GetKeyInfoRequest request;
1336222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_key_label("label");
1346222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_username("username");
1356222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  proxy_.GetKeyInfo(request, base::Bind(callback));
1366222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(1, callback_count);
1376222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1386222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
139cd5486df897619718b68223ebefc1322a1f5ab29Darren KrahnTEST_F(DBusProxyTest, GetEndorsementInfo) {
140cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto fake_dbus_call = [](
141cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      dbus::MethodCall* method_call,
142cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
143cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Verify request protobuf.
144cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageReader reader(method_call);
145cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoRequest request_proto;
146cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
147cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
148cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Create reply protobuf.
1492e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
150cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageWriter writer(response.get());
151cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoReply reply_proto;
152cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
153cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_public_key("public_key");
154cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_certificate("certificate");
155cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
156cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    response_callback.Run(response.release());
157cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
158cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
159cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
160cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
161cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // Set expectations on the outputs.
162cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  int callback_count = 0;
163cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto callback = [&callback_count](const GetEndorsementInfoReply& reply) {
164cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    callback_count++;
165cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
166cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("public_key", reply.ek_public_key());
167cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("certificate", reply.ek_certificate());
168cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
169cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  GetEndorsementInfoRequest request;
170cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
171cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  proxy_.GetEndorsementInfo(request, base::Bind(callback));
172cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ(1, callback_count);
173cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn}
174cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
175566c836c403212d5c13428b02ed65e5ff6e49a6bDarren KrahnTEST_F(DBusProxyTest, GetAttestationKeyInfo) {
176566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto fake_dbus_call = [](
177566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      dbus::MethodCall* method_call,
178566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
179566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Verify request protobuf.
180566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageReader reader(method_call);
181566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoRequest request_proto;
182566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
183566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
184566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Create reply protobuf.
1852e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
186566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageWriter writer(response.get());
187566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoReply reply_proto;
188566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
189566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_public_key("public_key");
1902e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_public_key_tpm_format("public_key_tpm_format");
191566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_certificate("certificate");
192566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr0_quote()->set_quote("pcr0");
193566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr1_quote()->set_quote("pcr1");
194566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
195566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    response_callback.Run(response.release());
196566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
197566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
198566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
199566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
200566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // Set expectations on the outputs.
201566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  int callback_count = 0;
202566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto callback = [&callback_count](const GetAttestationKeyInfoReply& reply) {
203566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    callback_count++;
204566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
205566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
2062e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("public_key_tpm_format", reply.public_key_tpm_format());
207566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
208566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr0", reply.pcr0_quote().quote());
209566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr1", reply.pcr1_quote().quote());
210566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
211566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  GetAttestationKeyInfoRequest request;
212566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
213566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  proxy_.GetAttestationKeyInfo(request, base::Bind(callback));
214566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ(1, callback_count);
215566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn}
216566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
2172e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(DBusProxyTest, ActivateAttestationKey) {
2182e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto fake_dbus_call = [](
2192e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      dbus::MethodCall* method_call,
2202e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
2212e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Verify request protobuf.
2222e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageReader reader(method_call);
2232e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyRequest request_proto;
2242e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
2252e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
2262e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted1",
2272e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().asym_ca_contents());
2282e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted2",
2292e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().sym_ca_attestation());
2302e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(request_proto.save_certificate());
2312e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Create reply protobuf.
2322e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
2332e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageWriter writer(response.get());
2342e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyReply reply_proto;
2352e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
2362e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_certificate("certificate");
2372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
2382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    response_callback.Run(response.release());
2392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
2412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
2422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
2432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // Set expectations on the outputs.
2442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  int callback_count = 0;
2452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto callback = [&callback_count](const ActivateAttestationKeyReply& reply) {
2462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    callback_count++;
2472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
2482e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
2492e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  ActivateAttestationKeyRequest request;
2512e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
2522e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_asym_ca_contents("encrypted1");
2532e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_sym_ca_attestation("encrypted2");
2542e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_save_certificate(true);
2552e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  proxy_.ActivateAttestationKey(request, base::Bind(callback));
2562e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ(1, callback_count);
2572e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
2582e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
25962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren KrahnTEST_F(DBusProxyTest, CreateCertifiableKey) {
26062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto fake_dbus_call = [](
26162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      dbus::MethodCall* method_call,
26262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
26362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Verify request protobuf.
26462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageReader reader(method_call);
26562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyRequest request_proto;
26662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
26762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
26862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
26962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
27062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("user", request_proto.username());
27162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Create reply protobuf.
27262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    auto response = dbus::Response::CreateEmpty();
27362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageWriter writer(response.get());
27462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyReply reply_proto;
27562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
27662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_public_key("public_key");
27762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info("certify_info");
27862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info_signature("signature");
27962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
28062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    response_callback.Run(response.release());
28162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
28262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
28362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
28462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
28562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // Set expectations on the outputs.
28662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  int callback_count = 0;
28762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto callback = [&callback_count](const CreateCertifiableKeyReply& reply) {
28862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    callback_count++;
28962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
29062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("public_key", reply.public_key());
29162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
29262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
29362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
29462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  CreateCertifiableKeyRequest request;
29562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_label("label");
29662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
29762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
29862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_username("user");
29962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  proxy_.CreateCertifiableKey(request, base::Bind(callback));
30062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ(1, callback_count);
30162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn}
30262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
303bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(DBusProxyTest, Decrypt) {
304bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto fake_dbus_call = [](
305bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      dbus::MethodCall* method_call,
306bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
307bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    // Verify request protobuf.
308bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    dbus::MessageReader reader(method_call);
309bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    DecryptRequest request_proto;
310bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
311bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
312bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("user", request_proto.username());
313bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("data", request_proto.encrypted_data());
314bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    // Create reply protobuf.
315bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
316bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    dbus::MessageWriter writer(response.get());
317bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    DecryptReply reply_proto;
318bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
319bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    reply_proto.set_decrypted_data("data");
320bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
321bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    response_callback.Run(response.release());
322bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  };
323bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
324bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
325bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
326bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  // Set expectations on the outputs.
327bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  int callback_count = 0;
328bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto callback = [&callback_count](const DecryptReply& reply) {
329bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    callback_count++;
330bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
331bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("data", reply.decrypted_data());
332bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  };
333bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  DecryptRequest request;
334bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_key_label("label");
335bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_username("user");
336bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_encrypted_data("data");
337bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  proxy_.Decrypt(request, base::Bind(callback));
338bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_EQ(1, callback_count);
339bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
340bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
341ccf90703bb6989e659b12a6494e84fdb921008edDarren KrahnTEST_F(DBusProxyTest, Sign) {
342ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  auto fake_dbus_call = [](
343ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      dbus::MethodCall* method_call,
344ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
345ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    // Verify request protobuf.
346ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    dbus::MessageReader reader(method_call);
347ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    SignRequest request_proto;
348ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
349ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
350ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("user", request_proto.username());
351ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("data", request_proto.data_to_sign());
352ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    // Create reply protobuf.
353ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    auto response = dbus::Response::CreateEmpty();
354ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    dbus::MessageWriter writer(response.get());
355ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    SignReply reply_proto;
356ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
357ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    reply_proto.set_signature("signature");
358ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
359ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    response_callback.Run(response.release());
360ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  };
361ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
362ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
363ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
364ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // Set expectations on the outputs.
365ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  int callback_count = 0;
366ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  auto callback = [&callback_count](const SignReply& reply) {
367ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    callback_count++;
368ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
369ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("signature", reply.signature());
370ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  };
371ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  SignRequest request;
372ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_key_label("label");
373ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_username("user");
374ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_data_to_sign("data");
375ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  proxy_.Sign(request, base::Bind(callback));
376ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_EQ(1, callback_count);
377ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn}
378ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
379594849c7cf872d055575277b930f4f596bef1988Darren KrahnTEST_F(DBusProxyTest, RegisterKeyWithChapsToken) {
380594849c7cf872d055575277b930f4f596bef1988Darren Krahn  auto fake_dbus_call = [](
381594849c7cf872d055575277b930f4f596bef1988Darren Krahn      dbus::MethodCall* method_call,
382594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
383594849c7cf872d055575277b930f4f596bef1988Darren Krahn    // Verify request protobuf.
384594849c7cf872d055575277b930f4f596bef1988Darren Krahn    dbus::MessageReader reader(method_call);
385594849c7cf872d055575277b930f4f596bef1988Darren Krahn    RegisterKeyWithChapsTokenRequest request_proto;
386594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
387594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
388594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_EQ("user", request_proto.username());
389594849c7cf872d055575277b930f4f596bef1988Darren Krahn    // Create reply protobuf.
390594849c7cf872d055575277b930f4f596bef1988Darren Krahn    auto response = dbus::Response::CreateEmpty();
391594849c7cf872d055575277b930f4f596bef1988Darren Krahn    dbus::MessageWriter writer(response.get());
392594849c7cf872d055575277b930f4f596bef1988Darren Krahn    RegisterKeyWithChapsTokenReply reply_proto;
393594849c7cf872d055575277b930f4f596bef1988Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
394594849c7cf872d055575277b930f4f596bef1988Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
395594849c7cf872d055575277b930f4f596bef1988Darren Krahn    response_callback.Run(response.release());
396594849c7cf872d055575277b930f4f596bef1988Darren Krahn  };
397594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
398594849c7cf872d055575277b930f4f596bef1988Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
399594849c7cf872d055575277b930f4f596bef1988Darren Krahn
400594849c7cf872d055575277b930f4f596bef1988Darren Krahn  // Set expectations on the outputs.
401594849c7cf872d055575277b930f4f596bef1988Darren Krahn  int callback_count = 0;
402594849c7cf872d055575277b930f4f596bef1988Darren Krahn  auto callback = [&callback_count](
403594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const RegisterKeyWithChapsTokenReply& reply) {
404594849c7cf872d055575277b930f4f596bef1988Darren Krahn    callback_count++;
405594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
406594849c7cf872d055575277b930f4f596bef1988Darren Krahn  };
407594849c7cf872d055575277b930f4f596bef1988Darren Krahn  RegisterKeyWithChapsTokenRequest request;
408594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_key_label("label");
409594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_username("user");
410594849c7cf872d055575277b930f4f596bef1988Darren Krahn  proxy_.RegisterKeyWithChapsToken(request, base::Bind(callback));
411594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_EQ(1, callback_count);
412594849c7cf872d055575277b930f4f596bef1988Darren Krahn}
413594849c7cf872d055575277b930f4f596bef1988Darren Krahn
414b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
415