[libcamera-devel,2/4] test: logging: add logSetStream test

Message ID 20190712201620.30457-2-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • [libcamera-devel,1/4] libcamera: logging: add syslog, stream, and nowhere logging targets
Related show

Commit Message

Paul Elder July 12, 2019, 8:16 p.m. UTC
Test the new logSetStream loggin API call. Reorganize the logging API
tests at the same time.

logSetTarget is not tested since the nowhere and syslog logging
destinations do not really need to be tested.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
 test/log.cpp | 82 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 58 insertions(+), 24 deletions(-)

Comments

Laurent Pinchart July 14, 2019, 10:07 a.m. UTC | #1
Hi Paul,

Thank you for the patch.

On Sat, Jul 13, 2019 at 05:16:18AM +0900, Paul Elder wrote:
> Test the new logSetStream loggin API call. Reorganize the logging API

s/loggin/logging/

> tests at the same time.

As for 1/4, it would probably have been easier to review if you had
split the rework into a preparatory patch.

> logSetTarget is not tested since the nowhere and syslog logging
> destinations do not really need to be tested.

I would test logSetTarget(LoggingTargetNone) and verify logging a
message doesn't crash, and then that logSetTarget(LoggingTargetFile) and
logSetTarget(LoggingTargetStream) both fail.

> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> ---
>  test/log.cpp | 82 +++++++++++++++++++++++++++++++++++++---------------
>  1 file changed, 58 insertions(+), 24 deletions(-)
> 
> diff --git a/test/log.cpp b/test/log.cpp
> index 89fb5ca..c1446bd 100644
> --- a/test/log.cpp
> +++ b/test/log.cpp
> @@ -29,19 +29,8 @@ LOG_DEFINE_CATEGORY(LogAPITest)
>  class LogAPITest : public Test
>  {
>  protected:
> -	int run() override
> +	void doLogging()
>  	{
> -		int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
> -		if (fd < 0) {
> -			cerr << "Failed to open tmp log file" << endl;
> -			return TestFail;
> -		}
> -
> -		char path[32];
> -		snprintf(path, sizeof(path), "/proc/self/fd/%u", fd);
> -
> -		logSetFile(path);
> -
>  		logSetLevel("LogAPITest", "DEBUG");
>  		LOG(LogAPITest, Info) << "good 1";
>  
> @@ -55,19 +44,13 @@ protected:
>  		logSetLevel("LogAPITest", "WARN");
>  		LOG(LogAPITest, Warning) << "good 5";
>  		LOG(LogAPITest, Info) << "bad";
> +	}
>  
> -		char buf[1000];
> -		memset(buf, 0, sizeof(buf));
> -		lseek(fd, 0, SEEK_SET);
> -		if (read(fd, buf, sizeof(buf)) < 0) {
> -			cerr << "Failed to read tmp log file" << endl;
> -			return TestFail;
> -		}
> -		close(fd);
> -
> -		std::list<int> goodList = { 1, 3, 5 };
> -		std::basic_istringstream<char> iss((std::string(buf)));
> -		std::string line;
> +	int verifyOutput(string &str)
> +	{
> +		list<int> goodList = { 1, 3, 5 };
> +		basic_istringstream<char> iss(str);

You can use istringstream instead of basic_istringstream<char>.

> +		string line;
>  		while (getline(iss, line)) {
>  			if (goodList.empty()) {
>  				cout << "Too many log lines" << endl;
> @@ -90,6 +73,57 @@ protected:
>  
>  		return TestPass;
>  	}
> +
> +	int testFile()
> +	{
> +		int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
> +		if (fd < 0) {
> +			cerr << "Failed to open tmp log file" << endl;
> +			return TestFail;
> +		}
> +
> +		char path[32];
> +		snprintf(path, sizeof(path), "/proc/self/fd/%u", fd);
> +
> +		logSetFile(path);

You should return an error if logSetFile() fails (and print a message).

> +
> +		doLogging();
> +
> +		char buf[1000];
> +		memset(buf, 0, sizeof(buf));
> +		lseek(fd, 0, SEEK_SET);
> +		if (read(fd, buf, sizeof(buf)) < 0) {
> +			cerr << "Failed to read tmp log file" << endl;
> +			return TestFail;
> +		}
> +		close(fd);
> +
> +		string str(buf);
> +		return verifyOutput(str);
> +	}
> +
> +	int testStream()
> +	{
> +		ostringstream log;
> +		logSetStream(log);
> +
> +		doLogging();
> +
> +		string str(log.str());

How about passing istream to verifyOutput() ? You could then avoid
turning the string into an istringstream internally. You will need to
turn ostringstream into a stringstream. For the file case you would
create the istringstream in testFile().

> +		return verifyOutput(str);
> +	}
> +
> +	int run() override
> +	{
> +		int ret1 = testFile();
> +
> +		int ret2 = testStream();
> +
> +		if (ret1 == TestPass && ret2 == TestPass)
> +			return TestPass;

I think you can return failures as soon as they occur.

> +
> +		return TestFail;

Let's revert the condition to return TestSuccess at the end, like all
other tests.

> +	}
>  };
>  
>  TEST_REGISTER(LogAPITest)

Patch

diff --git a/test/log.cpp b/test/log.cpp
index 89fb5ca..c1446bd 100644
--- a/test/log.cpp
+++ b/test/log.cpp
@@ -29,19 +29,8 @@  LOG_DEFINE_CATEGORY(LogAPITest)
 class LogAPITest : public Test
 {
 protected:
-	int run() override
+	void doLogging()
 	{
-		int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
-		if (fd < 0) {
-			cerr << "Failed to open tmp log file" << endl;
-			return TestFail;
-		}
-
-		char path[32];
-		snprintf(path, sizeof(path), "/proc/self/fd/%u", fd);
-
-		logSetFile(path);
-
 		logSetLevel("LogAPITest", "DEBUG");
 		LOG(LogAPITest, Info) << "good 1";
 
@@ -55,19 +44,13 @@  protected:
 		logSetLevel("LogAPITest", "WARN");
 		LOG(LogAPITest, Warning) << "good 5";
 		LOG(LogAPITest, Info) << "bad";
+	}
 
-		char buf[1000];
-		memset(buf, 0, sizeof(buf));
-		lseek(fd, 0, SEEK_SET);
-		if (read(fd, buf, sizeof(buf)) < 0) {
-			cerr << "Failed to read tmp log file" << endl;
-			return TestFail;
-		}
-		close(fd);
-
-		std::list<int> goodList = { 1, 3, 5 };
-		std::basic_istringstream<char> iss((std::string(buf)));
-		std::string line;
+	int verifyOutput(string &str)
+	{
+		list<int> goodList = { 1, 3, 5 };
+		basic_istringstream<char> iss(str);
+		string line;
 		while (getline(iss, line)) {
 			if (goodList.empty()) {
 				cout << "Too many log lines" << endl;
@@ -90,6 +73,57 @@  protected:
 
 		return TestPass;
 	}
+
+	int testFile()
+	{
+		int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
+		if (fd < 0) {
+			cerr << "Failed to open tmp log file" << endl;
+			return TestFail;
+		}
+
+		char path[32];
+		snprintf(path, sizeof(path), "/proc/self/fd/%u", fd);
+
+		logSetFile(path);
+
+		doLogging();
+
+		char buf[1000];
+		memset(buf, 0, sizeof(buf));
+		lseek(fd, 0, SEEK_SET);
+		if (read(fd, buf, sizeof(buf)) < 0) {
+			cerr << "Failed to read tmp log file" << endl;
+			return TestFail;
+		}
+		close(fd);
+
+		string str(buf);
+		return verifyOutput(str);
+	}
+
+	int testStream()
+	{
+		ostringstream log;
+		logSetStream(log);
+
+		doLogging();
+
+		string str(log.str());
+		return verifyOutput(str);
+	}
+
+	int run() override
+	{
+		int ret1 = testFile();
+
+		int ret2 = testStream();
+
+		if (ret1 == TestPass && ret2 == TestPass)
+			return TestPass;
+
+		return TestFail;
+	}
 };
 
 TEST_REGISTER(LogAPITest)