[{"id":17619,"web_url":"https://patchwork.libcamera.org/comment/17619/","msgid":"<20210617220958.iwcn5s2soe4o7st2@uno.localdomain>","date":"2021-06-17T22:09:58","subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Nicolas,\n\nOn Wed, Jun 16, 2021 at 10:25:35AM -0300, Nícolas F. R. A. Prado wrote:\n> Add a --list parameter that lists all current tests (by mapping to\n> googletest's --gtest_list_tests).\n>\n> Add a --filter 'filterString' parameter that filters the tests to run\n> (by mapping to googletest's --gtest_filter).\n>\n> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n> Changes in v8:\n> - Thanks to Kieran:\n>   - Switched from malloc/free to new/delete in gtest parameter allocation\n>\n> Changes in v7:\n> - Thanks to Niklas:\n>   - Removed intermediary filter string variable in Harness::initGtestParameters()\n>\n> Changes in v6:\n> - Thanks to Niklas:\n>   - Changed buildGtestParameters() into initGtestParameters() and removed the\n>     need for Harness::gtestArgc_ and Harness::gtestArgv_\n>\n> Changes in v5:\n> - Thanks to Niklas:\n>   - Moved buildGtestParameters() inside run()\n>\n> No changes in v4\n>\n>  src/lc-compliance/main.cpp | 68 +++++++++++++++++++++++++++++++++++---\n>  1 file changed, 64 insertions(+), 4 deletions(-)\n>\n> diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> index 8c18845141de..bf9920008827 100644\n> --- a/src/lc-compliance/main.cpp\n> +++ b/src/lc-compliance/main.cpp\n> @@ -20,6 +20,8 @@ using namespace libcamera;\n>\n>  enum {\n>  \tOptCamera = 'c',\n> +\tOptList = 'l',\n> +\tOptFilter = 'f',\n>  \tOptHelp = 'h',\n>  };\n>\n> @@ -45,13 +47,17 @@ public:\n>  \t~Harness();\n>\n>  \tint init();\n> -\tint run(int argc, char **argv);\n> +\tint run(char *arg0);\n>\n>  private:\n> +\tint initGtestParameters(char *arg0);\n>  \tvoid listCameras();\n>\n>  \tOptionsParser::Options options_;\n>  \tstd::unique_ptr<CameraManager> cm_;\n> +\n> +\tconst std::map<std::string, std::string> gtestFlag_ = { { \"list\", \"--gtest_list_tests\" },\n> +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n\nFlags\n\n>  };\n>\n>  Harness::Harness(const OptionsParser::Options &options)\n> @@ -76,6 +82,12 @@ int Harness::init()\n>  \t\treturn ret;\n>  \t}\n>\n> +\t/*\n> +\t * No need to initialize the camera if we'll just list tests\n> +\t */\n\nFits on one line\n\n> +\tif (options_.isSet(OptList))\n> +\t\treturn 0;\n> +\n>  \tif (!options_.isSet(OptCamera)) {\n>  \t\tstd::cout << \"No camera specified, available cameras:\" << std::endl;\n>  \t\tlistCameras();\n> @@ -97,9 +109,11 @@ int Harness::init()\n>  \treturn 0;\n>  }\n>\n> -int Harness::run(int argc, char **argv)\n> +int Harness::run(char *arg0)\n>  {\n> -\t::testing::InitGoogleTest(&argc, argv);\n> +\tint ret = initGtestParameters(arg0);\n> +\tif (ret)\n> +\t\treturn ret;\n>\n>  \ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n>\n> @@ -112,12 +126,58 @@ void Harness::listCameras()\n>  \t\tstd::cout << \"- \" << cam.get()->id() << std::endl;\n>  }\n>\n> +int Harness::initGtestParameters(char *arg0)\n> +{\n> +\tint argc = 0;\n\nEmpty line\n\n> +\t/*\n> +\t * +2 to have space for both the 0th argument that is needed but not\n> +\t * used and the null at the end.\n> +\t */\n> +\tchar **argv = new char *[(gtestFlag_.size() + 2)];\n> +\tstd::string filterParam;\n> +\n> +\tif (!argv)\n> +\t\treturn -ENOMEM;\n> +\n> +\targv[argc] = arg0;\n\nargv[0]\n\nDoes ::testing::InitGoogleTest wants as argv[0] the main function\nargv[0] ? I've no reasons to think it doesn't but I don't get why :)\n\n\n> +\targc++;\n> +\n> +\tif (options_.isSet(OptList)) {\n> +\t\targv[argc] = const_cast<char *>(gtestFlag_.at(\"list\").c_str());\n> +\t\targc++;\n> +\t}\n> +\n> +\tif (options_.isSet(OptFilter)) {\n> +\t\t/*\n> +\t\t * The filter flag needs to be passed as a single parameter, in\n> +\t\t * the format --gtest_filter=filterStr\n> +\t\t */\n> +\t\tfilterParam = gtestFlag_.at(\"filter\") + \"=\" +\n> +\t\t\t      static_cast<const std::string &>(options_[OptFilter]);\n> +\n> +\t\targv[argc] = const_cast<char *>(filterParam.c_str());\n> +\t\targc++;\n> +\t}\n> +\n> +\targv[argc] = 0;\n> +\n> +\t::testing::InitGoogleTest(&argc, argv);\n> +\n> +\tdelete argv;\n\nI assume InitGoogleTest copies its arguments in then ?\n\nThe patch looks good, my only concern is that for any gtest option we\nhave to support we'll have to do the converion here. Do you know how\nmany options does gtest provides and how many of them could be useful\n?\n\nThanks\n  j\n\n> +\n> +\treturn 0;\n> +}\n> +\n>  static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n>  {\n>  \tOptionsParser parser;\n>  \tparser.addOption(OptCamera, OptionString,\n>  \t\t\t \"Specify which camera to operate on, by id\", \"camera\",\n>  \t\t\t ArgumentRequired, \"camera\");\n> +\tparser.addOption(OptList, OptionNone, \"List all tests and exit\", \"list\");\n> +\tparser.addOption(OptFilter, OptionString,\n> +\t\t\t \"Specify which tests to run\", \"filter\",\n> +\t\t\t ArgumentRequired, \"filter\");\n>  \tparser.addOption(OptHelp, OptionNone, \"Display this help message\",\n>  \t\t\t \"help\");\n>\n> @@ -147,5 +207,5 @@ int main(int argc, char **argv)\n>  \tif (ret)\n>  \t\treturn ret;\n>\n> -\treturn harness.run(argc, argv);\n> +\treturn harness.run(argv[0]);\n>  }\n> --\n> 2.32.0\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 B75D4C3218\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 17 Jun 2021 22:09:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id ECCDA68944;\n\tFri, 18 Jun 2021 00:09:12 +0200 (CEST)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EF78E6029A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 18 Jun 2021 00:09:10 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 27988200003;\n\tThu, 17 Jun 2021 22:09:09 +0000 (UTC)"],"Date":"Fri, 18 Jun 2021 00:09:58 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<20210617220958.iwcn5s2soe4o7st2@uno.localdomain>","References":"<20210616132535.453411-1-nfraprado@collabora.com>\n\t<20210616132535.453411-6-nfraprado@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210616132535.453411-6-nfraprado@collabora.com>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","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>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17655,"web_url":"https://patchwork.libcamera.org/comment/17655/","msgid":"<20210621105625.GB1899306@pyrite.rasen.tech>","date":"2021-06-21T10:56:25","subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Nicolas,\n\nThank you for the patch.\n\nOn Wed, Jun 16, 2021 at 10:25:35AM -0300, Nícolas F. R. A. Prado wrote:\n> Add a --list parameter that lists all current tests (by mapping to\n> googletest's --gtest_list_tests).\n> \n> Add a --filter 'filterString' parameter that filters the tests to run\n> (by mapping to googletest's --gtest_filter).\n> \n> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n> Changes in v8:\n> - Thanks to Kieran:\n>   - Switched from malloc/free to new/delete in gtest parameter allocation\n> \n> Changes in v7:\n> - Thanks to Niklas:\n>   - Removed intermediary filter string variable in Harness::initGtestParameters()\n> \n> Changes in v6:\n> - Thanks to Niklas:\n>   - Changed buildGtestParameters() into initGtestParameters() and removed the\n>     need for Harness::gtestArgc_ and Harness::gtestArgv_\n> \n> Changes in v5:\n> - Thanks to Niklas:\n>   - Moved buildGtestParameters() inside run()\n> \n> No changes in v4\n> \n>  src/lc-compliance/main.cpp | 68 +++++++++++++++++++++++++++++++++++---\n>  1 file changed, 64 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> index 8c18845141de..bf9920008827 100644\n> --- a/src/lc-compliance/main.cpp\n> +++ b/src/lc-compliance/main.cpp\n> @@ -20,6 +20,8 @@ using namespace libcamera;\n>  \n>  enum {\n>  \tOptCamera = 'c',\n> +\tOptList = 'l',\n> +\tOptFilter = 'f',\n>  \tOptHelp = 'h',\n>  };\n>  \n> @@ -45,13 +47,17 @@ public:\n>  \t~Harness();\n>  \n>  \tint init();\n> -\tint run(int argc, char **argv);\n> +\tint run(char *arg0);\n>  \n>  private:\n> +\tint initGtestParameters(char *arg0);\n>  \tvoid listCameras();\n>  \n>  \tOptionsParser::Options options_;\n>  \tstd::unique_ptr<CameraManager> cm_;\n> +\n> +\tconst std::map<std::string, std::string> gtestFlag_ = { { \"list\", \"--gtest_list_tests\" },\n> +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n>  };\n>  \n>  Harness::Harness(const OptionsParser::Options &options)\n> @@ -76,6 +82,12 @@ int Harness::init()\n>  \t\treturn ret;\n>  \t}\n>  \n> +\t/*\n> +\t * No need to initialize the camera if we'll just list tests\n> +\t */\n> +\tif (options_.isSet(OptList))\n> +\t\treturn 0;\n> +\n>  \tif (!options_.isSet(OptCamera)) {\n>  \t\tstd::cout << \"No camera specified, available cameras:\" << std::endl;\n>  \t\tlistCameras();\n> @@ -97,9 +109,11 @@ int Harness::init()\n>  \treturn 0;\n>  }\n>  \n> -int Harness::run(int argc, char **argv)\n> +int Harness::run(char *arg0)\n>  {\n> -\t::testing::InitGoogleTest(&argc, argv);\n> +\tint ret = initGtestParameters(arg0);\n> +\tif (ret)\n> +\t\treturn ret;\n>  \n>  \ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n>  \n> @@ -112,12 +126,58 @@ void Harness::listCameras()\n>  \t\tstd::cout << \"- \" << cam.get()->id() << std::endl;\n>  }\n>  \n> +int Harness::initGtestParameters(char *arg0)\n> +{\n> +\tint argc = 0;\n> +\t/*\n> +\t * +2 to have space for both the 0th argument that is needed but not\n> +\t * used and the null at the end.\n> +\t */\n> +\tchar **argv = new char *[(gtestFlag_.size() + 2)];\n> +\tstd::string filterParam;\n> +\n> +\tif (!argv)\n> +\t\treturn -ENOMEM;\n> +\n> +\targv[argc] = arg0;\n> +\targc++;\n> +\n> +\tif (options_.isSet(OptList)) {\n> +\t\targv[argc] = const_cast<char *>(gtestFlag_.at(\"list\").c_str());\n> +\t\targc++;\n> +\t}\n> +\n> +\tif (options_.isSet(OptFilter)) {\n> +\t\t/*\n> +\t\t * The filter flag needs to be passed as a single parameter, in\n> +\t\t * the format --gtest_filter=filterStr\n> +\t\t */\n> +\t\tfilterParam = gtestFlag_.at(\"filter\") + \"=\" +\n> +\t\t\t      static_cast<const std::string &>(options_[OptFilter]);\n> +\n> +\t\targv[argc] = const_cast<char *>(filterParam.c_str());\n> +\t\targc++;\n> +\t}\n> +\n> +\targv[argc] = 0;\n> +\n> +\t::testing::InitGoogleTest(&argc, argv);\n> +\n> +\tdelete argv;\n\nI'm getting error: 'delete' applied to a pointer that was allocated with\n'new[]'; did you mean 'delete[]'? [-Werror,-Wmismatched-new-delete] here\non clang.\n\n\nPaul\n\n> +\n> +\treturn 0;\n> +}\n> +\n>  static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n>  {\n>  \tOptionsParser parser;\n>  \tparser.addOption(OptCamera, OptionString,\n>  \t\t\t \"Specify which camera to operate on, by id\", \"camera\",\n>  \t\t\t ArgumentRequired, \"camera\");\n> +\tparser.addOption(OptList, OptionNone, \"List all tests and exit\", \"list\");\n> +\tparser.addOption(OptFilter, OptionString,\n> +\t\t\t \"Specify which tests to run\", \"filter\",\n> +\t\t\t ArgumentRequired, \"filter\");\n>  \tparser.addOption(OptHelp, OptionNone, \"Display this help message\",\n>  \t\t\t \"help\");\n>  \n> @@ -147,5 +207,5 @@ int main(int argc, char **argv)\n>  \tif (ret)\n>  \t\treturn ret;\n>  \n> -\treturn harness.run(argc, argv);\n> +\treturn harness.run(argv[0]);\n>  }\n> -- \n> 2.32.0\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 42FE4BE58C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Jun 2021 10:56:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EA99968932;\n\tMon, 21 Jun 2021 12:56:35 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D180C60295\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Jun 2021 12:56:33 +0200 (CEST)","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 CD87E268;\n\tMon, 21 Jun 2021 12:56:31 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"aL8IS4Di\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1624272993;\n\tbh=Nan+QYXfTikLRKIXzanFI4lAqzYCai4mF5UZ+SK9CHg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=aL8IS4DifxHpPMV0AQRQ/1/p/DpjxFvhPomKIkqUgUYHlYDsLYGGE3KaVYcOyUIUP\n\t7e3+zpbb8q6ylRaZLALiDVGU1y4a2G71WGMfmAO/DVdSfWSt490LN7/O4JTiPwN8O2\n\tv9JHp8DIf4mOLhlLInvF7m/HTnus6UzS0g/oNW3M=","Date":"Mon, 21 Jun 2021 19:56:25 +0900","From":"paul.elder@ideasonboard.com","To":"=?iso-8859-1?q?N=EDcolas_F=2E_R=2E_A=2E?= Prado <nfraprado@collabora.com>","Message-ID":"<20210621105625.GB1899306@pyrite.rasen.tech>","References":"<20210616132535.453411-1-nfraprado@collabora.com>\n\t<20210616132535.453411-6-nfraprado@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210616132535.453411-6-nfraprado@collabora.com>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","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>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com,\n\t=?iso-8859-1?q?Andr=E9?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17669,"web_url":"https://patchwork.libcamera.org/comment/17669/","msgid":"<20210621193702.qpu5fws2t5n5yigi@notapiano>","date":"2021-06-21T19:37:02","subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","submitter":{"id":84,"url":"https://patchwork.libcamera.org/api/people/84/","name":"Nícolas F. R. A. Prado","email":"nfraprado@collabora.com"},"content":"Hi Jacopo,\n\nOn Fri, Jun 18, 2021 at 12:09:58AM +0200, Jacopo Mondi wrote:\n> Hi Nicolas,\n> \n> On Wed, Jun 16, 2021 at 10:25:35AM -0300, Nícolas F. R. A. Prado wrote:\n> > Add a --list parameter that lists all current tests (by mapping to\n> > googletest's --gtest_list_tests).\n> >\n> > Add a --filter 'filterString' parameter that filters the tests to run\n> > (by mapping to googletest's --gtest_filter).\n> >\n> > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> > Changes in v8:\n> > - Thanks to Kieran:\n> >   - Switched from malloc/free to new/delete in gtest parameter allocation\n> >\n> > Changes in v7:\n> > - Thanks to Niklas:\n> >   - Removed intermediary filter string variable in Harness::initGtestParameters()\n> >\n> > Changes in v6:\n> > - Thanks to Niklas:\n> >   - Changed buildGtestParameters() into initGtestParameters() and removed the\n> >     need for Harness::gtestArgc_ and Harness::gtestArgv_\n> >\n> > Changes in v5:\n> > - Thanks to Niklas:\n> >   - Moved buildGtestParameters() inside run()\n> >\n> > No changes in v4\n> >\n> >  src/lc-compliance/main.cpp | 68 +++++++++++++++++++++++++++++++++++---\n> >  1 file changed, 64 insertions(+), 4 deletions(-)\n> >\n> > diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> > index 8c18845141de..bf9920008827 100644\n> > --- a/src/lc-compliance/main.cpp\n> > +++ b/src/lc-compliance/main.cpp\n> > @@ -20,6 +20,8 @@ using namespace libcamera;\n> >\n> >  enum {\n> >  \tOptCamera = 'c',\n> > +\tOptList = 'l',\n> > +\tOptFilter = 'f',\n> >  \tOptHelp = 'h',\n> >  };\n> >\n> > @@ -45,13 +47,17 @@ public:\n> >  \t~Harness();\n> >\n> >  \tint init();\n> > -\tint run(int argc, char **argv);\n> > +\tint run(char *arg0);\n> >\n> >  private:\n> > +\tint initGtestParameters(char *arg0);\n> >  \tvoid listCameras();\n> >\n> >  \tOptionsParser::Options options_;\n> >  \tstd::unique_ptr<CameraManager> cm_;\n> > +\n> > +\tconst std::map<std::string, std::string> gtestFlag_ = { { \"list\", \"--gtest_list_tests\" },\n> > +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> \n> Flags\n> \n> >  };\n> >\n> >  Harness::Harness(const OptionsParser::Options &options)\n> > @@ -76,6 +82,12 @@ int Harness::init()\n> >  \t\treturn ret;\n> >  \t}\n> >\n> > +\t/*\n> > +\t * No need to initialize the camera if we'll just list tests\n> > +\t */\n> \n> Fits on one line\n> \n> > +\tif (options_.isSet(OptList))\n> > +\t\treturn 0;\n> > +\n> >  \tif (!options_.isSet(OptCamera)) {\n> >  \t\tstd::cout << \"No camera specified, available cameras:\" << std::endl;\n> >  \t\tlistCameras();\n> > @@ -97,9 +109,11 @@ int Harness::init()\n> >  \treturn 0;\n> >  }\n> >\n> > -int Harness::run(int argc, char **argv)\n> > +int Harness::run(char *arg0)\n> >  {\n> > -\t::testing::InitGoogleTest(&argc, argv);\n> > +\tint ret = initGtestParameters(arg0);\n> > +\tif (ret)\n> > +\t\treturn ret;\n> >\n> >  \ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> >\n> > @@ -112,12 +126,58 @@ void Harness::listCameras()\n> >  \t\tstd::cout << \"- \" << cam.get()->id() << std::endl;\n> >  }\n> >\n> > +int Harness::initGtestParameters(char *arg0)\n> > +{\n> > +\tint argc = 0;\n> \n> Empty line\n> \n> > +\t/*\n> > +\t * +2 to have space for both the 0th argument that is needed but not\n> > +\t * used and the null at the end.\n> > +\t */\n> > +\tchar **argv = new char *[(gtestFlag_.size() + 2)];\n> > +\tstd::string filterParam;\n> > +\n> > +\tif (!argv)\n> > +\t\treturn -ENOMEM;\n> > +\n> > +\targv[argc] = arg0;\n> \n> argv[0]\n\nThis and all of the above fixed.\n\n> \n> Does ::testing::InitGoogleTest wants as argv[0] the main function\n> argv[0] ? I've no reasons to think it doesn't but I don't get why :)\n\nWell, it's not that gtest wants argv[0] to do something useful, but it does\nexpect something there. I've tried skipping setting argv[0], but then gtest\ncrashes, since its parameter parsing routine probably expects a valid char\npointer there. But I don't think the string really matters.\n\nSo it was either passing argv[0] from main to it or creating an empty string to\npass it, and I thought the former would be less confusing even though it's more\nwork for something not useful (at least not to my knowledge). I could certainly\ndo the latter instead if you think that's better.\n\nAnd at the time I didn't realize InitGoogleTest() copied the parameters\ninternally, so I thought we'd need to keep the empty string on the Harness class\nscope. But since it does we could just create an empty string local to this\nfunction and use that as arg0, which is way better.\n\n> \n> \n> > +\targc++;\n> > +\n> > +\tif (options_.isSet(OptList)) {\n> > +\t\targv[argc] = const_cast<char *>(gtestFlag_.at(\"list\").c_str());\n> > +\t\targc++;\n> > +\t}\n> > +\n> > +\tif (options_.isSet(OptFilter)) {\n> > +\t\t/*\n> > +\t\t * The filter flag needs to be passed as a single parameter, in\n> > +\t\t * the format --gtest_filter=filterStr\n> > +\t\t */\n> > +\t\tfilterParam = gtestFlag_.at(\"filter\") + \"=\" +\n> > +\t\t\t      static_cast<const std::string &>(options_[OptFilter]);\n> > +\n> > +\t\targv[argc] = const_cast<char *>(filterParam.c_str());\n> > +\t\targc++;\n> > +\t}\n> > +\n> > +\targv[argc] = 0;\n> > +\n> > +\t::testing::InitGoogleTest(&argc, argv);\n> > +\n> > +\tdelete argv;\n> \n> I assume InitGoogleTest copies its arguments in then ?\n\nYep.\n\n> \n> The patch looks good, my only concern is that for any gtest option we\n> have to support we'll have to do the converion here. Do you know how\n> many options does gtest provides and how many of them could be useful\n> ?\n\nThese are Gtest's options (from its 'help'):\n\n    Test Selection:\n      --gtest_list_tests\n          List the names of all tests instead of running them. The name of\n          TEST(Foo, Bar) is \"Foo.Bar\".\n      --gtest_filter=POSITIVE_PATTERNS[-NEGATIVE_PATTERNS]\n          Run only the tests whose name matches one of the positive patterns but\n          none of the negative patterns. '?' matches any single character; '*'\n          matches any substring; ':' separates two patterns.\n      --gtest_also_run_disabled_tests\n          Run all disabled tests too.\n    \n    Test Execution:\n      --gtest_repeat=[COUNT]\n          Run the tests repeatedly; use a negative count to repeat forever.\n      --gtest_shuffle\n          Randomize tests' orders on every iteration.\n      --gtest_random_seed=[NUMBER]\n          Random number seed to use for shuffling test orders (between 1 and\n          99999, or 0 to use a seed based on the current time).\n    \n    Test Output:\n      --gtest_color=(yes|no|auto)\n          Enable/disable colored output. The default is auto.\n      --gtest_brief=1\n          Only print test failures.\n      --gtest_print_time=0\n          Don't print the elapsed time of each test.\n      --gtest_output=(json|xml)[:DIRECTORY_PATH/|:FILE_PATH]\n          Generate a JSON or XML report in the given directory or with the given\n          file name. FILE_PATH defaults to test_detail.xml.\n      --gtest_stream_result_to=HOST:PORT\n          Stream test results to the given server.\n    \n    Assertion Behavior:\n      --gtest_death_test_style=(fast|threadsafe)\n          Set the default death test style.\n      --gtest_break_on_failure\n          Turn assertion failures into debugger break-points.\n      --gtest_throw_on_failure\n          Turn assertion failures into C++ exceptions for use by an external\n          test framework.\n      --gtest_catch_exceptions=0\n          Do not report exceptions as test failures. Instead, allow them\n          to crash the program or throw a pop-up (on Windows).\n    \n    Except for --gtest_list_tests, you can alternatively set the corresponding\n    environment variable of a flag (all letters in upper-case). For example, to\n    disable colored text output, you can either specify --gtest_color=no or set\n    the GTEST_COLOR environment variable to no.\n\nThere are quite a few, but most don't seem that useful to me personally.\n\nThanks,\nNícolas\n\n> \n> Thanks\n>   j\n> \n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> >  static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n> >  {\n> >  \tOptionsParser parser;\n> >  \tparser.addOption(OptCamera, OptionString,\n> >  \t\t\t \"Specify which camera to operate on, by id\", \"camera\",\n> >  \t\t\t ArgumentRequired, \"camera\");\n> > +\tparser.addOption(OptList, OptionNone, \"List all tests and exit\", \"list\");\n> > +\tparser.addOption(OptFilter, OptionString,\n> > +\t\t\t \"Specify which tests to run\", \"filter\",\n> > +\t\t\t ArgumentRequired, \"filter\");\n> >  \tparser.addOption(OptHelp, OptionNone, \"Display this help message\",\n> >  \t\t\t \"help\");\n> >\n> > @@ -147,5 +207,5 @@ int main(int argc, char **argv)\n> >  \tif (ret)\n> >  \t\treturn ret;\n> >\n> > -\treturn harness.run(argc, argv);\n> > +\treturn harness.run(argv[0]);\n> >  }\n> > --\n> > 2.32.0\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 3E155C3218\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Jun 2021 19:37:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 985E368935;\n\tMon, 21 Jun 2021 21:37:53 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BD32560295\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Jun 2021 21:37:51 +0200 (CEST)","from notapiano (unknown\n\t[IPv6:2804:14c:1a9:2434:73c2:f0a9:af4a:cee])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\t(Authenticated sender: nfraprado)\n\tby bhuna.collabora.co.uk (Postfix) with ESMTPSA id 3174D1F41FE1;\n\tMon, 21 Jun 2021 20:37:49 +0100 (BST)"],"Date":"Mon, 21 Jun 2021 16:37:02 -0300","From":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20210621193702.qpu5fws2t5n5yigi@notapiano>","References":"<20210616132535.453411-1-nfraprado@collabora.com>\n\t<20210616132535.453411-6-nfraprado@collabora.com>\n\t<20210617220958.iwcn5s2soe4o7st2@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210617220958.iwcn5s2soe4o7st2@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","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>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17671,"web_url":"https://patchwork.libcamera.org/comment/17671/","msgid":"<20210621200137.reoozc6w6yrcovnp@notapiano>","date":"2021-06-21T20:01:37","subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","submitter":{"id":84,"url":"https://patchwork.libcamera.org/api/people/84/","name":"Nícolas F. R. A. Prado","email":"nfraprado@collabora.com"},"content":"Hi Paul,\n\nOn Mon, Jun 21, 2021 at 07:56:25PM +0900, paul.elder@ideasonboard.com wrote:\n> Hi Nicolas,\n> \n> Thank you for the patch.\n> \n> On Wed, Jun 16, 2021 at 10:25:35AM -0300, Nícolas F. R. A. Prado wrote:\n> > Add a --list parameter that lists all current tests (by mapping to\n> > googletest's --gtest_list_tests).\n> > \n> > Add a --filter 'filterString' parameter that filters the tests to run\n> > (by mapping to googletest's --gtest_filter).\n> > \n> > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> > Changes in v8:\n> > - Thanks to Kieran:\n> >   - Switched from malloc/free to new/delete in gtest parameter allocation\n> > \n> > Changes in v7:\n> > - Thanks to Niklas:\n> >   - Removed intermediary filter string variable in Harness::initGtestParameters()\n> > \n> > Changes in v6:\n> > - Thanks to Niklas:\n> >   - Changed buildGtestParameters() into initGtestParameters() and removed the\n> >     need for Harness::gtestArgc_ and Harness::gtestArgv_\n> > \n> > Changes in v5:\n> > - Thanks to Niklas:\n> >   - Moved buildGtestParameters() inside run()\n> > \n> > No changes in v4\n> > \n> >  src/lc-compliance/main.cpp | 68 +++++++++++++++++++++++++++++++++++---\n> >  1 file changed, 64 insertions(+), 4 deletions(-)\n> > \n> > diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> > index 8c18845141de..bf9920008827 100644\n> > --- a/src/lc-compliance/main.cpp\n> > +++ b/src/lc-compliance/main.cpp\n> > @@ -20,6 +20,8 @@ using namespace libcamera;\n> >  \n> >  enum {\n> >  \tOptCamera = 'c',\n> > +\tOptList = 'l',\n> > +\tOptFilter = 'f',\n> >  \tOptHelp = 'h',\n> >  };\n> >  \n> > @@ -45,13 +47,17 @@ public:\n> >  \t~Harness();\n> >  \n> >  \tint init();\n> > -\tint run(int argc, char **argv);\n> > +\tint run(char *arg0);\n> >  \n> >  private:\n> > +\tint initGtestParameters(char *arg0);\n> >  \tvoid listCameras();\n> >  \n> >  \tOptionsParser::Options options_;\n> >  \tstd::unique_ptr<CameraManager> cm_;\n> > +\n> > +\tconst std::map<std::string, std::string> gtestFlag_ = { { \"list\", \"--gtest_list_tests\" },\n> > +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> >  };\n> >  \n> >  Harness::Harness(const OptionsParser::Options &options)\n> > @@ -76,6 +82,12 @@ int Harness::init()\n> >  \t\treturn ret;\n> >  \t}\n> >  \n> > +\t/*\n> > +\t * No need to initialize the camera if we'll just list tests\n> > +\t */\n> > +\tif (options_.isSet(OptList))\n> > +\t\treturn 0;\n> > +\n> >  \tif (!options_.isSet(OptCamera)) {\n> >  \t\tstd::cout << \"No camera specified, available cameras:\" << std::endl;\n> >  \t\tlistCameras();\n> > @@ -97,9 +109,11 @@ int Harness::init()\n> >  \treturn 0;\n> >  }\n> >  \n> > -int Harness::run(int argc, char **argv)\n> > +int Harness::run(char *arg0)\n> >  {\n> > -\t::testing::InitGoogleTest(&argc, argv);\n> > +\tint ret = initGtestParameters(arg0);\n> > +\tif (ret)\n> > +\t\treturn ret;\n> >  \n> >  \ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> >  \n> > @@ -112,12 +126,58 @@ void Harness::listCameras()\n> >  \t\tstd::cout << \"- \" << cam.get()->id() << std::endl;\n> >  }\n> >  \n> > +int Harness::initGtestParameters(char *arg0)\n> > +{\n> > +\tint argc = 0;\n> > +\t/*\n> > +\t * +2 to have space for both the 0th argument that is needed but not\n> > +\t * used and the null at the end.\n> > +\t */\n> > +\tchar **argv = new char *[(gtestFlag_.size() + 2)];\n> > +\tstd::string filterParam;\n> > +\n> > +\tif (!argv)\n> > +\t\treturn -ENOMEM;\n> > +\n> > +\targv[argc] = arg0;\n> > +\targc++;\n> > +\n> > +\tif (options_.isSet(OptList)) {\n> > +\t\targv[argc] = const_cast<char *>(gtestFlag_.at(\"list\").c_str());\n> > +\t\targc++;\n> > +\t}\n> > +\n> > +\tif (options_.isSet(OptFilter)) {\n> > +\t\t/*\n> > +\t\t * The filter flag needs to be passed as a single parameter, in\n> > +\t\t * the format --gtest_filter=filterStr\n> > +\t\t */\n> > +\t\tfilterParam = gtestFlag_.at(\"filter\") + \"=\" +\n> > +\t\t\t      static_cast<const std::string &>(options_[OptFilter]);\n> > +\n> > +\t\targv[argc] = const_cast<char *>(filterParam.c_str());\n> > +\t\targc++;\n> > +\t}\n> > +\n> > +\targv[argc] = 0;\n> > +\n> > +\t::testing::InitGoogleTest(&argc, argv);\n> > +\n> > +\tdelete argv;\n> \n> I'm getting error: 'delete' applied to a pointer that was allocated with\n> 'new[]'; did you mean 'delete[]'? [-Werror,-Wmismatched-new-delete] here\n> on clang.\n\nThanks for the feedback. I was having some trouble with clang so I didn't test\nwith it. But I'm now able to compile with it for some reason and I fixed that\nerror, so we should be good with clang for v9. (CC: Laurent, it does say\n\"Library libc++ found: NO\" here).\n\nThanks,\nNícolas\n\n> \n> \n> Paul\n> \n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> >  static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n> >  {\n> >  \tOptionsParser parser;\n> >  \tparser.addOption(OptCamera, OptionString,\n> >  \t\t\t \"Specify which camera to operate on, by id\", \"camera\",\n> >  \t\t\t ArgumentRequired, \"camera\");\n> > +\tparser.addOption(OptList, OptionNone, \"List all tests and exit\", \"list\");\n> > +\tparser.addOption(OptFilter, OptionString,\n> > +\t\t\t \"Specify which tests to run\", \"filter\",\n> > +\t\t\t ArgumentRequired, \"filter\");\n> >  \tparser.addOption(OptHelp, OptionNone, \"Display this help message\",\n> >  \t\t\t \"help\");\n> >  \n> > @@ -147,5 +207,5 @@ int main(int argc, char **argv)\n> >  \tif (ret)\n> >  \t\treturn ret;\n> >  \n> > -\treturn harness.run(argc, argv);\n> > +\treturn harness.run(argv[0]);\n> >  }\n> > -- \n> > 2.32.0\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 BAD46C3218\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Jun 2021 20:02:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4361560296;\n\tMon, 21 Jun 2021 22:02:29 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E48360295\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Jun 2021 22:02:28 +0200 (CEST)","from notapiano (unknown\n\t[IPv6:2804:14c:1a9:2434:73c2:f0a9:af4a:cee])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\t(Authenticated sender: nfraprado)\n\tby bhuna.collabora.co.uk (Postfix) with ESMTPSA id 0243A1F4268D;\n\tMon, 21 Jun 2021 21:02:25 +0100 (BST)"],"Date":"Mon, 21 Jun 2021 17:01:37 -0300","From":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","To":"paul.elder@ideasonboard.com","Message-ID":"<20210621200137.reoozc6w6yrcovnp@notapiano>","References":"<20210616132535.453411-1-nfraprado@collabora.com>\n\t<20210616132535.453411-6-nfraprado@collabora.com>\n\t<20210621105625.GB1899306@pyrite.rasen.tech>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210621105625.GB1899306@pyrite.rasen.tech>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","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>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17672,"web_url":"https://patchwork.libcamera.org/comment/17672/","msgid":"<YND4Xbgv/38j8KOx@pendragon.ideasonboard.com>","date":"2021-06-21T20:36:45","subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Nícolas,\n\nOn Mon, Jun 21, 2021 at 05:01:37PM -0300, Nícolas F. R. A. Prado wrote:\n> On Mon, Jun 21, 2021 at 07:56:25PM +0900, paul.elder@ideasonboard.com wrote:\n> > On Wed, Jun 16, 2021 at 10:25:35AM -0300, Nícolas F. R. A. Prado wrote:\n> > > Add a --list parameter that lists all current tests (by mapping to\n> > > googletest's --gtest_list_tests).\n> > > \n> > > Add a --filter 'filterString' parameter that filters the tests to run\n> > > (by mapping to googletest's --gtest_filter).\n> > > \n> > > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > > Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > > ---\n> > > Changes in v8:\n> > > - Thanks to Kieran:\n> > >   - Switched from malloc/free to new/delete in gtest parameter allocation\n> > > \n> > > Changes in v7:\n> > > - Thanks to Niklas:\n> > >   - Removed intermediary filter string variable in Harness::initGtestParameters()\n> > > \n> > > Changes in v6:\n> > > - Thanks to Niklas:\n> > >   - Changed buildGtestParameters() into initGtestParameters() and removed the\n> > >     need for Harness::gtestArgc_ and Harness::gtestArgv_\n> > > \n> > > Changes in v5:\n> > > - Thanks to Niklas:\n> > >   - Moved buildGtestParameters() inside run()\n> > > \n> > > No changes in v4\n> > > \n> > >  src/lc-compliance/main.cpp | 68 +++++++++++++++++++++++++++++++++++---\n> > >  1 file changed, 64 insertions(+), 4 deletions(-)\n> > > \n> > > diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> > > index 8c18845141de..bf9920008827 100644\n> > > --- a/src/lc-compliance/main.cpp\n> > > +++ b/src/lc-compliance/main.cpp\n> > > @@ -20,6 +20,8 @@ using namespace libcamera;\n> > >  \n> > >  enum {\n> > >  \tOptCamera = 'c',\n> > > +\tOptList = 'l',\n> > > +\tOptFilter = 'f',\n> > >  \tOptHelp = 'h',\n> > >  };\n> > >  \n> > > @@ -45,13 +47,17 @@ public:\n> > >  \t~Harness();\n> > >  \n> > >  \tint init();\n> > > -\tint run(int argc, char **argv);\n> > > +\tint run(char *arg0);\n> > >  \n> > >  private:\n> > > +\tint initGtestParameters(char *arg0);\n> > >  \tvoid listCameras();\n> > >  \n> > >  \tOptionsParser::Options options_;\n> > >  \tstd::unique_ptr<CameraManager> cm_;\n> > > +\n> > > +\tconst std::map<std::string, std::string> gtestFlag_ = { { \"list\", \"--gtest_list_tests\" },\n> > > +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> > >  };\n> > >  \n> > >  Harness::Harness(const OptionsParser::Options &options)\n> > > @@ -76,6 +82,12 @@ int Harness::init()\n> > >  \t\treturn ret;\n> > >  \t}\n> > >  \n> > > +\t/*\n> > > +\t * No need to initialize the camera if we'll just list tests\n> > > +\t */\n> > > +\tif (options_.isSet(OptList))\n> > > +\t\treturn 0;\n> > > +\n> > >  \tif (!options_.isSet(OptCamera)) {\n> > >  \t\tstd::cout << \"No camera specified, available cameras:\" << std::endl;\n> > >  \t\tlistCameras();\n> > > @@ -97,9 +109,11 @@ int Harness::init()\n> > >  \treturn 0;\n> > >  }\n> > >  \n> > > -int Harness::run(int argc, char **argv)\n> > > +int Harness::run(char *arg0)\n> > >  {\n> > > -\t::testing::InitGoogleTest(&argc, argv);\n> > > +\tint ret = initGtestParameters(arg0);\n> > > +\tif (ret)\n> > > +\t\treturn ret;\n> > >  \n> > >  \ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> > >  \n> > > @@ -112,12 +126,58 @@ void Harness::listCameras()\n> > >  \t\tstd::cout << \"- \" << cam.get()->id() << std::endl;\n> > >  }\n> > >  \n> > > +int Harness::initGtestParameters(char *arg0)\n> > > +{\n> > > +\tint argc = 0;\n> > > +\t/*\n> > > +\t * +2 to have space for both the 0th argument that is needed but not\n> > > +\t * used and the null at the end.\n> > > +\t */\n> > > +\tchar **argv = new char *[(gtestFlag_.size() + 2)];\n> > > +\tstd::string filterParam;\n> > > +\n> > > +\tif (!argv)\n> > > +\t\treturn -ENOMEM;\n> > > +\n> > > +\targv[argc] = arg0;\n> > > +\targc++;\n> > > +\n> > > +\tif (options_.isSet(OptList)) {\n> > > +\t\targv[argc] = const_cast<char *>(gtestFlag_.at(\"list\").c_str());\n> > > +\t\targc++;\n> > > +\t}\n> > > +\n> > > +\tif (options_.isSet(OptFilter)) {\n> > > +\t\t/*\n> > > +\t\t * The filter flag needs to be passed as a single parameter, in\n> > > +\t\t * the format --gtest_filter=filterStr\n> > > +\t\t */\n> > > +\t\tfilterParam = gtestFlag_.at(\"filter\") + \"=\" +\n> > > +\t\t\t      static_cast<const std::string &>(options_[OptFilter]);\n> > > +\n> > > +\t\targv[argc] = const_cast<char *>(filterParam.c_str());\n> > > +\t\targc++;\n> > > +\t}\n> > > +\n> > > +\targv[argc] = 0;\n> > > +\n> > > +\t::testing::InitGoogleTest(&argc, argv);\n> > > +\n> > > +\tdelete argv;\n> > \n> > I'm getting error: 'delete' applied to a pointer that was allocated with\n> > 'new[]'; did you mean 'delete[]'? [-Werror,-Wmismatched-new-delete] here\n> > on clang.\n> \n> Thanks for the feedback. I was having some trouble with clang so I didn't test\n> with it. But I'm now able to compile with it for some reason and I fixed that\n> error, so we should be good with clang for v9. (CC: Laurent, it does say\n> \"Library libc++ found: NO\" here).\n\nThat's not a blocker, it falls back to libstdc++ then (the\nimplementation from gcc). We don't test that combination much though, so\nit's nice to know it's working for you :-)\n\n> > > +\n> > > +\treturn 0;\n> > > +}\n> > > +\n> > >  static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n> > >  {\n> > >  \tOptionsParser parser;\n> > >  \tparser.addOption(OptCamera, OptionString,\n> > >  \t\t\t \"Specify which camera to operate on, by id\", \"camera\",\n> > >  \t\t\t ArgumentRequired, \"camera\");\n> > > +\tparser.addOption(OptList, OptionNone, \"List all tests and exit\", \"list\");\n> > > +\tparser.addOption(OptFilter, OptionString,\n> > > +\t\t\t \"Specify which tests to run\", \"filter\",\n> > > +\t\t\t ArgumentRequired, \"filter\");\n> > >  \tparser.addOption(OptHelp, OptionNone, \"Display this help message\",\n> > >  \t\t\t \"help\");\n> > >  \n> > > @@ -147,5 +207,5 @@ int main(int argc, char **argv)\n> > >  \tif (ret)\n> > >  \t\treturn ret;\n> > >  \n> > > -\treturn harness.run(argc, argv);\n> > > +\treturn harness.run(argv[0]);\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 CC783C3218\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Jun 2021 20:37:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5375C68935;\n\tMon, 21 Jun 2021 22:37:14 +0200 (CEST)","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 D10A360295\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Jun 2021 22:37:12 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3678A5E17;\n\tMon, 21 Jun 2021 22:37:12 +0200 (CEST)"],"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=\"I284fN25\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1624307832;\n\tbh=YoeoOsjxmHkVW74QzlJQ5NHQ2X4/RO772w3YKO6zLBU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=I284fN25ujzwnuqQ9oS9an3phRdUXpjYWgEgTVYRTmyqESJnELooI93WUTfqxG8ia\n\tEkTjNjvCn5Byy7xFrC4fFK5Yh4Q7TKhDmiYKjigxzsjRJ3vJerLdvJ0XIcX31BdF51\n\tHL81tKA4As0BSnC/KBJ0TesBAo7N6oIPebq7HVwQ=","Date":"Mon, 21 Jun 2021 23:36:45 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<YND4Xbgv/38j8KOx@pendragon.ideasonboard.com>","References":"<20210616132535.453411-1-nfraprado@collabora.com>\n\t<20210616132535.453411-6-nfraprado@collabora.com>\n\t<20210621105625.GB1899306@pyrite.rasen.tech>\n\t<20210621200137.reoozc6w6yrcovnp@notapiano>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210621200137.reoozc6w6yrcovnp@notapiano>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] lc-compliance: Add list and\n\tfilter parameters","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>","Cc":"libcamera-devel@lists.libcamera.org, kernel@collabora.com, =?utf-8?q?A?=\n\t=?utf-8?b?bmRyw6k=?= Almeida <andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]