190792Sgshapiro/*
2261370Sgshapiro * Copyright (c) 2000-2002 Proofpoint, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro */
990792Sgshapiro
1090792Sgshapiro#include <sm/gen.h>
11266711SgshapiroSM_IDSTR(Id, "@(#)$Id: test.c,v 1.17 2013-11-22 20:51:44 ca Exp $")
1290792Sgshapiro
1390792Sgshapiro/*
1490792Sgshapiro**  Abstractions for writing libsm test programs.
1590792Sgshapiro*/
1690792Sgshapiro
1790792Sgshapiro#include <stdlib.h>
1890792Sgshapiro#include <unistd.h>
1990792Sgshapiro#include <stdio.h>
2090792Sgshapiro#include <sm/debug.h>
2190792Sgshapiro#include <sm/test.h>
2290792Sgshapiro
2390792Sgshapiroextern char *optarg;
2490792Sgshapiroextern int optind;
2590792Sgshapiroextern int optopt;
2690792Sgshapiroextern int opterr;
2790792Sgshapiro
2890792Sgshapiroint SmTestIndex;
2990792Sgshapiroint SmTestNumErrors;
3090792Sgshapirobool SmTestVerbose;
3190792Sgshapiro
3290792Sgshapirostatic char Help[] = "\
3390792Sgshapiro%s [-h] [-d debugging] [-v]\n\
3490792Sgshapiro\n\
3590792Sgshapiro%s\n\
3690792Sgshapiro\n\
3790792Sgshapiro-h		Display this help information.\n\
3890792Sgshapiro-d debugging	Set debug activation levels.\n\
3990792Sgshapiro-v		Verbose output.\n\
4090792Sgshapiro";
4190792Sgshapiro
4290792Sgshapirostatic char Usage[] = "\
4390792SgshapiroUsage: %s [-h] [-v]\n\
4490792SgshapiroUse %s -h for help.\n\
4590792Sgshapiro";
4690792Sgshapiro
4790792Sgshapiro/*
4890792Sgshapiro**  SM_TEST_BEGIN -- initialize test system.
4990792Sgshapiro**
5090792Sgshapiro**	Parameters:
5190792Sgshapiro**		argc -- argument counter.
5290792Sgshapiro**		argv -- argument vector.
5390792Sgshapiro**		testname -- description of tests.
5490792Sgshapiro**
5590792Sgshapiro**	Results:
5690792Sgshapiro**		none.
5790792Sgshapiro*/
5890792Sgshapiro
5990792Sgshapirovoid
6090792Sgshapirosm_test_begin(argc, argv, testname)
6190792Sgshapiro	int argc;
6290792Sgshapiro	char **argv;
6390792Sgshapiro	char *testname;
6490792Sgshapiro{
6590792Sgshapiro	int c;
6690792Sgshapiro
6790792Sgshapiro	SmTestIndex = 0;
6890792Sgshapiro	SmTestNumErrors = 0;
6990792Sgshapiro	SmTestVerbose = false;
7090792Sgshapiro	opterr = 0;
7190792Sgshapiro
7290792Sgshapiro	while ((c = getopt(argc, argv, "vhd:")) != -1)
7390792Sgshapiro	{
7490792Sgshapiro		switch (c)
7590792Sgshapiro		{
7690792Sgshapiro		  case 'v':
7790792Sgshapiro			SmTestVerbose = true;
7890792Sgshapiro			break;
7990792Sgshapiro		  case 'd':
8090792Sgshapiro			sm_debug_addsettings_x(optarg);
8190792Sgshapiro			break;
8290792Sgshapiro		  case 'h':
8390792Sgshapiro			(void) fprintf(stdout, Help, argv[0], testname);
8490792Sgshapiro			exit(0);
8590792Sgshapiro		  default:
8690792Sgshapiro			(void) fprintf(stderr,
8790792Sgshapiro					"Unknown command line option -%c\n",
8890792Sgshapiro					optopt);
8990792Sgshapiro			(void) fprintf(stderr, Usage, argv[0], argv[0]);
9090792Sgshapiro			exit(1);
9190792Sgshapiro		}
9290792Sgshapiro	}
9390792Sgshapiro}
9490792Sgshapiro
9590792Sgshapiro/*
9690792Sgshapiro**  SM_TEST -- single test.
9790792Sgshapiro**
9890792Sgshapiro**	Parameters:
9990792Sgshapiro**		success -- did test succeeed?
10090792Sgshapiro**		expr -- expression that has been evaluated.
10190792Sgshapiro**		filename -- guess...
10290792Sgshapiro**		lineno -- line number.
10390792Sgshapiro**
10490792Sgshapiro**	Results:
10590792Sgshapiro**		value of success.
10690792Sgshapiro*/
10790792Sgshapiro
10890792Sgshapirobool
10990792Sgshapirosm_test(success, expr, filename, lineno)
11090792Sgshapiro	bool success;
11190792Sgshapiro	char *expr;
11290792Sgshapiro	char *filename;
11390792Sgshapiro	int lineno;
11490792Sgshapiro{
11590792Sgshapiro	++SmTestIndex;
11690792Sgshapiro	if (SmTestVerbose)
11790792Sgshapiro		(void) fprintf(stderr, "%d..", SmTestIndex);
11890792Sgshapiro	if (!success)
11990792Sgshapiro	{
12090792Sgshapiro		++SmTestNumErrors;
12190792Sgshapiro		if (!SmTestVerbose)
12290792Sgshapiro			(void) fprintf(stderr, "%d..", SmTestIndex);
12390792Sgshapiro		(void) fprintf(stderr, "bad! %s:%d %s\n", filename, lineno,
12490792Sgshapiro				expr);
12590792Sgshapiro	}
12690792Sgshapiro	else
12790792Sgshapiro	{
12890792Sgshapiro		if (SmTestVerbose)
12990792Sgshapiro			(void) fprintf(stderr, "ok\n");
13090792Sgshapiro	}
13190792Sgshapiro	return success;
13290792Sgshapiro}
13390792Sgshapiro
13490792Sgshapiro/*
13590792Sgshapiro**  SM_TEST_END -- end of test system.
13690792Sgshapiro**
13790792Sgshapiro**	Parameters:
13890792Sgshapiro**		none.
13990792Sgshapiro**
14090792Sgshapiro**	Results:
14190792Sgshapiro**		number of errors.
14290792Sgshapiro*/
14390792Sgshapiro
14490792Sgshapiroint
14590792Sgshapirosm_test_end()
14690792Sgshapiro{
14790792Sgshapiro	(void) fprintf(stderr, "%d of %d tests completed successfully\n",
14890792Sgshapiro			SmTestIndex - SmTestNumErrors, SmTestIndex);
14990792Sgshapiro	if (SmTestNumErrors != 0)
15090792Sgshapiro		(void) fprintf(stderr, "*** %d error%s in test! ***\n",
15190792Sgshapiro				SmTestNumErrors,
15290792Sgshapiro				SmTestNumErrors > 1 ? "s" : "");
15390792Sgshapiro
15490792Sgshapiro	return SmTestNumErrors;
15590792Sgshapiro}
156