bitbake: toaster: tests Add management command tests
Add some simple sanity tests for the management commands that we use for Toaster. Can be executed with ./manage.py test tests.commands For faster execution use the test settings and keepdb flag: DJANGO_SETTINGS_MODULE=toastermain.settings_test ./manage.py test tests.commands --keepdb (Bitbake rev: 161ea71519e7f70d4aadaafc9c3294a12612f0cb) Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
310a9e5d35
commit
4477a762bd
|
@ -0,0 +1,61 @@
|
|||
#! /usr/bin/env python
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2016 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from django.test import TestCase
|
||||
from django.core import management
|
||||
|
||||
from orm.models import Layer_Version, Layer, Release, ToasterSetting
|
||||
|
||||
|
||||
class TestLoadDataFixtures(TestCase):
|
||||
""" Test loading our 3 provided fixtures """
|
||||
def test_run_loaddata_poky_command(self):
|
||||
management.call_command('loaddata', 'poky')
|
||||
|
||||
num_releases = Release.objects.count()
|
||||
|
||||
self.assertTrue(
|
||||
Layer_Version.objects.filter(
|
||||
layer__name="meta-poky").count() == num_releases,
|
||||
"Loaded poky fixture but don't have a meta-poky for all releases"
|
||||
" defined")
|
||||
|
||||
def test_run_loaddata_oecore_command(self):
|
||||
management.call_command('loaddata', 'oe-core')
|
||||
|
||||
# We only have the one layer for oe-core setup
|
||||
self.assertTrue(
|
||||
Layer.objects.filter(name="openembedded-core").count() > 0,
|
||||
"Loaded oe-core fixture but still have no openemebedded-core"
|
||||
" layer")
|
||||
|
||||
def test_run_loaddata_settings_command(self):
|
||||
management.call_command('loaddata', 'settings')
|
||||
|
||||
self.assertTrue(
|
||||
ToasterSetting.objects.filter(name="DEFAULT_RELEASE").count() > 0,
|
||||
"Loaded settings but have no DEFAULT_RELEASE")
|
||||
|
||||
self.assertTrue(
|
||||
ToasterSetting.objects.filter(
|
||||
name__startswith="DEFCONF").count() > 0,
|
||||
"Loaded settings but have no DEFCONF (default project "
|
||||
"configuration values)")
|
|
@ -0,0 +1,45 @@
|
|||
#! /usr/bin/env python
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2016 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from django.test import TestCase
|
||||
from django.core import management
|
||||
|
||||
from orm.models import Layer_Version, Machine, Recipe
|
||||
|
||||
|
||||
class TestLayerIndexUpdater(TestCase):
|
||||
def test_run_lsupdates_command(self):
|
||||
# Load some release information for us to fetch from the layer index
|
||||
management.call_command('loaddata', 'poky')
|
||||
|
||||
old_layers_count = Layer_Version.objects.count()
|
||||
old_recipes_count = Recipe.objects.count()
|
||||
old_machines_count = Machine.objects.count()
|
||||
|
||||
# Now fetch the metadata from the layer index
|
||||
management.call_command('lsupdates')
|
||||
|
||||
self.assertTrue(Layer_Version.objects.count() > old_layers_count,
|
||||
"lsupdates ran but we still have no more layers!")
|
||||
self.assertTrue(Recipe.objects.count() > old_recipes_count,
|
||||
"lsupdates ran but we still have no more Recipes!")
|
||||
self.assertTrue(Machine.objects.count() > old_machines_count,
|
||||
"lsupdates ran but we still have no more Machines!")
|
|
@ -0,0 +1,88 @@
|
|||
#! /usr/bin/env python
|
||||
# ex:ts=4:sw=4:sts=4:et
|
||||
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# BitBake Toaster Implementation
|
||||
#
|
||||
# Copyright (C) 2016 Intel Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
import os
|
||||
|
||||
from django.test import TestCase
|
||||
from django.core import management
|
||||
|
||||
from orm.models import signal_runbuilds
|
||||
|
||||
import threading
|
||||
import time
|
||||
import subprocess
|
||||
import signal
|
||||
|
||||
|
||||
class KillRunbuilds(threading.Thread):
|
||||
""" Kill the runbuilds process after an amount of time """
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(KillRunbuilds, self).__init__(*args, **kwargs)
|
||||
self.setDaemon(True)
|
||||
|
||||
def run(self):
|
||||
time.sleep(5)
|
||||
signal_runbuilds()
|
||||
time.sleep(1)
|
||||
|
||||
pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."),
|
||||
".runbuilds.pid")
|
||||
|
||||
with open(pidfile_path) as pidfile:
|
||||
pid = pidfile.read()
|
||||
os.kill(int(pid), signal.SIGTERM)
|
||||
|
||||
|
||||
class TestCommands(TestCase):
|
||||
""" Sanity test that runbuilds executes OK """
|
||||
|
||||
def setUp(self):
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
|
||||
"toastermain.settings_test")
|
||||
os.environ.setdefault("BUILDDIR",
|
||||
"/tmp/")
|
||||
|
||||
# Setup a real database if needed for runbuilds process
|
||||
# to connect to
|
||||
management.call_command('migrate')
|
||||
|
||||
def test_runbuilds_command(self):
|
||||
kill_runbuilds = KillRunbuilds()
|
||||
kill_runbuilds.start()
|
||||
|
||||
manage_py = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
os.pardir,
|
||||
os.pardir,
|
||||
"manage.py")
|
||||
|
||||
command = "%s runbuilds" % manage_py
|
||||
|
||||
process = subprocess.Popen(command,
|
||||
shell=True,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
|
||||
(out, err) = process.communicate()
|
||||
process.wait()
|
||||
|
||||
self.assertNotEqual(process.returncode, 1,
|
||||
"Runbuilds returned an error %s" % err)
|
Loading…
Reference in New Issue