1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/dist/tools/lazysponge/lazysponge_test.py
Gaëtan Harter 0528e0903f
dist/tools: add lazysponge tool
Write stdin to <outfile> if it is different from the previous content.

If data provided in stdin is the same as the data that was in <outfile>, it is
not modified so `last modification date` is not changed.
2018-08-20 11:34:49 +02:00

150 lines
4.7 KiB
Python
Executable File

#! /usr/bin/env python3
#
# Copyright (C) 2018 Gaëtan Harter <gaetan.harter@fu-berlin.de>
#
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
# directory for more details.
#
"""Test script for lazysponge."""
import os
import sys
import shutil
import tempfile
from io import StringIO, BytesIO
import unittest
from unittest import mock
import lazysponge
class TestLazysponge(unittest.TestCase):
"""Test the lazysponge script.
Tested using mocks for stdin.
"""
def setUp(self):
self.isatty_ret = False
self.isatty = mock.patch.object(
os, 'isatty', lambda _: self.isatty_ret).start()
self.tmpdir = tempfile.mkdtemp()
self.outfile = os.path.join(self.tmpdir, 'outfile')
self.argv = ['lazysponge', self.outfile]
mock.patch.object(sys, 'argv', self.argv).start()
self.stdin = mock.Mock()
self.stdin.fileno.return_value = 0
mock.patch.object(sys, 'stdin', self.stdin).start()
self.stdin.buffer = BytesIO()
def tearDown(self):
shutil.rmtree(self.tmpdir, ignore_errors=True)
mock.patch.stopall()
def test_write_one_file(self):
"""Test a simple case where we write one file without quiet output."""
first_input = b'First input\n'
# Write input once
self.stdin.buffer.write(first_input)
self.stdin.buffer.seek(0)
stderr = StringIO()
with mock.patch('sys.stderr', stderr):
lazysponge.main()
self.assertEqual(stderr.getvalue(), '')
# no errors
os.stat(self.outfile)
with open(self.outfile, 'rb') as outfd:
self.assertEqual(outfd.read(), first_input)
def test_write_two_times_and_update(self):
"""Test writing two times the same output plus a new one."""
first_input = b'First input\n'
updated_input = b'Second input\n'
stderr = StringIO()
self.argv.append('--verbose')
# File does not exist
with self.assertRaises(OSError):
os.stat(self.outfile)
# Write input once
self.stdin.buffer.write(first_input)
self.stdin.buffer.seek(0)
with mock.patch('sys.stderr', stderr):
lazysponge.main()
first_stat = os.stat(self.outfile)
with open(self.outfile, 'rb') as outfd:
self.assertEqual(outfd.read(), first_input)
self._truncate(self.stdin.buffer)
# compare stderr verbose output
errmsg = 'Replacing %s ( != 96022020c795ee69653958a3cb4bb083)\n'
self.assertEqual(stderr.getvalue(), errmsg % self.outfile)
self._truncate(stderr)
# Re-Write the same input
self.stdin.buffer.write(first_input)
self.stdin.buffer.seek(0)
with mock.patch('sys.stderr', stderr):
lazysponge.main()
second_stat = os.stat(self.outfile)
with open(self.outfile, 'rb') as outfd:
self.assertEqual(outfd.read(), first_input)
self._truncate(self.stdin.buffer)
# File has not been modified
self.assertEqual(first_stat, second_stat)
# compare stderr verbose output
errmsg = 'Keeping old %s (96022020c795ee69653958a3cb4bb083)\n'
self.assertEqual(stderr.getvalue(), errmsg % self.outfile)
self._truncate(stderr)
# Update with a new input
self.stdin.buffer.write(updated_input)
self.stdin.buffer.seek(0)
with mock.patch('sys.stderr', stderr):
lazysponge.main()
third_stat = os.stat(self.outfile)
with open(self.outfile, 'rb') as outfd:
self.assertEqual(outfd.read(), updated_input)
self._truncate(self.stdin.buffer)
# File is newer
self.assertGreater(third_stat, second_stat)
# compare stderr verbose output
errmsg = ('Replacing %s (96022020c795ee69653958a3cb4bb083'
' != 1015f2c7f2fc3d575b7aeb1e92c0f6bf)\n')
self.assertEqual(stderr.getvalue(), errmsg % self.outfile)
self._truncate(stderr)
@staticmethod
def _truncate(filefd):
filefd.seek(0)
filefd.truncate(0)
def test_no_tty_detection(self):
"""Test detecting that 'stdin' is not a tty."""
self.isatty_ret = True
stderr = StringIO()
with mock.patch('sys.stderr', stderr):
with self.assertRaises(SystemExit):
lazysponge.main()
not_a_tty = ('Interactive input not supported. Use piped input\n'
' echo message | {}\n'.format(' '.join(self.argv)))
self.assertEqual(stderr.getvalue(), not_a_tty)
if __name__ == '__main__':
unittest.main()