| Index: cc/ipc/struct_traits_unittest.cc
|
| diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc
|
| index 1b90b4a5498bb3a2b6964b5716a3e2ea6d7c7231..dafd2bdb847d4cdeaef1dfc84815b65db6e8ca85 100644
|
| --- a/cc/ipc/struct_traits_unittest.cc
|
| +++ b/cc/ipc/struct_traits_unittest.cc
|
| @@ -5,6 +5,7 @@
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| #include "cc/input/selection.h"
|
| +#include "cc/ipc/copy_output_request_struct_traits.h"
|
| #include "cc/ipc/traits_test_service.mojom.h"
|
| #include "cc/output/copy_output_result.h"
|
| #include "cc/quads/debug_border_draw_quad.h"
|
| @@ -130,7 +131,25 @@ class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
|
| DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
|
| };
|
|
|
| -void StubCopyOutputRequestCallback(std::unique_ptr<CopyOutputResult> result) {}
|
| +void CopyOutputRequestCallback(base::Closure quit_closure,
|
| + gfx::Size expected_size,
|
| + std::unique_ptr<CopyOutputResult> result) {
|
| + EXPECT_EQ(expected_size, result->size());
|
| + quit_closure.Run();
|
| +}
|
| +
|
| +void CopyOutputRequestCallbackRunsOnceCallback(
|
| + int* n_called,
|
| + std::unique_ptr<CopyOutputResult> result) {
|
| + ++*n_called;
|
| +}
|
| +
|
| +void CopyOutputRequestMessagePipeBrokenCallback(
|
| + base::Closure closure,
|
| + std::unique_ptr<CopyOutputResult> result) {
|
| + EXPECT_TRUE(result->IsEmpty());
|
| + closure.Run();
|
| +}
|
|
|
| void CopyOutputResultCallback(base::Closure quit_closure,
|
| const gpu::SyncToken& expected_sync_token,
|
| @@ -370,19 +389,17 @@ TEST_F(StructTraitsTest, CompositorFrameMetadata) {
|
| EXPECT_EQ(referenced_surfaces[i], output.referenced_surfaces[i]);
|
| }
|
|
|
| -TEST_F(StructTraitsTest, CopyOutputRequest) {
|
| +TEST_F(StructTraitsTest, CopyOutputRequest_BitmapRequest) {
|
| const gfx::Rect area(5, 7, 44, 55);
|
| - const auto callback = base::Bind(StubCopyOutputRequestCallback);
|
| - const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
|
| - 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 3};
|
| - const uint32_t target = 3;
|
| const auto source =
|
| base::UnguessableToken::Deserialize(0xdeadbeef, 0xdeadf00d);
|
| - gpu::Mailbox mailbox;
|
| - mailbox.SetName(mailbox_name);
|
| - TextureMailbox texture_mailbox(mailbox, gpu::SyncToken(), target);
|
| + gfx::Size size(9, 8);
|
| + auto bitmap = base::MakeUnique<SkBitmap>();
|
| + bitmap->allocN32Pixels(size.width(), size.height());
|
| + base::RunLoop run_loop;
|
| + auto callback =
|
| + base::Bind(CopyOutputRequestCallback, run_loop.QuitClosure(), size);
|
|
|
| - // Test with bitmap.
|
| std::unique_ptr<CopyOutputRequest> input;
|
| input = CopyOutputRequest::CreateBitmapRequest(callback);
|
| input->set_area(area);
|
| @@ -396,19 +413,66 @@ TEST_F(StructTraitsTest, CopyOutputRequest) {
|
| EXPECT_TRUE(output->has_area());
|
| EXPECT_EQ(area, output->area());
|
| EXPECT_EQ(source, output->source());
|
| + output->SendBitmapResult(std::move(bitmap));
|
| + // If CopyOutputRequestCallback is called, this ends. Otherwise, the test
|
| + // will time out and fail.
|
| + run_loop.Run();
|
| +}
|
| +
|
| +TEST_F(StructTraitsTest, CopyOutputRequest_TextureRequest) {
|
| + const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
|
| + 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 3};
|
| + const uint32_t target = 3;
|
| + gpu::Mailbox mailbox;
|
| + mailbox.SetName(mailbox_name);
|
| + TextureMailbox texture_mailbox(mailbox, gpu::SyncToken(), target);
|
| + base::RunLoop run_loop;
|
| + auto callback = base::Bind(CopyOutputRequestCallback, run_loop.QuitClosure(),
|
| + gfx::Size());
|
|
|
| - // Test with texture mailbox.
|
| - input = CopyOutputRequest::CreateRequest(callback);
|
| + auto input = CopyOutputRequest::CreateRequest(callback);
|
| input->SetTextureMailbox(texture_mailbox);
|
|
|
| - std::unique_ptr<CopyOutputRequest> output2;
|
| - proxy->EchoCopyOutputRequest(std::move(input), &output2);
|
| + mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
|
| + std::unique_ptr<CopyOutputRequest> output;
|
| + proxy->EchoCopyOutputRequest(std::move(input), &output);
|
| +
|
| + EXPECT_TRUE(output->has_texture_mailbox());
|
| + EXPECT_FALSE(output->has_area());
|
| + EXPECT_EQ(mailbox, output->texture_mailbox().mailbox());
|
| + EXPECT_EQ(target, output->texture_mailbox().target());
|
| + EXPECT_FALSE(output->has_source());
|
| + output->SendEmptyResult();
|
| + // If CopyOutputRequestCallback is called, this ends. Otherwise, the test
|
| + // will time out and fail.
|
| + run_loop.Run();
|
| +}
|
|
|
| - EXPECT_TRUE(output2->has_texture_mailbox());
|
| - EXPECT_FALSE(output2->has_area());
|
| - EXPECT_EQ(mailbox, output2->texture_mailbox().mailbox());
|
| - EXPECT_EQ(target, output2->texture_mailbox().target());
|
| - EXPECT_FALSE(output2->has_source());
|
| +TEST_F(StructTraitsTest, CopyOutputRequest_CallbackRunsOnce) {
|
| + int n_called = 0;
|
| + auto request = CopyOutputRequest::CreateRequest(
|
| + base::Bind(CopyOutputRequestCallbackRunsOnceCallback, &n_called));
|
| + auto result_sender = mojo::StructTraits<
|
| + mojom::CopyOutputRequestDataView,
|
| + std::unique_ptr<CopyOutputRequest>>::result_sender(request);
|
| + for (int i = 0; i < 10; i++)
|
| + result_sender->SendResult(CopyOutputResult::CreateEmptyResult());
|
| + EXPECT_EQ(0, n_called);
|
| + result_sender.FlushForTesting();
|
| + EXPECT_EQ(1, n_called);
|
| +}
|
| +
|
| +TEST_F(StructTraitsTest, CopyOutputRequest_MessagePipeBroken) {
|
| + base::RunLoop run_loop;
|
| + auto request = CopyOutputRequest::CreateRequest(base::Bind(
|
| + CopyOutputRequestMessagePipeBrokenCallback, run_loop.QuitClosure()));
|
| + auto result_sender = mojo::StructTraits<
|
| + mojom::CopyOutputRequestDataView,
|
| + std::unique_ptr<CopyOutputRequest>>::result_sender(request);
|
| + result_sender.reset();
|
| + // The callback must be called with an empty CopyOutputResult. If it's never
|
| + // called, this will never end and the test times out.
|
| + run_loop.Run();
|
| }
|
|
|
| TEST_F(StructTraitsTest, CopyOutputResult_Bitmap) {
|
|
|