Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Unified Diff: cc/surfaces/referenced_surface_tracker_unittest.cc

Issue 2632273003: Move ReferencedSurfaceTracker into GpuCompositorFrameSink. (Closed)
Patch Set: Fix iterator invalidation. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/surfaces/referenced_surface_tracker.cc ('k') | components/exo/compositor_frame_sink.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/surfaces/referenced_surface_tracker_unittest.cc
diff --git a/cc/surfaces/referenced_surface_tracker_unittest.cc b/cc/surfaces/referenced_surface_tracker_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..119b4a57bbe1721ac46799655218b9346b68f66f
--- /dev/null
+++ b/cc/surfaces/referenced_surface_tracker_unittest.cc
@@ -0,0 +1,179 @@
+// 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/surfaces/referenced_surface_tracker.h"
+
+#include <memory>
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "cc/surfaces/frame_sink_id.h"
+#include "cc/surfaces/surface_id.h"
+#include "cc/surfaces/surface_reference.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::UnorderedElementsAre;
+using testing::IsEmpty;
+using testing::SizeIs;
+
+namespace cc {
+namespace test {
+namespace {
+
+constexpr FrameSinkId kParentFrameSink(2, 1);
+constexpr FrameSinkId kChildFrameSink1(65563, 1);
+constexpr FrameSinkId kChildFrameSink2(65564, 1);
+
+std::vector<SurfaceId> empty_surface_ids() {
+ return std::vector<SurfaceId>();
+}
+
+SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) {
+ return SurfaceId(
+ frame_sink_id,
+ LocalFrameId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
+}
+
+} // namespace
+
+class ReferencedSurfaceTrackerTest : public testing::Test {
+ public:
+ ReferencedSurfaceTrackerTest() {}
+ ~ReferencedSurfaceTrackerTest() override {}
+
+ ReferencedSurfaceTracker& tracker() { return *tracker_; }
+
+ // testing::Test:
+ void SetUp() override {
+ testing::Test::SetUp();
+ tracker_ = base::MakeUnique<ReferencedSurfaceTracker>(kParentFrameSink);
+ }
+
+ void TearDown() override { tracker_.reset(); }
+
+ private:
+ std::unique_ptr<ReferencedSurfaceTracker> tracker_;
+
+ DISALLOW_COPY_AND_ASSIGN(ReferencedSurfaceTrackerTest);
+};
+
+TEST_F(ReferencedSurfaceTrackerTest, SetCurrentSurfaceId) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+
+ // Initially current_surface_id() should be invalid.
+ EXPECT_FALSE(tracker().current_surface_id().is_valid());
+
+ // After setting current SurfaceId then current_surface_id() should be valid.
+ tracker().UpdateReferences(parent_id.local_frame_id(), empty_surface_ids());
+ EXPECT_EQ(parent_id, tracker().current_surface_id());
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, RefSurface) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceReference reference(parent_id, child_id1);
+
+ // First frame has a reference to |child_id1|, check that reference is added.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1});
+ EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference));
+ EXPECT_THAT(tracker().references_to_remove(), IsEmpty());
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, NoChangeToReferences) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceReference reference(parent_id, child_id1);
+
+ // First frame has a reference to |child_id1|, check that reference is added.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1});
+ EXPECT_THAT(tracker().references_to_remove(), IsEmpty());
+ EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference));
+
+ // Second frame has same reference, check that no references are added or
+ // removed.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1});
+ EXPECT_THAT(tracker().references_to_remove(), IsEmpty());
+ EXPECT_THAT(tracker().references_to_add(), IsEmpty());
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, UnrefSurface) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceReference reference(parent_id, child_id1);
+
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1});
+
+ // Second frame no longer references |child_id1|, check that reference to is
+ // removed.
+ tracker().UpdateReferences(parent_id.local_frame_id(), empty_surface_ids());
+ EXPECT_THAT(tracker().references_to_add(), IsEmpty());
+ EXPECT_THAT(tracker().references_to_remove(),
+ UnorderedElementsAre(reference));
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, RefNewSurfaceForFrameSink) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId child_id1_first = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceId child_id1_second = MakeSurfaceId(kChildFrameSink1, 2);
+ const SurfaceReference reference_first(parent_id, child_id1_first);
+ const SurfaceReference reference_second(parent_id, child_id1_second);
+
+ // First frame has reference to |child_id1_first|.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1_first});
+ EXPECT_THAT(tracker().references_to_add(),
+ UnorderedElementsAre(reference_first));
+
+ // Second frame has reference to |child_id1_second| which has the same
+ // FrameSinkId but different LocalFrameId. Check that first reference is
+ // removed and second reference is added.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id1_second});
+ EXPECT_THAT(tracker().references_to_remove(),
+ UnorderedElementsAre(reference_first));
+ EXPECT_THAT(tracker().references_to_add(),
+ UnorderedElementsAre(reference_second));
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, UpdateParentSurfaceId) {
+ const SurfaceId parent_id_first = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId parent_id_second = MakeSurfaceId(kParentFrameSink, 2);
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceReference reference(parent_id_second, child_id1);
+
+ // First frame references |child_id1|.
+ tracker().UpdateReferences(parent_id_first.local_frame_id(), {child_id1});
+ EXPECT_THAT(tracker().references_to_add(), SizeIs(1));
+
+ // Second frame still reference |child_id1| but the parent SurfaceId has
+ // changed. The new parent SurfaceId should have a reference added to
+ // |child_id1|.
+ tracker().UpdateReferences(parent_id_second.local_frame_id(), {child_id1});
+ EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference));
+ EXPECT_THAT(tracker().references_to_remove(), IsEmpty());
+}
+
+TEST_F(ReferencedSurfaceTrackerTest, RefTwoThenUnrefOneSurface) {
+ const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+ const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 2);
+ const SurfaceReference reference1(parent_id, child_id1);
+ const SurfaceReference reference2(parent_id, child_id2);
+
+ // First frame references both surfaces.
+ tracker().UpdateReferences(parent_id.local_frame_id(),
+ {child_id1, child_id2});
+ EXPECT_THAT(tracker().references_to_add(),
+ UnorderedElementsAre(reference1, reference2));
+
+ // Second frame references only |child_id2|, check that reference to
+ // |child_id1| is removed.
+ tracker().UpdateReferences(parent_id.local_frame_id(), {child_id2});
+ EXPECT_THAT(tracker().references_to_remove(),
+ UnorderedElementsAre(reference1));
+ EXPECT_THAT(tracker().references_to_add(), IsEmpty());
+}
+
+} // namespace test
+} // namespace cc
« no previous file with comments | « cc/surfaces/referenced_surface_tracker.cc ('k') | components/exo/compositor_frame_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698