// 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 "cc/mojo_embedder/async_layer_tree_frame_sink.h"

#include <memory>

#include "base/bind.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/thread.h"
#include "cc/test/fake_layer_tree_frame_sink_client.h"
#include "components/viz/client/hit_test_data_provider_draw_quad.h"
#include "components/viz/client/local_surface_id_provider.h"
#include "components/viz/common/quads/render_pass_draw_quad.h"
#include "components/viz/common/quads/solid_color_draw_quad.h"
#include "components/viz/common/quads/surface_draw_quad.h"
#include "components/viz/common/surfaces/surface_range.h"
#include "components/viz/test/compositor_frame_helpers.h"
#include "components/viz/test/test_context_provider.h"
#include "components/viz/test/test_gpu_memory_buffer_manager.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {
namespace mojo_embedder {
namespace {

// Used to track the thread DidLoseLayerTreeFrameSink() is called on (and quit
// a RunLoop).
class ThreadTrackingLayerTreeFrameSinkClient
    : public FakeLayerTreeFrameSinkClient {
 public:
  ThreadTrackingLayerTreeFrameSinkClient(
      base::PlatformThreadId* called_thread_id,
      base::RunLoop* run_loop)
      : called_thread_id_(called_thread_id), run_loop_(run_loop) {}
  ~ThreadTrackingLayerTreeFrameSinkClient() override = default;

  // FakeLayerTreeFrameSinkClient:
  void DidLoseLayerTreeFrameSink() override {
    EXPECT_FALSE(did_lose_layer_tree_frame_sink_called());
    FakeLayerTreeFrameSinkClient::DidLoseLayerTreeFrameSink();
    *called_thread_id_ = base::PlatformThread::CurrentId();
    run_loop_->Quit();
  }

 private:
  base::PlatformThreadId* called_thread_id_;
  base::RunLoop* run_loop_;

  DISALLOW_COPY_AND_ASSIGN(ThreadTrackingLayerTreeFrameSinkClient);
};

TEST(AsyncLayerTreeFrameSinkTest,
     DidLoseLayerTreeFrameSinkCalledOnConnectionError) {
  base::Thread bg_thread("BG Thread");
  bg_thread.Start();

  scoped_refptr<viz::TestContextProvider> provider =
      viz::TestContextProvider::Create();
  viz::TestGpuMemoryBufferManager test_gpu_memory_buffer_manager;

  viz::mojom::CompositorFrameSinkPtrInfo sink_info;
  viz::mojom::CompositorFrameSinkRequest sink_request =
      mojo::MakeRequest(&sink_info);
  viz::mojom::CompositorFrameSinkClientPtr client;
  viz::mojom::CompositorFrameSinkClientRequest client_request =
      mojo::MakeRequest(&client);

  AsyncLayerTreeFrameSink::InitParams init_params;
  init_params.compositor_task_runner = bg_thread.task_runner();
  init_params.gpu_memory_buffer_manager = &test_gpu_memory_buffer_manager;
  init_params.pipes.compositor_frame_sink_info = std::move(sink_info);
  init_params.pipes.client_request = std::move(client_request);
  init_params.enable_surface_synchronization = true;
  auto layer_tree_frame_sink = std::make_unique<AsyncLayerTreeFrameSink>(
      std::move(provider), nullptr, &init_params);

  base::PlatformThreadId called_thread_id = base::kInvalidThreadId;
  base::RunLoop close_run_loop;
  ThreadTrackingLayerTreeFrameSinkClient frame_sink_client(&called_thread_id,
                                                           &close_run_loop);

  auto bind_in_background =
      [](AsyncLayerTreeFrameSink* layer_tree_frame_sink,
         ThreadTrackingLayerTreeFrameSinkClient* frame_sink_client) {
        layer_tree_frame_sink->BindToClient(frame_sink_client);
      };
  bg_thread.task_runner()->PostTask(
      FROM_HERE, base::BindOnce(bind_in_background,
                                base::Unretained(layer_tree_frame_sink.get()),
                                base::Unretained(&frame_sink_client)));
  // Closes the pipe, which should trigger calling DidLoseLayerTreeFrameSink()
  // (and quitting the RunLoop). There is no need to wait for BindToClient()
  // to complete as mojo::Binding error callbacks are processed asynchronously.
  sink_request = viz::mojom::CompositorFrameSinkRequest();
  close_run_loop.Run();

  EXPECT_NE(base::kInvalidThreadId, called_thread_id);
  EXPECT_EQ(called_thread_id, bg_thread.GetThreadId());

  // DetachFromClient() has to be called on the background thread.
  base::RunLoop detach_run_loop;
  auto detach_in_background =
      [](std::unique_ptr<AsyncLayerTreeFrameSink> layer_tree_frame_sink,
         base::RunLoop* detach_run_loop) {
        layer_tree_frame_sink->DetachFromClient();
        detach_run_loop->Quit();
      };
  bg_thread.task_runner()->PostTask(
      FROM_HERE,
      base::BindOnce(detach_in_background, std::move(layer_tree_frame_sink),
                     base::Unretained(&detach_run_loop)));
  detach_run_loop.Run();
}

}  // namespace

// Boilerplate code for simple AsyncLayerTreeFrameSink. Friend of
// AsyncLayerTreeFrameSink.
class AsyncLayerTreeFrameSinkSimpleTest : public testing::Test {
 public:
  AsyncLayerTreeFrameSinkSimpleTest()
      : task_runner_(base::MakeRefCounted<base::TestMockTimeTaskRunner>(
            base::TestMockTimeTaskRunner::Type::kStandalone)),
        display_rect_(1, 1) {
    auto context_provider = viz::TestContextProvider::Create();

    viz::mojom::CompositorFrameSinkPtrInfo sink_info;
    viz::mojom::CompositorFrameSinkRequest sink_request =
        mojo::MakeRequest(&sink_info);
    viz::mojom::CompositorFrameSinkClientPtr client;
    viz::mojom::CompositorFrameSinkClientRequest client_request =
        mojo::MakeRequest(&client);

    init_params_.compositor_task_runner = task_runner_;
    init_params_.gpu_memory_buffer_manager = &test_gpu_memory_buffer_manager_;
    init_params_.pipes.compositor_frame_sink_info = std::move(sink_info);
    init_params_.pipes.client_request = std::move(client_request);
    init_params_.enable_surface_synchronization = true;
    init_params_.hit_test_data_provider =
        std::make_unique<viz::HitTestDataProviderDrawQuad>(
            /*should_ask_for_child_region=*/true, /*root_accepts_events=*/true);

    layer_tree_frame_sink_ = std::make_unique<AsyncLayerTreeFrameSink>(
        std::move(context_provider), nullptr, &init_params_);

    viz::LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create());
    layer_tree_frame_sink_->SetLocalSurfaceId(local_surface_id);
    layer_tree_frame_sink_->BindToClient(&layer_tree_frame_sink_client_);
  }

