git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] tests: skip terminal output tests on OS X

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Feb 17, 2011, 12:38 UTC
Message-ID
<20110217123852.GD7740@elie>
In-Reply-To
<201102091538.46594.trast@student.ethz.ch>

On Mac OS X 10.5.0, test_terminal gets stuck reading from the pty master every once in a while. To reproduce the problem:

 perl -MIO::Pty -MFile::Copy -e '
	for (my $i = 0;; $i++) {
		my $master = new IO::Pty;
		my $slave = $master->slave;
		if (fork == 0) {
			close $master or die "close: $!";
			open STDOUT, ">&", $slave or die "dup2: $!";
			close $slave or die "close: $!";
			exec("echo", "hi", $i) or die "exec: $!";
		}
		close $slave or die "close: $!";
		copy($master, \*STDOUT) or die "copy: $!";
		close $master or die "close: $!";
		wait;
	}
 '

It blocks after 7000 iterations or so in sysread(). The relevant sysread() call is the second call by the parent, which presumably executes before the child dies but after the parent has read all output from there.

Since this is an intermitent problem, the quick check of terminal support in lib-terminal doesn't catch it. Skip these tests on the Mac for now.

Noticed-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Thanks for a reminder.

I'd be interested to hear whether this happens on other BSDs, too. It's possible that test_terminal should be using a select() loop to wait for input to be ready or the child to die instead of waiting on one while the other happens.

 t/lib-terminal.sh |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/t/lib-terminal.sh b/t/lib-terminal.sh
index c383b57..58d911d 100644
--- a/t/lib-terminal.sh
+++ b/t/lib-terminal.sh
@@ -1,8 +1,24 @@
 #!/bin/sh
 
-test_expect_success 'set up terminal for tests' '
-	if
-		test_have_prereq PERL &&
+test_expect_success PERL 'set up terminal for tests' '
+	# Reading from the pty master seems to get stuck _sometimes_
+	# on Mac OS X 10.5.0, using Perl 5.10.0 or 5.8.9.
+	#
+	# Reproduction recipe: run
+	#
+	#	i=0
+	#	while ./test-terminal.perl echo hi $i
+	#	do
+	#		: $((i = $i + 1))
+	#	done
+	#
+	# After 2000 iterations or so it hangs.
+	# https://rt.cpan.org/Ticket/Display.html?id=65692
+	#
+	if test "$(uname -s)" = Darwin
+	then
+		:
+	elif
 		"$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl \
 			sh -c "test -t 1 && test -t 2"
 	then
-- 
1.7.4.1
Previous: Jonathan Nieder
Message 12 of 12 in “t7006 sometimes hangs in cronjobs on OS X”
  1. Thomas RastFeb 9, 2011
  2. Ben WaltonFeb 9, 2011
  3. Jeff KingFeb 9, 2011
  4. Thomas RastFeb 9, 2011
  5. Thomas RastFeb 9, 2011
  6. Jeff KingFeb 9, 2011
  7. Jonathan NiederFeb 12, 2011
  8. Jonathan NiederFeb 12, 2011
  9. Jeff KingFeb 12, 2011
  10. Jonathan NiederFeb 12, 2011
  11. Jonathan NiederFeb 13, 2011
  12. tests: skip terminal output tests on OS XJonathan Nieder, Feb 17, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.