Sebastian Dröge 0219b6f6fa ptp-helper: Add some tests for functionality and memory safety of unsafe code
These tests are mostly for ensuring that the calls to system APIs are
done correctly and that there are no memory bugs (that would be caught
by valgrind) in the unsafe code.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4458>
2023-05-12 17:06:01 +00:00

128 lines
4.3 KiB
Meson

# Check PTP support
ptp_helper_option = get_option('ptp-helper')
if ptp_helper_option.disabled()
subdir_done()
endif
if host_system not in ['linux', 'freebsd', 'openbsd', 'netbsd', 'dragonfly', 'darwin', 'sunos', 'solaris', 'illumos', 'windows']
if ptp_helper_option.enabled()
error('PTP not supported on this OS')
endif
subdir_done()
endif
have_rust = add_languages('rust', native : false, required : false)
if not have_rust
if ptp_helper_option.enabled()
error('PTP not supported without Rust compiler')
endif
subdir_done()
endif
rustc = meson.get_compiler('rust')
if rustc.get_id() not in ['rustc', 'clippy-driver rustc']
warning('PTP support is only tested with rustc, found different compiler @0@ @1@'.format(rustc.get_id(), rustc.version()))
endif
# We currently need at least Rust 1.48 on all platforms but Windows.
# On Windows some 1.54 API is used that would otherwise complicate things
# unncecessarily.
rust_req = '1.48'
if host_system == 'windows'
rust_req = '1.54'
endif
if rustc.get_id() in ['rustc', 'clippy-driver rustc'] and not rustc.version().version_compare('>=' + rust_req)
if ptp_helper_option.enabled()
error('PTP support requires at least Rust @0@ on this platform, found @1@'.format(rust_req, rustc.version()))
endif
subdir_done()
endif
cdata.set('HAVE_PTP', 1, description : 'PTP support available')
ptp_helper_conf_data = configuration_data()
rust_args = []
setcap_prog = find_program('setcap', '/usr/sbin/setcap', '/sbin/setcap', required : false)
cap_dep = dependency('libcap', required: false)
# user/group to change to in gst-ptp-helper
ptp_helper_setuid_user = get_option('ptp-helper-setuid-user')
if ptp_helper_setuid_user != ''
ptp_helper_conf_data.set('PTP_HELPER_SETUID_USER', 'Some("@0@")'.format(ptp_helper_setuid_user))
else
ptp_helper_conf_data.set('PTP_HELPER_SETUID_USER', 'None')
endif
ptp_helper_setuid_group = get_option('ptp-helper-setuid-group')
if ptp_helper_setuid_group != ''
ptp_helper_conf_data.set('PTP_HELPER_SETUID_GROUP', 'Some("@0@")'.format(ptp_helper_setuid_group))
else
ptp_helper_conf_data.set('PTP_HELPER_SETUID_GROUP', 'None')
endif
# how to install gst-ptp-helper
with_ptp_helper_permissions = get_option('ptp-helper-permissions')
if with_ptp_helper_permissions == 'auto'
if setcap_prog.found() and cap_dep.found()
with_ptp_helper_permissions = 'capabilities'
elif host_system == 'windows'
with_ptp_helper_permissions = 'none'
else
with_ptp_helper_permissions = 'setuid-root'
endif
endif
message('How to install gst-ptp-helper: ' + with_ptp_helper_permissions)
if with_ptp_helper_permissions == 'none'
rust_args += ['--cfg', 'ptp_helper_permissions="none"']
# nothing to do
elif with_ptp_helper_permissions == 'setuid-root'
rust_args += ['--cfg', 'ptp_helper_permissions="setuid-root"']
elif with_ptp_helper_permissions == 'capabilities'
if not setcap_prog.found()
error('capabilities-based ptp-helper-permissions requested, but could not find setcap tool.')
elif not cap_dep.found()
error('capabilities-based ptp-helper-permissions requested, but could not find libcap.')
endif
rust_args += ['--cfg', 'ptp_helper_permissions="setcap"']
else
error('Unexpected ptp helper permissions value: ' + with_ptp_helper_permissions)
endif
conf_lib_rs = configure_file(input : 'conf_lib.rs.in',
output : 'conf_lib.rs',
configuration: ptp_helper_conf_data)
conf = static_library('gst_ptp_helper_conf', conf_lib_rs,
override_options : ['rust_std=2018'],
rust_crate_type : 'rlib')
exe = executable('gst-ptp-helper', 'main.rs',
override_options : ['rust_std=2018'],
rust_args : ['-Cpanic=abort', rust_args],
dependencies : [cap_dep],
link_with : conf,
install_dir : helpers_install_dir,
install : true)
exe_test = executable('gst-ptp-helper-test', 'main.rs',
override_options : ['rust_std=2018'],
rust_args : ['--test', rust_args],
dependencies : [cap_dep],
link_with : conf,
install_dir : helpers_install_dir,
install : true)
test('gst-ptp-helper-test', exe_test, protocol : 'rust')
if host_system != 'windows'
meson.add_install_script('ptp_helper_post_install.sh',
helpers_install_dir, with_ptp_helper_permissions,
setcap_prog.found() ? setcap_prog.full_path() : '')
endif
meson.add_devenv({'GST_PTP_HELPER': exe.full_path()})