Title: [265277] trunk/Tools
Revision
265277
Author
jbed...@apple.com
Date
2020-08-04 22:15:29 -0700 (Tue, 04 Aug 2020)

Log Message

[webkitcorepy] Add mocks.ContextStack
https://bugs.webkit.org/show_bug.cgi?id=214484

Reviewed by Dewei Zhu.

Add a class which allows a context leveraging mock to stack. This is useful when
mocking requests or subprocess, where a single function (or class of functions)
is handling calls that are destined for different for different mock handlers.

* Scripts/libraries/webkitcorepy/webkitcorepy/mocks: Added.
* Scripts/libraries/webkitcorepy/webkitcorepy/mocks/__init__.py: Added.
* Scripts/libraries/webkitcorepy/webkitcorepy/mocks/context_stack.py: Added.
(ContextStack): Class which stacks mock handlers.
* Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks: Added.
* Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/__init__.py: Added.
* Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/context_stack_unittest.py: Added.
(to_be_replaced): Function to be mocked
(ExampleStack): Example mock handler.
(ContextStack): Test suite.

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/ChangeLog (265276 => 265277)


--- trunk/Tools/ChangeLog	2020-08-05 04:19:05 UTC (rev 265276)
+++ trunk/Tools/ChangeLog	2020-08-05 05:15:29 UTC (rev 265277)
@@ -1,3 +1,25 @@
+2020-08-04  Jonathan Bedard  <jbed...@apple.com>
+
+        [webkitcorepy] Add mocks.ContextStack
+        https://bugs.webkit.org/show_bug.cgi?id=214484
+
+        Reviewed by Dewei Zhu.
+
+        Add a class which allows a context leveraging mock to stack. This is useful when
+        mocking requests or subprocess, where a single function (or class of functions)
+        is handling calls that are destined for different for different mock handlers.
+
+        * Scripts/libraries/webkitcorepy/webkitcorepy/mocks: Added.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/mocks/__init__.py: Added.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/mocks/context_stack.py: Added.
+        (ContextStack): Class which stacks mock handlers.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks: Added.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/__init__.py: Added.
+        * Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/context_stack_unittest.py: Added.
+        (to_be_replaced): Function to be mocked
+        (ExampleStack): Example mock handler.
+        (ContextStack): Test suite.
+
 2020-08-04  Fujii Hironori  <hironori.fu...@sony.com>
 
         [webkitcorepy] REGRESSION(r265254): autoinstaller is failing to execute setup.py on win32 Python

Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py (265276 => 265277)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py	2020-08-05 04:19:05 UTC (rev 265276)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py	2020-08-05 05:15:29 UTC (rev 265277)
@@ -29,7 +29,7 @@
 from webkitcorepy.version import Version
 from webkitcorepy.string_utils import BytesIO, StringIO, UnicodeIO, unicode
 
-version = Version(0, 1, 0)
+version = Version(0, 1, 1)
 
 from webkitcorepy.autoinstall import Package, AutoInstall
 if sys.version_info > (3, 0):

Copied: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/__init__.py (from rev 265276, trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py) (0 => 265277)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/__init__.py	                        (rev 0)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/__init__.py	2020-08-05 05:15:29 UTC (rev 265277)
@@ -0,0 +1,23 @@
+# Copyright (C) 2020 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from webkitcorepy.mocks.context_stack import ContextStack

Copied: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/context_stack.py (from rev 265276, trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py) (0 => 265277)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/context_stack.py	                        (rev 0)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/context_stack.py	2020-08-05 05:15:29 UTC (rev 265277)
@@ -0,0 +1,42 @@
+# Copyright (C) 2020 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+class ContextStack(object):
+
+    def __init__(self, cls):
+        self.previous = None
+        self.patches = []
+        self.cls = cls
+
+    def __enter__(self):
+        self.previous = self.top
+        self.cls.top = self
+        for patch in self.patches:
+            patch.__enter__()
+        return self
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        for patch in reversed(self.patches):
+            patch.__exit__(exc_type, exc_value, traceback)
+        self.cls.top = self.previous
+        self.previous = None

Copied: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/__init__.py (from rev 265276, trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py) (0 => 265277)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/__init__.py	                        (rev 0)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/__init__.py	2020-08-05 05:15:29 UTC (rev 265277)
@@ -0,0 +1,21 @@
+# Copyright (C) 2020 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Added: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/context_stack_unittest.py (0 => 265277)


--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/context_stack_unittest.py	                        (rev 0)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/tests/mocks/context_stack_unittest.py	2020-08-05 05:15:29 UTC (rev 265277)
@@ -0,0 +1,85 @@
+# Copyright (C) 2020 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import mock
+import unittest
+
+from webkitcorepy import mocks
+
+
+def to_be_replaced():
+    return None
+
+
+class ExampleStack(mocks.ContextStack):
+    top = None
+
+    def __init__(self):
+        super(ExampleStack, self).__init__(cls=ExampleStack)
+        self.patches.append(mock.patch(
+            'webkitcorepy.tests.mocks.context_stack_unittest.to_be_replaced',
+            new=lambda: str(self),
+        ))
+
+    @classmethod
+    def height(cls):
+        count = 0
+        current = cls.top
+        while current:
+            current = current.previous
+            count += 1
+        return count
+
+
+class ContextStack(unittest.TestCase):
+
+    def test_stacking(self):
+        stack_1 = ExampleStack()
+        stack_2 = ExampleStack()
+
+        self.assertIsNone(ExampleStack.top)
+        self.assertEqual(0, ExampleStack.height())
+        with stack_1:
+            self.assertEqual(1, ExampleStack.height())
+            self.assertEqual(ExampleStack.top, stack_1)
+            self.assertIsNone(ExampleStack.top.previous)
+
+            with stack_2:
+                self.assertEqual(2, ExampleStack.height())
+                self.assertEqual(ExampleStack.top, stack_2)
+                self.assertEqual(ExampleStack.top.previous, stack_1)
+
+            self.assertEqual(1, ExampleStack.height())
+            self.assertEqual(ExampleStack.top, stack_1)
+            self.assertIsNone(ExampleStack.top.previous)
+
+    def test_patch(self):
+        stack_1 = ExampleStack()
+        stack_2 = ExampleStack()
+
+        self.assertIsNone(to_be_replaced())
+        with stack_1:
+            self.assertEqual(str(stack_1), to_be_replaced())
+            with stack_2:
+                self.assertEqual(str(stack_2), to_be_replaced())
+
+            self.assertEqual(str(stack_1), to_be_replaced())
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to