/*****************************************************************************\
 *  test_plugin.c - standalone program to test TopologyParam=RouteTree
 *****************************************************************************
 *  Copyright (C) 2014 Bull S. A. S.
 *		Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois.
 *
 *  Written by Rod Schultz <rod.schultz@bull.com>
 *
 *  This file is part of Slurm, a resource management program.
 *  For details, see <https://slurm.schedmd.com/>.
 *  Please also read the included file: DISCLAIMER.
 *
 *  Slurm 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.
 *
 *  In addition, as a special exception, the copyright holders give permission
 *  to link the code of portions of this program with the OpenSSL library under
 *  certain conditions as described in each individual source file, and
 *  distribute linked combinations including the two. You must obey the GNU
 *  General Public License in all respects for all of the code used other than
 *  OpenSSL. If you modify file(s) with this exception, you may extend this
 *  exception to your version of the file(s), but you are not obligated to do
 *  so. If you do not wish to do so, delete this exception statement from your
 *  version.  If you delete this exception statement from all source files in
 *  the program, then also delete it here.
 *
 *  Slurm 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 Slurm; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
\*****************************************************************************/

#include <grp.h>
#include <errno.h>
#include <getopt.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include "slurm/slurm.h"
#include "slurm/slurm_errno.h"

#include "src/common/log.h"
#include "src/common/hostlist.h"
#include "src/common/macros.h"
#include "src/common/read_config.h"
#include "src/common/timers.h"
#include "src/common/xmalloc.h"
#include "src/common/xstring.h"
#include "src/interfaces/topology.h"

#define MAX_LINES_IN_TEST 200
#define MAX_LINE 100

typedef struct {
	char *testcases;
	char *configdir;
	int   measure;
	int   verbose;
} sroutetest_opts_t;


static sroutetest_opts_t params;

static int  _check_params(void);
static void _free_options(void);
static void _help_msg(void);
static void _init_options(void);
static int  _set_options(const int argc, char **argv);

static void _init_opts(void)
{
	memset(&params, 0, sizeof(sroutetest_opts_t));
	params.measure = 0;
	params.verbose = 0;
}

static int _set_options(const int argc, char **argv)
{
	int option_index = 0;
	int cc;
	char *next_str = NULL;

	static struct option long_options[] = {
		{"configdir", required_argument, 0, 'c'},
		{"measure", no_argument, 0, 'm'},
		{"testcases", required_argument, 0, 't'},
		{"usage", no_argument, 0, 'U'},
		{"verbose", no_argument, 0, 'v'},
		{0, 0, 0, 0}};

	_init_opts();

	while ((cc = getopt_long(argc, argv, "cmt:Uv",
	                         long_options, &option_index)) != EOF) {
		switch (cc) {
			case 'c':
				params.configdir = xstrdup(optarg);
				break;
			case 'm':
				params.measure++;
				break;
			case 't':
				params.testcases = xstrdup(optarg);
				break;
			case 'U':
				_help_msg();
				return -1;
				break;
			case 'v':
				params.verbose++;
				break;
			case ':':
			case '?': /* getopt() has explained it */
				return -1;
		}
	}

	return 0;
}

/* _check_params()
 */
static int
_check_params(void)
{
	char* conf_path;
	if (params.testcases == NULL) {
		error("testcases must be specified.");
		return -1;
	}
	if (params.configdir) {
		conf_path = xstrdup_printf("%s/slurm.conf",params.configdir);
		setenv("SLURM_CONF",conf_path,1);
		xfree(conf_path);
	}

	return 0;
}


static void _help_msg(void)
{
	info("\
Usage sroutetest [<OPTION>]\n"
"\n"
"Valid <OPTION> values are:\n"
" -t, --testcases      Path to a file containing test cases.\n"
" -m, --measure        Measure each test case\n"
" -v, --verbose        print test cases and results for successful tests \n"
" --usage              Display brief usage message\n");
}


/* _free_options()
 */
static void
_free_options(void)
{
	xfree(params.testcases);
	xfree(params.configdir);
}

int _measure_api(char* measure_case)
{

	int i,j,et;
	int hl_count = 0;
	char* nodes;
	hostlist_t *hl;
	DEF_TIMERS;

	hostlist_t **sp_hl;
	nodes = measure_case;
	hl = hostlist_create(nodes);
	START_TIMER;
	if (topology_g_split_hostlist(hl, &sp_hl, &hl_count, 0) ==
	    SLURM_ERROR) {
		hostlist_destroy(hl);
		fatal("unable to split forward hostlist");
	}
	END_TIMER;
#if SLURM_VERSION_NUMBER >= SLURM_VERSION_NUM(26, 5, 0)
	/* In #50113 we converted to timespec_t logic with new macros */
	et = TIMER_DURATION_USEC();
#else
	et = DELTA_TIMER;
#endif
	for (j = 0; j < hl_count; j++) {
		hostlist_destroy(sp_hl[j]);
	}
	xfree(sp_hl);
	hostlist_destroy(hl);
	info("%d usec to split %s", et, nodes);
	return et;
}

