summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2011-05-08 13:05:12 -0700
committerJoshua Haberman <jhaberman@gmail.com>2011-05-08 13:05:12 -0700
commitf74534b42ac9ac8b0ff496cb0da83f1201bbf8da (patch)
treecf20bb7160a6f37cecd5c2cb4222c03b88e4fcde /tests
parent4a99abba123fc1d2bef62778846a1f27b2012de0 (diff)
Decoder redesign in preparation for packed fields and start/endseq.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_decoder.c67
1 files changed, 51 insertions, 16 deletions
diff --git a/tests/test_decoder.c b/tests/test_decoder.c
index 714871a..5f01179 100644
--- a/tests/test_decoder.c
+++ b/tests/test_decoder.c
@@ -2,38 +2,73 @@
#include "upb_decoder.h"
#include "upb_textprinter.h"
#include "upb_stdio.h"
+#include "upb_glue.h"
+
+int main(int argc, char *argv[]) {
+ if (argc < 3) {
+ fprintf(stderr, "Usage: test_decoder <descfile> <msgname>\n");
+ return 1;
+ }
-int main() {
upb_symtab *symtab = upb_symtab_new();
- upb_symtab_add_descriptorproto(symtab);
- upb_def *fds = upb_symtab_lookup(
- symtab, UPB_STRLIT("google.protobuf.FileDescriptorSet"));
+ upb_string *desc = upb_strreadfile(argv[1]);
+ if (!desc) {
+ fprintf(stderr, "Couldn't open descriptor file: %s\n", argv[1]);
+ return 1;
+ }
+
+ upb_status status = UPB_STATUS_INIT;
+ upb_parsedesc(symtab, desc, &status);
+ if (!upb_ok(&status)) {
+ fprintf(stderr, "Error parsing descriptor: ");
+ upb_printerr(&status);
+ return 1;
+ }
+ upb_string_unref(desc);
+
+ upb_string *name = upb_strdupc(argv[2]);
+ upb_def *md = upb_symtab_lookup(symtab, name);
+ upb_string_unref(name);
+ if (!md) {
+ fprintf(stderr, "Descriptor did not contain message: %s\n", argv[2]);
+ return 1;
+ }
+
+ upb_msgdef *m = upb_dyncast_msgdef(md);
+ if (!m) {
+ fprintf(stderr, "Def was not a msgdef.\n");
+ return 1;
+ }
upb_stdio *in = upb_stdio_new();
upb_stdio_reset(in, stdin);
upb_stdio *out = upb_stdio_new();
upb_stdio_reset(out, stdout);
- upb_decoder d;
- upb_decoder_init(&d, upb_downcast_msgdef(fds));
- upb_decoder_reset(&d, upb_stdio_bytesrc(in));
- upb_textprinter *p = upb_textprinter_new();
+
upb_handlers handlers;
- upb_handlers_init(&handlers);
- upb_textprinter_reset(p, &handlers, upb_stdio_bytesink(out), false);
- upb_src *src = upb_decoder_src(&d);
- upb_src_sethandlers(src, &handlers);
+ upb_handlers_init(&handlers, m);
+ upb_textprinter *p = upb_textprinter_new();
+ upb_textprinter_reset(p, upb_stdio_bytesink(out), false);
+ upb_textprinter_reghandlers(&handlers);
- upb_status status = UPB_STATUS_INIT;
- upb_src_run(src, &status);
+ upb_decoder d;
+ upb_decoder_init(&d, &handlers);
+ upb_decoder_reset(&d, upb_stdio_bytesrc(in), p);
+
+ upb_clearerr(&status);
+ upb_decoder_decode(&d, &status);
- assert(upb_ok(&status));
+ if (!upb_ok(&status)) {
+ fprintf(stderr, "Error parsing input: ");
+ upb_printerr(&status);
+ }
upb_status_uninit(&status);
upb_stdio_free(in);
upb_stdio_free(out);
upb_decoder_uninit(&d);
upb_textprinter_free(p);
- upb_def_unref(fds);
+ upb_def_unref(UPB_UPCAST(m));
upb_symtab_unref(symtab);
// Prevent C library from holding buffers open, so Valgrind doesn't see
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback