[libcamera-devel,v2,14/18] test: Add Timer thread move test

Message ID 20190817152104.10834-15-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Object & Thread enhancements
Related show

Commit Message

Laurent Pinchart Aug. 17, 2019, 3:21 p.m. UTC
The test verifies correct behaviour of a running timer moved to a
different thread.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
---
 test/meson.build      |  1 +
 test/timer-thread.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+)
 create mode 100644 test/timer-thread.cpp

Comments

Niklas Söderlund Aug. 17, 2019, 3:40 p.m. UTC | #1
Hi Laurent,

Thanks for your work.

On 2019-08-17 18:21:00 +0300, Laurent Pinchart wrote:
> The test verifies correct behaviour of a running timer moved to a
> different thread.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  test/meson.build      |  1 +
>  test/timer-thread.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 79 insertions(+)
>  create mode 100644 test/timer-thread.cpp
> 
> diff --git a/test/meson.build b/test/meson.build
> index f695ffd7be44..05265b7d4976 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -29,6 +29,7 @@ internal_tests = [
>      ['object-invoke',                   'object-invoke.cpp'],
>      ['signal-threads',                  'signal-threads.cpp'],
>      ['threads',                         'threads.cpp'],
> +    ['timer-thread',                    'timer-thread.cpp'],
>  ]
>  
>  foreach t : public_tests
> diff --git a/test/timer-thread.cpp b/test/timer-thread.cpp
> new file mode 100644
> index 000000000000..b9373050068c
> --- /dev/null
> +++ b/test/timer-thread.cpp
> @@ -0,0 +1,78 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * timer-thread.cpp - Threaded timer test
> + */
> +
> +#include <chrono>
> +#include <iostream>
> +
> +#include <libcamera/timer.h>
> +
> +#include "test.h"
> +#include "thread.h"
> +
> +using namespace std;
> +using namespace libcamera;
> +
> +class TimeoutHandler : public Object
> +{
> +public:
> +	TimeoutHandler()
> +		: timeout_(false)
> +	{
> +		timer_.timeout.connect(this, &TimeoutHandler::timeoutHandler);
> +		timer_.start(100);
> +	}
> +
> +	bool timeout() const
> +	{
> +		return timeout_;
> +	}
> +
> +	void moveToThread(Thread *thread)
> +	{
> +		Object::moveToThread(thread);
> +		timer_.moveToThread(thread);
> +	}
> +
> +private:
> +	void timeoutHandler(Timer *timer)
> +	{
> +		timeout_ = true;
> +	}
> +
> +	Timer timer_;
> +	bool timeout_;
> +};
> +
> +class TimerThreadTest : public Test
> +{
> +protected:
> +	int run()
> +	{
> +		Thread thread;
> +		thread.start();
> +
> +		TimeoutHandler timeout;
> +		timeout.moveToThread(&thread);
> +
> +		this_thread::sleep_for(chrono::milliseconds(100));
> +
> +		/* Must stop thread before destroying timeout. */
> +		thread.exit(0);
> +		thread.wait();
> +
> +		if (!timeout.timeout()) {
> +			cout << "Timer expiration test failed" << endl;
> +			return TestFail;
> +		}
> +
> +		return TestPass;
> +	}
> +
> +private:
> +};
> +
> +TEST_REGISTER(TimerThreadTest)
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/test/meson.build b/test/meson.build
index f695ffd7be44..05265b7d4976 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -29,6 +29,7 @@  internal_tests = [
     ['object-invoke',                   'object-invoke.cpp'],
     ['signal-threads',                  'signal-threads.cpp'],
     ['threads',                         'threads.cpp'],
+    ['timer-thread',                    'timer-thread.cpp'],
 ]
 
 foreach t : public_tests
diff --git a/test/timer-thread.cpp b/test/timer-thread.cpp
new file mode 100644
index 000000000000..b9373050068c
--- /dev/null
+++ b/test/timer-thread.cpp
@@ -0,0 +1,78 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * timer-thread.cpp - Threaded timer test
+ */
+
+#include <chrono>
+#include <iostream>
+
+#include <libcamera/timer.h>
+
+#include "test.h"
+#include "thread.h"
+
+using namespace std;
+using namespace libcamera;
+
+class TimeoutHandler : public Object
+{
+public:
+	TimeoutHandler()
+		: timeout_(false)
+	{
+		timer_.timeout.connect(this, &TimeoutHandler::timeoutHandler);
+		timer_.start(100);
+	}
+
+	bool timeout() const
+	{
+		return timeout_;
+	}
+
+	void moveToThread(Thread *thread)
+	{
+		Object::moveToThread(thread);
+		timer_.moveToThread(thread);
+	}
+
+private:
+	void timeoutHandler(Timer *timer)
+	{
+		timeout_ = true;
+	}
+
+	Timer timer_;
+	bool timeout_;
+};
+
+class TimerThreadTest : public Test
+{
+protected:
+	int run()
+	{
+		Thread thread;
+		thread.start();
+
+		TimeoutHandler timeout;
+		timeout.moveToThread(&thread);
+
+		this_thread::sleep_for(chrono::milliseconds(100));
+
+		/* Must stop thread before destroying timeout. */
+		thread.exit(0);
+		thread.wait();
+
+		if (!timeout.timeout()) {
+			cout << "Timer expiration test failed" << endl;
+			return TestFail;
+		}
+
+		return TestPass;
+	}
+
+private:
+};
+
+TEST_REGISTER(TimerThreadTest)