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.
This commit is contained in:
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