blob: 931d50fcade89dff7666afdd3499dfec9b0ff0b7 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fit/function.h>
#include <lib/gtest/real_loop_fixture.h>
#include <lib/zx/clock.h>
#include <fbl/auto_call.h>
#include <fbl/function.h>
#include "../virtual_camera2_control.h"
#include "gtest/gtest.h"
#include "stream_tester.h"
namespace camera {
namespace {
// Test the controller part of the virtual camera
class CameraHalTest : public testing::Test {
public:
CameraHalTest()
: loop_(&kAsyncLoopConfigNoAttachToCurrentThread),
virtual_camera2_(camera_client_.NewRequest(), loop_.dispatcher(), [] {}) {
zx_status_t status = loop_.StartThread("camera-controller-loop");
EXPECT_EQ(status, ZX_OK) << "Failed to StartThread for tests. status: " << status;
}
~CameraHalTest() override { loop_.Shutdown(); }
void TestGetConfigs() {
zx_status_t out_status;
fidl::VectorPtr<fuchsia::camera2::hal::Config> out_configs;
zx_status_t fidl_status = camera_client_->GetConfigs(&out_configs, &out_status);
ASSERT_EQ(fidl_status, ZX_OK) << "Couldn't get Camera Configs. fidl status: " << fidl_status;
ASSERT_EQ(out_status, ZX_OK) << "Couldn't get Camera Configs. status: " << out_status;
ASSERT_TRUE(out_configs) << "Couldn't get Camera Configs. No Configs.";
// Test more about the configs
configs_ = std::move(out_configs.value());
// Assert that there is at least one config
ASSERT_TRUE(configs_.size());
// Assert that each config has at least one stream config:
for (auto& config : configs_) {
ASSERT_TRUE(config.stream_configs.size());
for (auto& stream : config.stream_configs) {
// Assert that each stream config has at least one image format:
ASSERT_TRUE(stream.image_formats.size());
}
}
}
void TestGetDeviceInfo() {
fuchsia::camera2::DeviceInfo device_info;
zx_status_t fidl_status = camera_client_->GetDeviceInfo(&device_info);
ASSERT_EQ(fidl_status, ZX_OK) << "Couldn't get device info. fidl status: " << fidl_status;
EXPECT_EQ(kVirtualCameraVendorName, device_info.vendor_name());
EXPECT_EQ(kVirtualCameraProductName, device_info.product_name());
EXPECT_EQ(fuchsia::camera2::DeviceType::VIRTUAL, device_info.type());
}
void TestCreateStream0() {
// Start by testing the first config, first stream, first format:
// TODO(garratt): make actual buffer collection
fuchsia::sysmem::BufferCollectionInfo_2 buffer_collection;
fuchsia::camera2::StreamPtr stream;
zx_status_t fidl_status = camera_client_->CreateStream(0, 0, 0, std::move(buffer_collection),
stream.NewRequest(loop_.dispatcher()));
ASSERT_EQ(fidl_status, ZX_OK) << "Couldn't create stream. fidl status: " << fidl_status;
// Assert that the channel is open:
ASSERT_TRUE(stream.is_bound());
ASSERT_TRUE(camera_client_.is_bound());
camera::StreamTester stream_tester(stream.Unbind().TakeChannel());
stream_tester.TestGetFrames();
}
private:
async::Loop loop_;
std::vector<fuchsia::camera2::hal::Config> configs_;
fuchsia::camera2::hal::ControllerSyncPtr camera_client_;
VirtualCamera2ControllerImpl virtual_camera2_;
};
TEST_F(CameraHalTest, GetStartupInfo) {
TestGetConfigs();
TestGetDeviceInfo();
}
TEST_F(CameraHalTest, ConnectToStream0) { TestCreateStream0(); }
} // namespace
} // namespace camera