blob: 117315db3d7e1288ffd049030038f100f712bc6e [file] [log] [blame] [edit]
# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for the shebang.py module."""
from chromite.lib import cros_test_lib
from chromite.utils.parser import shebang
class SplitShebangTest(cros_test_lib.TestCase):
"""Test the SplitShebang function."""
def testSimple(self):
"""Test a simple case."""
self.assertEqual(("/bin/sh", ""), shebang.parse("#!/bin/sh"))
def testWithArguments(self):
"""Test a case with arguments."""
self.assertEqual(
("/bin/sh", '-i -c "ls"'),
shebang.parse('#!/bin/sh -i -c "ls"'),
)
def testWithEndline(self):
"""Test a case finished with a newline char."""
self.assertEqual(("/bin/sh", "-i"), shebang.parse("#!/bin/sh -i\n"))
def testMultiLine(self):
"""Verify multiline inputs where we only parse the first."""
self.assertEqual(
("/bin/sh", "-i"), shebang.parse("#!/bin/sh -i\n# My program\n")
)
def testWithSpaces(self):
"""Test a case with several spaces in the line."""
self.assertEqual(
("/bin/sh", "-i"), shebang.parse("#! /bin/sh -i \n")
)
def testWithArgSpaces(self):
"""Test arguments with spaces in them."""
self.assertEqual(
("/bin/sh", "-e -x"), shebang.parse("#!/bin/sh -e -x\n")
)
def testValidBytes(self):
"""Test bytes inputs."""
self.assertEqual(("/foo", "-v"), shebang.parse(b"#!/foo -v"))
def testInvalidBytes(self):
"""Test bytes input but not valid UTF-8."""
self.assertRaises(ValueError, shebang.parse, b"#!/fo\xff")
def testInvalidCases(self):
"""Thes invalid cases."""
self.assertRaises(ValueError, shebang.parse, "/bin/sh -i")
self.assertRaises(ValueError, shebang.parse, "#!")
self.assertRaises(ValueError, shebang.parse, "#!env python")
def testRealCommand(self):
"""Test real_command helper."""
# If /usr/bin/env has an arg, that's the real command.
result = shebang.parse("#!/usr/bin/env ls")
assert result.command == "/usr/bin/env"
assert result.real_command == "ls"
# If /usr/bin/env doesn't have an arg, then env is the real command.
result = shebang.parse("#!/usr/bin/env")
assert result.command == "/usr/bin/env"
assert result.real_command == "/usr/bin/env"
# Don't skip non-wrapper tools.
result = shebang.parse("#!/bin/foo -x")
assert result.command == "/bin/foo"
assert result.real_command == "/bin/foo"