| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ipc/ipc_message.h" | 5 #include "ipc/ipc_message.h" |
| 6 #include "ppapi/proxy/nacl_message_scanner.h" | 6 #include "ppapi/proxy/nacl_message_scanner.h" |
| 7 #include "ppapi/proxy/ppapi_messages.h" | 7 #include "ppapi/proxy/ppapi_messages.h" |
| 8 #include "ppapi/proxy/ppapi_proxy_test.h" | 8 #include "ppapi/proxy/ppapi_proxy_test.h" |
| 9 #include "ppapi/proxy/serialized_handle.h" | 9 #include "ppapi/proxy/serialized_handle.h" |
| 10 #include "ppapi/shared_impl/host_resource.h" | 10 #include "ppapi/shared_impl/host_resource.h" |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 EXPECT_TRUE(fio); | 117 EXPECT_TRUE(fio); |
| 118 EXPECT_EQ(0, fio->max_written_offset()); | 118 EXPECT_EQ(0, fio->max_written_offset()); |
| 119 | 119 |
| 120 const int64_t kNewFileSize = 10; | 120 const int64_t kNewFileSize = 10; |
| 121 fio->SetMaxWrittenOffset(kNewFileSize); | 121 fio->SetMaxWrittenOffset(kNewFileSize); |
| 122 | 122 |
| 123 // We should not be able to under-report max_written_offset when closing. | 123 // We should not be able to under-report max_written_offset when closing. |
| 124 test.ScanUntrustedMessage( | 124 test.ScanUntrustedMessage( |
| 125 PpapiHostMsg_ResourceCall( | 125 PpapiHostMsg_ResourceCall( |
| 126 fio_call_params, | 126 fio_call_params, |
| 127 PpapiHostMsg_FileIO_Close(0)), | 127 PpapiHostMsg_FileIO_Close(FileGrowth(0, 0))), |
| 128 &new_msg_ptr); | 128 &new_msg_ptr); |
| 129 EXPECT_TRUE(new_msg_ptr); | 129 EXPECT_TRUE(new_msg_ptr); |
| 130 ResourceMessageCallParams call_params; | 130 ResourceMessageCallParams call_params; |
| 131 IPC::Message nested_msg; | 131 IPC::Message nested_msg; |
| 132 int64_t max_written_offset = 0; | 132 FileGrowth file_growth; |
| 133 EXPECT_TRUE(UnpackMessage<PpapiHostMsg_ResourceCall>( | 133 EXPECT_TRUE(UnpackMessage<PpapiHostMsg_ResourceCall>( |
| 134 *new_msg_ptr, &call_params, &nested_msg) && | 134 *new_msg_ptr, &call_params, &nested_msg) && |
| 135 UnpackMessage<PpapiHostMsg_FileIO_Close>( | 135 UnpackMessage<PpapiHostMsg_FileIO_Close>( |
| 136 nested_msg, &max_written_offset)); | 136 nested_msg, &file_growth)); |
| 137 new_msg_ptr.reset(); | 137 new_msg_ptr.reset(); |
| 138 EXPECT_EQ(kNewFileSize, max_written_offset); | 138 EXPECT_EQ(kNewFileSize, file_growth.max_written_offset); |
| 139 EXPECT_FALSE(FindFileIO(test, kFileIO)); | 139 EXPECT_FALSE(FindFileIO(test, kFileIO)); |
| 140 | 140 |
| 141 // Reopen the file. | 141 // Reopen the file. |
| 142 OpenQuotaFile(&test, kFileIO, kFileSystem); | 142 OpenQuotaFile(&test, kFileIO, kFileSystem); |
| 143 fio = FindFileIO(test, kFileIO); | 143 fio = FindFileIO(test, kFileIO); |
| 144 fio->SetMaxWrittenOffset(kNewFileSize); | 144 fio->SetMaxWrittenOffset(kNewFileSize); |
| 145 | 145 |
| 146 // Close with correct max_written_offset. | 146 // Close with correct max_written_offset. |
| 147 test.ScanUntrustedMessage( | 147 test.ScanUntrustedMessage( |
| 148 PpapiHostMsg_ResourceCall( | 148 PpapiHostMsg_ResourceCall( |
| 149 fio_call_params, | 149 fio_call_params, |
| 150 PpapiHostMsg_FileIO_Close(kNewFileSize)), | 150 PpapiHostMsg_FileIO_Close(FileGrowth(kNewFileSize, 0))), |
| 151 &new_msg_ptr); | 151 &new_msg_ptr); |
| 152 EXPECT_FALSE(new_msg_ptr); | 152 EXPECT_FALSE(new_msg_ptr); |
| 153 EXPECT_FALSE(FindFileIO(test, kFileIO)); | 153 EXPECT_FALSE(FindFileIO(test, kFileIO)); |
| 154 | 154 |
| 155 // Destroy file system. | 155 // Destroy file system. |
| 156 test.ScanUntrustedMessage( | 156 test.ScanUntrustedMessage( |
| 157 PpapiHostMsg_ResourceCall( | 157 PpapiHostMsg_ResourceCall( |
| 158 fs_call_params, | 158 fs_call_params, |
| 159 PpapiHostMsg_ResourceDestroyed(kFileSystem)), | 159 PpapiHostMsg_ResourceDestroyed(kFileSystem)), |
| 160 &new_msg_ptr); | 160 &new_msg_ptr); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 178 EXPECT_TRUE(fio); | 178 EXPECT_TRUE(fio); |
| 179 EXPECT_EQ(0, fio->max_written_offset()); | 179 EXPECT_EQ(0, fio->max_written_offset()); |
| 180 | 180 |
| 181 // Without reserving quota, we should not be able to grow the file. | 181 // Without reserving quota, we should not be able to grow the file. |
| 182 EXPECT_FALSE(fio->Grow(1)); | 182 EXPECT_FALSE(fio->Grow(1)); |
| 183 EXPECT_EQ(0, fs->reserved_quota()); | 183 EXPECT_EQ(0, fs->reserved_quota()); |
| 184 EXPECT_EQ(0, fio->max_written_offset()); | 184 EXPECT_EQ(0, fio->max_written_offset()); |
| 185 | 185 |
| 186 // Receive reserved quota, and updated file sizes. | 186 // Receive reserved quota, and updated file sizes. |
| 187 const int64_t kNewFileSize = 10; | 187 const int64_t kNewFileSize = 10; |
| 188 FileOffsetMap offset_map; | 188 FileSizeMap file_sizes; |
| 189 offset_map.insert(std::make_pair(kFileIO, kNewFileSize)); | 189 file_sizes[kFileIO] = kNewFileSize; |
| 190 test.ScanMessage( | 190 test.ScanMessage( |
| 191 PpapiPluginMsg_ResourceReply( | 191 PpapiPluginMsg_ResourceReply( |
| 192 fs_reply_params, | 192 fs_reply_params, |
| 193 PpapiPluginMsg_FileSystem_ReserveQuotaReply( | 193 PpapiPluginMsg_FileSystem_ReserveQuotaReply( |
| 194 kQuotaReservationAmount, | 194 kQuotaReservationAmount, |
| 195 offset_map)), | 195 file_sizes)), |
| 196 &unused_handles, | 196 &unused_handles, |
| 197 &new_msg_ptr); | 197 &new_msg_ptr); |
| 198 EXPECT_FALSE(new_msg_ptr); | 198 EXPECT_FALSE(new_msg_ptr); |
| 199 EXPECT_EQ(kQuotaReservationAmount, fs->reserved_quota()); | 199 EXPECT_EQ(kQuotaReservationAmount, fs->reserved_quota()); |
| 200 EXPECT_EQ(kNewFileSize, fio->max_written_offset()); | 200 EXPECT_EQ(kNewFileSize, fio->max_written_offset()); |
| 201 | 201 |
| 202 // We should be able to grow the file within quota. | 202 // We should be able to grow the file within quota. |
| 203 EXPECT_TRUE(fio->Grow(1)); | 203 EXPECT_TRUE(fio->Grow(1)); |
| 204 EXPECT_EQ(kQuotaReservationAmount - 1, fs->reserved_quota()); | 204 EXPECT_EQ(kQuotaReservationAmount - 1, fs->reserved_quota()); |
| 205 EXPECT_EQ(kNewFileSize + 1, fio->max_written_offset()); | 205 EXPECT_EQ(kNewFileSize + 1, fio->max_written_offset()); |
| 206 | 206 |
| 207 // We should not be able to grow the file over quota. | 207 // We should not be able to grow the file over quota. |
| 208 EXPECT_FALSE(fio->Grow(kQuotaReservationAmount)); | 208 EXPECT_FALSE(fio->Grow(kQuotaReservationAmount)); |
| 209 EXPECT_EQ(kQuotaReservationAmount - 1, fs->reserved_quota()); | 209 EXPECT_EQ(kQuotaReservationAmount - 1, fs->reserved_quota()); |
| 210 EXPECT_EQ(kNewFileSize + 1, fio->max_written_offset()); | 210 EXPECT_EQ(kNewFileSize + 1, fio->max_written_offset()); |
| 211 | 211 |
| 212 // Plugin should not under-report max written offsets when reserving quota. | 212 // Plugin should not under-report max written offsets when reserving quota. |
| 213 offset_map[kFileIO] = 0; // should be kNewFileSize + 1. | 213 file_sizes[kFileIO] = 0; // should be kNewFileSize + 1. |
| 214 test.ScanUntrustedMessage( | 214 test.ScanUntrustedMessage( |
| 215 PpapiHostMsg_ResourceCall( | 215 PpapiHostMsg_ResourceCall( |
| 216 fio_call_params, | 216 fio_call_params, |
| 217 PpapiHostMsg_FileSystem_ReserveQuota( | 217 PpapiHostMsg_FileSystem_ReserveQuota( |
| 218 kQuotaReservationAmount, | 218 kQuotaReservationAmount, |
| 219 offset_map)), | 219 FileSizeMapToFileGrowthMapForTesting(file_sizes))), |
| 220 &new_msg_ptr); | 220 &new_msg_ptr); |
| 221 EXPECT_TRUE(new_msg_ptr); | 221 EXPECT_TRUE(new_msg_ptr); |
| 222 ResourceMessageCallParams call_params; | 222 ResourceMessageCallParams call_params; |
| 223 IPC::Message nested_msg; | 223 IPC::Message nested_msg; |
| 224 int64_t amount = 0; | 224 int64_t amount = 0; |
| 225 FileOffsetMap new_offset_map; | 225 FileGrowthMap new_file_growths; |
| 226 EXPECT_TRUE(UnpackMessage<PpapiHostMsg_ResourceCall>( | 226 EXPECT_TRUE(UnpackMessage<PpapiHostMsg_ResourceCall>( |
| 227 *new_msg_ptr, &call_params, &nested_msg) && | 227 *new_msg_ptr, &call_params, &nested_msg) && |
| 228 UnpackMessage<PpapiHostMsg_FileSystem_ReserveQuota>( | 228 UnpackMessage<PpapiHostMsg_FileSystem_ReserveQuota>( |
| 229 nested_msg, &amount, &new_offset_map)); | 229 nested_msg, &amount, &new_file_growths)); |
| 230 new_msg_ptr.reset(); | 230 new_msg_ptr.reset(); |
| 231 EXPECT_EQ(kQuotaReservationAmount, amount); | 231 EXPECT_EQ(kQuotaReservationAmount, amount); |
| 232 EXPECT_EQ(kNewFileSize + 1, new_offset_map[kFileIO]); | 232 EXPECT_EQ(kNewFileSize + 1, new_file_growths[kFileIO].max_written_offset); |
| 233 } | 233 } |
| 234 | 234 |
| 235 TEST_F(NaClMessageScannerTest, SetLength) { | 235 TEST_F(NaClMessageScannerTest, SetLength) { |
| 236 NaClMessageScanner test; | 236 NaClMessageScanner test; |
| 237 std::vector<SerializedHandle> unused_handles; | 237 std::vector<SerializedHandle> unused_handles; |
| 238 ResourceMessageCallParams fio_call_params(kFileIO, 0); | 238 ResourceMessageCallParams fio_call_params(kFileIO, 0); |
| 239 ResourceMessageCallParams fs_call_params(kFileSystem, 0); | 239 ResourceMessageCallParams fs_call_params(kFileSystem, 0); |
| 240 ResourceMessageReplyParams fio_reply_params(kFileIO, 0); | 240 ResourceMessageReplyParams fio_reply_params(kFileIO, 0); |
| 241 ResourceMessageReplyParams fs_reply_params(kFileSystem, 0); | 241 ResourceMessageReplyParams fs_reply_params(kFileSystem, 0); |
| 242 scoped_ptr<IPC::Message> new_msg_ptr; | 242 scoped_ptr<IPC::Message> new_msg_ptr; |
| 243 | 243 |
| 244 OpenQuotaFile(&test, kFileIO, kFileSystem); | 244 OpenQuotaFile(&test, kFileIO, kFileSystem); |
| 245 NaClMessageScanner::FileSystem* fs = FindFileSystem(test, kFileSystem); | 245 NaClMessageScanner::FileSystem* fs = FindFileSystem(test, kFileSystem); |
| 246 NaClMessageScanner::FileIO* fio = FindFileIO(test, kFileIO); | 246 NaClMessageScanner::FileIO* fio = FindFileIO(test, kFileIO); |
| 247 | 247 |
| 248 // Receive reserved quota, and updated file sizes. | 248 // Receive reserved quota, and updated file sizes. |
| 249 const int64_t kNewFileSize = 10; | 249 const int64_t kNewFileSize = 10; |
| 250 FileOffsetMap offset_map; | 250 FileSizeMap file_sizes; |
| 251 offset_map.insert(std::make_pair(kFileIO, 0)); | 251 file_sizes[kFileIO] = 0; |
| 252 test.ScanMessage( | 252 test.ScanMessage( |
| 253 PpapiPluginMsg_ResourceReply( | 253 PpapiPluginMsg_ResourceReply( |
| 254 fs_reply_params, | 254 fs_reply_params, |
| 255 PpapiPluginMsg_FileSystem_ReserveQuotaReply( | 255 PpapiPluginMsg_FileSystem_ReserveQuotaReply( |
| 256 kQuotaReservationAmount, | 256 kQuotaReservationAmount, |
| 257 offset_map)), | 257 file_sizes)), |
| 258 &unused_handles, | 258 &unused_handles, |
| 259 &new_msg_ptr); | 259 &new_msg_ptr); |
| 260 | 260 |
| 261 // We should be able to SetLength within quota. | 261 // We should be able to SetLength within quota. |
| 262 test.ScanUntrustedMessage( | 262 test.ScanUntrustedMessage( |
| 263 PpapiHostMsg_ResourceCall( | 263 PpapiHostMsg_ResourceCall( |
| 264 fio_call_params, | 264 fio_call_params, |
| 265 PpapiHostMsg_FileIO_SetLength(kNewFileSize)), | 265 PpapiHostMsg_FileIO_SetLength(kNewFileSize)), |
| 266 &new_msg_ptr); | 266 &new_msg_ptr); |
| 267 EXPECT_FALSE(new_msg_ptr); | 267 EXPECT_FALSE(new_msg_ptr); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 284 UnpackMessage<PpapiHostMsg_FileIO_SetLength>( | 284 UnpackMessage<PpapiHostMsg_FileIO_SetLength>( |
| 285 nested_msg, &length)); | 285 nested_msg, &length)); |
| 286 new_msg_ptr.reset(); | 286 new_msg_ptr.reset(); |
| 287 EXPECT_EQ(-1, length); | 287 EXPECT_EQ(-1, length); |
| 288 EXPECT_EQ(kQuotaReservationAmount - kNewFileSize, fs->reserved_quota()); | 288 EXPECT_EQ(kQuotaReservationAmount - kNewFileSize, fs->reserved_quota()); |
| 289 EXPECT_EQ(kNewFileSize, fio->max_written_offset()); | 289 EXPECT_EQ(kNewFileSize, fio->max_written_offset()); |
| 290 } | 290 } |
| 291 | 291 |
| 292 } // namespace proxy | 292 } // namespace proxy |
| 293 } // namespace ppapi | 293 } // namespace ppapi |
| OLD | NEW |