[{"id":17821,"web_url":"https://patchwork.libcamera.org/comment/17821/","msgid":"<20210626082239.bu37yngjban5z3xt@uno.localdomain>","date":"2021-06-26T08:22:39","subject":"Re: [libcamera-devel] [PATCH v9 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 Fri, Jun 25, 2021 at 04:39:25PM -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> While at it, add to the help message that further googletest options can\n> be passed through the environment.\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 v9:\n> - Thanks to Jacopo:\n>   - Fixed some style issues\n>   - Added to --help that further Googletest options can be passed as environment\n>     variables\n> - Thanks to Paul:\n>   - Fixed compiling error on clang\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 | 76 ++++++++++++++++++++++++++++++++++++--\n>  1 file changed, 73 insertions(+), 3 deletions(-)\n>\n> diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> index b01768b5fc0b..45ec70351f2c 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> @@ -76,12 +78,73 @@ static int initCamera(CameraManager *cm, OptionsParser::Options options)\n>  \treturn 0;\n>  }\n>\n> +static int initGtestParameters(char *arg0, OptionsParser::Options options)\n> +{\n> +\tconst std::map<std::string, std::string> gtestFlags = { { \"list\", \"--gtest_list_tests\" },\n> +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> +\n> +\tint argc = 0;\n> +\tstd::string filterParam;\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 *[(gtestFlags.size() + 2)];\n> +\n\nAdditional empty line\n\n> +\tif (!argv)\n> +\t\treturn -ENOMEM;\n> +\n> +\targv[0] = arg0;\n> +\targc++;\n> +\n> +\tif (options.isSet(OptList)) {\n> +\t\targv[argc] = const_cast<char *>(gtestFlags.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 = gtestFlags.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] = nullptr;\n> +\n> +\t::testing::InitGoogleTest(&argc, argv);\n> +\n> +\tdelete[] argv;\n> +\n> +\treturn 0;\n> +}\n> +\n> +static int initGtest(char *arg0, OptionsParser::Options options)\n> +{\n> +\tint ret = initGtestParameters(arg0, options);\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\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> @@ -91,6 +154,8 @@ static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n>\n>  \tif (options->isSet(OptHelp)) {\n>  \t\tparser.usage();\n> +\t\tstd::cerr << \"Further options from Googletest can be passed as environment variables\"\n> +\t\t\t  << std::endl;\n>  \t\treturn -EINTR;\n>  \t}\n>\n> @@ -108,12 +173,17 @@ int main(int argc, char **argv)\n>\n>  \tstd::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();\n>\n> -\tret = initCamera(cm.get(), options);\n> +\t/* No need to initialize the camera if we'll just list tests */\n\nWon't you in this case stop the cm without starting it ?\n\n> +\tif (!options.isSet(OptList)) {\n> +\t\tret = initCamera(cm.get(), options);\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n> +\t}\n> +\n> +\tret = initGtest(argv[0], options);\n>  \tif (ret)\n>  \t\treturn ret;\n>\n> -\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> -\n>  \tret = RUN_ALL_TESTS();\n>\n>  \tcm->stop();\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 1B5FFC321D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 26 Jun 2021 08:21:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8797C684D5;\n\tSat, 26 Jun 2021 10:21:53 +0200 (CEST)","from relay10.mail.gandi.net (relay10.mail.gandi.net\n\t[217.70.178.230])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9C227684D2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 26 Jun 2021 10:21:52 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay10.mail.gandi.net (Postfix) with ESMTPSA id 5CA8C240003;\n\tSat, 26 Jun 2021 08:21:51 +0000 (UTC)"],"Date":"Sat, 26 Jun 2021 10:22:39 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<20210626082239.bu37yngjban5z3xt@uno.localdomain>","References":"<20210625193925.517406-1-nfraprado@collabora.com>\n\t<20210625193925.517406-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":"<20210625193925.517406-6-nfraprado@collabora.com>","Subject":"Re: [libcamera-devel] [PATCH v9 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":17893,"web_url":"https://patchwork.libcamera.org/comment/17893/","msgid":"<20210628134721.mq72pznpotmsucak@notapiano>","date":"2021-06-28T13:47:21","subject":"Re: [libcamera-devel] [PATCH v9 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 Sat, Jun 26, 2021 at 10:22:39AM +0200, Jacopo Mondi wrote:\n> Hi Nicolas,\n> \n> On Fri, Jun 25, 2021 at 04:39:25PM -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> > While at it, add to the help message that further googletest options can\n> > be passed through the environment.\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 v9:\n> > - Thanks to Jacopo:\n> >   - Fixed some style issues\n> >   - Added to --help that further Googletest options can be passed as environment\n> >     variables\n> > - Thanks to Paul:\n> >   - Fixed compiling error on clang\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 | 76 ++++++++++++++++++++++++++++++++++++--\n> >  1 file changed, 73 insertions(+), 3 deletions(-)\n> >\n> > diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> > index b01768b5fc0b..45ec70351f2c 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> > @@ -76,12 +78,73 @@ static int initCamera(CameraManager *cm, OptionsParser::Options options)\n> >  \treturn 0;\n> >  }\n> >\n> > +static int initGtestParameters(char *arg0, OptionsParser::Options options)\n> > +{\n> > +\tconst std::map<std::string, std::string> gtestFlags = { { \"list\", \"--gtest_list_tests\" },\n> > +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> > +\n> > +\tint argc = 0;\n> > +\tstd::string filterParam;\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 *[(gtestFlags.size() + 2)];\n> > +\n> \n> Additional empty line\n\nBy this you mean I should add one more empty line or remove this one?\n\n> \n> > +\tif (!argv)\n> > +\t\treturn -ENOMEM;\n> > +\n> > +\targv[0] = arg0;\n> > +\targc++;\n> > +\n> > +\tif (options.isSet(OptList)) {\n> > +\t\targv[argc] = const_cast<char *>(gtestFlags.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 = gtestFlags.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] = nullptr;\n> > +\n> > +\t::testing::InitGoogleTest(&argc, argv);\n> > +\n> > +\tdelete[] argv;\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +static int initGtest(char *arg0, OptionsParser::Options options)\n> > +{\n> > +\tint ret = initGtestParameters(arg0, options);\n> > +\tif (ret)\n> > +\t\treturn ret;\n> > +\n> > +\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\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> > @@ -91,6 +154,8 @@ static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n> >\n> >  \tif (options->isSet(OptHelp)) {\n> >  \t\tparser.usage();\n> > +\t\tstd::cerr << \"Further options from Googletest can be passed as environment variables\"\n> > +\t\t\t  << std::endl;\n> >  \t\treturn -EINTR;\n> >  \t}\n> >\n> > @@ -108,12 +173,17 @@ int main(int argc, char **argv)\n> >\n> >  \tstd::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();\n> >\n> > -\tret = initCamera(cm.get(), options);\n> > +\t/* No need to initialize the camera if we'll just list tests */\n> \n> Won't you in this case stop the cm without starting it ?\n\nIndeed. This doesn't seem to cause trouble, but I guess I can also check if\nOptList is set when stopping the cm.\n\nThanks,\nNícolas\n\n> \n> > +\tif (!options.isSet(OptList)) {\n> > +\t\tret = initCamera(cm.get(), options);\n> > +\t\tif (ret)\n> > +\t\t\treturn ret;\n> > +\t}\n> > +\n> > +\tret = initGtest(argv[0], options);\n> >  \tif (ret)\n> >  \t\treturn ret;\n> >\n> > -\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> > -\n> >  \tret = RUN_ALL_TESTS();\n> >\n> >  \tcm->stop();\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 102B3C3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Jun 2021 13:47:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5546C684D4;\n\tMon, 28 Jun 2021 15:47:29 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 099576028C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Jun 2021 15:47:28 +0200 (CEST)","from notapiano (unknown [IPv6:2804:14c:1a9:2434:f67:4f14:468a:ed5])\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 7CF6E1F40DAD;\n\tMon, 28 Jun 2021 14:47:26 +0100 (BST)"],"Date":"Mon, 28 Jun 2021 10:47:21 -0300","From":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20210628134721.mq72pznpotmsucak@notapiano>","References":"<20210625193925.517406-1-nfraprado@collabora.com>\n\t<20210625193925.517406-6-nfraprado@collabora.com>\n\t<20210626082239.bu37yngjban5z3xt@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210626082239.bu37yngjban5z3xt@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v9 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":17901,"web_url":"https://patchwork.libcamera.org/comment/17901/","msgid":"<20210628173241.ldg7vj64mpeiphjx@uno.localdomain>","date":"2021-06-28T17:32:41","subject":"Re: [libcamera-devel] [PATCH v9 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":"On Mon, Jun 28, 2021 at 10:47:21AM -0300, Nícolas F. R. A. Prado wrote:\n> Hi Jacopo,\n\nHello Nicolas,\n\n>\n> On Sat, Jun 26, 2021 at 10:22:39AM +0200, Jacopo Mondi wrote:\n> > Hi Nicolas,\n> >\n> > On Fri, Jun 25, 2021 at 04:39:25PM -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> > > While at it, add to the help message that further googletest options can\n> > > be passed through the environment.\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 v9:\n> > > - Thanks to Jacopo:\n> > >   - Fixed some style issues\n> > >   - Added to --help that further Googletest options can be passed as environment\n> > >     variables\n> > > - Thanks to Paul:\n> > >   - Fixed compiling error on clang\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 | 76 ++++++++++++++++++++++++++++++++++++--\n> > >  1 file changed, 73 insertions(+), 3 deletions(-)\n> > >\n> > > diff --git a/src/lc-compliance/main.cpp b/src/lc-compliance/main.cpp\n> > > index b01768b5fc0b..45ec70351f2c 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> > > @@ -76,12 +78,73 @@ static int initCamera(CameraManager *cm, OptionsParser::Options options)\n> > >  \treturn 0;\n> > >  }\n> > >\n> > > +static int initGtestParameters(char *arg0, OptionsParser::Options options)\n> > > +{\n> > > +\tconst std::map<std::string, std::string> gtestFlags = { { \"list\", \"--gtest_list_tests\" },\n> > > +\t\t\t\t\t\t\t\t{ \"filter\", \"--gtest_filter\" } };\n> > > +\n> > > +\tint argc = 0;\n> > > +\tstd::string filterParam;\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 *[(gtestFlags.size() + 2)];\n> > > +\n> >\n> > Additional empty line\n>\n> By this you mean I should add one more empty line or remove this one?\n>\n\nIf you add one more there will be 2 empty lines :)\nI mean that you can remove it as the check immediately follows the\nvariable assignement. But the assignement is also the variable\ndeclaration in this case, which usually calls for an emtpy line\nafter /o\\ Whatever, anything is fine, really :)\n\n> >\n> > > +\tif (!argv)\n> > > +\t\treturn -ENOMEM;\n> > > +\n> > > +\targv[0] = arg0;\n> > > +\targc++;\n> > > +\n> > > +\tif (options.isSet(OptList)) {\n> > > +\t\targv[argc] = const_cast<char *>(gtestFlags.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 = gtestFlags.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] = nullptr;\n> > > +\n> > > +\t::testing::InitGoogleTest(&argc, argv);\n> > > +\n> > > +\tdelete[] argv;\n> > > +\n> > > +\treturn 0;\n> > > +}\n> > > +\n> > > +static int initGtest(char *arg0, OptionsParser::Options options)\n> > > +{\n> > > +\tint ret = initGtestParameters(arg0, options);\n> > > +\tif (ret)\n> > > +\t\treturn ret;\n> > > +\n> > > +\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\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> > > @@ -91,6 +154,8 @@ static int parseOptions(int argc, char **argv, OptionsParser::Options *options)\n> > >\n> > >  \tif (options->isSet(OptHelp)) {\n> > >  \t\tparser.usage();\n> > > +\t\tstd::cerr << \"Further options from Googletest can be passed as environment variables\"\n> > > +\t\t\t  << std::endl;\n> > >  \t\treturn -EINTR;\n> > >  \t}\n> > >\n> > > @@ -108,12 +173,17 @@ int main(int argc, char **argv)\n> > >\n> > >  \tstd::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();\n> > >\n> > > -\tret = initCamera(cm.get(), options);\n> > > +\t/* No need to initialize the camera if we'll just list tests */\n> >\n> > Won't you in this case stop the cm without starting it ?\n>\n> Indeed. This doesn't seem to cause trouble, but I guess I can also check if\n> OptList is set when stopping the cm.\n\nYou know, I'm not sure.. stop() will call exit() and wait()\n(pthread_exit() and pthread_wait()) on the cm loop, which in this case\nit has not been started. I haven't been able to clearly find any\nindication that it's a no-op in that case :)\n\nAlso, deleting the cm calls stop() so you can avoid calling it\nexpliticitly if you prefer to do so!\n\nEither way\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>\n> Thanks,\n> Nícolas\n>\n> >\n> > > +\tif (!options.isSet(OptList)) {\n> > > +\t\tret = initCamera(cm.get(), options);\n> > > +\t\tif (ret)\n> > > +\t\t\treturn ret;\n> > > +\t}\n> > > +\n> > > +\tret = initGtest(argv[0], options);\n> > >  \tif (ret)\n> > >  \t\treturn ret;\n> > >\n> > > -\ttesting::UnitTest::GetInstance()->listeners().Append(new ThrowListener);\n> > > -\n> > >  \tret = RUN_ALL_TESTS();\n> > >\n> > >  \tcm->stop();\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 5947BC321F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Jun 2021 17:31:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B3192684D7;\n\tMon, 28 Jun 2021 19:31:55 +0200 (CEST)","from relay10.mail.gandi.net (relay10.mail.gandi.net\n\t[217.70.178.230])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C63986028C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Jun 2021 19:31:54 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay10.mail.gandi.net (Postfix) with ESMTPSA id 43E91240007;\n\tMon, 28 Jun 2021 17:31:52 +0000 (UTC)"],"Date":"Mon, 28 Jun 2021 19:32:41 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4=?= Prado <nfraprado@collabora.com>","Message-ID":"<20210628173241.ldg7vj64mpeiphjx@uno.localdomain>","References":"<20210625193925.517406-1-nfraprado@collabora.com>\n\t<20210625193925.517406-6-nfraprado@collabora.com>\n\t<20210626082239.bu37yngjban5z3xt@uno.localdomain>\n\t<20210628134721.mq72pznpotmsucak@notapiano>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20210628134721.mq72pznpotmsucak@notapiano>","Subject":"Re: [libcamera-devel] [PATCH v9 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>"}}]