  void SendRenderPassList(viz::RenderPassList* pass_list,
                          bool hit_test_data_changed) {
    auto frame = viz::CompositorFrameBuilder()
                     .SetRenderPassList(std::move(*pass_list))
                     .Build();
    pass_list->clear();
    layer_tree_frame_sink_->SubmitCompositorFrame(
        std::move(frame), hit_test_data_changed,
        /*show_hit_test_borders=*/false);
  }

  const viz::HitTestRegionList& GetHitTestData() const {
    return layer_tree_frame_sink_->get_last_hit_test_data_for_testing();
  }

  AsyncLayerTreeFrameSink::InitParams init_params_;

  scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
  viz::TestGpuMemoryBufferManager test_gpu_memory_buffer_manager_;
  gfx::Rect display_rect_;
  std::unique_ptr<AsyncLayerTreeFrameSink> layer_tree_frame_sink_;
  FakeLayerTreeFrameSinkClient layer_tree_frame_sink_client_;
};

TEST_F(AsyncLayerTreeFrameSinkSimpleTest, HitTestRegionListDuplicate) {
  viz::RenderPassList pass_list;

  // Initial submission.
  auto pass1 = viz::RenderPass::Create();
  pass1->id = 1;
  pass1->output_rect = display_rect_;
  auto* shared_quad_state1 = pass1->CreateAndAppendSharedQuadState();
  gfx::Rect rect1(display_rect_);
  shared_quad_state1->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect1,
      /*visible_quad_layer_rect=*/rect1, /*clip_rect=*/rect1,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad1 =
      pass1->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad1->SetNew(shared_quad_state1, /*rect=*/rect1,
                /*visible_rect=*/rect1, SK_ColorBLACK,
                /*force_anti_aliasing_off=*/false);
  pass_list.push_back(move(pass1));
  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/false);
  task_runner_->RunUntilIdle();
  const viz::HitTestRegionList hit_test_region_list = GetHitTestData();

  // Identical submission.
  auto pass2 = viz::RenderPass::Create();
  pass2->id = 2;
  pass2->output_rect = display_rect_;
  auto* shared_quad_state2 = pass2->CreateAndAppendSharedQuadState();
  gfx::Rect rect2(display_rect_);
  shared_quad_state2->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect2,
      /*visible_quad_layer_rect=*/rect2, /*clip_rect=*/rect2,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad2 =
      pass2->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad2->SetNew(shared_quad_state2, /*rect=*/rect2,
                /*visible_rect=*/rect2, SK_ColorBLACK,
                /*force_anti_aliasing_off=*/false);
  pass_list.push_back(move(pass2));
  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/false);
  task_runner_->RunUntilIdle();

  EXPECT_TRUE(
      viz::HitTestRegionList::IsEqual(hit_test_region_list, GetHitTestData()));

  // Different submission.
  const viz::SurfaceId child_surface_id(
      viz::FrameSinkId(1, 1),
      viz::LocalSurfaceId(2, base::UnguessableToken::Create()));
  auto pass3_0 = viz::RenderPass::Create();
  pass3_0->output_rect = display_rect_;
  pass3_0->id = 3;
  auto* shared_quad_state3_0 = pass3_0->CreateAndAppendSharedQuadState();
  gfx::Rect rect3_0(display_rect_);
  gfx::Transform transform3_0;
  transform3_0.Translate(-200, -100);
  shared_quad_state3_0->SetAll(
      transform3_0, /*quad_layer_rect=*/rect3_0,
      /*visible_quad_layer_rect=*/rect3_0, /*clip_rect=*/rect3_0,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad3_0 =
      pass3_0->quad_list.AllocateAndConstruct<viz::SurfaceDrawQuad>();
  quad3_0->SetNew(shared_quad_state3_0, /*rect=*/rect3_0,
                  /*visible_rect=*/rect3_0,
                  viz::SurfaceRange(base::nullopt, child_surface_id),
                  SK_ColorBLACK,
                  /*stretch_content_to_fill_bounds=*/false,
                  /*ignores_input_event=*/false);
  pass_list.push_back(std::move(pass3_0));

  auto pass3_1 = viz::RenderPass::Create();
  pass3_1->output_rect = display_rect_;
  pass3_1->id = 4;
  auto* shared_quad_state3_1 = pass3_1->CreateAndAppendSharedQuadState();
  gfx::Rect rect3_1(display_rect_);
  shared_quad_state3_1->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect3_1,
      /*visible_quad_layer_rect=*/rect3_1, /*clip_rect=*/rect3_1,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad3_1 =
      pass3_1->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad3_1->SetNew(shared_quad_state3_1, /*rect=*/rect3_1,
                  /*visible_rect=*/rect3_1, SK_ColorBLACK,
                  /*force_anti_aliasing_off=*/false);
  pass_list.push_back(std::move(pass3_1));

  auto pass3_root = viz::RenderPass::Create();
  pass3_root->output_rect = display_rect_;
  pass3_root->id = 5;
  auto* shared_quad_state3_root = pass3_root->CreateAndAppendSharedQuadState();
  gfx::Rect rect3_root(display_rect_);
  shared_quad_state3_root->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect3_root,
      /*visible_quad_layer_rect=*/rect3_root, /*clip_rect=*/rect3_root,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad3_root_1 =
      pass3_root->quad_list.AllocateAndConstruct<viz::RenderPassDrawQuad>();
  quad3_root_1->SetNew(shared_quad_state3_root, /*rect=*/rect3_root,
                       /*visible_rect=*/rect3_root, /*render_pass_id=*/3,
                       /*mask_resource_id=*/0, gfx::RectF(), gfx::Size(),
                       gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
                       1.0f);
  auto* quad3_root_2 =
      pass3_root->quad_list.AllocateAndConstruct<viz::RenderPassDrawQuad>();
  quad3_root_2->SetNew(shared_quad_state3_root, /*rect=*/rect3_root,
                       /*visible_rect=*/rect3_root, /*render_pass_id=*/4,
                       /*mask_resource_id=*/0, gfx::RectF(), gfx::Size(),
                       gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
                       1.0f);
  pass_list.push_back(std::move(pass3_root));

  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/false);
  task_runner_->RunUntilIdle();
  EXPECT_FALSE(
      viz::HitTestRegionList::IsEqual(hit_test_region_list, GetHitTestData()));
}

