This file is indexed.

/usr/include/nih/test_files.h is in libnih-dev 1.0.3-4ubuntu25.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/* libnih
 *
 * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
 * Copyright © 2011 Canonical Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2, as
 * published by the Free Software Foundation.
 *
 * This program 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, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef NIH_TEST_FILES_H
#define NIH_TEST_FILES_H

#ifndef NIH_IN_TEST_H
# error "This header may only be included by <nih/test.h>"
#endif /* NIH_IN_TEST_H */

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fnmatch.h>


/**
 * TEST_FILENAME:
 * @_var: variable to store filename in.
 *
 * Generate a filename that may be used for testing, it's unlinked if it
 * exists and it's up to you to unlink it when done.  @_var should be at
 * least PATH_MAX long.
 **/
#define TEST_FILENAME(_var) \
	do { \
		snprintf ((_var), sizeof (_var), "/tmp/%s-%s-%d-%d", \
			  strrchr (__FILE__, '/') ? strrchr (__FILE__, '/') + 1 : __FILE__, \
			  __FUNCTION__, __LINE__, getpid ()); \
		unlink (_var); \
	} while (0)

/**
 * TEST_FILE_EQ:
 * @_file: FILE to read from,
 * @_line: line to expect.
 *
 * Check that the next line in the file @_file is @_line, which should
 * include the terminating newline if one is expected.
 **/
