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 
32 static inline const char *
33 lzma_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 
57 static inline bool
58 coder_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 
109 static inline bool
110 decoder_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 
117 static inline bool
118 decoder_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