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