| Index: ppapi/native_client/tests/ppapi_browser/ppb_url_loader/ppapi_ppb_url_loader.cc
|
| ===================================================================
|
| --- ppapi/native_client/tests/ppapi_browser/ppb_url_loader/ppapi_ppb_url_loader.cc (revision 0)
|
| +++ ppapi/native_client/tests/ppapi_browser/ppb_url_loader/ppapi_ppb_url_loader.cc (revision 0)
|
| @@ -0,0 +1,822 @@
|
| +// Copyright (c) 2011 The Native Client 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 <string.h>
|
| +
|
| +#include "native_client/src/include/nacl_scoped_ptr.h"
|
| +
|
| +#include "native_client/src/shared/platform/nacl_check.h"
|
| +
|
| +#include "ppapi/c/pp_bool.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/c/pp_stdint.h"
|
| +#include "ppapi/c/pp_var.h"
|
| +#include "ppapi/c/ppb_core.h"
|
| +#include "ppapi/c/ppb_file_io.h"
|
| +#include "ppapi/c/ppb_url_loader.h"
|
| +#include "ppapi/c/ppb_url_request_info.h"
|
| +#include "ppapi/c/ppb_url_response_info.h"
|
| +#include "ppapi/c/ppb_var.h"
|
| +
|
| +#include "native_client/tests/ppapi_test_lib/get_browser_interface.h"
|
| +#include "native_client/tests/ppapi_test_lib/test_interface.h"
|
| +#include "native_client/tests/ppapi_test_lib/testable_callback.h"
|
| +
|
| +namespace {
|
| +
|
| +// Same content as file kExistingURL in this directory.
|
| +const char* kContentsOfExistingURL = "Lorem ipsum dolor sit.\n";
|
| +const char* kNonExistingURL = "does_not_exist";
|
| +const char* kExistingURL = "ppapi_ppb_url_loader.txt";
|
| +const char* kRedirectURL = "redirect-to-existing.txt";
|
| +const char* kNoHeaders = NULL;
|
| +
|
| +const PP_Bool kStreamToFile = PP_TRUE;
|
| +const PP_Bool kDontStreamToFile = PP_FALSE;
|
| +
|
| +const PP_Bool kDownloadProgress = PP_TRUE;
|
| +const PP_Bool kNoDownloadProgress = PP_FALSE;
|
| +
|
| +const PP_Bool kFollowRedirects = PP_TRUE;
|
| +const PP_Bool kDontFollowRedirects = PP_FALSE;
|
| +
|
| +// Helper functions, these are candidates for being moved to a helper_lib
|
| +void CheckResponse(PP_Resource response,
|
| + int http_status,
|
| + const char* status_line,
|
| + const char* response_url,
|
| + const char* headers) {
|
| + PP_Var var;
|
| + var = PPBURLResponseInfo()->GetProperty(
|
| + response, PP_URLRESPONSEPROPERTY_STATUSCODE);
|
| + EXPECT_VAR_INT(var, http_status);
|
| +
|
| + if (status_line != NULL) {
|
| + var = PPBURLResponseInfo()->GetProperty(
|
| + response, PP_URLRESPONSEPROPERTY_STATUSLINE);
|
| + EXPECT_VAR_STRING(var, status_line);
|
| + PPBVar()->Release(var);
|
| + }
|
| +
|
| + if (response_url != NULL) {
|
| + // TODO(robertm): This needs a regexp pass to get rid of the port number
|
| + // which is non-deterministic.
|
| + var = PPBURLResponseInfo()->GetProperty(
|
| + response, PP_URLRESPONSEPROPERTY_URL);
|
| + EXPECT_VAR_STRING(var, response_url);
|
| + PPBVar()->Release(var);
|
| + }
|
| +
|
| + if (headers != NULL) {
|
| + // TODO(robertm): This needs a regexp pass to get rid of the date, etc
|
| + // which are non-deterministic.
|
| + var = PPBURLResponseInfo()->GetProperty(
|
| + response, PP_URLRESPONSEPROPERTY_HEADERS);
|
| + EXPECT_VAR_STRING(var, headers);
|
| + PPBVar()->Release(var);
|
| + }
|
| +}
|
| +
|
| +
|
| +PP_Resource MakeRequest(const char* url,
|
| + const char* method,
|
| + const char* headers,
|
| + PP_Bool to_file,
|
| + PP_Bool download_progress,
|
| + PP_Bool follow_redirects) {
|
| + PP_Resource request = PPBURLRequestInfo()->Create(pp_instance());
|
| + EXPECT(request != kInvalidResource);
|
| + PP_Var var;
|
| +
|
| + if (url != NULL) {
|
| + var = PP_MakeString(url);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_URL, var));
|
| + PPBVar()->Release(var);
|
| + }
|
| +
|
| + if (method != NULL) {
|
| + var = PP_MakeString(method);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_METHOD, var));
|
| + PPBVar()->Release(var);
|
| + }
|
| +
|
| + if (headers != NULL) {
|
| + var = PP_MakeString(method);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_HEADERS, var));
|
| + PPBVar()->Release(var);
|
| + }
|
| +
|
| + var = PP_MakeBool(to_file);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_STREAMTOFILE, var));
|
| +
|
| + var = PP_MakeBool(download_progress);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, var));
|
| +
|
| + var = PP_MakeBool(follow_redirects);
|
| + EXPECT(PP_TRUE == PPBURLRequestInfo()->SetProperty(
|
| + request, PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, var));
|
| + return request;
|
| +}
|
| +
|
| +PP_Resource MakeDummyRequest() {
|
| + return MakeRequest(kNonExistingURL,
|
| + "GET",
|
| + kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| +}
|
| +
|
| +
|
| +int32_t ReadAndVerify(bool is_file_io,
|
| + PP_Resource resource,
|
| + int offset,
|
| + int buffer_size,
|
| + const nacl::string& expected) {
|
| + nacl::scoped_array<char> buffer(new char[buffer_size]);
|
| + TestableCallback callback(pp_instance(), true);
|
| + nacl::string actual;
|
| + int32_t rv;
|
| + for (;;) {
|
| + callback.Reset();
|
| + if (is_file_io) {
|
| + rv = PPBFileIO()->Read(resource,
|
| + offset + actual.size(),
|
| + buffer.get(),
|
| + buffer_size,
|
| + callback.GetCallback());
|
| + } else {
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + resource, buffer.get(), buffer_size, callback.GetCallback());
|
| + }
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + if (rv == 0) {
|
| + break;
|
| + } else if (rv < 0) {
|
| + return rv;
|
| + } else {
|
| + actual.append(buffer.get(), rv);
|
| + }
|
| + }
|
| +
|
| + // rv was zero
|
| + EXPECT(actual == expected);
|
| + return 0;
|
| +}
|
| +
|
| +
|
| +int32_t ReadAndVerifyResponseBody(PP_Resource loader,
|
| + int buffer_size,
|
| + const nacl::string& expected) {
|
| + return ReadAndVerify(false, loader, 0, buffer_size, expected);
|
| +}
|
| +
|
| +
|
| +int32_t ReadAndVerifyFileContents(PP_Resource file_io,
|
| + int offset,
|
| + int buffer_size,
|
| + const nacl::string& expected) {
|
| + return ReadAndVerify(true, file_io, offset, buffer_size, expected);
|
| +}
|
| +
|
| +
|
| +void TestOpenSuccess() {
|
| + int32_t rv;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource loader;
|
| + PP_Resource response;
|
| + PP_Resource request = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| +
|
| + LOG_TO_BROWSER("open and read entire existing file (all at once)");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| + ReadAndVerifyResponseBody(loader, 1024, kContentsOfExistingURL);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open and read entire existing file (one byte at a time)");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| + ReadAndVerifyResponseBody(loader, 1, kContentsOfExistingURL);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestOpenRedirect() {
|
| + int32_t rv;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource loader;
|
| + PP_Resource response;
|
| + PP_Resource request_no_redirect = MakeRequest(kRedirectURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kDontFollowRedirects);
|
| + PP_Resource request_redirect = MakeRequest(kRedirectURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| +
|
| + LOG_TO_BROWSER("redirect do NOT follow");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(
|
| + loader, request_no_redirect, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 301, "Moved", NULL, NULL);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("redirect follow");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request_redirect, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| + // TODO(robertm): also try smaller sizes, e.g. one and zero
|
| + EXPECT(PP_OK ==
|
| + ReadAndVerifyResponseBody(loader, 1024, kContentsOfExistingURL));
|
| +
|
| + PPBCore()->ReleaseResource(loader);
|
| + PPBCore()->ReleaseResource(request_redirect);
|
| + PPBCore()->ReleaseResource(request_no_redirect);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestOpenFailure() {
|
| + int32_t rv;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource request = MakeDummyRequest();
|
| + PP_Resource loader = PPBURLLoader()->Create(pp_instance());
|
| +
|
| + LOG_TO_BROWSER("open with non existing url");
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + PP_Resource response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 404, "File not found", NULL, NULL);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestStreamToFile() {
|
| + int32_t rv;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource loader;
|
| + PP_Resource file_ref;
|
| + PP_Resource response;
|
| + PP_Resource file_io;
|
| + PP_Resource request = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| +
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| +
|
| + file_ref = PPBURLResponseInfo()->GetBodyAsFileRef(response);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->FinishStreamingToFile(loader, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + callback.Reset();
|
| + file_io = PPBFileIO()->Create(pp_instance());
|
| + rv = PPBFileIO()->Open(
|
| + file_io, file_ref, PP_FILEOPENFLAG_READ, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + // TODO(robertm): add tests with different buffer sizes
|
| + ReadAndVerifyFileContents(file_io, 0, 1024, kContentsOfExistingURL);
|
| +
|
| + PPBCore()->ReleaseResource(file_io);
|
| + PPBCore()->ReleaseResource(file_ref);
|
| + PPBCore()->ReleaseResource(response);
|
| + PPBCore()->ReleaseResource(loader);
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestOpenSimple() {
|
| + int32_t rv;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource request = MakeDummyRequest();
|
| + PP_Resource loader;
|
| +
|
| + LOG_TO_BROWSER("open with loader/request invalid");
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(
|
| + kInvalidResource, kInvalidResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(
|
| + kNotAResource, kNotAResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + LOG_TO_BROWSER("open with loader invalid");
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(kInvalidResource, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(kNotAResource, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(request, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + LOG_TO_BROWSER("open with request invalid");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, kInvalidResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADARGUMENT == rv);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, kNotAResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADARGUMENT == rv);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, loader, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADARGUMENT == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open (synchronous) with blocking callback on main thread");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + // We are on the main thread, performing a sync call should fail
|
| + rv = PPBURLLoader()->Open(loader, request, PP_BlockUntilComplete());
|
| + EXPECT(PP_ERROR_BADARGUMENT == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open (asynchronous) normal");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open with with released loader");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + PPBCore()->ReleaseResource(loader);
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestDoubleOpen() {
|
| + int32_t rv;
|
| + PP_Resource loader;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource request1 = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kDontFollowRedirects);
|
| + PP_Resource request2 = MakeRequest(kNonExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kDontFollowRedirects);
|
| +
|
| + LOG_TO_BROWSER("open two requests on the same loader without Close");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request1, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request2, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_INPROGRESS == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open two requests on the same loader with Close");
|
| + // NOTE: using Close should NOT make a difference either
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request1, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| +
|
| + PPBURLLoader()->Close(loader);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request2, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_INPROGRESS == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request1);
|
| + PPBCore()->ReleaseResource(request2);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestProgressSimple() {
|
| + int32_t rv;
|
| + int64_t received;
|
| + int64_t total;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource loader;
|
| + PP_Resource req_bad = MakeDummyRequest();
|
| + PP_Resource req_good = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kDontFollowRedirects);
|
| + PP_Resource req_good_no_progress = MakeRequest(kExistingURL,
|
| + "GET",
|
| + kNoHeaders,
|
| + kDontStreamToFile,
|
| + kNoDownloadProgress,
|
| + kDontFollowRedirects);
|
| +
|
| + LOG_TO_BROWSER("progress on invalid loader");
|
| + rv = PPBURLLoader()->GetDownloadProgress(kInvalidResource, &received, &total);
|
| + EXPECT(PP_FALSE == rv);
|
| + rv = PPBURLLoader()->GetDownloadProgress(kNotAResource, &received, &total);
|
| + EXPECT(PP_FALSE == rv);
|
| + rv = PPBURLLoader()->GetDownloadProgress(req_bad, &received, &total);
|
| + EXPECT(PP_FALSE == rv);
|
| +
|
| + LOG_TO_BROWSER("progress for failed request");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, req_bad, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + rv = PPBURLLoader()->GetDownloadProgress(loader, &received, &total);
|
| + EXPECT(PP_TRUE == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("progress for request");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, req_good, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + rv = PPBURLLoader()->GetDownloadProgress(loader, &received, &total);
|
| + EXPECT(PP_TRUE == rv);
|
| + const int num_bytes_expected = strlen(kContentsOfExistingURL);
|
| + EXPECT(total == num_bytes_expected);
|
| + ReadAndVerifyResponseBody(loader, 1024, kContentsOfExistingURL);
|
| + rv = PPBURLLoader()->GetDownloadProgress(loader, &received, &total);
|
| + EXPECT(PP_TRUE == rv);
|
| + EXPECT(total == num_bytes_expected);
|
| + EXPECT(received == num_bytes_expected);
|
| +
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("progress for request 'without progress'");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(
|
| + loader, req_good_no_progress, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + rv = PPBURLLoader()->GetDownloadProgress(loader, &received, &total);
|
| + EXPECT(PP_FALSE == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(req_bad);
|
| + PPBCore()->ReleaseResource(req_good);
|
| + PPBCore()->ReleaseResource(req_good_no_progress);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestResponseInfoSimple() {
|
| + PP_Resource response;
|
| + PP_Resource request = MakeDummyRequest();
|
| +
|
| + LOG_TO_BROWSER("response info on invalid loader");
|
| + response = PPBURLLoader()->GetResponseInfo(kInvalidResource);
|
| + EXPECT(kInvalidResource == response);
|
| + response = PPBURLLoader()->GetResponseInfo(kNotAResource);
|
| + EXPECT(kInvalidResource == response);
|
| + response = PPBURLLoader()->GetResponseInfo(request);
|
| + EXPECT(kInvalidResource == response);
|
| +
|
| + LOG_TO_BROWSER("response info without open");
|
| + PP_Resource loader = PPBURLLoader()->Create(pp_instance());
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + EXPECT(kInvalidResource == response);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestCloseSimple() {
|
| + PP_Resource request = MakeDummyRequest();
|
| + LOG_TO_BROWSER("close on invalid loader");
|
| + // we just make sure we do not crash here.
|
| + PPBURLLoader()->Close(kInvalidResource);
|
| + PPBURLLoader()->Close(kNotAResource);
|
| + PPBURLLoader()->Close(request);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestReadSimple() {
|
| + int32_t rv;
|
| + char buffer[1024];
|
| + PP_Resource loader;
|
| + TestableCallback callback(pp_instance(), true);
|
| +
|
| + PP_Resource request = MakeDummyRequest();
|
| +
|
| + LOG_TO_BROWSER("read on invalid loader");
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + kInvalidResource, buffer, sizeof buffer, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + kNotAResource, buffer, sizeof buffer, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + request, buffer, sizeof buffer, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + LOG_TO_BROWSER("read without open");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + loader, buffer, sizeof buffer, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_FAILED == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestStreamToFileSimple() {
|
| + int32_t rv;
|
| + PP_Resource loader;
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource request = MakeDummyRequest();
|
| +
|
| + LOG_TO_BROWSER("stream on invalid loader");
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->FinishStreamingToFile(
|
| + kInvalidResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->FinishStreamingToFile(
|
| + kNotAResource, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->FinishStreamingToFile(
|
| + request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_BADRESOURCE == rv);
|
| +
|
| + LOG_TO_BROWSER("stream without open");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->FinishStreamingToFile(
|
| + loader, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_FAILED == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestAbort() {
|
| + int32_t rv;
|
| + PP_Resource loader;
|
| + PP_Resource request = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kDontFollowRedirects);
|
| + TestableCallback callback(pp_instance(), true);
|
| +
|
| + LOG_TO_BROWSER("release loader while open in flight");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_ABORTED == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + // TODO(sanga,polina): Investigate why this case is hanging
|
| + // The problem is that the callback never gets called.
|
| + // So WaitForResult() never returns.
|
| + // This is also true for regular callback.
|
| +#if 0
|
| + LOG_TO_BROWSER("close loader while open in flight");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + PPBURLLoader()->Close(loader);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_ABORTED == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +#endif
|
| +
|
| + // NOTE: this should be last in this function since it releases the request
|
| + LOG_TO_BROWSER("release request while open in flight");
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + callback.Reset();
|
| + rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + PPBCore()->ReleaseResource(request);
|
| + rv = callback.WaitForResult();
|
| + // loader holds another ref so this is ok
|
| + EXPECT(PP_OK == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +
|
| +void TestOpenReadMismatch() {
|
| + int32_t rv;
|
| + char buffer[1024];
|
| + TestableCallback callback(pp_instance(), true);
|
| + PP_Resource loader;
|
| + PP_Resource response;
|
| + PP_Resource request_regular = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kDontStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| + PP_Resource request_stream = MakeRequest(kExistingURL, "GET", kNoHeaders,
|
| + kStreamToFile,
|
| + kDownloadProgress,
|
| + kFollowRedirects);
|
| +
|
| + LOG_TO_BROWSER("open regularly but try streaming");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request_regular, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| + PP_Resource file_ref = PPBURLResponseInfo()->GetBodyAsFileRef(response);
|
| + EXPECT(kInvalidResource == file_ref);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + LOG_TO_BROWSER("open as stream but read via ReadResponseBody");
|
| + callback.Reset();
|
| + loader = PPBURLLoader()->Create(pp_instance());
|
| + rv = PPBURLLoader()->Open(loader, request_stream, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_OK == rv);
|
| + response = PPBURLLoader()->GetResponseInfo(loader);
|
| + CheckResponse(response, 200, "OK", NULL, NULL);
|
| + rv = PPBURLLoader()->ReadResponseBody(
|
| + loader, buffer, sizeof buffer, callback.GetCallback());
|
| + EXPECT(PP_OK_COMPLETIONPENDING == rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT(PP_ERROR_FAILED == rv);
|
| + PPBCore()->ReleaseResource(loader);
|
| +
|
| + PPBCore()->ReleaseResource(request_stream);
|
| + PPBCore()->ReleaseResource(request_regular);
|
| +
|
| + TEST_PASSED;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +
|
| +void SetupTests() {
|
| + // This test requires PPBTestingDev()
|
| + CHECK(PPBTestingDev() != NULL);
|
| +
|
| + // TODO(robertm): add POST tests
|
| + RegisterTest("TestOpenSimple", TestOpenSimple);
|
| + RegisterTest("TestStreamToFileSimple", TestStreamToFileSimple);
|
| + RegisterTest("TestProgressSimple", TestProgressSimple);
|
| + RegisterTest("TestResponseInfoSimple", TestResponseInfoSimple);
|
| + RegisterTest("TestCloseSimple", TestCloseSimple);
|
| + RegisterTest("TestReadSimple", TestReadSimple);
|
| +
|
| + RegisterTest("TestAbort", TestAbort);
|
| + RegisterTest("TestDoubleOpen", TestDoubleOpen);
|
| + RegisterTest("TestOpenSuccess", TestOpenSuccess);
|
| + RegisterTest("TestOpenFailure", TestOpenFailure);
|
| + RegisterTest("TestOpenRedirect", TestOpenRedirect);
|
| + RegisterTest("TestOpenReadMismatch", TestOpenReadMismatch);
|
| + RegisterTest("TestStreamToFile", TestStreamToFile);
|
| +}
|
| +
|
| +
|
| +void SetupPluginInterfaces() {
|
| + // No PPP interface to test.
|
| +}
|
|
|