summaryrefslogtreecommitdiff
path: root/test/meson.build
blob: 065c55866356ff1c52885ca615caabbbe524897c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# SPDX-License-Identifier: CC0-1.0

if not get_option('test')
    subdir_done()
endif

subdir('libtest')

subdir('camera')
subdir('controls')
subdir('ipa')
subdir('ipc')
subdir('log')
subdir('media_device')
subdir('pipeline')
subdir('process')
subdir('serialization')
subdir('stream')
subdir('v4l2_compat')
subdir('v4l2_subdevice')
subdir('v4l2_videodevice')

public_tests = [
    ['geometry',                        'geometry.cpp'],
    ['signal',                          'signal.cpp'],
    ['span',                            'span.cpp'],
]

internal_tests = [
    ['byte-stream-buffer',              'byte-stream-buffer.cpp'],
    ['camera-sensor',                   'camera-sensor.cpp'],
    ['delayed_contols',                 'delayed_contols.cpp'],
    ['event',                           'event.cpp'],
    ['event-dispatcher',                'event-dispatcher.cpp'],
    ['event-thread',                    'event-thread.cpp'],
    ['file',                            'file.cpp'],
    ['file-descriptor',                 'file-descriptor.cpp'],
    ['hotplug-cameras',                 'hotplug-cameras.cpp'],
    ['mapped-buffer',                   'mapped-buffer.cpp'],
    ['message',                         'message.cpp'],
    ['object',                          'object.cpp'],
    ['object-delete',                   'object-delete.cpp'],
    ['object-invoke',                   'object-invoke.cpp'],
    ['pixel-format',                    'pixel-format.cpp'],
    ['signal-threads',                  'signal-threads.cpp'],
    ['threads',                         'threads.cpp'],
    ['timer',                           'timer.cpp'],
    ['timer-thread',                    'timer-thread.cpp'],
    ['utils',                           'utils.cpp'],
]

foreach t : public_tests
    exe = executable(t[0], t[1],
                     dependencies : libcamera_dep,
                     link_with : test_libraries,
                     include_directories : test_includes_public)

    test(t[0], exe)
endforeach

foreach t : internal_tests
    exe = executable(t[0], t[1],
                     dependencies : libcamera_dep,
                     link_with : test_libraries,
                     include_directories : test_includes_internal)

    test(t[0], exe)
endforeach
hl com"> * object.cpp - Object tests */ #include <iostream> #include <libcamera/object.h> #include "libcamera/internal/message.h" #include "libcamera/internal/thread.h" #include "test.h" using namespace std; using namespace libcamera; class InstrumentedObject : public Object { public: enum Status { NoMessage, MessageReceived, }; InstrumentedObject(Object *parent = nullptr) : Object(parent), status_(NoMessage) { } Status status() const { return status_; } void reset() { status_ = NoMessage; } protected: void message(Message *msg) override { if (msg->type() == Message::ThreadMoveMessage) status_ = MessageReceived; Object::message(msg); } private: Status status_; }; class ObjectTest : public Test { protected: int init() { /* * Create a hierarchy of objects: * A -> B -> C * \->D * E */ a_ = new InstrumentedObject(); b_ = new InstrumentedObject(a_); c_ = new InstrumentedObject(b_); d_ = new InstrumentedObject(a_); e_ = new InstrumentedObject(); f_ = nullptr; return TestPass; } int run() { /* Verify the parent-child relationships. */ if (a_->parent() != nullptr || b_->parent() != a_ || c_->parent() != b_ || d_->parent() != a_ || e_->parent() != nullptr) { cout << "Incorrect parent-child relationships" << endl; return TestFail; } /* * Verify that moving an object with no parent to a different * thread succeeds. */ e_->moveToThread(&thread_); if (e_->thread() != &thread_ || e_->thread() == Thread::current()) { cout << "Failed to move object to thread" << endl; return TestFail; } /* * Verify that moving an object with a parent to a different * thread fails. This results in an undefined behaviour, the * test thus depends on the internal implementation returning * without performing any change. */ b_->moveToThread(&thread_); if (b_->thread() != Thread::current()) { cout << "Moving object with parent to thread shouldn't succeed" << endl; return TestFail; } /* * Verify that moving an object with children to a different * thread moves all the children. */ a_->moveToThread(&thread_); if (a_->thread() != &thread_ || b_->thread() != &thread_ || c_->thread() != &thread_ || d_->thread() != &thread_) { cout << "Failed to move children to thread" << endl; return TestFail; } /* Verify that objects are bound to the thread of their parent. */ f_ = new InstrumentedObject(d_); if (f_->thread() != &thread_) { cout << "Failed to bind child to parent thread" << endl; return TestFail; } /* Verify that objects receive a ThreadMoveMessage when moved. */ if (a_->status() != InstrumentedObject::MessageReceived || b_->status() != InstrumentedObject::MessageReceived || c_->status() != InstrumentedObject::MessageReceived || d_->status() != InstrumentedObject::MessageReceived || e_->status() != InstrumentedObject::MessageReceived) { cout << "Moving object didn't deliver ThreadMoveMessage" << endl; return TestFail; } return TestPass; } void cleanup()