[libcamera-devel] [PATCH 17/18] test: object: Extend object test to verify parent-child relationships

Niklas Söderlund niklas.soderlund at ragnatech.se
Sat Aug 17 17:14:34 CEST 2019


Hi Laurent,

Thanks for your work.

On 2019-08-12 15:46:41 +0300, Laurent Pinchart wrote:
> The test verifies correct behaviour of parent-child relationships in
> relation to thread affinity.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

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

> ---
>  test/object.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 76 insertions(+), 6 deletions(-)
> 
> diff --git a/test/object.cpp b/test/object.cpp
> index 3f1f700d1b39..16118971c755 100644
> --- a/test/object.cpp
> +++ b/test/object.cpp
> @@ -25,8 +25,8 @@ public:
>  		MessageReceived,
>  	};
>  
> -	InstrumentedObject()
> -		: status_(NoMessage)
> +	InstrumentedObject(Object *parent = nullptr)
> +		: Object(parent), status_(NoMessage)
>  	{
>  	}
>  
> @@ -51,22 +51,82 @@ 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 that moving an object to a different thread succeeds. */
> -		a_->moveToThread(&thread_);
> +		/* 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;
> +		}
>  
> -		if (a_->thread() != &thread_ || a_->thread() == Thread::current()) {
> +		/*
> +		 * 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) {
> +		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;
>  		}
> @@ -77,10 +137,20 @@ protected:
>  	void cleanup()
>  	{
>  		delete a_;
> +		delete b_;
> +		delete c_;
> +		delete d_;
> +		delete e_;
> +		delete f_;
>  	}
>  
>  private:
>  	InstrumentedObject *a_;
> +	InstrumentedObject *b_;
> +	InstrumentedObject *c_;
> +	InstrumentedObject *d_;
> +	InstrumentedObject *e_;
> +	InstrumentedObject *f_;
>  
>  	Thread thread_;
>  };
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list