{"id":11223,"url":"https://patchwork.libcamera.org/api/1.1/patches/11223/?format=json","web_url":"https://patchwork.libcamera.org/patch/11223/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20210211071846.35161-3-paul.elder@ideasonboard.com>","date":"2021-02-11T07:18:36","name":"[libcamera-devel,v7,02/12] tests: Remove IPA wrappers test","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":false,"hash":"6a26e20a62af6012cc4d1079f6ff1bd573e37c51","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/1.1/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/11223/mbox/","series":[{"id":1676,"url":"https://patchwork.libcamera.org/api/1.1/series/1676/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1676","date":"2021-02-11T07:18:34","name":"IPA isolation: Part 2: Conversion and plumbing","version":7,"mbox":"https://patchwork.libcamera.org/series/1676/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/11223/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/11223/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 A5B2EBD162\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 11 Feb 2021 07:19:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7170061662;\n\tThu, 11 Feb 2021 08:19:01 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EDA0861657\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 11 Feb 2021 08:18:59 +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 E3BC099D;\n\tThu, 11 Feb 2021 08:18:57 +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=\"Pn4Boqpf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1613027939;\n\tbh=M4HjMgErn+wIB190j3TLx2qKeb7mzdOUbm9KLJQ8Uc0=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Pn4BoqpfZ/bp+tr9UWLaDmhAnA8mo4NAdcAieD3bmh0iFTBcgqahySg8Abbg/558S\n\thc3TN9p4pFss6AcKV1siJsjfFNlzOYoSGQglUb7RRcX1UjTwZlaSMhef9KYBNd14Rt\n\tNKXZH9qxhz6W0aX0uaK1pxoWpLfYEU4uLJ+/q7NM=","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Thu, 11 Feb 2021 16:18:36 +0900","Message-Id":"<20210211071846.35161-3-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.27.0","In-Reply-To":"<20210211071846.35161-1-paul.elder@ideasonboard.com>","References":"<20210211071846.35161-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v7 02/12] 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=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Since we will soon no longer use IPA wrappers, remove the test for it.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n---\nNo change in v7\n\nNo changes in v6\n\nChanges in v5:\n- move earlier in series\n\nNo change in v4\n\nNo change in v3\n\nNew in v2\n---\n test/ipa/ipa_wrappers_test.cpp | 455 ---------------------------------\n test/ipa/meson.build           |   1 -\n 2 files changed, 456 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 eb6d783e..00000000\n--- a/test/ipa/ipa_wrappers_test.cpp\n+++ /dev/null\n@@ -1,455 +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-#include <libipa/ipa_interface_wrapper.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([[maybe_unused]] const IPAOperationData &data,\n-\t\t  [[maybe_unused]] IPAOperationData *result) 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\t.minFrameLength = 1940,\n-\t\t\t.maxFrameLength = 2880\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, ipaConfig, nullptr);\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 ba672f3f..e4f0818a 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","v7","02/12"]}