test: Add Thread test cases

The Thread test case verifies that

- a Thread instance is created for the main thread
- a new Thread can be created, started, and stopped

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-03-24 03:21:09 +02:00
parent cc3ae13d9e
commit a7fb1db1fa
2 changed files with 94 additions and 0 deletions

View file

@ -21,6 +21,7 @@ public_tests = [
internal_tests = [
['camera-sensor', 'camera-sensor.cpp'],
['threads', 'threads.cpp'],
]
foreach t : public_tests

93
test/threads.cpp Normal file
View file

@ -0,0 +1,93 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* threads.cpp - Threads test
*/
#include <chrono>
#include <iostream>
#include <thread>
#include "thread.h"
#include "test.h"
using namespace std;
using namespace libcamera;
class InstrumentedThread : public Thread
{
public:
InstrumentedThread(unsigned int iterations)
: iterations_(iterations)
{
}
protected:
void run()
{
for (unsigned int i = 0; i < iterations_; ++i) {
this_thread::sleep_for(chrono::milliseconds(50));
}
}
private:
unsigned int iterations_;
};
class ThreadTest : public Test
{
protected:
int init()
{
return 0;
}
int run()
{
/* Test Thread() retrieval for the main thread. */
Thread *thread = Thread::current();
if (!thread) {
cout << "Thread::current() failed to main thread"
<< endl;
return TestFail;
}
if (!thread->isRunning()) {
cout << "Main thread is not running" << endl;
return TestFail;
}
/* Test starting the main thread, the test shall not crash. */
thread->start();
/* Test the running state of a custom thread. */
thread = new Thread();
thread->start();
if (!thread->isRunning()) {
cout << "Thread is not running after being started"
<< endl;
return TestFail;
}
thread->exit(0);
thread->wait();
if (thread->isRunning()) {
cout << "Thread is still running after finishing"
<< endl;
return TestFail;
}
delete thread;
return TestPass;
}
void cleanup()
{
}
};
TEST_REGISTER(ThreadTest)