[Spice-devel,v2,26/43] test: Add code to read input from a file (or stdin)

Submitted by Frediano Ziglio on July 8, 2015, 1:53 p.m.

Details

Message ID 1436363656-4266-27-git-send-email-fziglio@redhat.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Frediano Ziglio July 8, 2015, 1:53 p.m.
This allow to emulate reading from network

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
---
 codegen/check_dissector  |  4 ++--
 codegen/dissector_test.c | 32 +++++++++++++++++++++++++++++---
 2 files changed, 31 insertions(+), 5 deletions(-)

Patch hide | download patch | download mbox

diff --git a/codegen/check_dissector b/codegen/check_dissector
index f1444a2..7d6d086 100755
--- a/codegen/check_dissector
+++ b/codegen/check_dissector
@@ -6,8 +6,8 @@  error() {
 	exit 1
 }
 
-./dissector_test 1 100
-if ./dissector_test 1 99; then
+./dissector_test 1 100 </dev/null
+if ./dissector_test 1 99 </dev/null; then
 	error "This test should fail"
 fi
 exit 0
diff --git a/codegen/dissector_test.c b/codegen/dissector_test.c
index 5a49f40..ba87367 100644
--- a/codegen/dissector_test.c
+++ b/codegen/dissector_test.c
@@ -15,6 +15,7 @@  enum {
 	first_hf_registered = 0x10000,
 	first_ei_registered = 0x20000,
 	first_tree_registered = 0x30000,
+	max_message_size = 0x100000,
 };
 static int last_hf_registered = first_hf_registered - 1;
 static int last_ei_registered = first_ei_registered - 1;
@@ -474,8 +475,9 @@  static const struct option long_options[] = {
 	{ "client", 0, NULL, 'c' },
 	{ "output-file", required_argument, NULL, 'o' },
 	{ "xml", 0, NULL, 'x' },
+	{ "input-file", required_argument, NULL, 'i' },
 };
-static const char options[] = "hscxo:";
+static const char options[] = "hscxo:i:";
 
 static void syntax(FILE *f, int exit_value)
 {
@@ -488,6 +490,7 @@  static void syntax(FILE *f, int exit_value)
 		"  -c, --client             Process client messages\n"
 		"  -x, --xml                Output in XML format\n"
 		"  -o, --output-file=FILE   Output to specified file\n"
+		"  -i, --input-file=FILE    Input from specified file\n"
 	);
 	exit(exit_value);
 }
@@ -495,8 +498,12 @@  static void syntax(FILE *f, int exit_value)
 int main(int argc, char **argv)
 {
 	int channel, message_type;
+	guint8 *buf, *p, *pend;
+	size_t size;
+	FILE *f = stdin;
 	GlobalInfo glb;
 	proto_tree tree;
+	struct tvbuff tvb;
 	spice_dissect_func_t (*msg_func)(guint8 channel);
 	spice_dissect_func_t channel_func = NULL;
 
@@ -526,6 +533,10 @@  int main(int argc, char **argv)
 			output_file = fopen(optarg, "w");
 			check(output_file != NULL, "Error opening output file");
 			break;
+		case 'i':
+			f = fopen(optarg, "rb");
+			check(f != NULL, "Error opening input file");
+			break;
 		default:
 			syntax(stderr, EXIT_FAILURE);
 			break;
@@ -540,10 +551,25 @@  int main(int argc, char **argv)
 	hfs = g_ptr_array_new_with_free_func(free);
 	spice_register_fields(1, NULL);
 
+	/* read message from standard input */
+	buf = malloc(max_message_size);
+	assert(buf);
+	p = buf;
+	pend = buf + max_message_size;
+	while (p < pend && (size = fread(p, 1, pend - p, f)) > 0)
+		p += size;
+	assert(p < pend);
+	assert(!ferror(f));
+	size = p - buf;
+
+	memset(&tvb, 0, sizeof(tvb));
+	tvb.data = buf;
+	tvb.len = size;
+
 	memset(&glb, 0, sizeof(glb));
-	glb.tvb = NULL;
+	glb.tvb = &tvb;
 	glb.message_offset = 0;
-	glb.message_end = 0;
+	glb.message_end = tvb.len;
 
 	channel_func = msg_func(channel);
 	assert(channel_func);