summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc435
1 files changed, 63 insertions, 372 deletions
diff --git a/chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc b/chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
index 877801119aa..8a2581ef3d1 100644
--- a/chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
+++ b/chromium/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
@@ -4,12 +4,14 @@
#include "third_party/blink/renderer/core/fetch/blob_bytes_consumer.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/fetch/bytes_consumer_test_util.h"
#include "third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.h"
#include "third_party/blink/renderer/core/loader/threadable_loader.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h"
#include "third_party/blink/renderer/platform/blob/blob_data.h"
+#include "third_party/blink/renderer/platform/blob/testing/fake_blob.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
#include "third_party/blink/renderer/platform/network/encoded_form_data.h"
@@ -25,92 +27,6 @@ using PublicState = BytesConsumer::PublicState;
using ReplayingHandle = DataConsumerHandleTestUtil::ReplayingHandle;
using Result = BytesConsumer::Result;
-class TestThreadableLoader : public ThreadableLoader {
- public:
- ~TestThreadableLoader() override {
- EXPECT_FALSE(should_be_cancelled_ && !is_cancelled_)
- << "The loader should be cancelled but is not cancelled.";
- }
-
- void Start(const ResourceRequest& request) override { is_started_ = true; }
-
- void OverrideTimeout(unsigned long timeout_milliseconds) override {
- ADD_FAILURE() << "overrideTimeout should not be called.";
- }
-
- void Cancel() override { is_cancelled_ = true; }
- void Detach() override { NOTREACHED(); }
-
- bool IsStarted() const { return is_started_; }
- bool IsCancelled() const { return is_cancelled_; }
- void SetShouldBeCancelled() { should_be_cancelled_ = true; }
-
- private:
- bool is_started_ = false;
- bool is_cancelled_ = false;
- bool should_be_cancelled_ = false;
-};
-
-class SyncLoadingTestThreadableLoader : public ThreadableLoader {
- public:
- ~SyncLoadingTestThreadableLoader() override { DCHECK(!handle_); }
-
- void Start(const ResourceRequest& request) override {
- is_started_ = true;
- client_->DidReceiveResponse(0, ResourceResponse(), std::move(handle_));
- client_->DidFinishLoading(0);
- }
-
- void OverrideTimeout(unsigned long timeout_milliseconds) override {
- ADD_FAILURE() << "overrideTimeout should not be called.";
- }
-
- void Cancel() override { is_cancelled_ = true; }
- void Detach() override { NOTREACHED(); }
-
- bool IsStarted() const { return is_started_; }
- bool IsCancelled() const { return is_cancelled_; }
-
- void SetClient(ThreadableLoaderClient* client) { client_ = client; }
-
- void SetHandle(std::unique_ptr<WebDataConsumerHandle> handle) {
- handle_ = std::move(handle);
- }
-
- private:
- bool is_started_ = false;
- bool is_cancelled_ = false;
- ThreadableLoaderClient* client_ = nullptr;
- std::unique_ptr<WebDataConsumerHandle> handle_;
-};
-
-class SyncErrorTestThreadableLoader : public ThreadableLoader {
- public:
- ~SyncErrorTestThreadableLoader() override {}
-
- void Start(const ResourceRequest& request) override {
- is_started_ = true;
- client_->DidFail(ResourceError::Failure(NullURL()));
- }
-
- void OverrideTimeout(unsigned long timeout_milliseconds) override {
- ADD_FAILURE() << "overrideTimeout should not be called.";
- }
-
- void Cancel() override { is_cancelled_ = true; }
- void Detach() override { NOTREACHED(); }
-
- bool IsStarted() const { return is_started_; }
- bool IsCancelled() const { return is_cancelled_; }
-
- void SetClient(ThreadableLoaderClient* client) { client_ = client; }
-
- private:
- bool is_started_ = false;
- bool is_cancelled_ = false;
- ThreadableLoaderClient* client_ = nullptr;
-};
-
class BlobBytesConsumerTestClient final
: public GarbageCollectedFinalized<BlobBytesConsumerTestClient>,
public BytesConsumer::Client {
@@ -128,144 +44,71 @@ class BlobBytesConsumerTestClient final
class BlobBytesConsumerTest : public PageTestBase {
public:
void SetUp() override { PageTestBase::SetUp(IntSize(1, 1)); }
+ scoped_refptr<BlobDataHandle> CreateBlob(const String& body) {
+ mojom::blink::BlobPtrInfo mojo_blob;
+ mojo::MakeStrongBinding(
+ std::make_unique<FakeBlob>(kBlobUUID, body, &blob_state_),
+ MakeRequest(&mojo_blob));
+ return BlobDataHandle::Create(kBlobUUID, "", body.length(),
+ std::move(mojo_blob));
+ }
+
+ bool DidStartLoading() {
+ base::RunLoop().RunUntilIdle();
+ return blob_state_.did_initiate_read_operation;
+ }
+
+ private:
+ const String kBlobUUID = "blob-id";
+ FakeBlob::State blob_state_;
};
TEST_F(BlobBytesConsumerTest, TwoPhaseRead) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- std::unique_ptr<ReplayingHandle> src = ReplayingHandle::Create();
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello, "));
- src->Add(DataConsumerCommand(DataConsumerCommand::kWait));
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "world"));
- src->Add(DataConsumerCommand(DataConsumerCommand::kDone));
+ String body = "hello, world";
+ scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
+
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
const char* buffer = nullptr;
size_t available = 0;
EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
+ EXPECT_TRUE(DidStartLoading());
EXPECT_FALSE(consumer->DrainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize));
EXPECT_FALSE(consumer->DrainAsFormData());
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- consumer->DidReceiveResponse(0, ResourceResponse(), std::move(src));
- consumer->DidFinishLoading(0);
-
auto result = (new BytesConsumerTestUtil::TwoPhaseReader(consumer))->Run();
EXPECT_EQ(Result::kDone, result.first);
EXPECT_EQ("hello, world",
BytesConsumerTestUtil::CharVectorToString(result.second));
}
-TEST_F(BlobBytesConsumerTest, FailLoading) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
-
- const char* buffer = nullptr;
- size_t available = 0;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
-
- int num_on_state_change_called = client->NumOnStateChangeCalled();
- consumer->DidFail(ResourceError::Failure(NullURL()));
-
- EXPECT_EQ(num_on_state_change_called + 1, client->NumOnStateChangeCalled());
- EXPECT_EQ(PublicState::kErrored, consumer->GetPublicState());
- EXPECT_EQ(Result::kError, consumer->BeginRead(&buffer, &available));
-}
-
-TEST_F(BlobBytesConsumerTest, FailLoadingAfterResponseReceived) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
-
- int num_on_state_change_called = client->NumOnStateChangeCalled();
- consumer->DidReceiveResponse(
- 0, ResourceResponse(),
- DataConsumerHandleTestUtil::CreateWaitingDataConsumerHandle());
- EXPECT_EQ(num_on_state_change_called + 1, client->NumOnStateChangeCalled());
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
-
- consumer->DidFail(ResourceError::Failure(NullURL()));
- EXPECT_EQ(num_on_state_change_called + 2, client->NumOnStateChangeCalled());
- EXPECT_EQ(PublicState::kErrored, consumer->GetPublicState());
- EXPECT_EQ(Result::kError, consumer->BeginRead(&buffer, &available));
-}
-
-TEST_F(BlobBytesConsumerTest, FailAccessControlCheck) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
-
- int num_on_state_change_called = client->NumOnStateChangeCalled();
- consumer->DidFail(ResourceError::Failure(NullURL()));
- EXPECT_EQ(num_on_state_change_called + 1, client->NumOnStateChangeCalled());
-
- EXPECT_EQ(PublicState::kErrored, consumer->GetPublicState());
- EXPECT_EQ(Result::kError, consumer->BeginRead(&buffer, &available));
-}
-
TEST_F(BlobBytesConsumerTest, CancelBeforeStarting) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob("foo bar");
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
consumer->SetClient(client);
consumer->Cancel();
- // This should be FALSE in production, but TRUE here because we set the
- // loader before starting loading in tests.
- EXPECT_TRUE(loader->IsCancelled());
const char* buffer = nullptr;
size_t available;
EXPECT_EQ(Result::kDone, consumer->BeginRead(&buffer, &available));
EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
EXPECT_EQ(0, client->NumOnStateChangeCalled());
}
TEST_F(BlobBytesConsumerTest, CancelAfterStarting) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob("foo bar");
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
consumer->SetClient(client);
@@ -273,130 +116,43 @@ TEST_F(BlobBytesConsumerTest, CancelAfterStarting) {
size_t available;
EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_TRUE(loader->IsStarted());
EXPECT_EQ(0, client->NumOnStateChangeCalled());
consumer->Cancel();
- EXPECT_TRUE(loader->IsCancelled());
EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
EXPECT_EQ(Result::kDone, consumer->BeginRead(&buffer, &available));
EXPECT_EQ(0, client->NumOnStateChangeCalled());
-}
-
-TEST_F(BlobBytesConsumerTest, ReadLastChunkBeforeDidFinishLoadingArrives) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
- std::unique_ptr<ReplayingHandle> src = ReplayingHandle::Create();
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello"));
- src->Add(DataConsumerCommand(DataConsumerCommand::kDone));
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_TRUE(loader->IsStarted());
- EXPECT_EQ(0, client->NumOnStateChangeCalled());
-
- consumer->DidReceiveResponse(0, ResourceResponse(), std::move(src));
- EXPECT_EQ(1, client->NumOnStateChangeCalled());
- test::RunPendingTasks();
- EXPECT_EQ(2, client->NumOnStateChangeCalled());
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- ASSERT_EQ(Result::kOk, consumer->BeginRead(&buffer, &available));
- ASSERT_EQ(5u, available);
- EXPECT_EQ("hello", String(buffer, available));
- ASSERT_EQ(Result::kOk, consumer->EndRead(available));
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- ASSERT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
-
- consumer->DidFinishLoading(0);
- EXPECT_EQ(3, client->NumOnStateChangeCalled());
- EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
- ASSERT_EQ(Result::kDone, consumer->BeginRead(&buffer, &available));
-}
-
-TEST_F(BlobBytesConsumerTest, ReadLastChunkAfterDidFinishLoadingArrives) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
- std::unique_ptr<ReplayingHandle> src = ReplayingHandle::Create();
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello"));
- src->Add(DataConsumerCommand(DataConsumerCommand::kDone));
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_TRUE(loader->IsStarted());
- EXPECT_EQ(0, client->NumOnStateChangeCalled());
-
- consumer->DidReceiveResponse(0, ResourceResponse(), std::move(src));
- EXPECT_EQ(1, client->NumOnStateChangeCalled());
- test::RunPendingTasks();
- EXPECT_EQ(2, client->NumOnStateChangeCalled());
-
- consumer->DidFinishLoading(0);
- test::RunPendingTasks();
- EXPECT_EQ(2, client->NumOnStateChangeCalled());
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- ASSERT_EQ(Result::kOk, consumer->BeginRead(&buffer, &available));
- ASSERT_EQ(5u, available);
- EXPECT_EQ("hello", String(buffer, available));
- ASSERT_EQ(Result::kOk, consumer->EndRead(available));
-
- EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_EQ(Result::kDone, consumer->BeginRead(&buffer, &available));
- EXPECT_EQ(2, client->NumOnStateChangeCalled());
+ EXPECT_TRUE(DidStartLoading());
}
TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ String body = "hello, world";
+ scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
scoped_refptr<BlobDataHandle> result = consumer->DrainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::kDisallowBlobWithInvalidSize);
ASSERT_TRUE(result);
EXPECT_FALSE(consumer->DrainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::kDisallowBlobWithInvalidSize));
- EXPECT_EQ(12345u, result->size());
+ EXPECT_EQ(body.length(), result->size());
EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
}
TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle_2) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), -1);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ scoped_refptr<BlobDataHandle> blob_data_handle = BlobDataHandle::Create(
+ "uuid", "", -1, CreateBlob("foo bar")->CloneBlobPtr().PassInterface());
+ ;
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
scoped_refptr<BlobDataHandle> result = consumer->DrainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize);
@@ -405,109 +161,44 @@ TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle_2) {
BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize));
EXPECT_EQ(UINT64_MAX, result->size());
EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
}
TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle_3) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), -1);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ scoped_refptr<BlobDataHandle> blob_data_handle = BlobDataHandle::Create(
+ "uuid", "", -1, CreateBlob("foo bar")->CloneBlobPtr().PassInterface());
+ ;
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
EXPECT_FALSE(consumer->DrainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::kDisallowBlobWithInvalidSize));
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
}
TEST_F(BlobBytesConsumerTest, DrainAsFormData) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
+ String body = "hello, world";
+ scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
+ BlobBytesConsumer* consumer =
+ new BlobBytesConsumer(&GetDocument(), blob_data_handle);
EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
+ EXPECT_FALSE(DidStartLoading());
scoped_refptr<EncodedFormData> result = consumer->DrainAsFormData();
ASSERT_TRUE(result);
ASSERT_EQ(1u, result->Elements().size());
ASSERT_EQ(FormDataElement::kEncodedBlob, result->Elements()[0].type_);
ASSERT_TRUE(result->Elements()[0].optional_blob_data_handle_);
- EXPECT_EQ(12345u, result->Elements()[0].optional_blob_data_handle_->size());
+ EXPECT_EQ(body.length(),
+ result->Elements()[0].optional_blob_data_handle_->size());
EXPECT_EQ(blob_data_handle->Uuid(), result->Elements()[0].blob_uuid_);
EXPECT_EQ(PublicState::kClosed, consumer->GetPublicState());
- EXPECT_FALSE(loader->IsStarted());
-}
-
-TEST_F(BlobBytesConsumerTest, LoaderShouldBeCancelled) {
- {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- TestThreadableLoader* loader = new TestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kShouldWait, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
- loader->SetShouldBeCancelled();
- }
- ThreadState::Current()->CollectAllGarbage();
-}
-
-TEST_F(BlobBytesConsumerTest, SyncErrorDispatch) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- SyncErrorTestThreadableLoader* loader = new SyncErrorTestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- loader->SetClient(consumer);
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
-
- const char* buffer = nullptr;
- size_t available;
- EXPECT_EQ(Result::kError, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
-
- EXPECT_EQ(0, client->NumOnStateChangeCalled());
- EXPECT_EQ(BytesConsumer::PublicState::kErrored, consumer->GetPublicState());
-}
-
-TEST_F(BlobBytesConsumerTest, SyncLoading) {
- scoped_refptr<BlobDataHandle> blob_data_handle =
- BlobDataHandle::Create(BlobData::Create(), 12345);
- SyncLoadingTestThreadableLoader* loader =
- new SyncLoadingTestThreadableLoader();
- BlobBytesConsumer* consumer = BlobBytesConsumer::CreateForTesting(
- &GetDocument(), blob_data_handle, loader);
- std::unique_ptr<ReplayingHandle> src = ReplayingHandle::Create();
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello, "));
- src->Add(DataConsumerCommand(DataConsumerCommand::kWait));
- src->Add(DataConsumerCommand(DataConsumerCommand::kData, "world"));
- src->Add(DataConsumerCommand(DataConsumerCommand::kDone));
- loader->SetClient(consumer);
- loader->SetHandle(std::move(src));
- BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
- consumer->SetClient(client);
-
- const char* buffer = nullptr;
- size_t available;
- ASSERT_EQ(Result::kOk, consumer->BeginRead(&buffer, &available));
- EXPECT_TRUE(loader->IsStarted());
- ASSERT_EQ(7u, available);
- EXPECT_EQ("hello, ", String(buffer, available));
-
- EXPECT_EQ(0, client->NumOnStateChangeCalled());
- EXPECT_EQ(BytesConsumer::PublicState::kReadableOrWaiting,
- consumer->GetPublicState());
+ EXPECT_FALSE(DidStartLoading());
}
TEST_F(BlobBytesConsumerTest, ConstructedFromNullHandle) {