void _print_test(char** testcase, int lines)
{
	int i;
	for (i=1; i<lines; i++) {
		info("   expected sublist[%d]=%s",i,testcase[i]);
	}
}

void _print_results(hostlist_t **hll, int hl_count)
{
	int i;
	char *list;
	info("   results list_count=%d", hl_count);
	for (i=0; i<hl_count; i++) {
		list = hostlist_ranged_string_xmalloc(hll[i]);
		info("   returned sublist[%d]=%s",i,list);
		xfree(list);
	}
}

int _run_test(char** testcase, int lines)
{
	int i, rc;
	hostlist_t **hll = NULL;
	int hl_count = 0;
	int level;
	char *list;
	char *nodes;
	nodes = testcase[0];
	hostlist_t *hl = hostlist_create(nodes);
	if (topology_g_split_hostlist(hl, &hll, &hl_count, 0) == SLURM_ERROR) {
		info("Unable to split forward hostlist");
		_print_test(testcase,lines);
		rc = SLURM_ERROR;
		goto clean;
	}
	if (hl_count != (lines-1)) {
		info("Expected #lines is %d, not #returned %d", lines,
			hl_count);
		_print_test(testcase,lines);
		_print_results(hll, hl_count);
		rc = SLURM_ERROR;
		goto clean;
	}
	for (i = 0; i < hl_count; i++) {
		list = hostlist_ranged_string_xmalloc(hll[i]);
		if (strcmp(list, testcase[i+1]) != 0) {
			info("List[%d]=%s not expected %s", i, list,
				testcase[i+1]);
			_print_test(testcase,lines);
			xfree(list);
			rc = SLURM_ERROR;
			goto clean;
		}
		xfree(list);
	}
	info("Test OK (%s)", testcase[0]);
	if (params.verbose > 0)
		_print_test(testcase,lines);
	rc = SLURM_SUCCESS;

clean:
	for (i = 0; i < hl_count; i++) {
		hostlist_destroy(hll[i]);
	}
	xfree(hll);
	return rc;
}

/* main - slurmctld main function, start various threads and process RPCs */
int main(int argc, char *argv[])
{
	int i, tl, l, rc, et;
	int   ncases = 0;
	int   nfail = 0;
	char** testcase;
	char*  measure_case;
	FILE *fd;
	log_options_t opts = LOG_OPTS_STDERR_ONLY;

	int cc;

	cc = _set_options(argc, argv);
	if (cc < 0)
		goto ouch;

	cc = _check_params();
	if (cc < 0)
		goto ouch;

	slurm_init(NULL);

	init_node_conf();
	build_all_nodeline_info(true, 0);

	if (topology_g_init() != SLURM_SUCCESS) {
		error("failed to initialize topology plugins");
		exit(1);
	}

	if (topology_g_build_config() != SLURM_SUCCESS) {
		error("failed to build topology config");
		exit(1);
	}

	opts.stderr_level = LOG_LEVEL_DEBUG;
	log_init(argv[0], opts, SYSLOG_FACILITY_USER, NULL);

	if ((fd = fopen(params.testcases, "r")) == NULL) {
		info("Failed to open %s: %m",params.testcases);
		exit(1);
	}
	testcase = xmalloc(sizeof (char*) * MAX_LINES_IN_TEST);
	for (i=0; i<MAX_LINES_IN_TEST; i++) {
		testcase[i] = malloc(sizeof(char) * (MAX_LINE+1));
	}
	tl = 0;
	while (fgets(testcase[tl], MAX_LINE, fd) != NULL) {
		l = strlen(testcase[tl]);
		if (l == 0)
			continue;
		if (testcase[tl][0] == '#')
			continue; // Comment
		testcase[tl][l-1] = '\0';
		if (strlen(testcase[tl]) == 0) {
			if (tl > 0) {
				ncases++;
				measure_case = testcase[0];
				if (params.measure > 0) {
					et = _measure_api(measure_case);
				} else {
					rc = _run_test(testcase, tl);
					if (rc == SLURM_ERROR)
						nfail++;
				}
				tl = -1;
			}
		}
		tl++;

	}
	if (tl > 0) {
		ncases++;
		measure_case = testcase[0];
		if (params.measure > 0) {
			et = _measure_api(measure_case);
		} else {
			rc = _run_test(testcase, tl);
			if (rc == SLURM_ERROR)
				nfail++;
		}
	}
	fclose(fd);
	for (i=0; i<MAX_LINES_IN_TEST; i++) {
		free(testcase[i]);
	}
	xfree(testcase);
	if (params.measure == 0) {
		info("\nTotal test cases %d, Failed cases %d\n",
				ncases, nfail);
	}
	_free_options();
	exit(0);

ouch:
	_free_options();
	return 0;

}
