/*
 * libdpkg - Debian packaging suite library routines
 * t-command.c - test command implementation
 *
 * Copyright © 2010-2011 Guillem Jover <guillem@debian.org>
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <config.h>
#include <compat.h>

#include <dpkg/test.h>
#include <dpkg/subproc.h>
#include <dpkg/command.h>

static void
test_command_init(void)
{
	struct command cmd;

	command_init(&cmd, "/absolute/path/to/progname", NULL);
	test_str(cmd.filename, ==, "/absolute/path/to/progname");
	test_str(cmd.name, ==, "progname");
	test_pass(cmd.argc == 0);
	test_pass(cmd.argv[0] == NULL);

	command_destroy(&cmd);
	test_pass(cmd.filename == NULL);
	test_pass(cmd.name == NULL);
	test_pass(cmd.argc == 0);
	test_pass(cmd.argv == NULL);

	command_init(&cmd, "progname", NULL);
	test_str(cmd.filename, ==, "progname");
	test_str(cmd.name, ==, "progname");
	test_pass(cmd.argc == 0);
	test_pass(cmd.argv[0] == NULL);

	command_destroy(&cmd);

	command_init(&cmd, "progname", "description");
	test_str(cmd.filename, ==, "progname");
	test_str(cmd.name, ==, "description");
	test_pass(cmd.argc == 0);
	test_pass(cmd.argv[0] == NULL);

	command_destroy(&cmd);
}

static void
test_command_add_arg(void)
{
	struct command cmd;

	command_init(&cmd, "test", NULL);

	command_add_arg(&cmd, "arg 0");
	test_pass(cmd.argc == 1);
	test_str(cmd.argv[0], ==, "arg 0");
	test_pass(cmd.argv[1] == NULL);

	command_add_arg(&cmd, "arg 1");
	test_pass(cmd.argc == 2);
	test_str(cmd.argv[0], ==, "arg 0");
	test_str(cmd.argv[1], ==, "arg 1");
	test_pass(cmd.argv[2] == NULL);

	command_add_arg(&cmd, "arg 2");
	test_pass(cmd.argc == 3);
	test_str(cmd.argv[0], ==, "arg 0");
	test_str(cmd.argv[1], ==, "arg 1");
	test_str(cmd.argv[2], ==, "arg 2");
	test_pass(cmd.argv[3] == NULL);

	command_destroy(&cmd);
}

static void
test_command_add_argl(void)
{
	struct command cmd;
	const char *args[] = {
		"arg 1",
		"arg 2",
		"arg 3",
		NULL,
	};

	command_init(&cmd, "test", NULL);

	command_add_arg(&cmd, "arg 0");

	command_add_argl(&cmd, args);
	test_pass(cmd.argc == 4);
	test_str(cmd.argv[0], ==, "arg 0");
	test_str(cmd.argv[1], ==, "arg 1");
	test_str(cmd.argv[2], ==, "arg 2");
	test_str(cmd.argv[3], ==, "arg 3");
	test_pass(cmd.argv[4] == NULL);

	command_destroy(&cmd);
}

static void
test_command_add_args(void)
{
	struct command cmd;

	command_init(&cmd, "test", NULL);

	command_add_arg(&cmd, "arg 0");

	command_add_args(&cmd, "arg 1", "arg 2", "arg 3", NULL);
	test_pass(cmd.argc == 4);
	test_str(cmd.argv[0], ==, "arg 0");
	test_str(cmd.argv[1], ==, "arg 1");
	test_str(cmd.argv[2], ==, "arg 2");
	test_str(cmd.argv[3], ==, "arg 3");
	test_pass(cmd.argv[4] == NULL);

	command_destroy(&cmd);
}

static void
test_command_exec(void)
{
	struct command cmd;
	pid_t pid;

	command_init(&cmd, "/bin/true", "exec test");

	command_add_arg(&cmd, "arg 0");
	command_add_arg(&cmd, "arg 1");

	pid = subproc_fork();

	if (pid == 0)
		command_exec(&cmd);

	subproc_wait_check(pid, "command exec test", 0);
}

static void
test_command_shell(void)
{
	pid_t pid;
	int ret;

	pid = subproc_fork();
	if (pid == 0)
		command_shell("true", "command shell pass test");
	ret = subproc_wait_check(pid, "command shell pass test", 0);
	test_pass(ret == 0);

	pid = subproc_fork();
	if (pid == 0)
		command_shell("false", "command shell fail test");
	ret = subproc_wait_check(pid, "command shell fail test", PROCNOERR);
	test_fail(ret == 0);
}

static void
test(void)
{
	test_command_init();
	test_command_add_arg();
	test_command_add_argl();
	test_command_add_args();
	test_command_exec();
	test_command_shell();
}
