commit:     0339031c22f3e30d95d1234ce08a47ae5df8e3f8
Author:     Felix Bier <flx.bier <AT> gmail <DOT> com>
AuthorDate: Tue May 18 20:53:11 2021 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon May 24 06:17:13 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=0339031c

Add unit tests for _shell_quote

This commit adds unit tests that cover the existing functionality of
_shell_quote, by checking that various special characters are
escaped/quoted correctly.

Signed-off-by: Felix Bier <felix.bier <AT> rohde-schwarz.com>
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/tests/ebuild/test_shell_quote.py | 79 ++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/lib/portage/tests/ebuild/test_shell_quote.py 
b/lib/portage/tests/ebuild/test_shell_quote.py
new file mode 100644
index 000000000..ce419488a
--- /dev/null
+++ b/lib/portage/tests/ebuild/test_shell_quote.py
@@ -0,0 +1,79 @@
+# Copyright 2021 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from portage import _shell_quote
+from portage.tests import TestCase
+
+class ShellQuoteTestCase(TestCase):
+
+       def testShellQuote(self):
+               test_data = [
+
+                       # String contains no special characters, should be 
preserved.
+                       ("abc","abc"),
+
+                       # String contains whitespace, should be double-quoted 
to prevent word splitting.
+                       ("abc xyz","\"abc xyz\""),
+                       ("abc  xyz","\"abc  xyz\""),
+                       (" abcxyz ","\" abcxyz \""),
+                       ("abc\txyz","\"abc\txyz\""),
+                       ("abc\t\txyz","\"abc\t\txyz\""),
+                       ("\tabcxyz\t","\"\tabcxyz\t\""),
+                       ("abc\nxyz","\"abc\nxyz\""),
+                       ("abc\n\nxyz","\"abc\n\nxyz\""),
+                       ("\nabcxyz\n","\"\nabcxyz\n\""),
+
+                       # String contains > or <, should be double-quoted to 
prevent redirection.
+                       ("abc>xyz","\"abc>xyz\""),
+                       ("abc>>xyz","\"abc>>xyz\""),
+                       (">abcxyz>","\">abcxyz>\""),
+                       ("abc<xyz","\"abc<xyz\""),
+                       ("abc<<xyz","\"abc<<xyz\""),
+                       ("<abcxyz<","\"<abcxyz<\""),
+
+                       # String contains =, should be double-quoted to prevent 
assignment.
+                       ("abc=xyz","\"abc=xyz\""),
+                       ("abc==xyz","\"abc==xyz\""),
+                       ("=abcxyz=","\"=abcxyz=\""),
+
+                       # String contains *, should be double-quoted to prevent 
globbing.
+                       ("abc*xyz","\"abc*xyz\""),
+                       ("abc**xyz","\"abc**xyz\""),
+                       ("*abcxyz*","\"*abcxyz*\""),
+
+                       # String contains $, should be escaped to prevent 
parameter expansion.
+                       # Also double-quoted, though not strictly needed.
+                       ("abc$xyz","\"abc\\$xyz\""),
+                       ("abc$$xyz","\"abc\\$\\$xyz\""),
+                       ("$abcxyz$","\"\\$abcxyz\\$\""),
+
+                       # String contains `, should be escaped to prevent 
command substitution.
+                       # Also double-quoted, though not strictly needed.
+                       ("abc`xyz","\"abc\\`xyz\""),
+                       ("abc``xyz","\"abc\\`\\`xyz\""),
+                       ("`abc`","\"\\`abc\\`\""),
+
+                       # String contains \, should be escaped to prevent it 
from escaping
+                       # the next character. Also double-quoted, though not 
strictly needed.
+                       ("abc\\xyz", "\"abc\\\\xyz\""),
+                       ("abc\\\\xyz", "\"abc\\\\\\\\xyz\""),
+                       ("\\abcxyz\\", "\"\\\\abcxyz\\\\\""),
+
+                       # String contains ", should be escaped to prevent it 
from unexpectedly
+                       # ending a previous double-quote or starting a new 
double-quote. Also
+                       # double-quoted, though not strictly needed.
+                       ("abc\"xyz","\"abc\\\"xyz\""),
+                       ("abc\"\"xyz","\"abc\\\"\\\"xyz\""),
+                       ("\"abcxyz\"","\"\\\"abcxyz\\\"\""),
+
+                       # String contains ', should be double-quoted to prevent 
it from unexpectedly
+                       # ending a previous single-quote or starting a new 
single-quote.
+                       ("abc'xyz","\"abc'xyz\""),
+                       ("abc''xyz","\"abc''xyz\""),
+                       ("'abcxyz'","\"'abcxyz'\""),
+
+               ]
+
+               for (data,expected_result) in test_data:
+                       result = _shell_quote(data)
+                       self.assertEqual(result, expected_result)

Reply via email to