TEST_F(AsyncLayerTreeFrameSinkSimpleTest,
       HitTestRegionListDuplicateChangedFlip) {
  viz::RenderPassList pass_list;

  // Initial submission.
  auto pass1 = viz::RenderPass::Create();
  pass1->id = 1;
  pass1->output_rect = display_rect_;
  auto* shared_quad_state1 = pass1->CreateAndAppendSharedQuadState();
  gfx::Rect rect1(display_rect_);
  shared_quad_state1->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect1,
      /*visible_quad_layer_rect=*/rect1, /*clip_rect=*/rect1,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad1 =
      pass1->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad1->SetNew(shared_quad_state1, /*rect=*/rect1,
                /*visible_rect=*/rect1, SK_ColorBLACK,
                /*force_anti_aliasing_off=*/false);
  pass_list.push_back(move(pass1));
  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/false);
  task_runner_->RunUntilIdle();
  viz::HitTestRegionList hit_test_region_list = GetHitTestData();

  // Different submission with |hit_test_data_changed| set to true.
  const viz::SurfaceId child_surface_id(
      viz::FrameSinkId(1, 1),
      viz::LocalSurfaceId(2, base::UnguessableToken::Create()));
  auto pass2_0 = viz::RenderPass::Create();
  pass2_0->output_rect = display_rect_;
  pass2_0->id = 2;
  auto* shared_quad_state2_0 = pass2_0->CreateAndAppendSharedQuadState();
  gfx::Rect rect2_0(display_rect_);
  gfx::Transform transform2_0;
  transform2_0.Translate(-200, -100);
  shared_quad_state2_0->SetAll(
      transform2_0, /*quad_layer_rect=*/rect2_0,
      /*visible_quad_layer_rect=*/rect2_0, /*clip_rect=*/rect2_0,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad2_0 =
      pass2_0->quad_list.AllocateAndConstruct<viz::SurfaceDrawQuad>();
  quad2_0->SetNew(shared_quad_state2_0, /*rect=*/rect2_0,
                  /*visible_rect=*/rect2_0,
                  viz::SurfaceRange(base::nullopt, child_surface_id),
                  SK_ColorBLACK,
                  /*stretch_content_to_fill_bounds=*/false,
                  /*ignores_input_event=*/false);
  pass_list.push_back(std::move(pass2_0));

  auto pass2_1 = viz::RenderPass::Create();
  pass2_1->output_rect = display_rect_;
  pass2_1->id = 3;
  auto* shared_quad_state2_1 = pass2_1->CreateAndAppendSharedQuadState();
  gfx::Rect rect2_1(display_rect_);
  shared_quad_state2_1->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect2_1,
      /*visible_quad_layer_rect=*/rect2_1, /*clip_rect=*/rect2_1,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad2_1 =
      pass2_1->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad2_1->SetNew(shared_quad_state2_1, /*rect=*/rect2_1,
                  /*visible_rect=*/rect2_1, SK_ColorBLACK,
                  /*force_anti_aliasing_off=*/false);
  pass_list.push_back(std::move(pass2_1));

  auto pass2_root = viz::RenderPass::Create();
  pass2_root->output_rect = display_rect_;
  pass2_root->id = 4;
  auto* shared_quad_state2_root = pass2_root->CreateAndAppendSharedQuadState();
  gfx::Rect rect2_root(display_rect_);
  shared_quad_state2_root->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect2_root,
      /*visible_quad_layer_rect=*/rect2_root, /*clip_rect=*/rect2_root,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad2_root_1 =
      pass2_root->quad_list.AllocateAndConstruct<viz::RenderPassDrawQuad>();
  quad2_root_1->SetNew(shared_quad_state2_root, /*rect=*/rect2_root,
                       /*visible_rect=*/rect2_root, /*render_pass_id=*/2,
                       /*mask_resource_id=*/0, gfx::RectF(), gfx::Size(),
                       gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
                       1.0f);
  auto* quad2_root_2 =
      pass2_root->quad_list.AllocateAndConstruct<viz::RenderPassDrawQuad>();
  quad2_root_2->SetNew(shared_quad_state2_root, /*rect=*/rect2_root,
                       /*visible_rect=*/rect2_root, /*render_pass_id=*/3,
                       /*mask_resource_id=*/0, gfx::RectF(), gfx::Size(),
                       gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
                       1.0f);
  pass_list.push_back(std::move(pass2_root));

  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/true);
  task_runner_->RunUntilIdle();

  EXPECT_FALSE(
      viz::HitTestRegionList::IsEqual(hit_test_region_list, GetHitTestData()));
  hit_test_region_list = GetHitTestData();

  // Identical submission with |hit_test_data_changed| set back to false. We
  // expect the hit-data to still have been sent.
  auto pass3 = viz::RenderPass::Create();
  pass3->id = 4;
  pass3->output_rect = display_rect_;
  auto* shared_quad_state3 = pass3->CreateAndAppendSharedQuadState();
  gfx::Rect rect3(display_rect_);
  shared_quad_state3->SetAll(
      gfx::Transform(), /*quad_layer_rect=*/rect3,
      /*visible_quad_layer_rect=*/rect3, /*clip_rect=*/rect3,
      /*is_clipped=*/false, /*are_contents_opaque=*/false,
      /*opacity=*/0.5f, SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
  auto* quad3 =
      pass3->quad_list.AllocateAndConstruct<viz::SolidColorDrawQuad>();
  quad3->SetNew(shared_quad_state3, /*rect=*/rect3,
                /*visible_rect=*/rect3, SK_ColorBLACK,
                /*force_anti_aliasing_off=*/false);
  pass_list.push_back(move(pass3));
  SendRenderPassList(&pass_list, /*hit_test_data_changed=*/false);
  task_runner_->RunUntilIdle();

  EXPECT_FALSE(
      viz::HitTestRegionList::IsEqual(hit_test_region_list, GetHitTestData()));
}

}  // namespace mojo_embedder
}  // namespace cc
