[{"id":22270,"web_url":"https://patchwork.libcamera.org/comment/22270/","msgid":"<164727489015.123014.12089120053818755589@Monstersaurus>","date":"2022-03-14T16:21:30","subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"Hi Tomi,\n\nQuoting Tomi Valkeinen (2022-03-14 15:46:32)\n> Add a simple unittests.py as a base for python unittests.\n> \n> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> ---\n>  src/py/test/unittests.py | 364 +++++++++++++++++++++++++++++++++++++++\n\nIs it feasible to get this to run/integrate with the meson.build test hooks?\n\nIt might want to be under test/python/ perhaps then too.\n\n>  1 file changed, 364 insertions(+)\n>  create mode 100755 src/py/test/unittests.py\n> \n> diff --git a/src/py/test/unittests.py b/src/py/test/unittests.py\n> new file mode 100755\n> index 00000000..ca3c37bf\n> --- /dev/null\n> +++ b/src/py/test/unittests.py\n> @@ -0,0 +1,364 @@\n> +#!/usr/bin/env python3\n> +\n> +# SPDX-License-Identifier: GPL-2.0-or-later\n> +# Copyright (C) 2021, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> +\n> +from collections import defaultdict\n> +import errno\n> +import gc\n> +import libcamera as libcam\n> +import os\n> +import selectors\n> +import time\n> +import unittest\n> +import weakref\n> +\n> +class MyTestCase(unittest.TestCase):\n> +       def assertZero(self, a, msg=None):\n> +               self.assertEqual(a, 0, msg)\n> +\n> +class SimpleTestMethods(MyTestCase):\n> +       def test_find_ref(self):\n> +               cm = libcam.CameraManager.singleton()\n> +               wr_cm = weakref.ref(cm)\n> +\n> +               cam = cm.find(\"platform/vimc\")\n> +               self.assertIsNotNone(cam)\n> +               wr_cam = weakref.ref(cam)\n> +\n> +               cm = None\n> +               gc.collect()\n> +               self.assertIsNotNone(wr_cm())\n> +\n> +               cam = None\n> +               gc.collect()\n> +               self.assertIsNone(wr_cm())\n> +               self.assertIsNone(wr_cam())\n> +\n> +       def test_get_ref(self):\n> +               cm = libcam.CameraManager.singleton()\n> +               wr_cm = weakref.ref(cm)\n> +\n> +               cam = cm.get(\"platform/vimc.0 Sensor B\")\n> +               self.assertTrue(cam != None)\n> +               wr_cam = weakref.ref(cam)\n> +\n> +               cm = None\n> +               gc.collect()\n> +               self.assertIsNotNone(wr_cm())\n> +\n> +               cam = None\n> +               gc.collect()\n> +               self.assertIsNone(wr_cm())\n> +               self.assertIsNone(wr_cam())\n> +\n> +       def test_acquire_release(self):\n> +               cm = libcam.CameraManager.singleton()\n> +               cam = cm.get(\"platform/vimc.0 Sensor B\")\n> +               self.assertTrue(cam != None)\n> +\n> +               ret = cam.acquire()\n> +               self.assertZero(ret)\n> +\n> +               ret = cam.release()\n> +               self.assertZero(ret)\n> +\n> +       def test_double_acquire(self):\n> +               cm = libcam.CameraManager.singleton()\n> +               cam = cm.get(\"platform/vimc.0 Sensor B\")\n> +               self.assertTrue(cam != None)\n> +\n> +               ret = cam.acquire()\n> +               self.assertZero(ret)\n> +\n> +               libcam.logSetLevel(\"Camera\", \"FATAL\")\n> +               ret = cam.acquire()\n> +               self.assertEqual(ret, -errno.EBUSY)\n> +               libcam.logSetLevel(\"Camera\", \"ERROR\")\n> +\n> +               ret = cam.release()\n> +               self.assertZero(ret)\n> +\n> +               ret = cam.release()\n> +               # I expected EBUSY, but looks like double release works fine\n> +               self.assertZero(ret)\n> +\n> +class CameraTesterBase(MyTestCase):\n> +       def setUp(self):\n> +               self.cm = libcam.CameraManager.singleton()\n> +               self.cam = self.cm.find(\"platform/vimc\")\n> +               if self.cam == None:\n> +                       self.cm = None\n> +                       raise Exception(\"No vimc found\")\n> +\n> +               ret = self.cam.acquire()\n> +               if ret != 0:\n> +                       self.cam = None\n> +                       self.cm = None\n> +                       raise Exception(\"Failed to acquire camera\")\n> +\n> +       def tearDown(self):\n> +               # If a test fails, the camera may be in running state. So always stop.\n> +               self.cam.stop()\n> +\n> +               ret = self.cam.release()\n> +               if ret != 0:\n> +                       raise Exception(\"Failed to release camera\")\n> +\n> +               self.cam = None\n> +               self.cm = None\n> +\n> +\n> +class AllocatorTestMethods(CameraTesterBase):\n> +       def test_allocator(self):\n> +               cam = self.cam\n> +\n> +               camconfig = cam.generateConfiguration([libcam.StreamRole.StillCapture])\n> +               self.assertTrue(camconfig.size == 1)\n> +               wr_camconfig = weakref.ref(camconfig)\n> +\n> +               streamconfig = camconfig.at(0)\n> +               wr_streamconfig = weakref.ref(streamconfig)\n> +\n> +               ret = cam.configure(camconfig);\n> +               self.assertZero(ret)\n> +\n> +               stream = streamconfig.stream\n> +               wr_stream = weakref.ref(stream)\n> +\n> +               # stream should keep streamconfig and camconfig alive\n> +               streamconfig = None\n> +               camconfig = None\n> +               gc.collect()\n> +               self.assertIsNotNone(wr_camconfig())\n> +               self.assertIsNotNone(wr_streamconfig())\n> +\n> +               allocator = libcam.FrameBufferAllocator(cam);\n> +               ret = allocator.allocate(stream)\n> +               self.assertTrue(ret > 0)\n> +               wr_allocator = weakref.ref(allocator)\n> +\n> +               buffers = allocator.buffers(stream)\n> +               buffers = None\n> +\n> +\n> +               buffer = allocator.buffers(stream)[0]\n> +               self.assertIsNotNone(buffer)\n> +               wr_buffer = weakref.ref(buffer)\n> +\n> +               allocator = None\n> +               gc.collect()\n> +               self.assertIsNotNone(wr_buffer())\n> +               self.assertIsNotNone(wr_allocator())\n> +               self.assertIsNotNone(wr_stream())\n> +\n> +               buffer = None\n> +               gc.collect()\n> +               self.assertIsNone(wr_buffer())\n> +               self.assertIsNone(wr_allocator())\n> +               self.assertIsNotNone(wr_stream())\n> +\n> +               stream = None\n> +               gc.collect()\n> +               self.assertIsNone(wr_stream())\n> +               self.assertIsNone(wr_camconfig())\n> +               self.assertIsNone(wr_streamconfig())\n> +\n> +\n> +class SimpleCaptureMethods(CameraTesterBase):\n> +       def test_sleep(self):\n> +               cm = self.cm\n> +               cam = self.cam\n> +\n> +               camconfig = cam.generateConfiguration([libcam.StreamRole.StillCapture])\n> +               self.assertTrue(camconfig.size == 1)\n> +\n> +               streamconfig = camconfig.at(0)\n> +               fmts = streamconfig.formats\n> +\n> +               ret = cam.configure(camconfig);\n> +               self.assertZero(ret)\n> +\n> +               stream = streamconfig.stream\n> +\n> +               allocator = libcam.FrameBufferAllocator(cam);\n> +               ret = allocator.allocate(stream)\n> +               self.assertTrue(ret > 0)\n> +\n> +               num_bufs = len(allocator.buffers(stream))\n> +\n> +               reqs = []\n> +               for i in range(num_bufs):\n> +                       req = cam.createRequest(i)\n> +                       self.assertIsNotNone(req)\n> +\n> +                       buffer = allocator.buffers(stream)[i]\n> +                       ret = req.addBuffer(stream, buffer)\n> +                       self.assertZero(ret)\n> +\n> +                       reqs.append(req)\n> +\n> +               buffer = None\n> +\n> +               ret = cam.start()\n> +               self.assertZero(ret)\n> +\n> +               for req in reqs:\n> +                       ret = cam.queueRequest(req)\n> +                       self.assertZero(ret)\n> +\n> +               reqs = None\n> +               gc.collect()\n> +\n> +               time.sleep(0.5)\n> +\n> +               reqs = cm.getReadyRequests()\n> +\n> +               self.assertTrue(len(reqs) == num_bufs)\n> +\n> +               for i, req in enumerate(reqs):\n> +                       self.assertTrue(i == req.cookie)\n> +\n> +               reqs = None\n> +               gc.collect()\n> +\n> +               ret = cam.stop()\n> +               self.assertZero(ret)\n> +\n> +\n> +       def test_select(self):\n> +               cm = self.cm\n> +               cam = self.cam\n> +\n> +               camconfig = cam.generateConfiguration([libcam.StreamRole.StillCapture])\n> +               self.assertTrue(camconfig.size == 1)\n> +\n> +               streamconfig = camconfig.at(0)\n> +               fmts = streamconfig.formats\n> +\n> +               ret = cam.configure(camconfig);\n> +               self.assertZero(ret)\n> +\n> +               stream = streamconfig.stream\n> +\n> +               allocator = libcam.FrameBufferAllocator(cam);\n> +               ret = allocator.allocate(stream)\n> +               self.assertTrue(ret > 0)\n> +\n> +               num_bufs = len(allocator.buffers(stream))\n> +\n> +               reqs = []\n> +               for i in range(num_bufs):\n> +                       req = cam.createRequest(i)\n> +                       self.assertIsNotNone(req)\n> +\n> +                       buffer = allocator.buffers(stream)[i]\n> +                       ret = req.addBuffer(stream, buffer)\n> +                       self.assertZero(ret)\n> +\n> +                       reqs.append(req)\n> +\n> +               buffer = None\n> +\n> +               ret = cam.start()\n> +               self.assertZero(ret)\n> +\n> +               for req in reqs:\n> +                       ret = cam.queueRequest(req)\n> +                       self.assertZero(ret)\n> +\n> +               reqs = None\n> +               gc.collect()\n> +\n> +               sel = selectors.DefaultSelector()\n> +               sel.register(cm.efd, selectors.EVENT_READ, 123)\n> +\n> +               reqs = []\n> +\n> +               running = True\n> +               while running:\n> +                       events = sel.select()\n> +                       for key, mask in events:\n> +                               os.read(key.fileobj, 8)\n> +\n> +                               l = cm.getReadyRequests()\n> +\n> +                               self.assertTrue(len(l) > 0)\n> +\n> +                               reqs += l\n> +\n> +                               if len(reqs) == num_bufs:\n> +                                       running = False\n> +\n> +               self.assertTrue(len(reqs) == num_bufs)\n> +\n> +               for i, req in enumerate(reqs):\n> +                       self.assertTrue(i == req.cookie)\n> +\n> +               reqs = None\n> +               gc.collect()\n> +\n> +               ret = cam.stop()\n> +               self.assertZero(ret)\n> +\n> +\n> +\n> +# Recursively expand slist's objects into olist, using seen to track already\n> +# processed objects.\n> +def _getr(slist, olist, seen):\n> +       for e in slist:\n> +               if id(e) in seen:\n> +                       continue\n> +               seen.add(id(e))\n> +               olist.append(e)\n> +               tl = gc.get_referents(e)\n> +               if tl:\n> +                       _getr(tl, olist, seen)\n> +\n> +def get_all_objects(ignored = []):\n> +       gcl = gc.get_objects()\n> +       olist = []\n> +       seen = set()\n> +\n> +       seen.add(id(gcl))\n> +       seen.add(id(olist))\n> +       seen.add(id(seen))\n> +       seen.update(set([id(o) for o in ignored]))\n> +\n> +       _getr(gcl, olist, seen)\n> +\n> +       return olist\n> +\n> +def create_type_count_map(olist):\n> +       map = defaultdict(int)\n> +       for o in olist:\n> +               map[type(o)] += 1\n> +       return map\n> +\n> +def diff_type_count_maps(before, after):\n> +       return [(k, after[k] - before[k]) for k in after if after[k] != before[k]]\n> +\n> +if __name__ == '__main__':\n> +       # doesn't work very well, as things always leak a bit\n> +       test_leaks = False\n> +\n> +       if test_leaks:\n> +               gc.unfreeze()\n> +               gc.collect()\n> +\n> +               obs_before = get_all_objects()\n> +\n> +       unittest.main(exit=False)\n> +\n> +       if test_leaks:\n> +               gc.unfreeze()\n> +               gc.collect()\n> +\n> +               obs_after = get_all_objects([obs_before])\n> +\n> +               before = create_type_count_map(obs_before)\n> +               after = create_type_count_map(obs_after)\n> +\n> +               leaks = diff_type_count_maps(before, after)\n> +               if len(leaks) > 0:\n> +                       print(leaks)\n> -- \n> 2.25.1\n>","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 8D8FFBE08A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 14 Mar 2022 16:21:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EB05F604EA;\n\tMon, 14 Mar 2022 17:21:33 +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 132E0604E6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 14 Mar 2022 17:21:33 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 927622E0;\n\tMon, 14 Mar 2022 17:21:32 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1647274894;\n\tbh=39xZxbAa2s3VUJWItbmp2NDOgjWitaT1VpL2C1LnJIw=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=u/4VsaOrT5b4fdGWMa8tkbx7cmZCtmstJJxrSzCTcfZm2zbX0x5ryK8avNcPY4KXF\n\tVrhHw0CzacXMTwcWiE3mMFYaf4haTFIaDj8josHrcOPfmKGO+DABUqVWpdNhV1+yFD\n\tL1ELhSS6yJS0XOwWOeYbnI9hZl8dsAGM3a1tv4wqacTpdSGkvZspL1u9zmav5yKE7X\n\tKt42u2nxGujv0mVKwo684B2rKSEnSOJ//cirxahjp2ff6iubCXNba/cvi60OObX1Ae\n\tXEJSs9wNMblMqzoJNDXLgcQGtJxYkhMi5t1RJ3Sk0/KjwAr5wZWuFxRhMIzbg21k1P\n\tB9XaLu1EVZXsQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1647274892;\n\tbh=39xZxbAa2s3VUJWItbmp2NDOgjWitaT1VpL2C1LnJIw=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Znkm8mRXSrnC3FlEP1E2P+8oBXs7j5c7KeRtaVVR2PrJxC2gvFr9fUJ1vtXyyN6xW\n\tmfEPi6Xcr5ZkW+Ox4DWaSvFiY0AKMdMuCwUeKOWBUHFzNYRGlDfen8ly80vH+6nsAc\n\tBBiIDeVLa9RZaGGmFP8/iVlMbHfN0RRpNc4zF9WU="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Znkm8mRX\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20220314154633.506026-3-tomi.valkeinen@ideasonboard.com>","References":"<20220314154633.506026-1-tomi.valkeinen@ideasonboard.com>\n\t<20220314154633.506026-3-tomi.valkeinen@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tTomi Valkeinen <tomi.valkeinen@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 14 Mar 2022 16:21:30 +0000","Message-ID":"<164727489015.123014.12089120053818755589@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","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>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22271,"web_url":"https://patchwork.libcamera.org/comment/22271/","msgid":"<6f22301b-a8b3-73e6-c0f5-637a77e53f27@ideasonboard.com>","date":"2022-03-15T06:09:20","subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"On 14/03/2022 18:21, Kieran Bingham wrote:\n> Hi Tomi,\n> \n> Quoting Tomi Valkeinen (2022-03-14 15:46:32)\n>> Add a simple unittests.py as a base for python unittests.\n>>\n>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>> ---\n>>   src/py/test/unittests.py | 364 +++++++++++++++++++++++++++++++++++++++\n> \n> Is it feasible to get this to run/integrate with the meson.build test hooks?\n> \n> It might want to be under test/python/ perhaps then too.\n\nYes, seems to work fine.\n\nAny preference on the test suite name & test name?\n\n  Tomi","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 89C56BDE17\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 15 Mar 2022 06:09:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C99FB610F8;\n\tTue, 15 Mar 2022 07:09:26 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C43D7604D5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 15 Mar 2022 07:09:24 +0100 (CET)","from [192.168.1.111] (91-156-85-209.elisa-laajakaista.fi\n\t[91.156.85.209])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 18A6A2E0;\n\tTue, 15 Mar 2022 07:09:24 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1647324566;\n\tbh=cvis5B7KMeV+KNaA1Ag4+ZUy5jDIaK/ViR5dcnOzcy8=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=alwLdLZDtnvUu/14zv8Rqo6pkZfg9LiQeoryuT0/Bybu9gq5h6Bk4lZDq23ZhkkxN\n\tFKUvd0KJCdxoMH5Zv//SioaAn84ClIYIkgZ5xdlgdLF8Jkgtq2+S/SH9ltauUYynlH\n\txGWc5tTQQYNfHIxCIxNdAU951M+Niu1ifyJ7I9WKwaFBUez0CxJUxg5RhmTEhiPHfD\n\tWbEc6N0CVvbBd2HD5QxILpThgBKn6DDYgnEXojCBC/uksIvEwq/2IXcXQrSdtULDQi\n\t1M32TMsENhf7LyNRXEPvKY6YeO7X3rPG9qCyvkMuRYgLsqCbZVk5fVFi+zpDuIjZAa\n\tcTnoJGcGLrZmQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1647324564;\n\tbh=cvis5B7KMeV+KNaA1Ag4+ZUy5jDIaK/ViR5dcnOzcy8=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=i72v9Esc0zhOLfWNd5w0V5cPj3iu0vBfz9CNcBWwEe9zxrGfxALBaiyqwZU/eYF1F\n\tlnQfKsfOCqD7vA6eGv9tJ/qQ8AYOCZA/2dLQM6p0U4J83xGu23AV0l72A+no4NPzFG\n\t7WrZm514IrF8tHf/Wjz6VEo7wAB4uJJKMwxpB6rY="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"i72v9Esc\"; dkim-atps=neutral","Message-ID":"<6f22301b-a8b3-73e6-c0f5-637a77e53f27@ideasonboard.com>","Date":"Tue, 15 Mar 2022 08:09:20 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.5.0","Content-Language":"en-US","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tDavid Plowman <david.plowman@raspberrypi.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220314154633.506026-1-tomi.valkeinen@ideasonboard.com>\n\t<20220314154633.506026-3-tomi.valkeinen@ideasonboard.com>\n\t<164727489015.123014.12089120053818755589@Monstersaurus>","In-Reply-To":"<164727489015.123014.12089120053818755589@Monstersaurus>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","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>","From":"Tomi Valkeinen via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22276,"web_url":"https://patchwork.libcamera.org/comment/22276/","msgid":"<164734486812.123014.12658381960484025564@Monstersaurus>","date":"2022-03-15T11:47:48","subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"Quoting Tomi Valkeinen (2022-03-15 06:09:20)\n> On 14/03/2022 18:21, Kieran Bingham wrote:\n> > Hi Tomi,\n> > \n> > Quoting Tomi Valkeinen (2022-03-14 15:46:32)\n> >> Add a simple unittests.py as a base for python unittests.\n> >>\n> >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> >> ---\n> >>   src/py/test/unittests.py | 364 +++++++++++++++++++++++++++++++++++++++\n> > \n> > Is it feasible to get this to run/integrate with the meson.build test hooks?\n> > \n> > It might want to be under test/python/ perhaps then too.\n> \n> Yes, seems to work fine.\n> \n> Any preference on the test suite name & test name?\n> \n\nNot specifically, suite name is likely python, and test name - well you\nonly have one at the moment, which seems to contain multiple tests.\nMeson can parse TAP to get the results of each test if you expose it -\nbut I haven't explored enough there yet.\n\nSo for now - just the single pass/fail/skip is likely enough.\n\n(If python is not enabled, then I think the test/python/meson.build\nshould skip the dir and not test anything).\n\n--\nKieran\n\n\n\n>   Tomi","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 DE742BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 15 Mar 2022 11:47:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 43FCD610F8;\n\tTue, 15 Mar 2022 12:47:52 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BF52D604DA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 15 Mar 2022 12:47:50 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5023D1AD5;\n\tTue, 15 Mar 2022 12:47:50 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1647344872;\n\tbh=WjKCNeB8Lq4OpRFMgfIQ9Se7USNxAWTOCns8diKEKUc=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=bTNUwtX7niP/u8sRRtMUzRgMtSncVjD0oz/hK9oXP6Khtv8OiTLQUiTSIPF1SnHFt\n\tbLg8NMzS18KrEFqPrVEgtmGVwRoUrg5yivc17/Lp+WMACINTYaKMEuCNiD/LssBRfE\n\t0uUFnQpaumBg+4GVO66MS20HNvEoxydjh04/al/NwpsvyFsiEqXAqeTBy+b3plqN1r\n\tM8mxw4aToolg/LhRsG4yyqfy8cb2as3/sy3OPOKxI/eH/aaUJ6xLGnXSR4FKhXRdax\n\tKtnRGP5/amvm6YjYbcFoBEm0DtGjEYZAz2KNLRGZEOtmJIW5/bN95pZE3SfrYP7O1u\n\tiiLw4rTJ7QNJA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1647344870;\n\tbh=WjKCNeB8Lq4OpRFMgfIQ9Se7USNxAWTOCns8diKEKUc=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=FKqMrg3jiR8zZSqkzzUpbv3QRv3/d7U4tB+GglXIEL5SxbKsGToTqJhX6GjH24kkl\n\t6xazEmHNh7TJ1zn3Gis17KeLZp0fvWD5zOlNcp0/9sDfrMOsPKBCgDOtQlm2Imkl6b\n\tTD7DBqLdWYAWdeqrRTd1OZB2DnzIZ257otU+VKb8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"FKqMrg3j\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<6f22301b-a8b3-73e6-c0f5-637a77e53f27@ideasonboard.com>","References":"<20220314154633.506026-1-tomi.valkeinen@ideasonboard.com>\n\t<20220314154633.506026-3-tomi.valkeinen@ideasonboard.com>\n\t<164727489015.123014.12089120053818755589@Monstersaurus>\n\t<6f22301b-a8b3-73e6-c0f5-637a77e53f27@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tTomi Valkeinen <tomi.valkeinen@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 15 Mar 2022 11:47:48 +0000","Message-ID":"<164734486812.123014.12658381960484025564@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v5 2/3] py: add unittests.py","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>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]