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_; |
+} |