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