2016-11-04 21:04:37 +00:00
#!/usr/bin/env python3
2014-01-09 17:43:15 +00:00
#
# Copyright (c) 2014,Thibault Saunier <thibault.saunier@collabora.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.
import os
2015-02-24 18:32:37 +00:00
import sys
2016-11-04 21:04:37 +00:00
from . import utils
import urllib . parse
from . import loggable
2016-12-22 13:08:24 +00:00
import multiprocessing
2014-04-30 13:40:10 +00:00
import argparse
2015-02-24 18:32:37 +00:00
import tempfile
2016-11-04 21:04:37 +00:00
from . import reporters
2014-07-16 08:35:34 +00:00
import subprocess
2014-04-30 13:40:10 +00:00
2014-01-09 17:43:15 +00:00
2016-11-04 21:04:37 +00:00
from . loggable import Loggable
from . httpserver import HTTPServer
from . vfb_server import get_virual_frame_buffer_server
from . baseclasses import _TestsLauncher , ScenarioManager
from . utils import printc , path2url , DEFAULT_MAIN_DIR , launch_command , Colors , Protocols , which
2014-04-30 13:40:10 +00:00
2015-02-24 18:32:37 +00:00
LESS = " less "
2014-04-30 13:40:10 +00:00
HELP = '''
== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
gst - validate - launcher
== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
1. Introduction
- - - - - - - - - - - - - - - -
2014-11-28 05:44:12 +00:00
gst - validate - launcher is a test launcher tool . It has been designed to
launch the various tools included in GstValidate , running tests on real
2014-04-30 13:40:10 +00:00
media files . This means that with gst - validate - launcher , you can launch
many tests automatically in one simple command . It then permits to
aggregate results and print them in a human readable way on stdout
and serializing them in the following implemented formats :
* % s
We support all the tools provided in GstValidate in the launcher , but
we also support ges - launch when the GStreamer Editing Services have
been compiled against GstValidate .
2. Default test suite
- - - - - - - - - - - - - - - - - - - - -
2015-02-24 18:08:12 +00:00
A default suite of tests is provided and is available at : http : / / cgit . freedesktop . org / gstreamer / gst - integration - testsuites /
You can run it pretty simply doing :
2014-04-30 13:40:10 +00:00
2015-07-16 01:28:18 +00:00
. $ gst - validate - launcher - - sync
2014-04-30 13:40:10 +00:00
That will download Gstreamer upstream default assets into the
default folder ( % s ) and run all currently
activated tests . Note that we use git - annex https : / / git - annex . branchable . com / so
you will need that tool to get started .
3. Implement your own tests
- - - - - - - - - - - - - - - - - - - - - - - - - - -
To implement new tests , you will just need to set the media path using the
2016-06-09 21:30:53 +00:00
- - medias - paths argument . If you want to run all available scenarios on all the
2014-04-30 13:40:10 +00:00
file present in that folder , you should run the first time :
2015-07-16 01:28:18 +00:00
. $ gst - validate - launcher - - medias - paths / path / to / media / files - - generate - media - info
2014-04-30 13:40:10 +00:00
2014-11-28 05:44:12 +00:00
That will generate the . media_info files that contains information about the media
files present in that folder . Those media_info files are simple XML file describing
the topology of the media files . You need not reuse - - generate - media - info from
next time . The generated media files will be used as a reference for following
runs . You might want to check that they contain the right information yourself
2014-04-30 13:40:10 +00:00
the first time .
2014-01-09 17:43:15 +00:00
2015-07-23 00:18:46 +00:00
Once . media - info is generated , you can update it using - - update - media - info .
2014-04-30 13:40:10 +00:00
Those . media_info are the files that are used by gst - validate - launcher to know
what media files can be used for the different scenarios . For example if a
file is not seekable , seeking scenarios will not be run on it etc . . .
3.1 Scenarios specific to a media file / stream :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2014-11-28 05:44:12 +00:00
It is possible that some scenarios are very specific to one media file . In that case ,
2014-04-30 13:40:10 +00:00
the . scenario file should be present in the same folder as the . media_info file and
be called similarly . For example for a file called / some / media / file . mp4 , the media_info
2015-03-19 11:22:39 +00:00
file will be called / some / media / file . media_info and a scenario that will seek to a position that
2014-04-30 13:40:10 +00:00
is known to fail would be called : / some / media / file . mp4 . seek_to_failing_pos . scenario and
gst - validate - launcher will run that scenario only on that media file .
3.2 Test media accessible through other protocols :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Currently gst - validate - launcher supports the following protocols :
* % s
It does not mean you can not test other protocols but it means that it has not been
properly tested .
To test medias that use those protocols , you should simply make sure that there
is a media descriptor file with . stream_info as an extension in your - - media - paths .
You can generate such a file doing :
. $ gst - validate - media - check - 1.0 http : / / devimages . apple . com / iphone / samples / bipbop / bipbopall . m3u8 - - output - file / somewhere / in / you / media / path / bipbop . stream_info
Once this is done , gst - validate - launcher will run the scenarios on those media files the
same way as if they were local files .
4. Debug gst - validate - launcher execution
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You can activate debug logs setting the environment variable GST_VALIDATE_LAUNCHER_DEBUG .
2014-11-28 05:44:12 +00:00
It uses the same syntax as PITIVI_DEBUG ( more information at :
2014-04-30 13:40:10 +00:00
http : / / wiki . pitivi . org / wiki / Bug_reporting #Debug_logs).
''' % ( " \n * " .join([reporter.name for reporter in
utils . get_subclasses ( reporters . Reporter , reporters . __dict__ ) ]
) ,
DEFAULT_MAIN_DIR ,
" \n * " . join ( [ getattr ( Protocols , att ) for att in
2015-08-04 13:21:16 +00:00
dir ( Protocols ) if isinstance ( getattr ( Protocols , att ) , str ) and not
att . startswith ( " _ " ) ] ) )
2014-01-22 23:15:54 +00:00
2014-12-02 14:41:17 +00:00
QA_ASSETS = " gst-integration-testsuites "
2014-02-12 10:20:06 +00:00
MEDIAS_FOLDER = " medias "
2015-01-13 18:07:04 +00:00
DEFAULT_GST_QA_ASSETS_REPO = " git://anongit.freedesktop.org/gstreamer/gst-integration-testsuites "
OLD_DEFAULT_GST_QA_ASSETS_REPO = " https://gitlab.com/thiblahute/gst-integration-testsuites.git "
2016-12-22 13:08:21 +00:00
DEFAULT_TESTSUITES_DIRS = [ os . path . join ( DEFAULT_MAIN_DIR , QA_ASSETS , " testsuites " ) ]
2014-01-09 17:43:15 +00:00
2014-10-24 12:23:52 +00:00
2014-07-16 08:35:34 +00:00
def download_assets ( options ) :
try :
launch_command ( " %s %s %s " % ( options . get_assets_command ,
options . remote_assets_url ,
options . clone_dir ) ,
fails = True )
except subprocess . CalledProcessError as e :
if " git " in options . get_assets_command :
m = " \n \n MAKE SURE YOU HAVE git INSTALLED! "
else :
m = " "
2014-10-24 12:23:52 +00:00
printc ( " Could not download assets \n \n Error: %s %s " % ( e , m ) ,
2014-07-16 08:35:34 +00:00
Colors . FAIL , True )
return False
return True
2014-10-24 12:23:52 +00:00
2014-04-30 13:40:10 +00:00
class PrintUsage ( argparse . Action ) :
2014-10-24 12:23:52 +00:00
2014-04-30 13:40:10 +00:00
def __init__ ( self , option_strings , dest = argparse . SUPPRESS , default = argparse . SUPPRESS , help = None ) :
2014-10-24 12:23:52 +00:00
super (
PrintUsage , self ) . __init__ ( option_strings = option_strings , dest = dest ,
default = default , nargs = 0 , help = help )
2014-04-30 13:40:10 +00:00
def __call__ ( self , parser , namespace , values , option_string = None ) :
print ( HELP )
parser . exit ( )
2014-10-24 12:23:52 +00:00
2014-12-02 09:02:09 +00:00
class LauncherConfig ( Loggable ) :
def __init__ ( self ) :
self . testsuites = [ ]
self . debug = False
self . forever = False
2016-10-29 14:22:31 +00:00
self . n_runs = None
2014-12-02 09:02:09 +00:00
self . fatal_error = False
self . wanted_tests = [ ]
self . blacklisted_tests = [ ]
self . list_tests = False
self . mute = False
self . no_color = False
self . generate_info = False
self . update_media_info = False
self . generate_info_full = False
self . long_limit = utils . LONG_TEST
self . config = None
2015-03-19 15:06:54 +00:00
self . valgrind = False
2015-11-10 16:43:54 +00:00
self . gdb = False
2015-04-17 18:37:21 +00:00
self . no_display = False
2014-12-02 09:02:09 +00:00
self . xunit_file = None
self . main_dir = utils . DEFAULT_MAIN_DIR
self . output_dir = None
self . logsdir = None
2016-12-22 13:08:28 +00:00
self . privatedir = None
2015-01-15 14:26:14 +00:00
self . redirect_logs = False
2016-12-22 13:08:24 +00:00
self . num_jobs = multiprocessing . cpu_count ( )
2014-12-02 09:02:09 +00:00
self . dest = None
self . _using_default_paths = False
2016-03-23 19:02:47 +00:00
# paths passed with --media-path, and not defined by a testsuite
self . user_paths = [ ]
2014-12-02 16:32:18 +00:00
self . paths = [ ]
2016-12-22 13:08:21 +00:00
self . testsuites_dirs = DEFAULT_TESTSUITES_DIRS
2014-12-02 09:02:09 +00:00
self . clone_dir = None
self . http_server_port = 8079
self . http_bandwith = 1024 * 1024
self . http_server_dir = None
self . httponly = False
self . get_assets_command = " git clone "
self . remote_assets_url = DEFAULT_GST_QA_ASSETS_REPO
self . sync = False
2015-08-04 13:21:16 +00:00
self . force_sync = False
2014-12-02 09:02:09 +00:00
self . sync_all = False
2016-11-16 13:47:21 +00:00
self . check_bugs_status = False
2014-12-02 09:02:09 +00:00
def cleanup ( self ) :
"""
Cleanup the options looking after user options have been parsed
"""
# Get absolute path for main_dir and base everything on that
self . main_dir = os . path . abspath ( self . main_dir )
# default for output_dir is MAINDIR
if not self . output_dir :
self . output_dir = self . main_dir
else :
self . output_dir = os . path . abspath ( self . output_dir )
2015-11-10 16:43:54 +00:00
if self . gdb :
self . logsdir = " stdout "
self . debug = True
self . num_jobs = 1
try :
subprocess . check_output ( " gdb --help " , shell = True )
except subprocess . CalledProcessError :
2016-06-09 21:30:53 +00:00
printc ( " Want to use gdb, but not available on the system " ,
2015-11-10 16:43:54 +00:00
Colors . FAIL )
return False
2014-12-02 09:02:09 +00:00
# other output directories
2015-01-15 14:26:14 +00:00
if self . logsdir in [ ' stdout ' , ' stderr ' ] :
# Allow -l stdout/stderr to work like -rl stdout/stderr
self . redirect_logs = self . logsdir
self . logsdir = None
2016-12-22 13:08:25 +00:00
if self . verbose :
self . redirect_logs = ' stdout '
self . logsdir = None
2014-12-02 09:02:09 +00:00
if self . logsdir is None :
self . logsdir = os . path . join ( self . output_dir , " logs " )
if self . dest is None :
self . dest = os . path . join ( self . output_dir , " rendered " )
2016-12-22 13:08:28 +00:00
self . privatedir = os . path . join ( self . output_dir , " launcher-private " )
2014-12-02 09:02:09 +00:00
if not os . path . exists ( self . dest ) :
os . makedirs ( self . dest )
2015-01-15 14:26:14 +00:00
if not os . path . exists ( self . logsdir ) :
os . makedirs ( self . logsdir )
2016-12-22 13:08:28 +00:00
if not os . path . exists ( self . privatedir ) :
os . makedirs ( self . privatedir )
2015-01-15 14:26:14 +00:00
2015-02-24 18:08:12 +00:00
if self . redirect_logs not in [ ' stdout ' , ' stderr ' , False ] :
2015-01-15 14:26:14 +00:00
printc ( " Log redirection ( %s ) must be either ' stdout ' or ' stderr ' . "
% self . redirect_logs , Colors . FAIL , True )
return False
2016-11-04 21:04:37 +00:00
if urllib . parse . urlparse ( self . dest ) . scheme == " " :
2014-12-02 09:02:09 +00:00
self . dest = path2url ( self . dest )
if self . no_color :
utils . desactivate_colors ( )
if self . clone_dir is None :
self . clone_dir = os . path . join ( self . main_dir , QA_ASSETS )
if not isinstance ( self . paths , list ) :
self . paths = [ self . paths ]
2016-03-23 19:02:47 +00:00
if not isinstance ( self . user_paths , list ) :
self . user_paths = [ self . user_paths ]
self . paths = list ( set ( self . paths ) . union ( set ( self . user_paths ) ) )
2014-12-02 09:02:09 +00:00
if self . generate_info_full is True :
self . generate_info = True
2015-08-04 13:21:16 +00:00
if self . sync_all is True or self . force_sync is True :
2014-12-02 09:02:09 +00:00
self . sync = True
if not self . sync and not os . path . exists ( self . clone_dir ) and \
self . clone_dir == os . path . join ( self . clone_dir , MEDIAS_FOLDER ) :
printc ( " Media path ( %s ) does not exists. Forgot to run --sync ? "
% self . clone_dir , Colors . FAIL , True )
return False
2014-12-08 09:09:57 +00:00
if ( self . main_dir != DEFAULT_MAIN_DIR or
self . clone_dir != QA_ASSETS ) and \
2016-12-22 13:08:21 +00:00
self . testsuites_dirs in DEFAULT_TESTSUITES_DIRS :
self . testsuites_dirs . insert ( 0 , os . path . join ( self . main_dir , self . clone_dir ,
" testsuites " ) )
2015-04-17 17:56:17 +00:00
if self . valgrind :
try :
subprocess . check_output ( " valgrind --help " , shell = True )
except subprocess . CalledProcessError :
2016-06-09 21:30:53 +00:00
printc ( " Want to use valgrind, but not available on the system " ,
2015-04-17 17:56:17 +00:00
Colors . FAIL )
return False
2014-12-02 09:02:09 +00:00
return True
2014-12-02 16:32:18 +00:00
def set_http_server_dir ( self , path ) :
if self . http_server_dir is not None :
2015-02-24 18:32:37 +00:00
printc ( " Server directory already set to %s " % self . http_server_dir )
2014-12-02 16:32:18 +00:00
return
self . http_server_dir = path
2015-07-16 11:27:11 +00:00
def add_paths ( self , paths , force = False ) :
if force is False :
if self . paths :
return
2014-12-02 09:02:09 +00:00
if not isinstance ( paths , list ) :
paths = [ paths ]
if self . _using_default_paths :
self . paths = paths
self . _using_default_paths = False
else :
for path in paths :
if path not in self . paths :
self . paths . append ( path )
2014-08-11 18:19:02 +00:00
def main ( libsdir ) :
2015-02-24 18:32:37 +00:00
if " --help " in sys . argv :
_help_message = HELP
else :
_help_message = " Use --help for the full help "
2016-12-22 13:08:21 +00:00
DEFAULT_TESTSUITES_DIRS . append ( os . path . join ( libsdir , " testsuites " ) )
2014-10-24 12:23:52 +00:00
parser = argparse . ArgumentParser (
2014-10-25 12:49:26 +00:00
formatter_class = argparse . RawTextHelpFormatter ,
2015-02-24 18:32:37 +00:00
prog = ' gst-validate-launcher ' , description = _help_message )
2014-11-28 23:03:04 +00:00
parser . add_argument ( ' testsuites ' , metavar = ' N ' , nargs = ' * ' ,
help = """ Lets you specify a file where the testsuite to execute is defined.
In the module if you want to work with a specific test manager ( s ) ( for example ,
' ges ' or ' validate ' ) , you should define the TEST_MANAGER variable in the
testsuite file ( it can be a list of test manager names )
In this file you should implement a setup_tests function . That function takes
a TestManager and the GstValidateLauncher option as parameters and return True
if it succeeded loading the tests , False otherwise .
You will be able to configure the TestManager with its various methods . This
function will be called with each TestManager usable , for example you will be
passed the ' validate ' TestManager in case the GstValidateManager launcher is
2016-06-09 21:30:53 +00:00
available . You should configure it using :
2014-11-28 23:03:04 +00:00
* test_manager . add_scenarios : which allows you to register a list of scenario names to be run
* test_manager . set_default_blacklist : Lets you set a list of tuple of the form :
( @regex_defining_blacklister_test_names , @reason_for_the_blacklisting )
* test_manager . add_generators : which allows you to register a list of #GstValidateTestsGenerator
to be used to generate tests
* test_manager . add_encoding_formats : : which allows you to register a list #MediaFormatCombination to be used for transcoding tests
You can also set default values with :
* test_manager . register_defaults : Sets default values for all parametters
* test_manager . register_default_test_generators : Sets default values for the TestsGenerators to be used
* test_manager . register_default_scenarios : Sets default values for the scenarios to be executed
* test_manager . register_default_encoding_formats : Sets default values for the encoding formats to be tested
Note that all testsuite should be inside python modules , so the directory should contain a __init__ . py file
""" ,
2015-04-10 16:19:40 +00:00
default = [ " validate " ] )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -d " , " --debug " , dest = " debug " ,
2014-10-24 12:23:52 +00:00
action = " store_true " ,
help = " Let user debug the process on timeout " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -f " , " --forever " , dest = " forever " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-10-24 12:23:52 +00:00
help = " Keep running tests until one fails " )
2016-10-29 14:22:31 +00:00
parser . add_argument ( " --n-runs " , dest = " n_runs " , action = ' store ' ,
help = " Number of runs, if the testsuites. "
" Meaning no failure will stop the testuite "
" run meanwhile. " , type = int ) ,
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -F " , " --fatal-error " , dest = " fatal_error " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-10-24 12:23:52 +00:00
help = " Stop on first fail " )
2016-02-23 10:29:56 +00:00
parser . add_argument ( " --fail-on-testlist-change " ,
dest = " fail_on_testlist_change " ,
action = " store_true " ,
help = " Fail the testsuite if a test has been added "
" or removed without being explicitely added/removed "
" from the testlist file. " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -t " , " --wanted-tests " , dest = " wanted_tests " ,
2014-10-24 12:23:52 +00:00
action = " append " ,
2014-11-28 05:44:12 +00:00
help = " Define the tests to execute, it can be a regex. "
" If it contains defaults_only, only default scenarios "
2014-10-24 12:23:52 +00:00
" will be executed " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -b " , " --blacklisted-tests " , dest = " blacklisted_tests " ,
2014-10-24 12:23:52 +00:00
action = " append " ,
help = " Define the tests not to execute, it can be a regex. " )
2016-11-16 13:47:21 +00:00
parser . add_argument ( " --check-bugs " , dest = " check_bugs_status " ,
action = " store_true " ,
help = " Check if the bug linked to blacklisted tests has "
" been marked as resolved. (only work with bugzilla "
" for the time being). " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -L " , " --list-tests " ,
2014-10-24 12:23:52 +00:00
dest = " list_tests " ,
action = " store_true " ,
help = " List tests and exit " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -m " , " --mute " , dest = " mute " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-11-28 05:44:12 +00:00
help = " Mute playback output, which means that we use "
2014-10-24 12:23:52 +00:00
" a fakesink " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -n " , " --no-color " , dest = " no_color " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-10-24 12:23:52 +00:00
help = " Set it to output no colored text in the terminal " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( " -g " , " --generate-media-info " , dest = " generate_info " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-10-24 12:23:52 +00:00
help = " Set it in order to generate the missing .media_infos files " )
2014-11-19 16:58:23 +00:00
parser . add_argument ( " --update-media-info " , dest = " update_media_info " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2016-12-22 13:08:30 +00:00
help = " Set it in order to update existing .media_infos files " )
2014-10-24 12:23:52 +00:00
parser . add_argument (
" -G " , " --generate-media-info-with-frame-detection " , dest = " generate_info_full " ,
2014-12-02 09:02:09 +00:00
action = " store_true " ,
2014-11-28 05:44:12 +00:00
help = " Set it in order to generate the missing .media_infos files. "
2014-10-25 12:49:26 +00:00
" It implies --generate-media-info but enabling frame detection " )
2014-05-07 09:30:09 +00:00
parser . add_argument ( " -lt " , " --long-test-limit " , dest = " long_limit " ,
2014-12-02 09:02:09 +00:00
action = ' store ' ,
2015-07-23 00:18:46 +00:00
help = " Defines the limit for which a test is considered as long (in seconds). "
" Note that 0 will enable all tests " , type = int ) ,
2016-09-01 01:39:18 +00:00
parser . add_argument ( " --dump-on-failure " , dest = " dump_on_failure " ,
action = " store_true " , default = False ,
help = " Dump logs to stdout when a test fails " )
2014-06-26 10:42:38 +00:00
parser . add_argument ( " -c " , " --config " , dest = " config " ,
2014-11-28 23:03:04 +00:00
help = " This is DEPRECATED, prefer using the testsuite format "
" to configure testsuites " )
2015-03-19 15:06:54 +00:00
parser . add_argument ( " -vg " , " --valgrind " , dest = " valgrind " ,
action = " store_true " ,
help = " Run the tests inside Valgrind " )
2015-11-10 16:43:54 +00:00
parser . add_argument ( " --gdb " , dest = " gdb " ,
action = " store_true " ,
help = " Run the tests inside gdb (implies "
" --output-dir=stdout and --jobs=1) " )
2015-04-17 18:37:21 +00:00
parser . add_argument ( " -nd " , " --no-display " , dest = " no_display " ,
action = " store_true " ,
2015-07-23 00:18:46 +00:00
help = " Run the tests without outputting graphics "
2015-04-17 18:37:21 +00:00
" on any display. It tries to run all graphical operation "
" in a virtual framebuffer. "
" Note that it is currently implemented only "
" for the X server thanks to Xvfb (which is requeried in that case) " )
2014-10-24 12:23:52 +00:00
dir_group = parser . add_argument_group (
" Directories and files to be used by the launcher " )
2014-04-30 09:52:00 +00:00
parser . add_argument ( ' --xunit-file ' , action = ' store ' ,
2014-10-24 12:23:52 +00:00
dest = ' xunit_file ' , metavar = " FILE " ,
2016-09-06 19:21:05 +00:00
help = ( " Path to xml file to store the xunit report in. " ) )
2014-04-30 09:52:00 +00:00
dir_group . add_argument ( " -M " , " --main-dir " , dest = " main_dir " ,
2014-10-24 12:23:52 +00:00
help = " Main directory where to put files. Default is %s " % DEFAULT_MAIN_DIR )
2016-12-22 13:08:21 +00:00
dir_group . add_argument ( " --testsuites-dir " , dest = " testsuites_dirs " , action = ' append ' ,
2014-11-28 23:03:04 +00:00
help = " Directory where to look for testsuites. Default is %s "
2016-12-22 13:08:21 +00:00
% DEFAULT_TESTSUITES_DIRS )
2014-04-30 09:52:00 +00:00
dir_group . add_argument ( " -o " , " --output-dir " , dest = " output_dir " ,
2014-10-24 12:23:52 +00:00
help = " Directory where to store logs and rendered files. Default is MAIN_DIR " )
2014-04-30 09:52:00 +00:00
dir_group . add_argument ( " -l " , " --logs-dir " , dest = " logsdir " ,
2015-01-15 14:26:14 +00:00
help = " Directory where to store logs, default is OUTPUT_DIR/logs. " )
2014-04-30 09:52:00 +00:00
dir_group . add_argument ( " -R " , " --render-path " , dest = " dest " ,
2014-10-24 12:23:52 +00:00
help = " Set the path to which projects should be rendered, default is OUTPUT_DIR/rendered " )
2016-03-23 19:02:47 +00:00
dir_group . add_argument ( " -p " , " --medias-paths " , dest = " user_paths " , action = " append " ,
2014-12-02 16:32:18 +00:00
help = " Paths in which to look for media files " )
2014-04-30 09:52:00 +00:00
dir_group . add_argument ( " -a " , " --clone-dir " , dest = " clone_dir " ,
2016-11-17 18:43:15 +00:00
help = " Paths where to clone the testuite to run. "
2014-12-02 16:32:18 +00:00
" default is MAIN_DIR/gst-integration-testsuites " )
2015-01-15 14:26:14 +00:00
dir_group . add_argument ( " -rl " , " --redirect-logs " , dest = " redirect_logs " ,
help = " Redirect logs to ' stdout ' or ' sdterr ' . " )
2016-12-22 13:08:25 +00:00
dir_group . add_argument ( " -v " , " --verbose " , dest = " verbose " ,
default = False , action = ' store_true ' ,
help = " Redirect logs to stdout. " )
2015-01-16 20:29:55 +00:00
dir_group . add_argument ( " -j " , " --jobs " , dest = " num_jobs " ,
2016-12-22 13:08:24 +00:00
help = " Number of tests to execute simultaneously "
" (Defaults to number of cores of the processor) " ,
2015-01-16 20:29:55 +00:00
type = int )
2014-02-06 16:24:30 +00:00
2014-10-24 12:23:52 +00:00
http_server_group = parser . add_argument_group (
" Handle the HTTP server to be created " )
http_server_group . add_argument (
" --http-server-port " , dest = " http_server_port " ,
2016-07-04 14:16:25 +00:00
help = " Port on which to run the http server on localhost " , type = int )
2014-10-24 12:23:52 +00:00
http_server_group . add_argument (
" --http-bandwith-limitation " , dest = " http_bandwith " ,
2014-10-25 12:49:26 +00:00
help = " The artificial bandwith limitation to introduce to the local server (in Bytes/sec) (default: 1 MBps) " )
2014-10-24 12:23:52 +00:00
http_server_group . add_argument (
" -s " , " --folder-for-http-server " , dest = " http_server_dir " ,
2014-10-25 12:49:26 +00:00
help = " Folder in which to create an http server on localhost. Default is PATHS " )
2014-05-07 10:21:49 +00:00
http_server_group . add_argument ( " --http-only " , dest = " httponly " ,
2014-12-02 09:02:09 +00:00
action = ' store_true ' ,
2014-10-24 12:23:52 +00:00
help = " Start the http server and quit " )
2014-02-06 16:24:30 +00:00
2014-04-30 09:52:00 +00:00
assets_group = parser . add_argument_group ( " Handle remote assets " )
2014-10-24 12:23:52 +00:00
assets_group . add_argument (
" --get-assets-command " , dest = " get_assets_command " ,
2014-10-25 12:49:26 +00:00
help = " Command to get assets " )
2014-04-30 09:52:00 +00:00
assets_group . add_argument ( " --remote-assets-url " , dest = " remote_assets_url " ,
2014-10-24 12:23:52 +00:00
help = " Url to the remote assets (default: %s ) " % DEFAULT_GST_QA_ASSETS_REPO )
2014-04-30 09:52:00 +00:00
assets_group . add_argument ( " -S " , " --sync " , dest = " sync " , action = " store_true " ,
2014-12-02 09:02:09 +00:00
help = " Synchronize asset repository " )
2015-08-04 13:21:16 +00:00
assets_group . add_argument ( " -fs " , " --force-sync " , dest = " force_sync " , action = " store_true " ,
help = " Synchronize asset repository reseting any change that might have "
" happened in the testsuite " )
2014-11-28 21:58:09 +00:00
assets_group . add_argument ( " --sync-all " , dest = " sync_all " , action = " store_true " ,
2014-12-02 09:02:09 +00:00
help = " Synchronize asset repository, "
2014-11-28 21:58:09 +00:00
" including big media files " )
assets_group . add_argument ( " --usage " , action = PrintUsage ,
2014-10-24 12:23:52 +00:00
help = " Print usage documentation " )
2014-01-10 10:36:10 +00:00
2014-01-09 17:43:15 +00:00
loggable . init ( " GST_VALIDATE_LAUNCHER_DEBUG " , True , False )
2015-03-18 16:05:19 +00:00
tests_launcher = _TestsLauncher ( libsdir )
tests_launcher . add_options ( parser )
2015-02-24 18:32:37 +00:00
if _help_message == HELP and which ( LESS ) :
2016-11-04 21:04:37 +00:00
tmpf = tempfile . NamedTemporaryFile ( mode = ' r+ ' )
2015-02-24 18:32:37 +00:00
parser . print_help ( file = tmpf )
exit ( os . system ( " %s %s " % ( LESS , tmpf . name ) ) )
2014-12-02 09:02:09 +00:00
options = LauncherConfig ( )
parser . parse_args ( namespace = options )
if not options . cleanup ( ) :
exit ( 1 )
2014-04-15 13:26:36 +00:00
2015-04-10 16:11:09 +00:00
if options . remote_assets_url and options . sync and not os . path . exists ( options . clone_dir ) :
if not download_assets ( options ) :
exit ( 1 )
2014-01-09 17:43:15 +00:00
2014-02-12 10:18:14 +00:00
# Ensure that the scenario manager singleton is ready to be used
ScenarioManager ( ) . config = options
2016-09-05 15:16:59 +00:00
if not tests_launcher . set_settings ( options , [ ] ) :
exit ( 1 )
2014-03-19 16:04:14 +00:00
if options . list_tests :
2016-12-22 13:08:23 +00:00
if tests_launcher . list_tests ( ) == - 1 :
printc ( " \n Failling as tests have been removed/added "
" (--fail-on-testlist-change) " , Colors . FAIL )
exit ( 1 )
2014-03-19 16:04:14 +00:00
l = tests_launcher . tests
for test in l :
printc ( test )
2014-04-25 08:23:21 +00:00
2014-10-24 12:23:52 +00:00
printc ( " \n Number of tests: %d " % len ( l ) , Colors . OKGREEN )
2014-03-19 16:04:14 +00:00
return 0
2014-01-13 16:31:57 +00:00
httpsrv = HTTPServer ( options )
2014-05-07 10:21:49 +00:00
if tests_launcher . needs_http_server ( ) or options . httponly is True :
2014-01-13 16:31:57 +00:00
httpsrv . start ( )
2015-04-17 18:37:21 +00:00
vfb_server = get_virual_frame_buffer_server ( options )
if options . no_display :
res = vfb_server . start ( )
if res [ 0 ] is False :
printc ( " Could not start virtual frame server: %s " % res [ 1 ] ,
Colors . FAIL )
exit ( 1 )
os . environ [ " DISPLAY " ] = vfb_server . display_id
2014-05-07 10:21:49 +00:00
if options . httponly is True :
2015-08-04 13:21:16 +00:00
print ( " Running HTTP server only " )
2014-05-07 10:21:49 +00:00
return
2016-05-15 09:34:21 +00:00
# There seems to be some issue with forking, dconf and some gtype
# initialization that deadlocks occasionally, setting the
# GSettings backend make it go away.
# Also happened here: https://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/tests/check/Makefile.am?id=8e2c1d1de56bddbff22170f8b17473882e0e63f9
os . environ [ ' GSETTINGS_BACKEND ' ] = " memory "
2016-11-04 21:04:37 +00:00
exception = None
2014-01-13 16:31:57 +00:00
try :
tests_launcher . run_tests ( )
except Exception as e :
2016-11-04 21:04:37 +00:00
exception = e
2014-01-13 16:31:57 +00:00
pass
finally :
2014-07-23 15:49:21 +00:00
tests_launcher . final_report ( )
2016-09-02 20:39:50 +00:00
tests_launcher . clean_tests ( )
2014-01-13 16:31:57 +00:00
httpsrv . stop ( )
2015-04-17 18:37:21 +00:00
vfb_server . stop ( )
2016-11-04 21:04:37 +00:00
if exception is not None :
raise exception
2014-01-09 17:43:15 +00:00
return 0