blob: a42448bf58fcf6858a5a9081b7d2718ed62d7989 [file] [log] [blame]
#!/usr/bin/python2
#
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for au_test."""
from __future__ import print_function
import os
import signal
import sys
import time
import unittest
import mock
from multiprocessing import Process, Value
import constants
sys.path.append(constants.CROS_PLATFORM_ROOT)
sys.path.append(constants.SOURCE_ROOT)
from crostestutils.au_test_harness.au_test import AUTest
class AuTestTest(unittest.TestCase):
"""Test for autest.AUTest."""
def testSigtermAndSigintHandled(self):
"""Tests that worker.CleanUp is always called."""
def _ChildProcess(shared_integer):
class _FakeWorker(object):
"""A fake worker class to use as a mock."""
def __init__(self, options, test_results_root):
pass
def CleanUp(self):
shared_integer.value = 1
with mock.patch.object(AUTest, 'SimpleTestVerify', autospec=True,
side_effect=lambda _: time.sleep(60)):
AUTest.worker_class = _FakeWorker
AUTest.options = None
AUTest.test_results_root = None
test_suite = unittest.TestSuite()
test_suite.addTest(AUTest('SimpleTestVerify'))
test_runner = unittest.TextTestRunner()
# This is going to block for 60 seconds.
test_runner.run(test_suite)
for signum in (signal.SIGINT, signal.SIGTERM):
# Start a child process to run VerifyImage.
shared_integer = Value('i', 0)
child = Process(target=_ChildProcess, args=(shared_integer,))
child.start()
# Wait till it gets into SimpleTestVerify.
time.sleep(2)
# Send signal to the child process - test should abort, and if signal is
# not caught and handled, the child will terminate without calling
# worker.CleanUp.
os.kill(child.pid, signum)
child.join()
# Assert that worker.CleanUp is called.
self.assertEqual(1, shared_integer.value)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(AuTestTest('testSigtermAndSigintHandled'))
unittest.TextTestRunner().run(suite)