| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| /* |
| * Copyright (C) 2019, Google Inc. |
| * |
| * libcamera Camera API tests |
| */ |
| |
| #include <iostream> |
| |
| #include <libcamera/framebuffer_allocator.h> |
| |
| #include "camera_test.h" |
| #include "test.h" |
| |
| using namespace libcamera; |
| using namespace std; |
| |
| namespace { |
| |
| class Statemachine : public CameraTest, public Test |
| { |
| public: |
| Statemachine() |
| : CameraTest("platform/vimc.0 Sensor B") |
| { |
| } |
| |
| protected: |
| int testAvailable() |
| { |
| /* Test operations which should fail. */ |
| if (camera_->configure(defconf_.get()) != -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; |
| |
| /* Test operations which should pass. */ |
| if (camera_->release()) |
| return TestFail; |
| |
| if (camera_->stop()) |
| 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_->createRequest()) |
| return TestFail; |
| |
| if (camera_->start() != -EACCES) |
| return TestFail; |
| |
| Request request(camera_.get()); |
| if (camera_->queueRequest(&request) != -EACCES) |
| return TestFail; |
| |
| /* Test operations which should pass. */ |
| if (camera_->stop()) |
| 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; |
| |
| Request request1(camera_.get()); |
| if (camera_->queueRequest(&request1) != -EACCES) |
| return TestFail; |
| |
| /* Test operations which should pass. */ |
| std::unique_ptr<Request> request2 = camera_->createRequest(); |
| if (!request2) |
| return TestFail; |
| |
| if (camera_->stop()) |
| return TestFail; |
| |
| /* Test valid state transitions, end in Running state. */ |
| if (camera_->release()) |
| return TestFail; |
| |
| if (camera_->acquire()) |
| return TestFail; |
| |
| if (camera_->configure(defconf_.get())) |
| return TestFail; |
| |
| /* Use internally allocated buffers. */ |
| allocator_ = new FrameBufferAllocator(camera_); |
| Stream *stream = *camera_->streams().begin(); |
| if (allocator_->allocate(stream) < 0) |
| 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_->start() != -EACCES) |
| return TestFail; |
| |
| /* Test operations which should pass. */ |
| std::unique_ptr<Request> request = camera_->createRequest(); |
| if (!request) |
| return TestFail; |
| |
| Stream *stream = *camera_->streams().begin(); |
| if (request->addBuffer(stream, allocator_->buffers(stream)[0].get())) |
| return TestFail; |
| |
| if (camera_->queueRequest(request.get())) |
| return TestFail; |
| |
| /* Test valid state transitions, end in Available state. */ |
| if (camera_->stop()) |
| return TestFail; |
| |
| delete allocator_; |
| |
| 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 (testRuning() != TestPass) { |
| cout << "State machine in Running state failed" << endl; |
| return TestFail; |
| } |
| |
| return TestPass; |
| } |
| |
| std::unique_ptr<CameraConfiguration> defconf_; |
| FrameBufferAllocator *allocator_; |
| }; |
| |
| } /* namespace */ |
| |
| TEST_REGISTER(Statemachine) |