Chromium Code Reviews| Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_googledrivefs.cc |
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_googledrivefs.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_googledrivefs.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d540274ebdccedfdba9e9b9b3559e038fa3d6a01 |
| --- /dev/null |
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_googledrivefs.cc |
| @@ -0,0 +1,312 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "fake_ppapi/fake_pepper_interface_googledrivefs.h" |
| + |
| +#include <ppapi/c/pp_completion_callback.h> |
| +#include <ppapi/c/pp_errors.h> |
| + |
| +#include "gtest/gtest.h" |
| + |
| +#include "fake_ppapi/fake_core_interface.h" |
| +#include "fake_ppapi/fake_file_ref_interface.h" |
| +#include "fake_ppapi/fake_pepper_interface_url_loader.h" |
| +#include "fake_ppapi/fake_util.h" |
| +#include "fake_ppapi/fake_var_interface.h" |
| + |
| +class FakeDriveInstanceResource : public FakeResource { |
| + public: |
| + FakeDriveInstanceResource() : server_template(NULL) {} |
| + static const char* classname() { return "FakeDriveInstanceResource"; } |
| + |
| + FakeGoogleDriveServer* server_template; |
| +}; |
| + |
| +class FakeDriveURLLoaderResource : public FakeResource { |
| + public: |
| + FakeDriveURLLoaderResource() : manager(NULL), server(NULL), response(0) {} |
| + |
| + virtual void Destroy() { |
| + EXPECT_TRUE(manager != NULL); |
| + if (response != 0) { |
| + manager->Release(response); |
| + } |
| + } |
| + |
| + static const char* classname() { return "FakeDriveURLLoaderResource"; } |
| + |
| + FakeResourceManager* manager; |
| + FakeGoogleDriveServer* server; |
| + PP_Resource response; |
| + std::string response_body; |
|
binji
2016/12/02 22:30:38
Why not store the response_body in the response?
chanpatorikku
2016/12/05 15:05:44
If response_body is stored in the response, Finish
binji
2016/12/08 20:35:13
It doesn't seem as though response_body is actuall
chanpatorikku
2016/12/09 14:37:36
response_body isn't actually used in the current p
|
| +}; |
| + |
| +class FakeDriveResponseResource : public FakeURLResponseInfoResource { |
| + public: |
| + FakeDriveResponseResource() : loader(0), request(0), file_ref(0) {} |
| + static const char* classname() { return "FakeDriveResponseResource"; } |
| + |
| + std::string body; |
| + PP_Resource loader; |
|
binji
2016/12/02 22:30:38
Why doesn't the response own references to these r
chanpatorikku
2016/12/05 15:05:44
Not a reason why.
In the current patch set, the r
|
| + PP_Resource request; |
| + PP_Resource file_ref; |
| +}; |
| + |
| +FakeGoogleDriveServer::FakeGoogleDriveServer() {} |
| + |
| +void FakeGoogleDriveServer::Respond( |
| + const std::string& url, |
| + const std::string& headers, |
| + const std::string& method, |
| + const std::string& body, |
| + FakeGoogleDriveServerResponse* out_response) { |
| + out_response->status_code = STATUSCODE_NOT_IMPLEMENTED; |
| +} |
| + |
| +FakeDriveURLLoaderInterface::FakeDriveURLLoaderInterface( |
| + FakeCoreInterface* core_interface) |
| + : FakeURLLoaderInterface(core_interface) {} |
| + |
| +PP_Resource FakeDriveURLLoaderInterface::Create(PP_Instance instance) { |
| + FakeDriveInstanceResource* drive_instance_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveInstanceResource>( |
| + instance); |
| + if (drive_instance_resource == NULL) |
| + return 0; |
| + |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + new FakeDriveURLLoaderResource; |
| + drive_loader_resource->manager = core_interface_->resource_manager(); |
| + drive_loader_resource->server = drive_instance_resource->server_template; |
| + |
| + return CREATE_RESOURCE(core_interface_->resource_manager(), |
| + FakeDriveURLLoaderResource, drive_loader_resource); |
| +} |
| + |
| +int32_t FakeDriveURLLoaderInterface::Open(PP_Resource loader, |
| + PP_Resource request, |
|
chanpatorikku
2016/12/02 13:23:33
The .cc function signature names the 2ndparameter
binji
2016/12/02 22:30:38
Feel free to fix, but it's common that the declara
chanpatorikku
2016/12/05 15:05:44
Not gonna fix because it's common and the code loo
|
| + PP_CompletionCallback callback) { |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveURLLoaderResource>( |
| + loader); |
| + if (drive_loader_resource == NULL) |
| + return PP_ERROR_BADRESOURCE; |
| + |
| + // Close() has been called. Invalid to call Open() again. |
| + if (drive_loader_resource->server == NULL) |
| + return PP_ERROR_FAILED; |
| + |
| + FakeURLRequestInfoResource* request_resource = |
| + core_interface_->resource_manager()->Get<FakeURLRequestInfoResource>( |
| + request); |
| + if (request_resource == NULL) |
| + return PP_ERROR_BADRESOURCE; |
| + |
| + // Create a response resource. |
| + FakeDriveResponseResource* drive_response_resource = |
| + new FakeDriveResponseResource; |
| + drive_loader_resource->response = |
| + CREATE_RESOURCE(core_interface_->resource_manager(), |
| + FakeDriveResponseResource, drive_response_resource); |
| + |
| + drive_response_resource->loader = loader; |
| + drive_response_resource->request = request; |
| + |
| + FakeGoogleDriveServerResponse server_response; |
| + drive_loader_resource->server->Respond( |
| + request_resource->url, request_resource->headers, |
| + request_resource->method, request_resource->body, &server_response); |
| + |
| + drive_response_resource->status_code = server_response.status_code; |
| + drive_loader_resource->response_body = server_response.body; |
| + |
| + // Call the callback. |
| + return RunCompletionCallback(&callback, PP_OK); |
| +} |
| + |
| +PP_Resource FakeDriveURLLoaderInterface::GetResponseInfo(PP_Resource loader) { |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveURLLoaderResource>( |
| + loader); |
| + if (drive_loader_resource == NULL) |
| + return 0; |
| + |
| + if (drive_loader_resource->response == 0) { |
|
binji
2016/12/02 22:30:38
nit: please be consistent with braces around singl
chanpatorikku
2016/12/05 15:05:44
Done. About being consistent with braces around s
|
| + return 0; |
| + } |
| + |
| + // Returned resources have an implicit AddRef. |
| + core_interface_->resource_manager()->AddRef(drive_loader_resource->response); |
| + return drive_loader_resource->response; |
| +} |
| + |
| +int32_t FakeDriveURLLoaderInterface::FinishStreamingToFile( |
| + PP_Resource loader, |
| + PP_CompletionCallback callback) { |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveURLLoaderResource>( |
| + loader); |
| + if (drive_loader_resource == NULL) |
| + return PP_ERROR_BADRESOURCE; |
| + |
| + FakeDriveResponseResource* drive_response_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveResponseResource>( |
| + drive_loader_resource->response); |
| + if (drive_response_resource == NULL) |
| + return PP_ERROR_BADRESOURCE; |
| + |
| + FakeURLRequestInfoResource* request_resource = |
| + core_interface_->resource_manager()->Get<FakeURLRequestInfoResource>( |
| + drive_response_resource->request); |
| + if (request_resource == NULL) |
| + return PP_ERROR_BADRESOURCE; |
| + |
| + if (!request_resource->stream_to_file) { |
| + return PP_ERROR_FAILED; |
| + } |
| + |
| + drive_response_resource->body = drive_loader_resource->response_body; |
| + |
| + // PPB_URLLoader::FinishStreamingToFile(..) returns 0 even when |
| + // the response body size is > 0. |
| + return 0; |
| +} |
| + |
| +void FakeDriveURLLoaderInterface::Close(PP_Resource loader) { |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveURLLoaderResource>( |
| + loader); |
| + if (drive_loader_resource == NULL) |
| + return; |
| + |
| + core_interface_->resource_manager()->Release(drive_loader_resource->response); |
| + |
| + drive_loader_resource->server = NULL; |
| + drive_loader_resource->response = 0; |
| + drive_loader_resource->response_body.clear(); |
| +} |
| + |
| +FakeDriveURLResponseInfoInterface::FakeDriveURLResponseInfoInterface( |
| + FakeCoreInterface* core_interface, |
| + FakeVarInterface* var_interface, |
| + FakeFileRefInterface* file_ref_interface) |
| + : FakeURLResponseInfoInterface(core_interface, var_interface), |
| + file_ref_interface_(file_ref_interface) { |
| + FakeFileSystemResource* file_system_resource = new FakeFileSystemResource; |
| + file_system_resource->filesystem = new FakeFilesystem(); |
| + file_system_resource->opened = true; |
| + |
| + filesystem_resource_ = |
| + CREATE_RESOURCE(core_interface_->resource_manager(), |
| + FakeFileSystemResource, file_system_resource); |
| +} |
| + |
| +FakeDriveURLResponseInfoInterface::~FakeDriveURLResponseInfoInterface() { |
| + core_interface_->ReleaseResource(filesystem_resource_); |
| +} |
| + |
| +PP_Resource FakeDriveURLResponseInfoInterface::GetBodyAsFileRef( |
| + PP_Resource response) { |
| + FakeDriveResponseResource* drive_response_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveResponseResource>( |
| + response); |
| + if (drive_response_resource == NULL) |
| + return 0; |
| + |
| + FakeURLRequestInfoResource* request_resource = |
| + core_interface_->resource_manager()->Get<FakeURLRequestInfoResource>( |
| + drive_response_resource->request); |
| + if (request_resource == NULL) |
| + return 0; |
| + |
| + if (!request_resource->stream_to_file) { |
| + return 0; |
| + } |
| + |
| + FakeDriveURLLoaderResource* drive_loader_resource = |
| + core_interface_->resource_manager()->Get<FakeDriveURLLoaderResource>( |
| + drive_response_resource->loader); |
| + if (drive_loader_resource == NULL) |
| + return 0; |
| + |
| + if (drive_loader_resource->server == NULL) { |
| + return 0; |
| + } |
| + |
| + if (drive_response_resource->file_ref == 0) { |
| + FakeFileSystemResource* file_system_resource = |
| + core_interface_->resource_manager()->Get<FakeFileSystemResource>( |
| + filesystem_resource_); |
| + if (file_system_resource == NULL) |
| + return 0; |
| + |
| + char path_buffer[1024]; |
|
binji
2016/12/02 22:30:38
nit: 1024 is way overkill here. Even if %u is 64-b
chanpatorikku
2016/12/05 15:05:44
Changed to path_buffer[32]. I was thinking the st
binji
2016/12/08 20:35:12
Yes, but the stack is not limitless, so it is best
chanpatorikku
2016/12/09 14:37:36
The stack is about a few megabytes. It is small c
|
| + snprintf(path_buffer, sizeof(path_buffer), "%u", response); |
| + |
| + FakeNode* fake_node; |
| + if (!file_system_resource->filesystem->AddFile( |
| + path_buffer, drive_response_resource->body, &fake_node)) { |
| + return 0; |
| + } |
| + |
| + drive_response_resource->file_ref = |
| + file_ref_interface_->Create(filesystem_resource_, path_buffer); |
| + } |
| + |
| + return drive_response_resource->file_ref; |
| +} |
| + |
| +FakePepperInterfaceGoogleDriveFs::FakePepperInterfaceGoogleDriveFs() |
| + : core_interface_(&resource_manager_), |
| + var_interface_(&var_manager_), |
| + file_ref_interface_(&core_interface_, &var_interface_), |
| + drive_url_loader_interface_(&core_interface_), |
| + url_request_info_interface_(&core_interface_, &var_interface_), |
| + drive_url_response_info_interface_(&core_interface_, |
| + &var_interface_, |
| + &file_ref_interface_) { |
| + Init(); |
| +} |
| + |
| +void FakePepperInterfaceGoogleDriveFs::Init() { |
| + FakeDriveInstanceResource* drive_instance_resource = |
| + new FakeDriveInstanceResource; |
| + drive_instance_resource->server_template = &google_drive_server_template_; |
| + |
| + instance_ = |
| + CREATE_RESOURCE(core_interface_.resource_manager(), |
| + FakeDriveInstanceResource, drive_instance_resource); |
| +} |
| + |
| +FakePepperInterfaceGoogleDriveFs::~FakePepperInterfaceGoogleDriveFs() { |
| + core_interface_.ReleaseResource(instance_); |
| +} |
| + |
| +nacl_io::CoreInterface* FakePepperInterfaceGoogleDriveFs::GetCoreInterface() { |
| + return &core_interface_; |
| +} |
| + |
| +nacl_io::FileRefInterface* |
| +FakePepperInterfaceGoogleDriveFs::GetFileRefInterface() { |
| + return &file_ref_interface_; |
| +} |
| + |
| +nacl_io::URLLoaderInterface* |
| +FakePepperInterfaceGoogleDriveFs::GetURLLoaderInterface() { |
| + return &drive_url_loader_interface_; |
| +} |
| + |
| +nacl_io::URLRequestInfoInterface* |
| +FakePepperInterfaceGoogleDriveFs::GetURLRequestInfoInterface() { |
| + return &url_request_info_interface_; |
| +} |
| + |
| +nacl_io::URLResponseInfoInterface* |
| +FakePepperInterfaceGoogleDriveFs::GetURLResponseInfoInterface() { |
| + return &drive_url_response_info_interface_; |
| +} |
| + |
| +nacl_io::VarInterface* FakePepperInterfaceGoogleDriveFs::GetVarInterface() { |
| + return &var_interface_; |
| +} |