libcamera/test/camera/statemachine.cpp
Niklas Söderlund dea689e1f2 libcamera: request: In addBuffer() do not fetch stream from Buffer
In the FrameBuffer interface the stream will not be available from the
buffer object as the buffer might be allocated externally. The
application needs to explicitly state which stream the buffer is being
added for to the request.

Extend the addBuffer() function to get this information explicitly from
the caller.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2020-01-12 16:10:37 +01:00

290 lines
5.7 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* libcamera Camera API tests
*/
#include <iostream>
#include "camera_test.h"
#include "test.h"
using namespace std;
namespace {
class Statemachine : public CameraTest, public Test
{
public:
Statemachine()
: CameraTest("VIMC Sensor B")
{
}
protected:
int testAvailable()
{
/* Test operations which should fail. */
if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail;
if (camera_->allocateBuffers() != -EACCES)
return TestFail;
if (camera_->freeBuffers() != -EACCES)
return TestFail;
if (camera_->createRequest())
return TestFail;
if (camera_->start() != -EACCES)
return TestFail;
Request request(camera_.get());
if (camera_->queueRequest(&request) != -EACCES)
return TestFail;
if (camera_->stop() != -EACCES)
return TestFail;
/* Test operations which should pass. */
if (camera_->release())
return TestFail;
/* Test valid state transitions, end in Acquired state. */
if (camera_->acquire())
return TestFail;
return TestPass;
}
int testAcquired()
{
/* Test operations which should fail. */
if (camera_->acquire() != -EBUSY)
return TestFail;
if (camera_->allocateBuffers() != -EACCES)
return TestFail;
if (camera_->freeBuffers() != -EACCES)
return TestFail;
if (camera_->createRequest())
return TestFail;
if (camera_->start() != -EACCES)
return TestFail;
Request request(camera_.get());
if (camera_->queueRequest(&request) != -EACCES)
return TestFail;
if (camera_->stop() != -EACCES)
return TestFail;
/* Test valid state transitions, end in Configured state. */
if (camera_->release())
return TestFail;
if (camera_->acquire())
return TestFail;
if (camera_->configure(defconf_.get()))
return TestFail;
return TestPass;
}
int testConfigured()
{
/* Test operations which should fail. */
if (camera_->acquire() != -EBUSY)
return TestFail;
if (camera_->freeBuffers() != -EACCES)
return TestFail;
if (camera_->createRequest())
return TestFail;
Request request(camera_.get());
if (camera_->queueRequest(&request) != -EACCES)
return TestFail;
if (camera_->start() != -EACCES)
return TestFail;
if (camera_->stop() != -EACCES)
return TestFail;
/* Test operations which should pass. */
if (camera_->configure(defconf_.get()))
return TestFail;
/* Test valid state transitions, end in Prepared state. */
if (camera_->release())
return TestFail;
if (camera_->acquire())
return TestFail;
if (camera_->configure(defconf_.get()))
return TestFail;
if (camera_->allocateBuffers())
return TestFail;
return TestPass;
}
int testPrepared()
{
/* Test operations which should fail. */
if (camera_->acquire() != -EBUSY)
return TestFail;
if (camera_->release() != -EBUSY)
return TestFail;
if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail;
if (camera_->allocateBuffers() != -EACCES)
return TestFail;
Request request1(camera_.get());
if (camera_->queueRequest(&request1) != -EACCES)
return TestFail;
if (camera_->stop() != -EACCES)
return TestFail;
/* Test operations which should pass. */
Request *request2 = camera_->createRequest();
if (!request2)
return TestFail;
/* Never handed to hardware so need to manually delete it. */
delete request2;
/* Test valid state transitions, end in Running state. */
if (camera_->freeBuffers())
return TestFail;
if (camera_->release())
return TestFail;
if (camera_->acquire())
return TestFail;
if (camera_->configure(defconf_.get()))
return TestFail;
if (camera_->allocateBuffers())
return TestFail;
if (camera_->start())
return TestFail;
return TestPass;
}
int testRuning()
{
/* Test operations which should fail. */
if (camera_->acquire() != -EBUSY)
return TestFail;
if (camera_->release() != -EBUSY)
return TestFail;
if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail;
if (camera_->allocateBuffers() != -EACCES)
return TestFail;
if (camera_->freeBuffers() != -EACCES)
return TestFail;
if (camera_->start() != -EACCES)
return TestFail;
/* Test operations which should pass. */
Request *request = camera_->createRequest();
if (!request)
return TestFail;
Stream *stream = *camera_->streams().begin();
std::unique_ptr<Buffer> buffer = stream->createBuffer(0);
if (request->addBuffer(stream, std::move(buffer)))
return TestFail;
if (camera_->queueRequest(request))
return TestFail;
/* Test valid state transitions, end in Available state. */
if (camera_->stop())
return TestFail;
if (camera_->freeBuffers())
return TestFail;
if (camera_->release())
return TestFail;
return TestPass;
}
int init() override
{
if (status_ != TestPass)
return status_;
defconf_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!defconf_) {
cout << "Failed to generate default configuration" << endl;
return TestFail;
}
return TestPass;
}
int run() override
{
if (testAvailable() != TestPass) {
cout << "State machine in Available state failed" << endl;
return TestFail;
}
if (testAcquired() != TestPass) {
cout << "State machine in Acquired state failed" << endl;
return TestFail;
}
if (testConfigured() != TestPass) {
cout << "State machine in Configured state failed" << endl;
return TestFail;
}
if (testPrepared() != TestPass) {
cout << "State machine in Prepared state failed" << endl;
return TestFail;
}
if (testRuning() != TestPass) {
cout << "State machine in Running state failed" << endl;
return TestFail;
}
return TestPass;
}
std::unique_ptr<CameraConfiguration> defconf_;
};
} /* namespace */
TEST_REGISTER(Statemachine);