{"id":10381,"url":"https://patchwork.libcamera.org/api/patches/10381/?format=json","web_url":"https://patchwork.libcamera.org/patch/10381/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20201106103707.49660-34-paul.elder@ideasonboard.com>","date":"2020-11-06T10:37:03","name":"[libcamera-devel,v4,33/37] tests: Remove IPA wrappers test","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"5a2141f8e65c3e304f85e0bb3ba4f0c09664f114","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/10381/mbox/","series":[{"id":1448,"url":"https://patchwork.libcamera.org/api/series/1448/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1448","date":"2020-11-06T10:36:30","name":"IPA isolation implementation","version":4,"mbox":"https://patchwork.libcamera.org/series/1448/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/10381/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/10381/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 9D7FBBDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  6 Nov 2020 10:38:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6B3F562D3E;\n\tFri,  6 Nov 2020 11:38:34 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 643AE62D41\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Nov 2020 11:38:31 +0100 (CET)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EABBDA19;\n\tFri,  6 Nov 2020 11:38:29 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"IiN7X/OF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1604659111;\n\tbh=yd66WIoJrynsdLYB3ucCEAk/I2BoAiwYtV9KdnllyjM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=IiN7X/OFLXN3khJCy0gV19fIU/i9Mht+EAOcPpECm5tJXHp/CveQS/gffcieU9yH+\n\tZ5GKN1NaDbxShIbn//efXL7N+vksxQO464UKd9o+stwiSpTYosE4FwsVMyhw0YfOt3\n\tLBthXLEpnfv6zZQzqnD2hTSpJVNscokHuhPhPAV4=","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Fri,  6 Nov 2020 19:37:03 +0900","Message-Id":"<20201106103707.49660-34-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.27.0","In-Reply-To":"<20201106103707.49660-1-paul.elder@ideasonboard.com>","References":"<20201106103707.49660-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v4 33/37] tests: Remove IPA wrappers test","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Since we no longer use IPA wrappers, remove the test for it.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nNo change in v4\n\nNo change in v3\n\nNew in v2\n---\n test/ipa/ipa_wrappers_test.cpp | 451 ---------------------------------\n test/ipa/meson.build           |   1 -\n 2 files changed, 452 deletions(-)\n delete mode 100644 test/ipa/ipa_wrappers_test.cpp","diff":"diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp\ndeleted file mode 100644\nindex 0133d8d2..00000000\n--- a/test/ipa/ipa_wrappers_test.cpp\n+++ /dev/null\n@@ -1,451 +0,0 @@\n-/* SPDX-License-Identifier: GPL-2.0-or-later */\n-/*\n- * Copyright (C) 2019, Google Inc.\n- *\n- * ipa_wrappers_test.cpp - Test the IPA interface and context wrappers\n- */\n-\n-#include <fcntl.h>\n-#include <iostream>\n-#include <memory>\n-#include <linux/videodev2.h>\n-#include <sys/stat.h>\n-#include <unistd.h>\n-\n-#include <libcamera/controls.h>\n-\n-#include \"libcamera/internal/camera_sensor.h\"\n-#include \"libcamera/internal/device_enumerator.h\"\n-#include \"libcamera/internal/ipa_context_wrapper.h\"\n-#include \"libcamera/internal/media_device.h\"\n-#include \"libcamera/internal/v4l2_subdevice.h\"\n-\n-#include \"test.h\"\n-\n-using namespace libcamera;\n-using namespace std;\n-\n-enum Operation {\n-\tOp_init,\n-\tOp_start,\n-\tOp_stop,\n-\tOp_configure,\n-\tOp_mapBuffers,\n-\tOp_unmapBuffers,\n-\tOp_processEvent,\n-};\n-\n-class TestIPAInterface : public IPAInterface\n-{\n-public:\n-\tTestIPAInterface()\n-\t\t: sequence_(0)\n-\t{\n-\t}\n-\n-\tint init(const IPASettings &settings) override\n-\t{\n-\t\tif (settings.configurationFile != \"/ipa/configuration/file\") {\n-\t\t\tcerr << \"init(): Invalid configuration file\" << endl;\n-\t\t\treport(Op_init, TestFail);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\treport(Op_init, TestPass);\n-\t\treturn 0;\n-\t}\n-\n-\tint start() override\n-\t{\n-\t\treport(Op_start, TestPass);\n-\t\treturn 0;\n-\t}\n-\n-\tvoid stop() override\n-\t{\n-\t\treport(Op_stop, TestPass);\n-\t}\n-\n-\tvoid configure(const CameraSensorInfo &sensorInfo,\n-\t\t       const std::map<unsigned int, IPAStream> &streamConfig,\n-\t\t       const std::map<unsigned int, const ControlInfoMap &> &entityControls,\n-\t\t       [[maybe_unused]] const IPAOperationData &ipaConfig,\n-\t\t       [[maybe_unused]] IPAOperationData *result) override\n-\t{\n-\t\t/* Verify sensorInfo. */\n-\t\tif (sensorInfo.outputSize.width != 2560 ||\n-\t\t    sensorInfo.outputSize.height != 1940) {\n-\t\t\tcerr << \"configure(): Invalid sensor info size \"\n-\t\t\t     << sensorInfo.outputSize.toString();\n-\t\t}\n-\n-\t\t/* Verify streamConfig. */\n-\t\tif (streamConfig.size() != 2) {\n-\t\t\tcerr << \"configure(): Invalid number of streams \"\n-\t\t\t     << streamConfig.size() << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\n-\t\tauto iter = streamConfig.find(1);\n-\t\tif (iter == streamConfig.end()) {\n-\t\t\tcerr << \"configure(): No configuration for stream 1\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\t\tconst IPAStream *stream = &iter->second;\n-\t\tif (stream->pixelFormat != V4L2_PIX_FMT_YUYV ||\n-\t\t    stream->size != Size{ 1024, 768 }) {\n-\t\t\tcerr << \"configure(): Invalid configuration for stream 1\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\n-\t\titer = streamConfig.find(2);\n-\t\tif (iter == streamConfig.end()) {\n-\t\t\tcerr << \"configure(): No configuration for stream 2\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\t\tstream = &iter->second;\n-\t\tif (stream->pixelFormat != V4L2_PIX_FMT_NV12 ||\n-\t\t    stream->size != Size{ 800, 600 }) {\n-\t\t\tcerr << \"configure(): Invalid configuration for stream 2\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\n-\t\t/* Verify entityControls. */\n-\t\tauto ctrlIter = entityControls.find(42);\n-\t\tif (ctrlIter == entityControls.end()) {\n-\t\t\tcerr << \"configure(): Controls not found\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\n-\t\tconst ControlInfoMap &infoMap = ctrlIter->second;\n-\n-\t\tif (infoMap.count(V4L2_CID_BRIGHTNESS) != 1 ||\n-\t\t    infoMap.count(V4L2_CID_CONTRAST) != 1 ||\n-\t\t    infoMap.count(V4L2_CID_SATURATION) != 1) {\n-\t\t\tcerr << \"configure(): Invalid control IDs\" << endl;\n-\t\t\treturn report(Op_configure, TestFail);\n-\t\t}\n-\n-\t\treport(Op_configure, TestPass);\n-\t}\n-\n-\tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override\n-\t{\n-\t\tif (buffers.size() != 2) {\n-\t\t\tcerr << \"mapBuffers(): Invalid number of buffers \"\n-\t\t\t     << buffers.size() << endl;\n-\t\t\treturn report(Op_mapBuffers, TestFail);\n-\t\t}\n-\n-\t\tif (buffers[0].id != 10 ||\n-\t\t    buffers[1].id != 11) {\n-\t\t\tcerr << \"mapBuffers(): Invalid buffer IDs\" << endl;\n-\t\t\treturn report(Op_mapBuffers, TestFail);\n-\t\t}\n-\n-\t\tif (buffers[0].planes.size() != 3 ||\n-\t\t    buffers[1].planes.size() != 3) {\n-\t\t\tcerr << \"mapBuffers(): Invalid number of planes\" << endl;\n-\t\t\treturn report(Op_mapBuffers, TestFail);\n-\t\t}\n-\n-\t\tif (buffers[0].planes[0].length != 4096 ||\n-\t\t    buffers[0].planes[1].length != 0 ||\n-\t\t    buffers[0].planes[2].length != 0 ||\n-\t\t    buffers[0].planes[0].length != 4096 ||\n-\t\t    buffers[1].planes[1].length != 4096 ||\n-\t\t    buffers[1].planes[2].length != 0) {\n-\t\t\tcerr << \"mapBuffers(): Invalid length\" << endl;\n-\t\t\treturn report(Op_mapBuffers, TestFail);\n-\t\t}\n-\n-\t\tif (buffers[0].planes[0].fd.fd() == -1 ||\n-\t\t    buffers[0].planes[1].fd.fd() != -1 ||\n-\t\t    buffers[0].planes[2].fd.fd() != -1 ||\n-\t\t    buffers[0].planes[0].fd.fd() == -1 ||\n-\t\t    buffers[1].planes[1].fd.fd() == -1 ||\n-\t\t    buffers[1].planes[2].fd.fd() != -1) {\n-\t\t\tcerr << \"mapBuffers(): Invalid dmabuf\" << endl;\n-\t\t\treturn report(Op_mapBuffers, TestFail);\n-\t\t}\n-\n-\t\treport(Op_mapBuffers, TestPass);\n-\t}\n-\n-\tvoid unmapBuffers(const std::vector<unsigned int> &ids) override\n-\t{\n-\t\tif (ids.size() != 2) {\n-\t\t\tcerr << \"unmapBuffers(): Invalid number of ids \"\n-\t\t\t     << ids.size() << endl;\n-\t\t\treturn report(Op_unmapBuffers, TestFail);\n-\t\t}\n-\n-\t\tif (ids[0] != 10 || ids[1] != 11) {\n-\t\t\tcerr << \"unmapBuffers(): Invalid buffer IDs\" << endl;\n-\t\t\treturn report(Op_unmapBuffers, TestFail);\n-\t\t}\n-\n-\t\treport(Op_unmapBuffers, TestPass);\n-\t}\n-\n-\tvoid processEvent(const IPAOperationData &data) override\n-\t{\n-\t\t/* Verify operation and data. */\n-\t\tif (data.operation != Op_processEvent) {\n-\t\t\tcerr << \"processEvent(): Invalid operation \"\n-\t\t\t     << data.operation << endl;\n-\t\t\treturn report(Op_processEvent, TestFail);\n-\t\t}\n-\n-\t\tif (data.data != std::vector<unsigned int>{ 1, 2, 3, 4 }) {\n-\t\t\tcerr << \"processEvent(): Invalid data\" << endl;\n-\t\t\treturn report(Op_processEvent, TestFail);\n-\t\t}\n-\n-\t\t/* Verify controls. */\n-\t\tif (data.controls.size() != 1) {\n-\t\t\tcerr << \"processEvent(): Controls not found\" << endl;\n-\t\t\treturn report(Op_processEvent, TestFail);\n-\t\t}\n-\n-\t\tconst ControlList &controls = data.controls[0];\n-\t\tif (controls.get(V4L2_CID_BRIGHTNESS).get<int32_t>() != 10 ||\n-\t\t    controls.get(V4L2_CID_CONTRAST).get<int32_t>() != 20 ||\n-\t\t    controls.get(V4L2_CID_SATURATION).get<int32_t>() != 30) {\n-\t\t\tcerr << \"processEvent(): Invalid controls\" << endl;\n-\t\t\treturn report(Op_processEvent, TestFail);\n-\t\t}\n-\n-\t\treport(Op_processEvent, TestPass);\n-\t}\n-\n-private:\n-\tvoid report(Operation op, int status)\n-\t{\n-\t\tIPAOperationData data;\n-\t\tdata.operation = op;\n-\t\tdata.data.resize(1);\n-\t\tdata.data[0] = status;\n-\t\tqueueFrameAction.emit(sequence_++, data);\n-\t}\n-\n-\tunsigned int sequence_;\n-};\n-\n-#define INVOKE(method, ...) \\\n-\tinvoke(&IPAInterface::method, Op_##method, #method, ##__VA_ARGS__)\n-\n-class IPAWrappersTest : public Test\n-{\n-public:\n-\tIPAWrappersTest()\n-\t\t: subdev_(nullptr), wrapper_(nullptr), sequence_(0), fd_(-1)\n-\t{\n-\t}\n-\n-protected:\n-\tint init() override\n-\t{\n-\t\t/* Locate the VIMC Sensor B subdevice. */\n-\t\tenumerator_ = unique_ptr<DeviceEnumerator>(DeviceEnumerator::create());\n-\t\tif (!enumerator_) {\n-\t\t\tcerr << \"Failed to create device enumerator\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tif (enumerator_->enumerate()) {\n-\t\t\tcerr << \"Failed to enumerate media devices\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tDeviceMatch dm(\"vimc\");\n-\t\tmedia_ = enumerator_->search(dm);\n-\t\tif (!media_) {\n-\t\t\tcerr << \"No VIMC media device found: skip test\" << endl;\n-\t\t\treturn TestSkip;\n-\t\t}\n-\n-\t\tMediaEntity *entity = media_->getEntityByName(\"Sensor A\");\n-\t\tif (!entity) {\n-\t\t\tcerr << \"Unable to find media entity 'Sensor A'\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tsubdev_ = new V4L2Subdevice(entity);\n-\t\tif (subdev_->open() < 0) {\n-\t\t\tcerr << \"Unable to open 'Sensor A' subdevice\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\t/* Force usage of the C API as that's what we want to test. */\n-\t\tint ret = setenv(\"LIBCAMERA_IPA_FORCE_C_API\", \"\", 1);\n-\t\tif (ret)\n-\t\t\treturn TestFail;\n-\n-\t\tstd::unique_ptr<IPAInterface> intf = std::make_unique<TestIPAInterface>();\n-\t\twrapper_ = new IPAContextWrapper(new IPAInterfaceWrapper(std::move(intf)));\n-\t\twrapper_->queueFrameAction.connect(this, &IPAWrappersTest::queueFrameAction);\n-\n-\t\t/* Create a file descriptor for the buffer-related operations. */\n-\t\tfd_ = open(\"/tmp\", O_TMPFILE | O_RDWR, 0600);\n-\t\tif (fd_ == -1)\n-\t\t\treturn TestFail;\n-\n-\t\tret = ftruncate(fd_, 4096);\n-\t\tif (ret < 0)\n-\t\t\treturn TestFail;\n-\n-\t\treturn TestPass;\n-\t}\n-\n-\tint run() override\n-\t{\n-\t\tint ret;\n-\n-\t\t/* Test configure(). */\n-\t\tCameraSensorInfo sensorInfo{\n-\t\t\t.model = \"sensor\",\n-\t\t\t.bitsPerPixel = 8,\n-\t\t\t.activeAreaSize = { 2576, 1956 },\n-\t\t\t.analogCrop = { 8, 8, 2560, 1940 },\n-\t\t\t.outputSize = { 2560, 1940 },\n-\t\t\t.pixelRate = 96000000,\n-\t\t\t.lineLength = 2918,\n-\t\t};\n-\t\tstd::map<unsigned int, IPAStream> config{\n-\t\t\t{ 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },\n-\t\t\t{ 2, { V4L2_PIX_FMT_NV12, { 800, 600 } } },\n-\t\t};\n-\t\tstd::map<unsigned int, const ControlInfoMap &> controlInfo;\n-\t\tcontrolInfo.emplace(42, subdev_->controls());\n-\t\tIPAOperationData ipaConfig;\n-\t\tret = INVOKE(configure, sensorInfo, config, controlInfo,\n-\t\t\t     ipaConfig, nullptr);\n-\t\tif (ret == TestFail)\n-\t\t\treturn TestFail;\n-\n-\t\t/* Test mapBuffers(). */\n-\t\tstd::vector<IPABuffer> buffers(2);\n-\t\tbuffers[0].planes.resize(3);\n-\t\tbuffers[0].id = 10;\n-\t\tbuffers[0].planes[0].fd = FileDescriptor(fd_);\n-\t\tbuffers[0].planes[0].length = 4096;\n-\t\tbuffers[1].id = 11;\n-\t\tbuffers[1].planes.resize(3);\n-\t\tbuffers[1].planes[0].fd = FileDescriptor(fd_);\n-\t\tbuffers[1].planes[0].length = 4096;\n-\t\tbuffers[1].planes[1].fd = FileDescriptor(fd_);\n-\t\tbuffers[1].planes[1].length = 4096;\n-\n-\t\tret = INVOKE(mapBuffers, buffers);\n-\t\tif (ret == TestFail)\n-\t\t\treturn TestFail;\n-\n-\t\t/* Test unmapBuffers(). */\n-\t\tstd::vector<unsigned int> bufferIds = { 10, 11 };\n-\t\tret = INVOKE(unmapBuffers, bufferIds);\n-\t\tif (ret == TestFail)\n-\t\t\treturn TestFail;\n-\n-\t\t/* Test processEvent(). */\n-\t\tIPAOperationData data;\n-\t\tdata.operation = Op_processEvent;\n-\t\tdata.data = { 1, 2, 3, 4 };\n-\t\tdata.controls.emplace_back(subdev_->controls());\n-\n-\t\tControlList &controls = data.controls.back();\n-\t\tcontrols.set(V4L2_CID_BRIGHTNESS, static_cast<int32_t>(10));\n-\t\tcontrols.set(V4L2_CID_CONTRAST, static_cast<int32_t>(20));\n-\t\tcontrols.set(V4L2_CID_SATURATION, static_cast<int32_t>(30));\n-\n-\t\tret = INVOKE(processEvent, data);\n-\t\tif (ret == TestFail)\n-\t\t\treturn TestFail;\n-\n-\t\t/*\n-\t\t * Test init(), start() and stop() last to ensure nothing in the\n-\t\t * wrappers or serializer depends on them being called first.\n-\t\t */\n-\t\tIPASettings settings{\n-\t\t\t.configurationFile = \"/ipa/configuration/file\"\n-\t\t};\n-\t\tret = INVOKE(init, settings);\n-\t\tif (ret == TestFail) {\n-\t\t\tcerr << \"Failed to run init()\";\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tret = INVOKE(start);\n-\t\tif (ret == TestFail) {\n-\t\t\tcerr << \"Failed to run start()\";\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tret = INVOKE(stop);\n-\t\tif (ret == TestFail) {\n-\t\t\tcerr << \"Failed to run stop()\";\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\treturn TestPass;\n-\t}\n-\n-\tvoid cleanup() override\n-\t{\n-\t\tdelete wrapper_;\n-\t\tdelete subdev_;\n-\n-\t\tif (fd_ != -1)\n-\t\t\tclose(fd_);\n-\t}\n-\n-private:\n-\ttemplate<typename T, typename... Args1, typename... Args2>\n-\tint invoke(T (IPAInterface::*func)(Args1...), Operation op,\n-\t\t   const char *name, Args2... args)\n-\t{\n-\t\tdata_ = IPAOperationData();\n-\t\t(wrapper_->*func)(args...);\n-\n-\t\tif (frame_ != sequence_) {\n-\t\t\tcerr << \"IPAInterface::\" << name\n-\t\t\t     << \"(): invalid frame number \" << frame_\n-\t\t\t     << \", expected \" << sequence_;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tsequence_++;\n-\n-\t\tif (data_.operation != op) {\n-\t\t\tcerr << \"IPAInterface::\" << name\n-\t\t\t     << \"(): failed to propagate\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\tif (data_.data[0] != TestPass) {\n-\t\t\tcerr << \"IPAInterface::\" << name\n-\t\t\t     << \"(): reported an error\" << endl;\n-\t\t\treturn TestFail;\n-\t\t}\n-\n-\t\treturn TestPass;\n-\t}\n-\n-\tvoid queueFrameAction(unsigned int frame, const IPAOperationData &data)\n-\t{\n-\t\tframe_ = frame;\n-\t\tdata_ = data;\n-\t}\n-\n-\tstd::shared_ptr<MediaDevice> media_;\n-\tstd::unique_ptr<DeviceEnumerator> enumerator_;\n-\tV4L2Subdevice *subdev_;\n-\n-\tIPAContextWrapper *wrapper_;\n-\tIPAOperationData data_;\n-\tunsigned int sequence_;\n-\tunsigned int frame_;\n-\tint fd_;\n-};\n-\n-TEST_REGISTER(IPAWrappersTest)\ndiff --git a/test/ipa/meson.build b/test/ipa/meson.build\nindex fce58a31..f83bb29e 100644\n--- a/test/ipa/meson.build\n+++ b/test/ipa/meson.build\n@@ -3,7 +3,6 @@\n ipa_test = [\n     ['ipa_module_test',     'ipa_module_test.cpp'],\n     ['ipa_interface_test',  'ipa_interface_test.cpp'],\n-    ['ipa_wrappers_test',   'ipa_wrappers_test.cpp'],\n ]\n \n foreach t : ipa_test\n","prefixes":["libcamera-devel","v4","33/37"]}