blob: 045a889a3c5de922f56bf2a990f92e4153d2011d [file] [log] [blame]
// Copyright 2017 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 "media/mojo/common/mojo_data_pipe_read_write.h"
#include <stdint.h>
#include <memory>
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/test/mock_callback.h"
#include "media/base/decoder_buffer.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
namespace {
uint32_t kDefaultDataPipeCapacityBytes = 512;
class MojoDataPipeReadWrite {
public:
MojoDataPipeReadWrite(
uint32_t data_pipe_capacity_bytes = kDefaultDataPipeCapacityBytes) {
mojo::DataPipe data_pipe(data_pipe_capacity_bytes);
writer_ = std::make_unique<MojoDataPipeWriter>(
std::move(data_pipe.producer_handle));
reader_ = std::make_unique<MojoDataPipeReader>(
std::move(data_pipe.consumer_handle));
}
void WriteAndRead(const uint8_t* buffer,
uint32_t buffer_size,
bool discard_data = false) {
base::RunLoop run_loop;
base::MockCallback<MojoDataPipeWriter::DoneCB> mock_write_cb;
base::MockCallback<MojoDataPipeReader::DoneCB> mock_read_cb;
EXPECT_TRUE(reader_->IsPipeValid());
EXPECT_TRUE(writer_->IsPipeValid());
EXPECT_CALL(mock_write_cb, Run(true)).Times(1);
EXPECT_CALL(mock_read_cb, Run(true)).Times(1);
writer_->Write(buffer, buffer_size, mock_write_cb.Get());
EXPECT_TRUE(read_buffer_.empty());
if (discard_data) {
reader_->Read(nullptr, buffer_size, mock_read_cb.Get());
run_loop.RunUntilIdle();
} else {
read_buffer_.resize(buffer_size);
reader_->Read(read_buffer_.data(), buffer_size, mock_read_cb.Get());
run_loop.RunUntilIdle();
EXPECT_EQ(0, std::memcmp(buffer, read_buffer_.data(), buffer_size));
read_buffer_.clear();
}
}
std::unique_ptr<MojoDataPipeWriter> writer_;
std::unique_ptr<MojoDataPipeReader> reader_;
std::vector<uint8_t> read_buffer_;
};
} // namespace
TEST(MojoDataPipeReadWriteTest, Normal) {
base::MessageLoop message_loop;
std::string kData = "hello, world";
MojoDataPipeReadWrite pipe_read_write_;
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData.data()),
kData.size());
}
TEST(MojoDataPipeReadWriteTest, SequentialReading) {
base::MessageLoop message_loop;
std::string kData1 = "hello, world";
std::string kData2 = "Bye!";
MojoDataPipeReadWrite pipe_read_write_;
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData1.data()),
kData1.size());
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData2.data()),
kData2.size());
}
TEST(MojoDataPipeReadWriteTest, LongerThanCapacity) {
base::MessageLoop message_loop;
std::string kData = "hello, world, hello, world, hello, world";
MojoDataPipeReadWrite pipe_read_write_(10);
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData.data()),
kData.size());
}
TEST(MojoDataPipeReadWriteTest, DiscardDataInPipe) {
base::MessageLoop message_loop;
std::string kData1 = "to be discarded";
std::string kData2 = "hello, world, hello, world, hello, world";
MojoDataPipeReadWrite pipe_read_write_(10);
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData1.data()),
kData1.size(), true);
pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData2.data()),
kData2.size());
}
} // namespace media