/*
* This file is part of Cockpit.
*
* Copyright (C) 2016 Red Hat, Inc.
*
* Cockpit is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* Cockpit 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Cockpit; If not, see .
*/
#include "config.h"
#include "cockpitsystem.h"
#include "common/cockpittest.h"
#include
#include
/* Defined in cockpit-system.c */
extern const gchar *cockpit_system_proc_base;
typedef struct {
const gchar *name;
guint64 result;
const gchar *warning;
const gchar *contents;
} StartFixture;
static const StartFixture start_fixtures[] = {
{
"real-world",
1286773,
NULL,
"25429 (bash) S 25423 25429 25429 34816 28241 4210688 15410 80646 0 0 18 5 51 35 20 0 1 0 1286773 126083072 1827 18446744073709551615 93932014997504 93932016010716 140725640184064 140725640182696 140221933127530 0 65536 3670020 1266777851 1 0 0 17 0 0 0 0 0 0 93932018110120 93932018156904 93932029841408 140725640190162 140725640190167 140725640190167 140725640191982 0"
},
{
"spaces-in-command",
1286773,
NULL,
"25429 (bash command spaces) S 25423 25429 25429 34816 28241 4210688 15410 80646 0 0 18 5 51 35 20 0 1 0 1286773 126083072 1827 18446744073709551615 93932014997504 93932016010716 140725640184064 140725640182696 140221933127530 0 65536 3670020 1266777851 1 0 0 17 0 0 0 0 0 0 93932018110120 93932018156904 93932029841408 140725640190162 140725640190167 140725640190167 140725640191982 0"
},
{
"missing-file",
0,
"couldn't read start time*",
NULL,
},
{
"missing-command",
0,
"error parsing stat command*",
"25429 xxxx S 25423 25429 25429 34816 28241 4210688 15410 80646 0 0 18 5 51 35 20 0 1 0 1286773 126083072 1827 18446744073709551615 93932014997504 93932016010716 140725640184064 140725640182696 140221933127530 0 65536 3670020 1266777851 1 0 0 17 0 0 0 0 0 0 93932018110120 93932018156904 93932029841408 140725640190162 140725640190167 140725640190167 140725640191982 0",
},
{
"truncate-command",
0,
"error parsing stat command*",
"25429 (bash)",
},
{
"not-enough-tokens",
0,
"error parsing stat tokens*",
"25429 (bash) S 25423 25429 25429 34816 28241 4210688 15410 80646"
},
{
"invalid-time-value",
0,
"error parsing start time*",
"25429 (bash) S 25423 25429 25429 34816 28241 4210688 15410 80646 0 0 18 5 51 35 20 0 1 0 1286773x 126083072 1827 18446744073709551615 93932014997504 93932016010716 140725640184064 140725640182696 140221933127530 0 65536 3670020 1266777851 1 0 0 17 0 0 0 0 0 0 93932018110120 93932018156904 93932029841408 140725640190162 140725640190167 140725640190167 140725640191982 0"
},
};
static void
test_start_time (gconstpointer data)
{
const StartFixture *fixture = data;
GError *error = NULL;
gchar *filename = NULL;
gchar *directory;
gchar *base;
guint64 result;
base = g_strdup ("/tmp/test-cockpit-system.XXXXXX");
base = g_mkdtemp (base);
g_assert (base != NULL);
cockpit_system_proc_base = base;
directory = g_strdup_printf ("%s/%d", base, getpid ());
g_assert_cmpint (g_mkdir (directory, 0700), ==, 0);
if (fixture->contents)
{
filename = g_strdup_printf ("%s/stat", directory);
g_file_set_contents (filename, fixture->contents, -1, &error);
g_assert_no_error (error);
}
if (fixture->warning)
cockpit_expect_warning (fixture->warning);
result = cockpit_system_process_start_time ();
/* g_printerr ("%lu\n", result); */
g_assert (result == fixture->result);
if (fixture->warning)
cockpit_assert_expected ();
if (filename)
g_assert_cmpint (g_unlink (filename), ==, 0);
g_assert_cmpint (g_rmdir (directory), ==, 0);
g_assert_cmpint (g_rmdir (base), ==, 0);
cockpit_system_proc_base = "/proc";
g_free (directory);
g_free (filename);
g_free (base);
}
int
main (int argc,
char *argv[])
{
gchar *name;
int i;
cockpit_test_init (&argc, &argv);
for (i = 0; i < G_N_ELEMENTS (start_fixtures); i++)
{
name = g_strdup_printf ("/system/start-time/%s", start_fixtures[i].name);
g_test_add_data_func (name, start_fixtures + i, test_start_time);
g_free (name);
}
return g_test_run ();
}