File: test-input-stream.c

package info (click to toggle)
libgedit-gfls 0.3.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 448 kB
  • sloc: ansic: 1,748; xml: 57; makefile: 8
file content (114 lines) | stat: -rw-r--r-- 2,552 bytes parent folder | download | duplicates (2)
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
/* SPDX-FileCopyrightText: 2024 - Sébastien Wilmet
 * SPDX-License-Identifier: LGPL-3.0-or-later
 */

#include <gfls/gfls.h>

typedef struct
{
	/* To run the async operation. */
	GMainLoop *main_loop;

	/* To check against the result of gfls_input_stream_read_finish(): */
	gsize result_size;
	guint result_is_truncated : 1;
} TestData;

static GInputStream *
create_input_stream (gsize size)
{
	gchar *str;
	GBytes *bytes;
	GInputStream *input_stream;

	str = g_strnfill (size, 'A');
	bytes = g_bytes_new_take (str, size);

	input_stream = g_memory_input_stream_new_from_bytes (bytes);
	g_bytes_unref (bytes);

	return input_stream;
}

static void
read_cb (GObject      *source_object,
	 GAsyncResult *result,
	 gpointer      user_data)
{
	GInputStream *input_stream = G_INPUT_STREAM (source_object);
	TestData *data = user_data;
	GBytes *bytes;
	gboolean is_truncated = FALSE;
	GError *error = NULL;

	bytes = gfls_input_stream_read_finish (input_stream, result, &is_truncated, &error);
	g_assert_no_error (error);
	g_assert_cmpint (is_truncated, ==, data->result_is_truncated);
	g_assert_nonnull (bytes);
	g_assert_cmpint (g_bytes_get_size (bytes), ==, data->result_size);

	g_bytes_unref (bytes);

	g_main_loop_quit (data->main_loop);
}

static void
check_read (gsize    input_stream_real_size,
	    gsize    input_stream_expected_size,
	    gsize    max_size,
	    gsize    result_size,
	    gboolean result_is_truncated)
{
	GInputStream *input_stream;
	TestData data;

	input_stream = create_input_stream (input_stream_real_size);

	data.main_loop = g_main_loop_new (NULL, FALSE);
	data.result_size = result_size;
	data.result_is_truncated = result_is_truncated != FALSE;

	gfls_input_stream_read_async (input_stream,
				      input_stream_expected_size,
				      max_size,
				      G_PRIORITY_DEFAULT,
				      NULL,
				      read_cb,
				      &data);

	g_main_loop_run (data.main_loop);
	g_object_unref (input_stream);
}

static void
test_read (void)
{
	check_read (0, 0, 0, 0, FALSE);
	check_read (0, 1, 0, 0, FALSE);
	check_read (1, 0, 100, 1, FALSE);
	check_read (100, 50, 200, 100, FALSE);
	check_read (100, 100, 200, 100, FALSE);
	check_read (100, 100, 100, 100, FALSE);

	/* Truncated */
	check_read (1, 0, 0, 0, TRUE);
	check_read (2, 2, 0, 0, TRUE);
	check_read (100, 50, 99, 99, TRUE);
}

int
main (int    argc,
      char **argv)
{
	int exit_status;

	gfls_init ();
	g_test_init (&argc, &argv, NULL);

	g_test_add_func ("/InputStream/read", test_read);

	exit_status = g_test_run ();
	gfls_finalize ();

	return exit_status;
}