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

Unified Diff: third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h

Issue 2588403002: TestingPlatformSupport: register Platform instance correctly (Closed)
Patch Set: LocaleMacTest needed same caller side fix 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
Index: third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
diff --git a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h b/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
index 159c0febae33681c850788625010da4a68eee369..d9f49afecd2abe01dbf9d43f156d20e369e7e929 100644
--- a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
+++ b/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
@@ -37,6 +37,7 @@
#include "public/platform/WebCompositorSupport.h"
#include "public/platform/WebScheduler.h"
#include "public/platform/WebThread.h"
+#include "wtf/Assertions.h"
#include "wtf/Vector.h"
#include <memory>
@@ -107,6 +108,16 @@ class TestingPlatformMockScheduler : public WebScheduler {
void removePendingNavigation(WebScheduler::NavigatingFrameType) override {}
};
+// A base class to override Platform methods for testing. You can override
+// compositorSupport() method via a TestingPlatformSupport::Config parameter.
+// Other virtual Platform methods that are overriden in this class will call
+// the original Platform methods that can be obtained by Platform::current()
+// in the consturctor.
+// Or you may to consider to implement your own inheritance of this class to
+// override arbitorary virtual methods.
+// You should use ScopedTestingPlatformSupport to hold any instance of this
+// class and inheritances in order to setup and shutdown Platform instance
+// correctly. See also comments on ScopedTestingPlatformSupport.
class TestingPlatformSupport : public Platform {
WTF_MAKE_NONCOPYABLE(TestingPlatformSupport);
@@ -142,6 +153,8 @@ class TestingPlatformSupport : public Platform {
std::unique_ptr<TestingInterfaceProvider> m_interfaceProvider;
};
+// This class adds mocked scheduler support to TestingPlatformSupport. See also
+// comments on TestingPlatformSupport to use this class correctly.
class TestingPlatformSupportWithMockScheduler : public TestingPlatformSupport {
WTF_MAKE_NONCOPYABLE(TestingPlatformSupportWithMockScheduler);
@@ -188,6 +201,74 @@ class TestingPlatformSupportWithMockScheduler : public TestingPlatformSupport {
std::unique_ptr<WebThread> m_thread;
};
+// A template class to hold an instance of TestingPlatformSupport class and
+// inheritances. This class also sets the Platform inheritance to be available
+// through Platform::current(), and safely reset it to the previous instance
+// on destructing the instance. This instance could be nested.
+//
+// Usage:
+//
+// #include "wtf/PtrUtil.h"
+//
+// TEST_F(SampleTest, sampleTest) {
+// ScopedTestingPlatformSupport<MyTestingPlatformSupport> platform(
+// WTF::makeUnique<MyTestingPlatformSupport>(...));
+//
+// // Or can set an instance later.
+// platform.reset(WTF::makeUnique<MyTestingPlatformSupport>(...));
+// ...
+// // Can call methods of MyTestingPlatformSupport.
+// EXPECT_TRUE(platform->myMethodIsCalled());
+// }
+//
+// Note: A valid Platform instance should be already set before setting a
+// TestingPlatformSupport instance, and the original instance should outlive.
+// These conditions should be always true in usual use cases, but if you are
+// changing ScopedUnittestsEnvironmentSetup or something like that, you should
+// keep these restrictions in mind.
+template <class T>
+class ScopedTestingPlatformSupport {
+ public:
+ ScopedTestingPlatformSupport() : ScopedTestingPlatformSupport(nullptr) {}
+ explicit ScopedTestingPlatformSupport(
+ std::unique_ptr<T> testingPlatformSupport)
+ : m_originalPlatform(nullptr) {
+ reset(std::move(testingPlatformSupport));
+ }
+ void reset(std::unique_ptr<T> testingPlatformSupport) {
haraken 2017/01/11 13:03:38 This method is getting a bit too complicated. May
Takashi Toyoshima 2017/01/12 08:56:13 Original intention of this complicated logic was t
+ // Try obtaining a valid Platform instance to restore a valid instance
+ // always.
+ if (!m_originalPlatform)
+ m_originalPlatform = Platform::current();
+
+ // To set a TestingPlatformSupport instance, |m_originalPlatform| should be
+ // valid so that a valid instance could be always restored.
+ DCHECK(!testingPlatformSupport || m_originalPlatform);
+
+ // The old instance should be deleted before setting new Platform instance
+ // so to check if the TestingPlatformSupport was registered correctly in
+ // the TestingPlatformSupport's destructor.
+ m_testingPlatformSupport = std::move(testingPlatformSupport);
+
+ // To avoid calling setCurrentPlatformForTesting() with nullptr, do nothing
+ // if Platform::current() is still nullptr, and |testingPlatformSupport| is
+ // also nullptr. This may happen for stack-allocated instances.
+ if (!m_testingPlatformSupport && !m_originalPlatform)
+ return;
+
+ Platform::setCurrentPlatformForTesting(m_testingPlatformSupport
+ ? m_testingPlatformSupport.get()
+ : m_originalPlatform);
+ }
+ ~ScopedTestingPlatformSupport() { reset(nullptr); }
+ const T* operator->() const { return m_testingPlatformSupport.get(); }
+ T* operator->() { return m_testingPlatformSupport.get(); }
+
+ private:
+ Platform* m_originalPlatform;
+ std::unique_ptr<T> m_testingPlatformSupport;
+};
+
class ScopedUnittestsEnvironmentSetup {
WTF_MAKE_NONCOPYABLE(ScopedUnittestsEnvironmentSetup);
@@ -202,7 +283,7 @@ class ScopedUnittestsEnvironmentSetup {
std::unique_ptr<DummyPlatform> m_platform;
std::unique_ptr<cc_blink::WebCompositorSupportImpl> m_compositorSupport;
TestingPlatformSupport::Config m_testingPlatformConfig;
- std::unique_ptr<TestingPlatformSupport> m_testingPlatformSupport;
+ ScopedTestingPlatformSupport<TestingPlatformSupport> m_testingPlatformSupport;
Takashi Toyoshima 2017/01/12 08:56:13 Unfortunately, we can not use ScopedTestingPlatfor
};
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698