summaryrefslogtreecommitdiffstats
path: root/contrib/python/websocket-client/websocket/tests/test_utils.py
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-10-22 11:36:42 +0300
committerrobot-piglet <[email protected]>2025-10-22 12:14:27 +0300
commit6a490d481992dac77fa8785bb4d6e6cafea36fa3 (patch)
tree28dac4c8ea239eedadc726b73a16514223e56389 /contrib/python/websocket-client/websocket/tests/test_utils.py
parentd924ab94175835dc15b389ee8969ff0ddfd35930 (diff)
Intermediate changes
commit_hash:6bfda3fd45ff19cb21e3edc6e8b7dad337978a7e
Diffstat (limited to 'contrib/python/websocket-client/websocket/tests/test_utils.py')
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_utils.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/contrib/python/websocket-client/websocket/tests/test_utils.py b/contrib/python/websocket-client/websocket/tests/test_utils.py
new file mode 100644
index 00000000000..deb9751bd16
--- /dev/null
+++ b/contrib/python/websocket-client/websocket/tests/test_utils.py
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+import sys
+import unittest
+from unittest.mock import patch
+
+"""
+test_utils.py
+websocket - WebSocket client library for Python
+
+Copyright 2025 engn33r
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+class UtilsTest(unittest.TestCase):
+ def test_nolock(self):
+ """Test NoLock context manager"""
+ from websocket._utils import NoLock
+
+ lock = NoLock()
+
+ # Test that it can be used as context manager
+ with lock:
+ pass # Should not raise any exception
+
+ # Test enter/exit methods directly
+ self.assertIsNone(lock.__enter__())
+ self.assertIsNone(lock.__exit__(None, None, None))
+
+ def test_utf8_validation_with_wsaccel(self):
+ """Test UTF-8 validation when wsaccel is available"""
+ # Import normally (wsaccel should be available in test environment)
+ from websocket._utils import validate_utf8
+
+ # Test valid UTF-8 strings (convert to bytes for wsaccel)
+ self.assertTrue(validate_utf8("Hello, World!".encode("utf-8")))
+ self.assertTrue(validate_utf8("🌟 Unicode test".encode("utf-8")))
+ self.assertTrue(validate_utf8(b"Hello, bytes"))
+ self.assertTrue(validate_utf8("Héllo with accénts".encode("utf-8")))
+
+ # Test invalid UTF-8 sequences
+ self.assertFalse(validate_utf8(b"\xff\xfe")) # Invalid UTF-8
+ self.assertFalse(validate_utf8(b"\x80\x80")) # Invalid continuation
+
+ def test_utf8_validation_fallback(self):
+ """Test UTF-8 validation fallback when wsaccel is not available"""
+ # Remove _utils from modules to force reimport
+ if "websocket._utils" in sys.modules:
+ del sys.modules["websocket._utils"]
+
+ # Mock wsaccel import to raise ImportError
+ import builtins
+
+ original_import = builtins.__import__
+
+ def mock_import(name, *args, **kwargs):
+ if "wsaccel" in name:
+ raise ImportError(f"No module named '{name}'")
+ return original_import(name, *args, **kwargs)
+
+ with patch("builtins.__import__", side_effect=mock_import):
+ import websocket._utils as utils
+
+ # Test valid UTF-8 strings with fallback implementation (convert strings to bytes)
+ self.assertTrue(utils.validate_utf8("Hello, World!".encode("utf-8")))
+ self.assertTrue(utils.validate_utf8(b"Hello, bytes"))
+ self.assertTrue(utils.validate_utf8("ASCII text".encode("utf-8")))
+
+ # Test Unicode strings (convert to bytes)
+ self.assertTrue(utils.validate_utf8("🌟 Unicode test".encode("utf-8")))
+ self.assertTrue(utils.validate_utf8("Héllo with accénts".encode("utf-8")))
+
+ # Test empty string/bytes
+ self.assertTrue(utils.validate_utf8("".encode("utf-8")))
+ self.assertTrue(utils.validate_utf8(b""))
+
+ # Test invalid UTF-8 sequences (should return False)
+ self.assertFalse(utils.validate_utf8(b"\xff\xfe"))
+ self.assertFalse(utils.validate_utf8(b"\x80\x80"))
+
+ # Note: The fallback implementation may have different validation behavior
+ # than wsaccel, so we focus on clearly invalid sequences
+
+ def test_extract_err_message(self):
+ """Test extract_err_message function"""
+ from websocket._utils import extract_err_message
+
+ # Test with exception that has args
+ exc_with_args = Exception("Test error message")
+ self.assertEqual(extract_err_message(exc_with_args), "Test error message")
+
+ # Test with exception that has multiple args
+ exc_multi_args = Exception("First arg", "Second arg")
+ self.assertEqual(extract_err_message(exc_multi_args), "First arg")
+
+ # Test with exception that has no args
+ exc_no_args = Exception()
+ self.assertIsNone(extract_err_message(exc_no_args))
+
+ def test_extract_error_code(self):
+ """Test extract_error_code function"""
+ from websocket._utils import extract_error_code
+
+ # Test with exception that has integer as first arg
+ exc_with_code = Exception(404, "Not found")
+ self.assertEqual(extract_error_code(exc_with_code), 404)
+
+ # Test with exception that has string as first arg
+ exc_with_string = Exception("Error message", "Second arg")
+ self.assertIsNone(extract_error_code(exc_with_string))
+
+ # Test with exception that has only one arg
+ exc_single_arg = Exception("Single arg")
+ self.assertIsNone(extract_error_code(exc_single_arg))
+
+ # Test with exception that has no args
+ exc_no_args = Exception()
+ self.assertIsNone(extract_error_code(exc_no_args))
+
+ def tearDown(self):
+ """Clean up after tests"""
+ # Ensure _utils is reimported fresh for next test
+ if "websocket._utils" in sys.modules:
+ del sys.modules["websocket._utils"]
+
+
+if __name__ == "__main__":
+ unittest.main()