Module Name:    src
Committed By:   blymn
Date:           Thu Sep  8 10:56:49 UTC 2011

Modified Files:
        src/tests/lib/libcurses: t_curses.sh
        src/tests/lib/libcurses/director: testlang_parse.y

Log Message:
- Add a delay just after the function is passed to the slave, this
  gives the slave time to process the command and produce output before
  the director drains output from the slave.  This is particularly
  important when the slave is set up for timed input because the ioctl
  used by curses to set the tty parameters waits for pending output to
  drain.
- make a debug statement conditional on verbose again
- make a warning about output from the slave conditional on verbose
- fix setting the minimum input delay, it should be milliseconds not
  nanoseconds.
- Handle nanosleep returning early due to a signal, restart the sleep
  with the remaining time.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/lib/libcurses/t_curses.sh
cvs rdiff -u -r1.9 -r1.10 src/tests/lib/libcurses/director/testlang_parse.y

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libcurses/t_curses.sh
diff -u src/tests/lib/libcurses/t_curses.sh:1.6 src/tests/lib/libcurses/t_curses.sh:1.7
--- src/tests/lib/libcurses/t_curses.sh:1.6	Mon Aug 29 12:44:35 2011
+++ src/tests/lib/libcurses/t_curses.sh	Thu Sep  8 10:56:49 2011
@@ -272,7 +272,7 @@
 	atf_add_test_case addstr
 	atf_add_test_case addnstr
 	atf_add_test_case getch
-#	atf_add_test_case timeout	# This is racy; works with -v
+	atf_add_test_case timeout
 	atf_add_test_case window
 	atf_add_test_case wborder
 	atf_add_test_case box

Index: src/tests/lib/libcurses/director/testlang_parse.y
diff -u src/tests/lib/libcurses/director/testlang_parse.y:1.9 src/tests/lib/libcurses/director/testlang_parse.y:1.10
--- src/tests/lib/libcurses/director/testlang_parse.y:1.9	Mon Aug 29 12:49:37 2011
+++ src/tests/lib/libcurses/director/testlang_parse.y	Thu Sep  8 10:56:49 2011
@@ -1,5 +1,5 @@
 %{
-/*	$NetBSD: testlang_parse.y,v 1.9 2011/08/29 12:49:37 christos Exp $	*/
+/*	$NetBSD: testlang_parse.y,v 1.10 2011/09/08 10:56:49 blymn Exp $	*/
 
 /*-
  * Copyright 2009 Brett Lymn <[email protected]>
@@ -64,7 +64,16 @@
  * problems with input tests
  */
 #define DELAY_MIN 0.1
+
+/* time delay after a function call - allows the slave time to
+ * run the function and output data before we do other actions.
+ * Set this to 50ms.
+ */
+#define POST_CALL_DELAY 50
+
 static struct timespec delay_spec = {0, 1000 * DELAY_MIN};
+static struct timespec delay_post_call = {0, 1000 * POST_CALL_DELAY};
+
 static char *input_str;	/* string to feed in as input */
 static bool no_input;	/* don't need more input */
 
@@ -135,6 +144,7 @@
 static void	validate_reference(int, void *);
 static char	*numeric_or(char *, char *);
 static char	*get_numeric_var(const char *);
+static void	perform_delay(struct timespec *);
 
 static const char *input_functions[] = {
 	"inch", "getch", "getnstr", "getstr", "innstr", "instr", "mvgetnstr",
@@ -305,7 +315,7 @@
 	}
 
 	if (input_delay < DELAY_MIN)
-		input_delay = 1000 * DELAY_MIN; /* ms to ns */
+		input_delay = DELAY_MIN;
 	/*
 	 * Fill in the timespec structure now ready for use later.
 	 * The delay is specified in milliseconds so convert to timespec
@@ -315,7 +325,7 @@
 	delay_spec.tv_nsec = (input_delay - 1000 * delay_spec.tv_sec) * 1000;
 	if (verbose) {
 		fprintf(stderr, "set delay to %jd.%jd\n",
-		    (intmax_t)delay_spec.tv_sec, 
+		    (intmax_t)delay_spec.tv_sec,
 		    (intmax_t)delay_spec.tv_nsec);
 	}
 
@@ -484,6 +494,23 @@
 }
 
 /*
+ * Sleep for the specified time, handle the sleep getting interrupted
+ * by a signal.
+ */
+static void
+perform_delay(struct timespec *ts)
+{
+	struct timespec delay_copy, delay_remainder;
+
+	delay_copy = *ts;
+	while (nanosleep(&delay_copy, &delay_remainder) < 0) {
+		if (errno != EINTR)
+			err(2, "nanosleep returned error");
+		delay_copy = delay_remainder;
+	}
+}
+
+/*
  * Assign the value given to the named variable.
  */
 static void
@@ -837,7 +864,6 @@
 	size_t i;
 	struct pollfd fds[3];
 	returns_t response[MAX_RESULTS], returns_count;
-
 	assert(nresults <= MAX_RESULTS);
 
 	do_input = check_function_table(command.function, input_functions,
@@ -854,6 +880,8 @@
 		err(2, "expected return type of ret_count but received %s",
 		    returns_enum_names[returns_count.return_type]);
 
+	perform_delay(&delay_post_call); /* let slave catch up */
+
 	if (verbose) {
 		fprintf(stderr, "Expect %zu results from slave, slave "
 		    "reported %zu\n", nresults, returns_count.return_len);
@@ -876,7 +904,8 @@
  		p = input_str;
 		save_slave_output(false);
 		while(*p != '\0') {
-			nanosleep(&delay_spec, NULL);
+			perform_delay(&delay_spec);
+
 			if (poll(fds, 2, 0) < 0)
 				err(2, "poll failed");
 			if (fds[0].revents & POLLIN) {
@@ -979,11 +1008,10 @@
 				response[i].return_type;
 		}
 	}
-#if 0
-	if (saved_output.count > 0)
+
+	if (verbose && (saved_output.count > 0))
 		excess(cur_file, line, __func__, " from slave",
 		    &saved_output.data[saved_output.readp], saved_output.count);
-#endif
 
 	init_parse_variables(0);
 }
@@ -1143,7 +1171,7 @@
 	if (command.returns[i].return_type != ret_byte)
 		response = data;
 
-	if (1 || verbose) {
+	if (verbose) {
 		fprintf(stderr,
 		    "validate_reference: return type of %s, value %s \n",
 		    returns_enum_names[varp->type],

Reply via email to