Blame tests/inspect.c

Packit eba2e2
/*
Packit eba2e2
 * Copyright (C) 2010 Colin Watson.
Packit eba2e2
 *
Packit eba2e2
 * This file is part of libpipeline.
Packit eba2e2
 *
Packit eba2e2
 * libpipeline is free software; you can redistribute it and/or modify
Packit eba2e2
 * it under the terms of the GNU General Public License as published by
Packit eba2e2
 * the Free Software Foundation; either version 2 of the License, or (at
Packit eba2e2
 * your option) any later version.
Packit eba2e2
 *
Packit eba2e2
 * libpipeline is distributed in the hope that it will be useful, but
Packit eba2e2
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eba2e2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit eba2e2
 * General Public License for more details.
Packit eba2e2
 *
Packit eba2e2
 * You should have received a copy of the GNU General Public License
Packit eba2e2
 * along with libpipeline; if not, write to the Free Software
Packit eba2e2
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
Packit eba2e2
 * USA.
Packit eba2e2
 */
Packit eba2e2
Packit eba2e2
#ifdef HAVE_CONFIG_H
Packit eba2e2
#  include "config.h"
Packit eba2e2
#endif
Packit eba2e2
Packit eba2e2
#include <string.h>
Packit eba2e2
#include <sys/types.h>
Packit eba2e2
#include <unistd.h>
Packit eba2e2
#include <stdlib.h>
Packit eba2e2
#include <signal.h>
Packit eba2e2
#include <errno.h>
Packit eba2e2
Packit eba2e2
#include "error.h"
Packit eba2e2
Packit eba2e2
#include "common.h"
Packit eba2e2
Packit eba2e2
const char *program_name = "inspect";
Packit eba2e2
Packit eba2e2
START_TEST (test_inspect_command)
Packit eba2e2
{
Packit eba2e2
	pipecmd *cmd;
Packit eba2e2
	char *str;
Packit eba2e2
Packit eba2e2
	cmd = pipecmd_new ("foo");
Packit eba2e2
	str = pipecmd_tostring (cmd);
Packit eba2e2
	fail_unless (!strcmp (str, "foo"));
Packit eba2e2
	free (str);
Packit eba2e2
	pipecmd_free (cmd);
Packit eba2e2
Packit eba2e2
	cmd = pipecmd_new_args ("foo", "bar", "baz quux", NULL);
Packit eba2e2
	str = pipecmd_tostring (cmd);
Packit eba2e2
	/* TODO: not ideal representation of commands with metacharacters */
Packit eba2e2
	fail_unless (!strcmp (str, "foo bar baz quux"));
Packit eba2e2
	free (str);
Packit eba2e2
	pipecmd_free (cmd);
Packit eba2e2
}
Packit eba2e2
END_TEST
Packit eba2e2
Packit eba2e2
START_TEST (test_inspect_pipeline)
Packit eba2e2
{
Packit eba2e2
	pipeline *p;
Packit eba2e2
	char *str;
Packit eba2e2
Packit eba2e2
	p = pipeline_new ();
Packit eba2e2
	pipeline_command_args (p, "foo", "bar", NULL);
Packit eba2e2
	pipeline_command_args (p, "grep", "baz", "quux", NULL);
Packit eba2e2
	fail_unless (pipeline_get_ncommands (p) == 2);
Packit eba2e2
	pipecmd_setenv (pipeline_get_command (p, 1), "KEY", "value");
Packit eba2e2
	str = pipeline_tostring (p);
Packit eba2e2
	fail_unless (!strcmp (str, "foo bar | KEY=value grep baz quux"));
Packit eba2e2
	free (str);
Packit eba2e2
	pipeline_free (p);
Packit eba2e2
}
Packit eba2e2
END_TEST
Packit eba2e2
Packit eba2e2
static void pid_helper (void *data PIPELINE_ATTR_UNUSED)
Packit eba2e2
{
Packit eba2e2
	struct sigaction sa;
Packit eba2e2
Packit eba2e2
	/* Get rid of check's SIGTERM handler. */
Packit eba2e2
	memset (&sa, 0, sizeof sa);
Packit eba2e2
	sa.sa_handler = SIG_DFL;
Packit eba2e2
	sigemptyset (&sa.sa_mask);
Packit eba2e2
	sa.sa_flags = 0;
Packit eba2e2
	if (sigaction (SIGTERM, &sa, NULL) == -1)
Packit eba2e2
		error (1, errno, "can't install SIGTERM handler");
Packit eba2e2
Packit eba2e2
	printf ("%ld\n", (long) getpid ());
Packit eba2e2
	fflush (stdout);
Packit eba2e2
	pause ();
Packit eba2e2
}
Packit eba2e2
Packit eba2e2
START_TEST (test_inspect_pid)
Packit eba2e2
{
Packit eba2e2
	pipeline *p;
Packit eba2e2
	pipecmd *cmd;
Packit eba2e2
	const char *line;
Packit eba2e2
	pid_t pid;
Packit eba2e2
Packit eba2e2
	p = pipeline_new ();
Packit eba2e2
	cmd = pipecmd_new_function ("pid_helper", pid_helper, NULL, NULL);
Packit eba2e2
	pipeline_command (p, cmd);
Packit eba2e2
	pipeline_want_out (p, -1);
Packit eba2e2
	pipeline_start (p);
Packit eba2e2
	line = pipeline_readline (p);
Packit eba2e2
	fail_unless (line != NULL);
Packit eba2e2
	pid = (pid_t) atol (line);
Packit eba2e2
	fail_unless (pid == pipeline_get_pid (p, 0), "pids match");
Packit eba2e2
	/* Note that this test may hang if pipeline_get_pid does not work.
Packit eba2e2
	 * We might be able to fix this by calling setsid at the start of
Packit eba2e2
	 * the test and then killing the process group, but I'm not sure if
Packit eba2e2
	 * that's sufficiently portable.
Packit eba2e2
	 */
Packit eba2e2
	if (pid == pipeline_get_pid (p, 0)) {
Packit eba2e2
		int status;
Packit eba2e2
Packit eba2e2
		/* Suppress "Terminated" errors. */
Packit eba2e2
		setenv ("PIPELINE_QUIET", "1", 1);
Packit eba2e2
		kill (pid, SIGTERM);
Packit eba2e2
		status = pipeline_wait (p);
Packit eba2e2
Packit eba2e2
		fail_unless (status == 128 + SIGTERM,
Packit eba2e2
			     "pid_helper did not indicate SIGTERM");
Packit eba2e2
	}
Packit eba2e2
	pipeline_free (p);
Packit eba2e2
}
Packit eba2e2
END_TEST
Packit eba2e2
Packit eba2e2
Suite *inspect_suite (void)
Packit eba2e2
{
Packit eba2e2
	Suite *s = suite_create ("Inspect");
Packit eba2e2
Packit eba2e2
	TEST_CASE (s, inspect, command);
Packit eba2e2
	TEST_CASE (s, inspect, pipeline);
Packit eba2e2
	TEST_CASE (s, inspect, pid);
Packit eba2e2
Packit eba2e2
	return s;
Packit eba2e2
}
Packit eba2e2
Packit eba2e2
MAIN (inspect)