xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/tests/commands/test_runbuilds.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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