build: turn on integration tests in ctest by default (#1381)

They can still be skipped by passing `-DSKIP_INTEGRATION_TESTS=ON` for
the build configuration. Fix integration tests so they run correctly when building out of tree.

Use FindPython3 in CMake to fix build and integration tests on Windows.
pull/1390/head
Cosmin Stejerean 2024-04-19 07:56:49 -07:00 committed by GitHub
parent ceeb378a85
commit 84009d82ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 89 additions and 57 deletions

View File

@ -26,7 +26,7 @@ option(FULLY_STATIC "Attempt fully static linking of all CLI apps" OFF)
# Enable CMake's test infrastructure.
enable_testing()
option(SKIP_INTEGRATION_TESTS "Skip the packager integration tests" ON)
option(SKIP_INTEGRATION_TESTS "Skip the packager integration tests" OFF)
# Subdirectories with their own CMakeLists.txt
add_subdirectory(packager)

View File

@ -13,7 +13,7 @@ if(BUILD_SHARED_LIBS)
# Custom commands aren't targets, but have outputs.
add_custom_command(
DEPENDS mpd_generator packager libpackager
DEPENDS mpd_generator packager libpackager pssh_box_py
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
OUTPUT ${TEST_INSTALL_DIR}
COMMAND

View File

@ -66,6 +66,11 @@ include("gtest.cmake")
# Include our module for building protos.
include("protobuf.cmake")
# Find Python3 used by integration tests, license notice and version string
if(NOT Python3_EXECUTABLE)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
endif()
# Subdirectories with their own CMakeLists.txt, all of whose targets are built.
add_subdirectory(file)
add_subdirectory(kv_pairs)
@ -228,9 +233,22 @@ add_custom_target(packager_test_py_copy ALL
if(NOT SKIP_INTEGRATION_TESTS)
add_test (NAME packager_test_py
COMMAND ${PYTHON_EXECUTABLE} packager_test.py
COMMAND "${Python3_EXECUTABLE}" packager_test.py
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
set(test_environment_vars "PACKAGER_SRC_DIR=${CMAKE_SOURCE_DIR}")
list(APPEND test_environment_vars "PACKAGER_BIN=$<TARGET_FILE:packager>")
list(APPEND test_environment_vars "MPD_GENERATOR_BIN=$<TARGET_FILE:mpd_generator>")
if(BUILD_SHARED_LIBS)
list(APPEND test_environment_vars "BUILD_TYPE=shared")
else()
list(APPEND test_environment_vars "BUILD_TYPE=static")
endif()
set_tests_properties(packager_test_py PROPERTIES
ENVIRONMENT "${test_environment_vars}"
)
endif()
configure_file(packager.pc.in packager.pc @ONLY)
@ -238,12 +256,6 @@ configure_file(packager.pc.in packager.pc @ONLY)
# Always install the binaries.
install(TARGETS mpd_generator packager)
# Always install the python tools.
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/pssh-box.py
DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pssh-box-protos
DESTINATION ${CMAKE_INSTALL_BINDIR})
# With shared libraries, also install the library, headers, and pkgconfig.
# The static library isn't usable as a standalone because it doesn't include
# its static dependencies (zlib, absl, etc).

View File

@ -17,10 +17,8 @@ class PackagerApp(object):
"""Main integration class for testing the packager binaries."""
def __init__(self):
self.packager_binary = os.path.join(test_env.SCRIPT_DIR,
self._GetBinaryName('packager'))
self.mpd_generator_binary = os.path.join(
test_env.SCRIPT_DIR, self._GetBinaryName('mpd_generator'))
self.packager_binary = test_env.PACKAGER_BIN
self.mpd_generator_binary = test_env.MPD_GENERATOR_BIN
# Set this to empty for now in case GetCommandLine() is called before
# Package().
self.packaging_command_line = ''
@ -28,15 +26,10 @@ class PackagerApp(object):
'Please run from output directory, e.g. out/Debug/packager_test.py\n'
' Missing: ' + self.packager_binary)
def _GetBinaryName(self, name):
if platform.system() == 'Windows':
name += '.exe'
return name
def GetEnv(self):
env = os.environ.copy()
if (platform.system() == 'Darwin' and
test_env.options.libpackager_type == 'shared_library'):
test_env.BUILD_TYPE == 'shared'):
env['DYLD_FALLBACK_LIBRARY_PATH'] = test_env.SCRIPT_DIR
return env

View File

@ -485,7 +485,7 @@ class PackagerAppTest(unittest.TestCase):
use_fake_clock=True,
allow_codec_switching=False,
dash_force_segment_list=False,
force_cl_index=False):
force_cl_index=None):
flags = ['--single_threaded']
@ -570,8 +570,10 @@ class PackagerAppTest(unittest.TestCase):
if allow_codec_switching:
flags += ['--allow_codec_switching']
if force_cl_index:
if force_cl_index is True:
flags += ['--force_cl_index']
elif force_cl_index is False:
flags += ['--noforce_cl_index']
if ad_cues:
flags += ['--ad_cues', ad_cues]
@ -754,7 +756,8 @@ class PackagerFunctionalTest(PackagerAppTest):
self._GetStream('video', trick_play_factor=2),
]
self.assertPackageSuccess(streams, self._GetFlags(output_dash=True))
self.assertPackageSuccess(streams, self._GetFlags(output_dash=True,
force_cl_index=False))
self._CheckTestResults('audio-video-with-two-trick-play')
def testAudioVideoWithTwoTrickPlayDecreasingRate(self):
@ -765,7 +768,8 @@ class PackagerFunctionalTest(PackagerAppTest):
self._GetStream('video', trick_play_factor=1),
]
self.assertPackageSuccess(streams, self._GetFlags(output_dash=True))
self.assertPackageSuccess(streams, self._GetFlags(output_dash=True,
force_cl_index=False))
# Since the stream descriptors are sorted in packager app, a different
# order of trick play factors gets the same mpd.
self._CheckTestResults('audio-video-with-two-trick-play')
@ -1510,8 +1514,8 @@ class PackagerFunctionalTest(PackagerAppTest):
# TODO(kqyang): Fix shared_library not supporting strip_parameter_set_nalus
# problem.
@unittest.skipUnless(
test_env.options.libpackager_type == 'static_library',
@unittest.skipIf(
test_env.BUILD_TYPE == 'shared',
'libpackager shared_library does not support '
'--strip_parameter_set_nalus flag.'
)

View File

@ -14,21 +14,38 @@ flags through the command line interface.
import argparse
import os
import platform
import sys
def GetBinaryName(name):
if platform.system() == 'Windows':
name += '.exe'
return name
# Define static global objects and attributes.
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
SRC_DIR = os.path.join(SCRIPT_DIR, os.pardir, os.pardir)
SRC_DIR = os.environ.get('PACKAGER_SRC_DIR')
if not SRC_DIR:
# fallback to computing src dir from script dir
SRC_DIR = os.path.join(SCRIPT_DIR, os.pardir, os.pardir)
PACKAGER_BIN = os.environ.get('PACKAGER_BIN')
if not PACKAGER_BIN:
PACKAGER_BIN = os.path.join(SCRIPT_DIR,
GetBinaryName('packager'))
MPD_GENERATOR_BIN = os.environ.get('MPD_GENERATOR_BIN')
if not MPD_GENERATOR_BIN:
MPD_GENERATOR_BIN = os.path.join(SCRIPT_DIR,
GetBinaryName('mpd_generator'))
BUILD_TYPE = os.environ.get('BUILD_TYPE', 'static')
# Parse arguments and calculate dynamic global objects and attributes.
parser = argparse.ArgumentParser()
parser.add_argument('--test_update_golden_files', action='store_true')
parser.add_argument('--libpackager_type', default='static_library',
choices=['static_library', 'shared_library'])
parser.add_argument('--v')
parser.add_argument('--vmodule')
# Overwrite the test to encryption key/iv specified in the command line.

View File

@ -2,8 +2,31 @@
<!--Generated with https://github.com/shaka-project/shaka-packager version <tag>-<hash>-<test>-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2.736067S">
<Period id="0">
<AdaptationSet id="0" contentType="audio" subsegmentStartsWithSAP="1" subsegmentAlignment="true">
<Representation id="0" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
<Representation id="0" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
<BaseURL>bear-640x360-video.mp4</BaseURL>
<SegmentBase indexRange="870-937" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="640" height="360" maxFrameRate="30000/22022" par="16:9">
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/trickmode" value="0"/>
<Representation id="1" bandwidth="211545" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" frameRate="30000/30030" maxPlayoutRate="30" codingDependency="false">
<BaseURL>bear-640x360-video-trick_play_factor_1.mp4</BaseURL>
<SegmentBase indexRange="870-937" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
<Representation id="2" bandwidth="211545" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" frameRate="30000/22022" maxPlayoutRate="60" codingDependency="false">
<BaseURL>bear-640x360-video-trick_play_factor_2.mp4</BaseURL>
<SegmentBase indexRange="870-925" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="2" contentType="audio" subsegmentStartsWithSAP="1" subsegmentAlignment="true">
<Representation id="3" bandwidth="133334" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>bear-640x360-audio.mp4</BaseURL>
<SegmentBase indexRange="804-871" timescale="44100">
@ -11,28 +34,5 @@
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" width="640" height="360" frameRate="30000/1001" subsegmentAlignment="true" par="16:9">
<Representation id="1" bandwidth="973483" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1">
<BaseURL>bear-640x360-video.mp4</BaseURL>
<SegmentBase indexRange="870-937" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="2" contentType="video" width="640" height="360" maxFrameRate="30000/22022" par="16:9">
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/trickmode" value="1"/>
<Representation id="2" bandwidth="211545" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" frameRate="30000/22022" maxPlayoutRate="60" codingDependency="false">
<BaseURL>bear-640x360-video-trick_play_factor_2.mp4</BaseURL>
<SegmentBase indexRange="870-925" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
<Representation id="3" bandwidth="211545" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" frameRate="30000/30030" maxPlayoutRate="30" codingDependency="false">
<BaseURL>bear-640x360-video-trick_play_factor_1.mp4</BaseURL>
<SegmentBase indexRange="870-937" timescale="30000">
<Initialization range="0-869"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -5,7 +5,7 @@
# https://developers.google.com/open-source/licenses/bsd
execute_process(
COMMAND python3 generate_license_notice.py "${CMAKE_CURRENT_BINARY_DIR}"
COMMAND "${Python3_EXECUTABLE}" generate_license_notice.py "${CMAKE_CURRENT_BINARY_DIR}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE STATUS)
if(NOT STATUS EQUAL 0)

View File

@ -31,3 +31,9 @@ add_custom_command(
${CMAKE_BINARY_DIR}/packager/)
add_custom_target(pssh_box_py ALL DEPENDS ${PSSH_BOX_OUTPUTS})
# Always install the python tools.
install(PROGRAMS ${CMAKE_BINARY_DIR}/packager/pssh-box.py
DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY ${CMAKE_BINARY_DIR}/packager/pssh-box-protos
DESTINATION ${CMAKE_INSTALL_BINDIR})

View File

@ -5,7 +5,7 @@
# https://developers.google.com/open-source/licenses/bsd
execute_process(
COMMAND python3 generate_version_string.py
COMMAND "${Python3_EXECUTABLE}" generate_version_string.py
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE STATUS
OUTPUT_VARIABLE PACKAGER_VERSION