[v3,2/3] libcanera: yaml-parser: Add failing test for unexpected behavior
diff mbox series

Message ID 20240920132823.88433-3-stefan.klug@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera: yaml-parser: Differentiate between empty and empty string
Related show

Commit Message

Stefan Klug Sept. 20, 2024, 1:28 p.m. UTC
When accessing a nonexistent key on a dict the YamlObject returns an
empty element. This element can happily be cast to a string. This is
unexpected. For example the following statement:

yamlDict["nonexistent"].get<string>("default")

is expected to return "default" but actually returns "". Add a (failing)
testcase for that behavior.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

---
Changes in v3:
- Added separate patch for the failing test
---
 test/yaml-parser.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Stefan Klug Sept. 20, 2024, 2:57 p.m. UTC | #1
The typo in the commit title will be fixed on merge/next update.

On Fri, Sep 20, 2024 at 03:28:09PM +0200, Stefan Klug wrote:
> When accessing a nonexistent key on a dict the YamlObject returns an
> empty element. This element can happily be cast to a string. This is
> unexpected. For example the following statement:
> 
> yamlDict["nonexistent"].get<string>("default")
> 
> is expected to return "default" but actually returns "". Add a (failing)
> testcase for that behavior.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> 
> ---
> Changes in v3:
> - Added separate patch for the failing test
> ---
>  test/yaml-parser.cpp | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
> index 347999831d61..4cc77e26ae39 100644
> --- a/test/yaml-parser.cpp
> +++ b/test/yaml-parser.cpp
> @@ -536,6 +536,12 @@ protected:
>  			return TestFail;
>  		}
>  
> +		/* Test access to nonexistent member. */
> +		if (dictObj["nonexistent"].get<std::string>("default") != "default") {
> +			cerr << "Accessing nonexistent dict entry fails to return default" << std::endl;
> +			return TestFail;
> +		}
> +
>  		/* Make sure utils::map_keys() works on the adapter. */
>  		(void)utils::map_keys(dictObj.asDict());
>  
> -- 
> 2.43.0
>
Kieran Bingham Sept. 21, 2024, 12:37 p.m. UTC | #2
Quoting Stefan Klug (2024-09-20 14:28:09)
> When accessing a nonexistent key on a dict the YamlObject returns an
> empty element. This element can happily be cast to a string. This is
> unexpected. For example the following statement:
> 
> yamlDict["nonexistent"].get<string>("default")
> 
> is expected to return "default" but actually returns "". Add a (failing)
> testcase for that behavior.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> 
> ---
> Changes in v3:
> - Added separate patch for the failing test
> ---
>  test/yaml-parser.cpp | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
> index 347999831d61..4cc77e26ae39 100644
> --- a/test/yaml-parser.cpp
> +++ b/test/yaml-parser.cpp
> @@ -536,6 +536,12 @@ protected:
>                         return TestFail;
>                 }
>  
> +               /* Test access to nonexistent member. */
> +               if (dictObj["nonexistent"].get<std::string>("default") != "default") {
> +                       cerr << "Accessing nonexistent dict entry fails to return default" << std::endl;
> +                       return TestFail;
> +               }
> +
>                 /* Make sure utils::map_keys() works on the adapter. */
>                 (void)utils::map_keys(dictObj.asDict());
>  

We should also add the following change/hunk to this patch, or make test
will fail at bisection here:

diff --git a/test/meson.build b/test/meson.build
index 5ed052ed62c8..dcd169a8793e 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -73,7 +73,7 @@ internal_tests = [
     {'name': 'timer-thread', 'sources': ['timer-thread.cpp']},
     {'name': 'unique-fd', 'sources': ['unique-fd.cpp']},
     {'name': 'utils', 'sources': ['utils.cpp']},
-    {'name': 'yaml-parser', 'sources': ['yaml-parser.cpp']},
+    {'name': 'yaml-parser', 'sources': ['yaml-parser.cpp'], 'should_fail': true},
 ]

 internal_non_parallel_tests = [


With that:

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> -- 
> 2.43.0
>
Paul Elder Sept. 23, 2024, 10:10 a.m. UTC | #3
On Fri, Sep 20, 2024 at 03:28:09PM +0200, Stefan Klug wrote:
> When accessing a nonexistent key on a dict the YamlObject returns an
> empty element. This element can happily be cast to a string. This is
> unexpected. For example the following statement:
> 
> yamlDict["nonexistent"].get<string>("default")
> 
> is expected to return "default" but actually returns "". Add a (failing)
> testcase for that behavior.
> 
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

With either squashing or should_fail,

Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> 
> ---
> Changes in v3:
> - Added separate patch for the failing test
> ---
>  test/yaml-parser.cpp | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
> index 347999831d61..4cc77e26ae39 100644
> --- a/test/yaml-parser.cpp
> +++ b/test/yaml-parser.cpp
> @@ -536,6 +536,12 @@ protected:
>  			return TestFail;
>  		}
>  
> +		/* Test access to nonexistent member. */
> +		if (dictObj["nonexistent"].get<std::string>("default") != "default") {
> +			cerr << "Accessing nonexistent dict entry fails to return default" << std::endl;
> +			return TestFail;
> +		}
> +
>  		/* Make sure utils::map_keys() works on the adapter. */
>  		(void)utils::map_keys(dictObj.asDict());
>  
> -- 
> 2.43.0
>

Patch
diff mbox series

diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
index 347999831d61..4cc77e26ae39 100644
--- a/test/yaml-parser.cpp
+++ b/test/yaml-parser.cpp
@@ -536,6 +536,12 @@  protected:
 			return TestFail;
 		}
 
+		/* Test access to nonexistent member. */
+		if (dictObj["nonexistent"].get<std::string>("default") != "default") {
+			cerr << "Accessing nonexistent dict entry fails to return default" << std::endl;
+			return TestFail;
+		}
+
 		/* Make sure utils::map_keys() works on the adapter. */
 		(void)utils::map_keys(dictObj.asDict());