1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       tests.h
4/// \brief      Common definitions for test applications
5//
6//  Author:     Lasse Collin
7//
8//  This file has been put into the public domain.
9//  You can do whatever you want with this file.
10//
11///////////////////////////////////////////////////////////////////////////////
12
13#ifndef LZMA_TESTS_H
14#define LZMA_TESTS_H
15
16#include "sysdefs.h"
17#include "tuklib_integer.h"
18#include "lzma.h"
19
20#include <stdio.h>
21
22#define memcrap(buf, size) memset(buf, 0xFD, size)
23
24#define expect(test) ((test) ? 0 : (fprintf(stderr, "%s:%d: %s\n", \
25	__FILE__, __LINE__, #test), abort(), 0))
26
27#define succeed(test) expect(!(test))
28
29#define fail(test) expect(test)
30
31
32static inline const char *
33lzma_ret_sym(lzma_ret ret)
34{
35	if ((unsigned int)(ret) > LZMA_PROG_ERROR)
36		return "UNKNOWN_ERROR";
37
38	static const char *msgs[] = {
39		"LZMA_OK",
40		"LZMA_STREAM_END",
41		"LZMA_NO_CHECK",
42		"LZMA_UNSUPPORTED_CHECK",
43		"LZMA_GET_CHECK",
44		"LZMA_MEM_ERROR",
45		"LZMA_MEMLIMIT_ERROR",
46		"LZMA_FORMAT_ERROR",
47		"LZMA_OPTIONS_ERROR",
48		"LZMA_DATA_ERROR",
49		"LZMA_BUF_ERROR",
50		"LZMA_PROG_ERROR"
51	};
52
53	return msgs[ret];
54}
55
56
57static inline bool
58coder_loop(lzma_stream *strm, uint8_t *in, size_t in_size,
59		uint8_t *out, size_t out_size,
60		lzma_ret expected_ret, lzma_action finishing_action)
61{
62	size_t in_left = in_size;
63	size_t out_left = out_size > 0 ? out_size + 1 : 0;
64	lzma_action action = LZMA_RUN;
65	lzma_ret ret;
66
67	strm->next_in = NULL;
68	strm->avail_in = 0;
69	strm->next_out = NULL;
70	strm->avail_out = 0;
71
72	while (true) {
73		if (in_left > 0) {
74			if (--in_left == 0)
75				action = finishing_action;
76
77			strm->next_in = in++;
78			strm->avail_in = 1;
79		}
80
81		if (out_left > 0) {
82			--out_left;
83			strm->next_out = out++;
84			strm->avail_out = 1;
85		}
86
87		ret = lzma_code(strm, action);
88		if (ret != LZMA_OK)
89			break;
90	}
91
92	bool error = false;
93
94	if (ret != expected_ret)
95		error = true;
96
97	if (expected_ret == LZMA_STREAM_END) {
98		if (strm->total_in != in_size || strm->total_out != out_size)
99			error = true;
100	} else {
101		if (strm->total_in != in_size || strm->total_out != out_size)
102			error = true;
103	}
104
105	return error;
106}
107
108
109static inline bool
110decoder_loop_ret(lzma_stream *strm, uint8_t *in, size_t in_size,
111		lzma_ret expected_ret)
112{
113	return coder_loop(strm, in, in_size, NULL, 0, expected_ret, LZMA_RUN);
114}
115
116
117static inline bool
118decoder_loop(lzma_stream *strm, uint8_t *in, size_t in_size)
119{
120	return coder_loop(strm, in, in_size, NULL, 0,
121			LZMA_STREAM_END, LZMA_RUN);
122}
123
124#endif
125