#define TEST_FILE_EQ(_file, _line) \
	do { \
		char _test_file[512]; \
		if (! fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("eof on file %p (%s), expected '%s'", \
				     (_file), #_file, (_line)); \
		if (strcmp (_test_file, (_line))) \
			TEST_FAILED ("wrong content in file %p (%s), expected '%s' got '%s'", \
			     (_file), #_file, (_line), _test_file); \
	} while (0)

/**
 * TEST_FILE_MATCH:
 * @_file: FILE to read from,
 * @_pattern: pattern to expect.
 *
 * Check that the next line in the file @_file matches the glob pattern
 * @_pattern, which should include the terminating newline if one is expected.
 **/
#define TEST_FILE_MATCH(_file, _pattern) \
	do { \
		char _test_file[512]; \
		if (! fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("eof on file %p (%s), expected '%s'", \
				     (_file), #_file, (_pattern)); \
		if (fnmatch ((_pattern), _test_file, 0))		\
			TEST_FAILED ("wrong content in file %p (%s), expected '%s' got '%s'", \
			     (_file), #_file, (_pattern), _test_file); \
	} while (0)

/**
 * TEST_FILE_EQ_N:
 * @_file: FILE to read from,
 * @_line: line to expect.
 *
 * Check that the start of the next line in the file @_file is @_line, up to
 * the length of that argument.
 **/
#define TEST_FILE_EQ_N(_file, _line) \
	do { \
		char _test_file[512]; \
		if (! fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("eof on file %p (%s), expected '%s'", \
				     (_file), #_file, (_line)); \
		if (strncmp (_test_file, (_line), strlen (_line))) \
			TEST_FAILED ("wrong content in file %p (%s), expected '%.*s' got '%.*s'", \
			     (_file), #_file, (int)strlen (_line), (_line), \
			     (int)strlen (_line), _test_file); \
	} while (0)

/**
 * TEST_FILE_NE:
 * @_file: FILE to read from,
 * @_line: line to expect.
 *
 * Check that the next line in the file @_file is not @_line, but also not
 * end of file.
 **/
#define TEST_FILE_NE(_file, _line) \
	do { \
		char _test_file[512]; \
		if (! fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("eof on file %p (%s), expected line other than '%s'", \
				     (_file), #_file, (_line)); \
		if (! strcmp (_test_file, (_line))) \
			TEST_FAILED ("wrong content in file %p (%s), got unexpected '%s'", \
			     (_file), #_file, (_line)); \
	} while (0)

/**
 * TEST_FILE_NE_N:
 * @_file: FILE to read from,
 * @_line: line to expect.
 *
 * Check that the next line in the file @_file does not start with @_line,
 * up to the length of that argument; but also not end of file.
 **/
#define TEST_FILE_NE_N(_file, _line) \
	do { \
		char _test_file[512]; \
		if (! fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("eof on file %p (%s), expected line other than '%s'", \
				     (_file), #_file, (_line)); \
		if (! strncmp (_test_file, (_line), strlen (_line))) \
			TEST_FAILED ("wrong content in file %p (%s), got unexpected '%.*s'", \
			     (_file), #_file, (int)strlen (_line), (_line)); \
	} while (0)

/**
 * TEST_FILE_END:
 * @_file: FILE to check.
 *
 * Check that the end of the file @_file has been reached, and that there
 * are no more lines to read.
 **/
#define TEST_FILE_END(_file) \
	do { \
		char _test_file[512];\
		if (fgets (_test_file, sizeof (_test_file), (_file))) \
			TEST_FAILED ("wrong content in file %p (%s), expected eof got '%s'", \
				     (_file), #_file, _test_file); \
	} while (0)

/**
 * TEST_FILE_RESET:
 * @_file: FILE to reset.
 *
 * This macro may be used to reset a temporary file such that it can be
 * treated as a new one.
 **/
#define TEST_FILE_RESET(_file) \
	do { \
		fflush (_file); \
		rewind (_file); \
		assert0 (ftruncate (fileno (_file), 0)); \
	} while (0)


/**
 * TEST_EXPECTED_STR:
 * @_str: string to check,
 * @_filename: filename to compare against.
 *
 * Check that the string @_str exactly matches the contents of the
 * file @_filename, which is local to the expected directory.
 **/
#define TEST_EXPECTED_STR(_str, _filename)				\
	do {								\
		char        _test_file[512];				\
		char *      _test_basename;				\
		int         _test_fd;					\
		struct stat _test_stat;					\
		char *      _test_buf;					\
									\
		strcpy (_test_file, __FILE__);				\
		_test_basename = strrchr (_test_file, '/');		\
		strcpy (_test_basename ? _test_basename + 1 : _test_file, "expected/"); \
		strcat (_test_file, (_filename));			\
									\
		_test_fd = open (_test_file, O_RDONLY);			\
		assert (_test_fd >= 0);					\
									\
		assert (fstat (_test_fd, &_test_stat) == 0);		\
									\
		_test_buf = mmap (NULL, _test_stat.st_size, PROT_READ,	\
				  MAP_SHARED, _test_fd, 0);		\
		assert (_test_buf != MAP_FAILED);			\
									\
		if ((_str) == NULL) {					\
			TEST_FAILED ("wrong value for %s, expected '%.*s' got NULL", \
				     #_str, (int)_test_stat.st_size, _test_buf); \
		} else if ((strlen (_str) != (size_t)_test_stat.st_size)	\
			   || strncmp ((_str), _test_buf, _test_stat.st_size)) \
			TEST_FAILED ("wrong value for %s, expected '%.*s' got '%s'", \
				     #_str, (int)_test_stat.st_size, _test_buf, \
				     (_str));	\
									\
		assert (munmap (_test_buf, _test_stat.st_size) == 0);	\
		assert (close (_test_fd) == 0);				\
	} while (0)

/**
 * TEST_EXPECTED_FILE:
 * @_file: open file to check,
 * @_filename: filename to compare against.
 *
 * Check that the contents of file @_file exactly matches the contents of
 * the file @_filename, which is local to the expected directory.
 **/
#define TEST_EXPECTED_FILE(_file, _filename)				\
	do {								\
		char        _test_file[512];				\
		char *      _test_basename;				\
		int         _test_fd;					\
		struct stat _test_stat_a;				\
		struct stat _test_stat_b;				\
		char *      _test_buf_a;				\
		char *      _test_buf_b;				\
									\
		strcpy (_test_file, __FILE__);				\
		_test_basename = strrchr (_test_file, '/');		\
		strcpy (_test_basename ? _test_basename + 1 : _test_file, "expected/"); \
		strcat (_test_file, (_filename));			\
									\
		_test_fd = open (_test_file, O_RDONLY);			\
		assert (_test_fd >= 0);					\
									\
		assert (fstat (_test_fd, &_test_stat_a) == 0);		\
		assert (fstat (fileno (_file), &_test_stat_b) == 0);	\
									\
		_test_buf_a = mmap (NULL, _test_stat_a.st_size, PROT_READ, \
				    MAP_SHARED, _test_fd, 0);		\
		assert (_test_buf_a != MAP_FAILED);			\
									\
		_test_buf_b = mmap (NULL, _test_stat_b.st_size, PROT_READ, \
				    MAP_SHARED, fileno (_file), 0);	\
		assert (_test_buf_b != MAP_FAILED);			\
									\
		if ((_test_stat_a.st_size != _test_stat_b.st_size)	\
		    || strncmp (_test_buf_a, _test_buf_b,			\
				_test_stat_a.st_size)) \
			TEST_FAILED ("wrong value for %s, expected '%.*s' got '%.*s'", \
				     #_file, (int)_test_stat_a.st_size, _test_buf_a, \
				     (int)_test_stat_b.st_size, _test_buf_b); \
									\
		assert (munmap (_test_buf_a, _test_stat_a.st_size) == 0); \
		assert (munmap (_test_buf_b, _test_stat_b.st_size) == 0); \
		assert (close (_test_fd) == 0);				\
	} while (0)

#endif /* NIH_TEST_FILES_H */