1/*
2 * Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
9
10#pragma ident	"%Z%%M%	%I%	%E% SMI"
11
12#include <sm/gen.h>
13SM_IDSTR(Id, "@(#)$Id: test.c,v 1.16 2002/01/08 17:54:40 ca Exp $")
14
15/*
16**  Abstractions for writing libsm test programs.
17*/
18
19#include <stdlib.h>
20#include <unistd.h>
21#include <stdio.h>
22#include <sm/debug.h>
23#include <sm/test.h>
24
25extern char *optarg;
26extern int optind;
27extern int optopt;
28extern int opterr;
29
30int SmTestIndex;
31int SmTestNumErrors;
32bool SmTestVerbose;
33
34static char Help[] = "\
35%s [-h] [-d debugging] [-v]\n\
36\n\
37%s\n\
38\n\
39-h		Display this help information.\n\
40-d debugging	Set debug activation levels.\n\
41-v		Verbose output.\n\
42";
43
44static char Usage[] = "\
45Usage: %s [-h] [-v]\n\
46Use %s -h for help.\n\
47";
48
49/*
50**  SM_TEST_BEGIN -- initialize test system.
51**
52**	Parameters:
53**		argc -- argument counter.
54**		argv -- argument vector.
55**		testname -- description of tests.
56**
57**	Results:
58**		none.
59*/
60
61void
62sm_test_begin(argc, argv, testname)
63	int argc;
64	char **argv;
65	char *testname;
66{
67	int c;
68
69	SmTestIndex = 0;
70	SmTestNumErrors = 0;
71	SmTestVerbose = false;
72	opterr = 0;
73
74	while ((c = getopt(argc, argv, "vhd:")) != -1)
75	{
76		switch (c)
77		{
78		  case 'v':
79			SmTestVerbose = true;
80			break;
81		  case 'd':
82			sm_debug_addsettings_x(optarg);
83			break;
84		  case 'h':
85			(void) fprintf(stdout, Help, argv[0], testname);
86			exit(0);
87		  default:
88			(void) fprintf(stderr,
89					"Unknown command line option -%c\n",
90					optopt);
91			(void) fprintf(stderr, Usage, argv[0], argv[0]);
92			exit(1);
93		}
94	}
95}
96
97/*
98**  SM_TEST -- single test.
99**
100**	Parameters:
101**		success -- did test succeeed?
102**		expr -- expression that has been evaluated.
103**		filename -- guess...
104**		lineno -- line number.
105**
106**	Results:
107**		value of success.
108*/
109
110bool
111sm_test(success, expr, filename, lineno)
112	bool success;
113	char *expr;
114	char *filename;
115	int lineno;
116{
117	++SmTestIndex;
118	if (SmTestVerbose)
119		(void) fprintf(stderr, "%d..", SmTestIndex);
120	if (!success)
121	{
122		++SmTestNumErrors;
123		if (!SmTestVerbose)
124			(void) fprintf(stderr, "%d..", SmTestIndex);
125		(void) fprintf(stderr, "bad! %s:%d %s\n", filename, lineno,
126				expr);
127	}
128	else
129	{
130		if (SmTestVerbose)
131			(void) fprintf(stderr, "ok\n");
132	}
133	return success;
134}
135
136/*
137**  SM_TEST_END -- end of test system.
138**
139**	Parameters:
140**		none.
141**
142**	Results:
143**		number of errors.
144*/
145
146int
147sm_test_end()
148{
149	(void) fprintf(stderr, "%d of %d tests completed successfully\n",
150			SmTestIndex - SmTestNumErrors, SmTestIndex);
151	if (SmTestNumErrors != 0)
152		(void) fprintf(stderr, "*** %d error%s in test! ***\n",
153				SmTestNumErrors,
154				SmTestNumErrors > 1 ? "s" : "");
155
156	return SmTestNumErrors;
157}
158