1*4882a593Smuzhiyun#! /usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# BitBake Toaster Implementation 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Copyright (C) 2016 Intel Corporation 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunimport os 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunfrom django.test import TestCase 13*4882a593Smuzhiyunfrom django.core import management 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunfrom orm.models import signal_runbuilds 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunimport threading 18*4882a593Smuzhiyunimport time 19*4882a593Smuzhiyunimport subprocess 20*4882a593Smuzhiyunimport signal 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunclass KillRunbuilds(threading.Thread): 24*4882a593Smuzhiyun """ Kill the runbuilds process after an amount of time """ 25*4882a593Smuzhiyun def __init__(self, *args, **kwargs): 26*4882a593Smuzhiyun super(KillRunbuilds, self).__init__(*args, **kwargs) 27*4882a593Smuzhiyun self.setDaemon(True) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun def run(self): 30*4882a593Smuzhiyun time.sleep(5) 31*4882a593Smuzhiyun signal_runbuilds() 32*4882a593Smuzhiyun time.sleep(1) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."), 35*4882a593Smuzhiyun ".runbuilds.pid") 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun with open(pidfile_path) as pidfile: 38*4882a593Smuzhiyun pid = pidfile.read() 39*4882a593Smuzhiyun os.kill(int(pid), signal.SIGTERM) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunclass TestCommands(TestCase): 43*4882a593Smuzhiyun """ Sanity test that runbuilds executes OK """ 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun def setUp(self): 46*4882a593Smuzhiyun os.environ.setdefault("DJANGO_SETTINGS_MODULE", 47*4882a593Smuzhiyun "toastermain.settings_test") 48*4882a593Smuzhiyun os.environ.setdefault("BUILDDIR", 49*4882a593Smuzhiyun "/tmp/") 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun # Setup a real database if needed for runbuilds process 52*4882a593Smuzhiyun # to connect to 53*4882a593Smuzhiyun management.call_command('migrate') 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun def test_runbuilds_command(self): 56*4882a593Smuzhiyun kill_runbuilds = KillRunbuilds() 57*4882a593Smuzhiyun kill_runbuilds.start() 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun manage_py = os.path.join( 60*4882a593Smuzhiyun os.path.dirname(os.path.abspath(__file__)), 61*4882a593Smuzhiyun os.pardir, 62*4882a593Smuzhiyun os.pardir, 63*4882a593Smuzhiyun "manage.py") 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun command = "%s runbuilds" % manage_py 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun process = subprocess.Popen(command, 68*4882a593Smuzhiyun shell=True, 69*4882a593Smuzhiyun stdout=subprocess.PIPE, 70*4882a593Smuzhiyun stderr=subprocess.PIPE) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun (out, err) = process.communicate() 73*4882a593Smuzhiyun process.wait() 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun self.assertNotEqual(process.returncode, 1, 76*4882a593Smuzhiyun "Runbuilds returned an error %s" % err) 77