diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 060e93041ca0f..c5e2e81441784 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -80,6 +80,7 @@ FILE: ../../../flutter/flow/scene_update_context.cc FILE: ../../../flutter/flow/scene_update_context.h FILE: ../../../flutter/flow/skia_gpu_object.cc FILE: ../../../flutter/flow/skia_gpu_object.h +FILE: ../../../flutter/flow/skia_gpu_object_unittests.cc FILE: ../../../flutter/flow/texture.cc FILE: ../../../flutter/flow/texture.h FILE: ../../../flutter/flow/texture_unittests.cc diff --git a/flow/BUILD.gn b/flow/BUILD.gn index 3ecc8381c5d33..c2f0c98415a3e 100644 --- a/flow/BUILD.gn +++ b/flow/BUILD.gn @@ -114,6 +114,7 @@ executable("flow_unittests") { "matrix_decomposition_unittests.cc", "mutators_stack_unittests.cc", "raster_cache_unittests.cc", + "skia_gpu_object_unittests.cc", "texture_unittests.cc", ] @@ -121,6 +122,7 @@ executable("flow_unittests") { ":flow", ":flow_fixtures", "$flutter_root/fml", + "$flutter_root/testing:testing_lib", "//third_party/dart/runtime:libdart_jit", # for tracing "//third_party/googletest:gtest", "//third_party/skia", diff --git a/flow/skia_gpu_object.cc b/flow/skia_gpu_object.cc index fa0de8d05ce98..dd6c6b8436dff 100644 --- a/flow/skia_gpu_object.cc +++ b/flow/skia_gpu_object.cc @@ -15,7 +15,7 @@ SkiaUnrefQueue::SkiaUnrefQueue(fml::RefPtr task_runner, drain_pending_(false) {} SkiaUnrefQueue::~SkiaUnrefQueue() { - Drain(); + FML_DCHECK(objects_.empty()); } void SkiaUnrefQueue::Unref(SkRefCnt* object) { diff --git a/flow/skia_gpu_object_unittests.cc b/flow/skia_gpu_object_unittests.cc new file mode 100644 index 0000000000000..aa259a6909eec --- /dev/null +++ b/flow/skia_gpu_object_unittests.cc @@ -0,0 +1,50 @@ +// Copyright 2013 The Flutter 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 "flutter/flow/skia_gpu_object.h" +#include "flutter/fml/message_loop.h" +#include "flutter/fml/synchronization/waitable_event.h" +#include "flutter/fml/task_runner.h" +#include "flutter/testing/thread_test.h" +#include "gtest/gtest.h" +#include "third_party/skia/include/core/SkRefCnt.h" + +namespace flutter { +namespace testing { + +using SkiaGpuObjectTest = flutter::testing::ThreadTest; + +class TestSkObject : public SkRefCnt { + public: + TestSkObject(std::shared_ptr latch, + fml::TaskQueueId* dtor_task_queue_id) + : latch_(latch), dtor_task_queue_id_(dtor_task_queue_id) {} + + ~TestSkObject() { + *dtor_task_queue_id_ = fml::MessageLoop::GetCurrentTaskQueueId(); + latch_->Signal(); + } + + private: + std::shared_ptr latch_; + fml::TaskQueueId* dtor_task_queue_id_; +}; + +TEST_F(SkiaGpuObjectTest, UnrefQueue) { + fml::RefPtr task_runner = CreateNewThread(); + fml::RefPtr queue = fml::MakeRefCounted( + task_runner, fml::TimeDelta::FromSeconds(0)); + + std::shared_ptr latch = + std::make_shared(); + fml::TaskQueueId dtor_task_queue_id(0); + SkRefCnt* ref_object = new TestSkObject(latch, &dtor_task_queue_id); + + queue->Unref(ref_object); + latch->Wait(); + ASSERT_EQ(dtor_task_queue_id, task_runner->GetTaskQueueId()); +} + +} // namespace testing +} // namespace flutter diff --git a/testing/BUILD.gn b/testing/BUILD.gn index 037e7f6012fe6..a8db2229e29f5 100644 --- a/testing/BUILD.gn +++ b/testing/BUILD.gn @@ -9,6 +9,8 @@ source_set("testing_lib") { "$flutter_root/testing/assertions.h", "$flutter_root/testing/testing.cc", "$flutter_root/testing/testing.h", + "$flutter_root/testing/thread_test.cc", + "$flutter_root/testing/thread_test.h", ] public_deps = [ @@ -23,8 +25,6 @@ source_set("testing") { sources = [ "$flutter_root/testing/run_all_unittests.cc", - "$flutter_root/testing/thread_test.cc", - "$flutter_root/testing/thread_test.h", ] public_deps = [