You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_tools/tests/create_temp_file_test.py

117 lines
4.2 KiB
Python

#!/usr/bin/env vpython3
# Copyright (c) 2022 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import unittest
import sys
import os
import io
import tempfile
from unittest.mock import patch
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT_DIR)
import create_temp_file
class TestCreateTempFileFromStdin(unittest.TestCase):
def setUp(self):
"""Set up test environment: capture stdout and stderr."""
self.held_stdout = sys.stdout
self.held_stderr = sys.stderr
self.new_stdout = io.StringIO()
self.new_stderr = io.StringIO()
sys.stdout = self.new_stdout
sys.stderr = self.new_stderr
def tearDown(self):
"""Clean up test environment: restore stdout and stderr."""
sys.stdout = self.held_stdout
sys.stderr = self.held_stderr
def _read_content_and_delete_file(self, file_path):
"""Helper to read content of a temporary file."""
with open(file_path, 'r', encoding='utf-8') as f:
ret = f.read()
os.remove(file_path)
return ret
@patch('sys.stdin', new_callable=io.StringIO)
def test_basic_text_input(self, mock_stdin):
"""Test with basic multi-line text input."""
test_content = "Hello, world!\nThis is a test.\n"
mock_stdin.write(test_content)
mock_stdin.seek(0) # Rewind the mock stdin to the beginning
create_temp_file.run()
# Get the output printed to stdout (the temp file path)
output = self.new_stdout.getvalue().strip()
self.assertTrue(os.path.exists(output)) # Check if file was created
# Verify content
file_content = self._read_content_and_delete_file(output)
self.assertEqual(self.new_stderr.getvalue(), "") # No errors on stderr
self.assertEqual(file_content, test_content)
@patch('sys.stdin', new_callable=io.StringIO)
def test_empty_input(self, mock_stdin):
"""Test with empty input from stdin."""
test_content = ""
mock_stdin.write(test_content)
mock_stdin.seek(0)
create_temp_file.run()
output = self.new_stdout.getvalue().strip()
self.assertTrue(os.path.exists(output)) # File should still be created
file_content = self._read_content_and_delete_file(output)
self.assertEqual(file_content, test_content)
self.assertFalse(os.path.exists(output))
self.assertEqual(self.new_stderr.getvalue(), "")
@patch('sys.stdin', new_callable=io.StringIO)
def test_with_prefix(self, mock_stdin):
"""Test if the --prefix argument is respected."""
test_content = "Prefix test content.\n"
mock_stdin.write(test_content)
mock_stdin.seek(0)
# Simulate argparse.args
mock_args = argparse.Namespace(prefix="myprefix_", suffix=None)
with patch('argparse.ArgumentParser.parse_args',
return_value=mock_args):
create_temp_file.run(prefix=mock_args.prefix)
output = self.new_stdout.getvalue().strip()
self.assertTrue(os.path.exists(output))
self.assertTrue(os.path.basename(output).startswith("myprefix_"))
file_content = self._read_content_and_delete_file(output)
self.assertEqual(file_content, test_content)
@patch('sys.stdin', new_callable=io.StringIO)
def test_with_suffix(self, mock_stdin):
"""Test if the --suffix argument is respected."""
test_content = "Suffix test content.\n"
mock_stdin.write(test_content)
mock_stdin.seek(0)
# Simulate argparse.args
mock_args = argparse.Namespace(prefix=None, suffix=".log")
with patch('argparse.ArgumentParser.parse_args',
return_value=mock_args):
create_temp_file.run(suffix=mock_args.suffix)
output = self.new_stdout.getvalue().strip()
self.assertTrue(os.path.exists(output))
self.assertTrue(os.path.basename(output).endswith(".log"))
file_content = self._read_content_and_delete_file(output)
self.assertEqual(file_content, test_content)
if __name__ == '__main__':
unittest.main()