blob: 6457d643cd6fa19ae6fa080e17fd3baef873c790 [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/platform/loader/testing/bytes_consumer_test_reader.h"
#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h"
#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
namespace blink {
BytesConsumerTestReader::BytesConsumerTestReader(BytesConsumer* consumer)
: consumer_(consumer) {
consumer_->SetClient(this);
}
void BytesConsumerTestReader::OnStateChange() {
while (true) {
const char* buffer = nullptr;
size_t available = 0;
auto result = consumer_->BeginRead(&buffer, &available);
if (result == BytesConsumer::Result::kShouldWait)
return;
if (result == BytesConsumer::Result::kOk) {
// We don't use |available| as-is to test cases where endRead
// is called with a number smaller than |available|. We choose 3
// because of the same reasons as Reader::onStateChange.
wtf_size_t read =
static_cast<wtf_size_t>(std::min(static_cast<size_t>(3), available));
data_.Append(buffer, read);
result = consumer_->EndRead(read);
}
DCHECK_NE(result, BytesConsumer::Result::kShouldWait);
if (result != BytesConsumer::Result::kOk) {
result_ = result;
return;
}
}
}
std::pair<BytesConsumer::Result, Vector<char>> BytesConsumerTestReader::Run() {
OnStateChange();
while (result_ != BytesConsumer::Result::kDone &&
result_ != BytesConsumer::Result::kError)
test::RunPendingTasks();
test::RunPendingTasks();
return std::make_pair(result_, std::move(data_));
}
std::pair<BytesConsumer::Result, Vector<char>> BytesConsumerTestReader::Run(
scheduler::FakeTaskRunner* task_runner) {
OnStateChange();
while (result_ != BytesConsumer::Result::kDone &&
result_ != BytesConsumer::Result::kError)
task_runner->RunUntilIdle();
return std::make_pair(result_, std::move(data_));
}
} // namespace blink