+// Do a synchronous composite and assert that the swap promise succeeds.
+class LayerTreeHostTestSynchronousCompositeSwapPromise
+ : public LayerTreeHostTest {
+ public:
+ LayerTreeHostTestSynchronousCompositeSwapPromise() : commit_count_(0) {}
+
+ void InitializeSettings(LayerTreeSettings* settings) override {
+ settings->single_thread_proxy_scheduler = false;
+ }
+
+ void BeginTest() override {
+ // Successful composite.
+ scoped_ptr<SwapPromise> swap_promise0(
+ new TestSwapPromise(&swap_promise_result_[0]));
+ layer_tree_host()->QueueSwapPromise(swap_promise0.Pass());
+ layer_tree_host()->Composite(gfx::FrameTime::Now());
+
+ // Fail to swap (no damage).
+ scoped_ptr<SwapPromise> swap_promise1(
+ new TestSwapPromise(&swap_promise_result_[1]));
+ layer_tree_host()->QueueSwapPromise(swap_promise1.Pass());
+ layer_tree_host()->SetNeedsCommit();
+ layer_tree_host()->Composite(gfx::FrameTime::Now());
+
+ // Fail to draw (not visible).
+ scoped_ptr<SwapPromise> swap_promise2(
+ new TestSwapPromise(&swap_promise_result_[2]));
+ layer_tree_host()->QueueSwapPromise(swap_promise2.Pass());
+ layer_tree_host()->SetNeedsDisplayOnAllLayers();
+ layer_tree_host()->SetVisible(false);
+ layer_tree_host()->Composite(gfx::FrameTime::Now());
+
+ EndTest();
+ }
+
+ void DidCommit() override {
+ commit_count_++;
+ ASSERT_LE(commit_count_, 3);
+ }
+
+ void AfterTest() override {
+ EXPECT_EQ(3, commit_count_);
+
+ // Initial swap promise should have succeded.
+ {
+ base::AutoLock lock(swap_promise_result_[0].lock);
+ EXPECT_TRUE(swap_promise_result_[0].did_swap_called);
+ EXPECT_FALSE(swap_promise_result_[0].did_not_swap_called);
+ EXPECT_TRUE(swap_promise_result_[0].dtor_called);
+ }
+
+ // Second swap promise fails to swap.
+ {
+ base::AutoLock lock(swap_promise_result_[1].lock);
+ EXPECT_FALSE(swap_promise_result_[1].did_swap_called);
+ EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called);
+ EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason);
+ EXPECT_TRUE(swap_promise_result_[1].dtor_called);
+ }
+
+ // Third swap promises also fails to swap (and draw).
+ {
+ base::AutoLock lock(swap_promise_result_[2].lock);
+ EXPECT_FALSE(swap_promise_result_[2].did_swap_called);
+ EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called);
+ EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason);
+ EXPECT_TRUE(swap_promise_result_[2].dtor_called);
+ }
+ }
+
+ int commit_count_;
+ TestSwapPromiseResult swap_promise_result_[3];
+};
+
+// Impl-side painting is not supported for synchronous compositing.
+SINGLE_THREAD_NOIMPL_TEST_F(LayerTreeHostTestSynchronousCompositeSwapPromise);
+