summaryrefslogtreecommitdiff
path: root/tests/pb
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pb')
-rw-r--r--tests/pb/test_decoder.cc189
-rw-r--r--tests/pb/test_decoder.proto128
-rw-r--r--tests/pb/test_encoder.cc32
3 files changed, 202 insertions, 147 deletions
diff --git a/tests/pb/test_decoder.cc b/tests/pb/test_decoder.cc
index 49544b2..d0e3fa3 100644
--- a/tests/pb/test_decoder.cc
+++ b/tests/pb/test_decoder.cc
@@ -36,6 +36,7 @@
#include "tests/test_util.h"
#include "tests/upb_test.h"
+#include "tests/pb/test_decoder.upbdefs.h"
#ifdef AMALGAMATED
#include "upb.h"
@@ -387,7 +388,6 @@ void reg_subm(upb_handlers *h, uint32_t num) {
ASSERT(
h->SetStartSubMessageHandler(f, UpbBind(startsubmsg, new uint32_t(num))));
ASSERT(h->SetEndSubMessageHandler(f, UpbBind(endsubmsg, new uint32_t(num))));
- ASSERT(upb_handlers_setsubhandlers(h, f, h));
}
void reg_str(upb_handlers *h, uint32_t num) {
@@ -399,151 +399,60 @@ void reg_str(upb_handlers *h, uint32_t num) {
ASSERT(h->SetStringHandler(f, UpbBind(value_string, new uint32_t(num))));
}
-void AddField(upb_descriptortype_t descriptor_type, const std::string& name,
- uint32_t fn, bool repeated, upb::MessageDef* md) {
- // TODO: Fluent interface? ie.
- // ASSERT(md->AddField(upb::BuildFieldDef()
- // .SetName("f_message")
- // .SetNumber(UPB_DESCRIPTOR_TYPE_MESSAGE)
- // .SetDescriptorType(UPB_DESCRIPTOR_TYPE_MESSAGE)
- // .SetMessageSubdef(md.get())));
- upb::reffed_ptr<upb::FieldDef> f = upb::FieldDef::New();
- ASSERT(f->set_name(name, NULL));
- ASSERT(f->set_number(fn, NULL));
- f->set_label(repeated ? UPB_LABEL_REPEATED : UPB_LABEL_OPTIONAL);
- f->set_descriptor_type(descriptor_type);
- ASSERT(md->AddField(f.get(), NULL));
-}
-
-void AddFieldsForType(upb_descriptortype_t descriptor_type,
- const char* basename, upb::MessageDef* md) {
- const upb_descriptortype_t t = descriptor_type;
- AddField(t, std::string("f_") + basename, t, false, md);
- AddField(t, std::string("r_") + basename, rep_fn(t), true, md);
-}
-
-upb::reffed_ptr<const upb::MessageDef> NewMessageDef() {
- upb::reffed_ptr<upb::MessageDef> md = upb::MessageDef::New();
-
- md->set_full_name("DecoderTest", NULL);
-
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_DOUBLE, "double", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_FLOAT, "float", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_INT64, "int64", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_UINT64, "uint64", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_INT32, "int32", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_FIXED64, "fixed64", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_FIXED32, "fixed32", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_BOOL, "bool", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_STRING, "string", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_BYTES, "bytes", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_UINT32, "uint32", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_SFIXED32, "sfixed32", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_SFIXED64, "sfixed64", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_SINT32, "sint32", md.get());
- AddFieldsForType(UPB_DESCRIPTOR_TYPE_SINT64, "sint64", md.get());
-
- AddField(UPB_DESCRIPTOR_TYPE_STRING, "nop_field", 40, false, md.get());
-
- upb::reffed_ptr<upb::FieldDef> f = upb::FieldDef::New();
- ASSERT(f->set_name("f_message", NULL));
- ASSERT(f->set_number(UPB_DESCRIPTOR_TYPE_MESSAGE, NULL));
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_MESSAGE);
- ASSERT(f->set_message_subdef(md.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- f = upb::FieldDef::New();
- ASSERT(f->set_name("r_message", NULL));
- ASSERT(f->set_number(rep_fn(UPB_DESCRIPTOR_TYPE_MESSAGE), NULL));
- f->set_label(UPB_LABEL_REPEATED);
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_MESSAGE);
- ASSERT(f->set_message_subdef(md.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- f = upb::FieldDef::New();
- ASSERT(f->set_name("f_group", NULL));
- ASSERT(f->set_number(UPB_DESCRIPTOR_TYPE_GROUP, NULL));
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_GROUP);
- ASSERT(f->set_message_subdef(md.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- f = upb::FieldDef::New();
- ASSERT(f->set_name("r_group", NULL));
- ASSERT(f->set_number(rep_fn(UPB_DESCRIPTOR_TYPE_GROUP), NULL));
- f->set_label(UPB_LABEL_REPEATED);
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_GROUP);
- ASSERT(f->set_message_subdef(md.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- upb::reffed_ptr<upb::EnumDef> e = upb::EnumDef::New();
- ASSERT(e->AddValue("FOO", 1, NULL));
- ASSERT(e->Freeze(NULL));
-
- f = upb::FieldDef::New();
- ASSERT(f->set_name("f_enum", NULL));
- ASSERT(f->set_number(UPB_DESCRIPTOR_TYPE_ENUM, NULL));
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_ENUM);
- ASSERT(f->set_enum_subdef(e.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- f = upb::FieldDef::New();
- ASSERT(f->set_name("r_enum", NULL));
- ASSERT(f->set_number(rep_fn(UPB_DESCRIPTOR_TYPE_ENUM), NULL));
- f->set_label(UPB_LABEL_REPEATED);
- f->set_descriptor_type(UPB_DESCRIPTOR_TYPE_ENUM);
- ASSERT(f->set_enum_subdef(e.get(), NULL));
- ASSERT(md->AddField(f.get(), NULL));
-
- ASSERT(md->Freeze(NULL));
-
- return md;
-}
-
-upb::reffed_ptr<const upb::Handlers> NewHandlers(TestMode mode) {
- upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(NewMessageDef().get()));
+struct HandlerRegisterData {
+ TestMode mode;
+};
- if (mode == ALL_HANDLERS) {
+void callback(const void *closure, upb_handlers *h) {
+ const HandlerRegisterData* data =
+ static_cast<const HandlerRegisterData*>(closure);
+ if (data->mode == ALL_HANDLERS) {
h->SetStartMessageHandler(UpbMakeHandler(startmsg));
h->SetEndMessageHandler(UpbMakeHandler(endmsg));
// Register handlers for each type.
- reg<double, value_double>(h.get(), UPB_DESCRIPTOR_TYPE_DOUBLE);
- reg<float, value_float> (h.get(), UPB_DESCRIPTOR_TYPE_FLOAT);
- reg<int64_t, value_int64> (h.get(), UPB_DESCRIPTOR_TYPE_INT64);
- reg<uint64_t, value_uint64>(h.get(), UPB_DESCRIPTOR_TYPE_UINT64);
- reg<int32_t, value_int32> (h.get(), UPB_DESCRIPTOR_TYPE_INT32);
- reg<uint64_t, value_uint64>(h.get(), UPB_DESCRIPTOR_TYPE_FIXED64);
- reg<uint32_t, value_uint32>(h.get(), UPB_DESCRIPTOR_TYPE_FIXED32);
- reg<bool, value_bool> (h.get(), UPB_DESCRIPTOR_TYPE_BOOL);
- reg<uint32_t, value_uint32>(h.get(), UPB_DESCRIPTOR_TYPE_UINT32);
- reg<int32_t, value_int32> (h.get(), UPB_DESCRIPTOR_TYPE_ENUM);
- reg<int32_t, value_int32> (h.get(), UPB_DESCRIPTOR_TYPE_SFIXED32);
- reg<int64_t, value_int64> (h.get(), UPB_DESCRIPTOR_TYPE_SFIXED64);
- reg<int32_t, value_int32> (h.get(), UPB_DESCRIPTOR_TYPE_SINT32);
- reg<int64_t, value_int64> (h.get(), UPB_DESCRIPTOR_TYPE_SINT64);
-
- reg_str(h.get(), UPB_DESCRIPTOR_TYPE_STRING);
- reg_str(h.get(), UPB_DESCRIPTOR_TYPE_BYTES);
- reg_str(h.get(), rep_fn(UPB_DESCRIPTOR_TYPE_STRING));
- reg_str(h.get(), rep_fn(UPB_DESCRIPTOR_TYPE_BYTES));
+ reg<double, value_double>(h, UPB_DESCRIPTOR_TYPE_DOUBLE);
+ reg<float, value_float> (h, UPB_DESCRIPTOR_TYPE_FLOAT);
+ reg<int64_t, value_int64> (h, UPB_DESCRIPTOR_TYPE_INT64);
+ reg<uint64_t, value_uint64>(h, UPB_DESCRIPTOR_TYPE_UINT64);
+ reg<int32_t, value_int32> (h, UPB_DESCRIPTOR_TYPE_INT32);
+ reg<uint64_t, value_uint64>(h, UPB_DESCRIPTOR_TYPE_FIXED64);
+ reg<uint32_t, value_uint32>(h, UPB_DESCRIPTOR_TYPE_FIXED32);
+ reg<bool, value_bool> (h, UPB_DESCRIPTOR_TYPE_BOOL);
+ reg<uint32_t, value_uint32>(h, UPB_DESCRIPTOR_TYPE_UINT32);
+ reg<int32_t, value_int32> (h, UPB_DESCRIPTOR_TYPE_ENUM);
+ reg<int32_t, value_int32> (h, UPB_DESCRIPTOR_TYPE_SFIXED32);
+ reg<int64_t, value_int64> (h, UPB_DESCRIPTOR_TYPE_SFIXED64);
+ reg<int32_t, value_int32> (h, UPB_DESCRIPTOR_TYPE_SINT32);
+ reg<int64_t, value_int64> (h, UPB_DESCRIPTOR_TYPE_SINT64);
+
+ reg_str(h, UPB_DESCRIPTOR_TYPE_STRING);
+ reg_str(h, UPB_DESCRIPTOR_TYPE_BYTES);
+ reg_str(h, rep_fn(UPB_DESCRIPTOR_TYPE_STRING));
+ reg_str(h, rep_fn(UPB_DESCRIPTOR_TYPE_BYTES));
// Register submessage/group handlers that are self-recursive
// to this type, eg: message M { optional M m = 1; }
- reg_subm(h.get(), UPB_DESCRIPTOR_TYPE_MESSAGE);
- reg_subm(h.get(), rep_fn(UPB_DESCRIPTOR_TYPE_MESSAGE));
- reg_subm(h.get(), UPB_DESCRIPTOR_TYPE_GROUP);
- reg_subm(h.get(), rep_fn(UPB_DESCRIPTOR_TYPE_GROUP));
+ reg_subm(h, UPB_DESCRIPTOR_TYPE_MESSAGE);
+ reg_subm(h, rep_fn(UPB_DESCRIPTOR_TYPE_MESSAGE));
+
+ if (h->message_def()->full_name() == std::string("DecoderTest")) {
+ reg_subm(h, UPB_DESCRIPTOR_TYPE_GROUP);
+ reg_subm(h, rep_fn(UPB_DESCRIPTOR_TYPE_GROUP));
+ }
// For NOP_FIELD we register no handlers, so we can pad a proto freely without
// changing the output.
}
-
- bool ok = h->Freeze(NULL);
- ASSERT(ok);
-
- return h;
}
+upb::reffed_ptr<const upb::Handlers> NewHandlers(upb::SymbolTable* symtab,
+ TestMode mode) {
+ HandlerRegisterData handlerdata;
+ handlerdata.mode = mode;
+ return upb::Handlers::NewFrozen(DecoderTest_getmsgdef(symtab), callback,
+ &handlerdata);
+}
/* Running of test cases ******************************************************/
@@ -1231,14 +1140,11 @@ upb::reffed_ptr<const upb::pb::DecoderMethod> NewMethod(
return cache.GetDecoderMethod(upb::pb::DecoderMethodOptions(dest_handlers));
}
-void test_emptyhandlers(bool allowjit) {
+void test_emptyhandlers(upb::SymbolTable* symtab, bool allowjit) {
// Create an empty handlers to make sure that the decoder can handle empty
// messages.
- upb::reffed_ptr<upb::MessageDef> md = upb::MessageDef::New();
- ASSERT(md->set_full_name("Empty", NULL));
- ASSERT(md->Freeze(NULL));
-
- upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(md.get()));
+ const upb::MessageDef* md = Empty_getmsgdef(symtab);
+ upb::reffed_ptr<upb::Handlers> h(upb::Handlers::New(md));
bool ok = h->Freeze(NULL);
ASSERT(ok);
upb::reffed_ptr<const upb::pb::DecoderMethod> method =
@@ -1277,8 +1183,9 @@ upb::reffed_ptr<const upb::pb::DecoderMethod> method =
void run_tests(bool use_jit) {
upb::reffed_ptr<const upb::pb::DecoderMethod> method;
upb::reffed_ptr<const upb::Handlers> handlers;
+ upb::SymbolTable* symtab = upb::SymbolTable::New();
- handlers = NewHandlers(test_mode);
+ handlers = NewHandlers(symtab, test_mode);
global_handlers = handlers.get();
method = NewMethod(handlers.get(), use_jit);
@@ -1289,7 +1196,9 @@ void run_tests(bool use_jit) {
test_invalid();
test_valid();
- test_emptyhandlers(use_jit);
+ test_emptyhandlers(symtab, use_jit);
+
+ upb::SymbolTable::Free(symtab);
}
void run_test_suite() {
diff --git a/tests/pb/test_decoder.proto b/tests/pb/test_decoder.proto
new file mode 100644
index 0000000..e9fa6ad
--- /dev/null
+++ b/tests/pb/test_decoder.proto
@@ -0,0 +1,128 @@
+
+syntax = "proto2";
+
+enum TestEnum {
+ FOO = 1;
+}
+
+message Empty {}
+
+message DecoderTest {
+ optional double f_double = 1;
+ optional float f_float = 2;
+ optional int64 f_int64 = 3;
+ optional uint64 f_uint64 = 4;
+ optional int32 f_int32 = 5;
+ optional fixed64 f_fixed64 = 6;
+ optional fixed32 f_fixed32 = 7;
+ optional bool f_bool = 8;
+ optional string f_string = 9;
+ optional DecoderTest f_message = 11;
+ optional bytes f_bytes = 12;
+ optional uint32 f_uint32 = 13;
+ optional TestEnum f_enum = 14;
+ optional sfixed32 f_sfixed32 = 15;
+ optional sfixed64 f_sfixed64 = 16;
+ optional sint32 f_sint32 = 17;
+ optional sint64 f_sint64 = 18;
+
+ optional string nop_field = 40;
+
+ repeated double r_double = 536869912;
+ repeated float r_float = 536869913;
+ repeated int64 r_int64 = 536869914;
+ repeated uint64 r_uint64 = 536869915;
+ repeated int32 r_int32 = 536869916;
+ repeated fixed64 r_fixed64 = 536869917;
+ repeated fixed32 r_fixed32 = 536869918;
+ repeated bool r_bool = 536869919;
+ repeated string r_string = 536869920;
+ repeated DecoderTest r_message = 536869922;
+ repeated bytes r_bytes = 536869923;
+ repeated uint32 r_uint32 = 536869924;
+ repeated TestEnum r_enum = 536869925;
+ repeated sfixed32 r_sfixed32 = 536869926;
+ repeated sfixed64 r_sfixed64 = 536869927;
+ repeated sint32 r_sint32 = 536869928;
+ repeated sint64 r_sint64 = 536869929;
+
+ optional group F_group = 10 {
+ optional double f_double = 1;
+ optional float f_float = 2;
+ optional int64 f_int64 = 3;
+ optional uint64 f_uint64 = 4;
+ optional int32 f_int32 = 5;
+ optional fixed64 f_fixed64 = 6;
+ optional fixed32 f_fixed32 = 7;
+ optional bool f_bool = 8;
+ optional string f_string = 9;
+ optional DecoderTest f_message = 11;
+ optional bytes f_bytes = 12;
+ optional uint32 f_uint32 = 13;
+ optional TestEnum f_enum = 14;
+ optional sfixed32 f_sfixed32 = 15;
+ optional sfixed64 f_sfixed64 = 16;
+ optional sint32 f_sint32 = 17;
+ optional sint64 f_sint64 = 18;
+
+ optional string nop_field = 40;
+
+ repeated double r_double = 536869912;
+ repeated float r_float = 536869913;
+ repeated int64 r_int64 = 536869914;
+ repeated uint64 r_uint64 = 536869915;
+ repeated int32 r_int32 = 536869916;
+ repeated fixed64 r_fixed64 = 536869917;
+ repeated fixed32 r_fixed32 = 536869918;
+ repeated bool r_bool = 536869919;
+ repeated string r_string = 536869920;
+ repeated DecoderTest r_message = 536869922;
+ repeated bytes r_bytes = 536869923;
+ repeated uint32 r_uint32 = 536869924;
+ repeated TestEnum r_enum = 536869925;
+ repeated sfixed32 r_sfixed32 = 536869926;
+ repeated sfixed64 r_sfixed64 = 536869927;
+ repeated sint32 r_sint32 = 536869928;
+ repeated sint64 r_sint64 = 536869929;
+ }
+
+ optional group R_group = 536869921 {
+ optional double f_double = 1;
+ optional float f_float = 2;
+ optional int64 f_int64 = 3;
+ optional uint64 f_uint64 = 4;
+ optional int32 f_int32 = 5;
+ optional fixed64 f_fixed64 = 6;
+ optional fixed32 f_fixed32 = 7;
+ optional bool f_bool = 8;
+ optional string f_string = 9;
+ optional DecoderTest f_message = 11;
+ optional bytes f_bytes = 12;
+ optional uint32 f_uint32 = 13;
+ optional TestEnum f_enum = 14;
+ optional sfixed32 f_sfixed32 = 15;
+ optional sfixed64 f_sfixed64 = 16;
+ optional sint32 f_sint32 = 17;
+ optional sint64 f_sint64 = 18;
+
+ optional string nop_field = 40;
+
+ repeated double r_double = 536869912;
+ repeated float r_float = 536869913;
+ repeated int64 r_int64 = 536869914;
+ repeated uint64 r_uint64 = 536869915;
+ repeated int32 r_int32 = 536869916;
+ repeated fixed64 r_fixed64 = 536869917;
+ repeated fixed32 r_fixed32 = 536869918;
+ repeated bool r_bool = 536869919;
+ repeated string r_string = 536869920;
+ repeated DecoderTest r_message = 536869922;
+ repeated bytes r_bytes = 536869923;
+ repeated uint32 r_uint32 = 536869924;
+ repeated TestEnum r_enum = 536869925;
+ repeated sfixed32 r_sfixed32 = 536869926;
+ repeated sfixed64 r_sfixed64 = 536869927;
+ repeated sint32 r_sint32 = 536869928;
+ repeated sint64 r_sint64 = 536869929;
+ }
+}
diff --git a/tests/pb/test_encoder.cc b/tests/pb/test_encoder.cc
index 6c20e27..a0f8453 100644
--- a/tests/pb/test_encoder.cc
+++ b/tests/pb/test_encoder.cc
@@ -2,10 +2,9 @@
#include "tests/test_util.h"
#include "tests/upb_test.h"
#include "upb/bindings/stdc++/string.h"
-#include "upb/descriptor/descriptor.upbdefs.h"
+#include "google/protobuf/descriptor.upb.h"
#include "upb/pb/decoder.h"
#include "upb/pb/encoder.h"
-#include "upb/pb/glue.h"
std::string read_string(const char *filename) {
size_t len;
@@ -18,16 +17,34 @@ std::string read_string(const char *filename) {
}
void test_pb_roundtrip() {
- upb::reffed_ptr<const upb::MessageDef> md(
- upbdefs::google::protobuf::FileDescriptorSet::get());
+ std::string input = read_string("google/protobuf/descriptor.pb");
+ upb::SymbolTable* symtab = upb::SymbolTable::New();
+ upb::Arena arena;
+ google_protobuf_FileDescriptorSet *set =
+ google_protobuf_FileDescriptorSet_parsenew(
+ upb_stringview_make(input.c_str(), input.size()), &arena);
+ ASSERT(set);
+ size_t n;
+ const google_protobuf_FileDescriptorProto *const *files =
+ google_protobuf_FileDescriptorSet_file(set, &n);
+ ASSERT(n == 1);
+ upb::Status status;
+ bool ok = symtab->AddFile(files[0], &status);
+ if (!ok) {
+ fprintf(stderr, "Error building def: %s\n", upb_status_errmsg(&status));
+ ASSERT(false);
+ }
+ const upb::MessageDef *md =
+ symtab->LookupMessage("google.protobuf.FileDescriptorSet");
+ ASSERT(md);
+ printf("name: %s\n", md->full_name());
upb::reffed_ptr<const upb::Handlers> encoder_handlers(
- upb::pb::Encoder::NewHandlers(md.get()));
+ upb::pb::Encoder::NewHandlers(md));
upb::reffed_ptr<const upb::pb::DecoderMethod> method(
upb::pb::DecoderMethod::New(
upb::pb::DecoderMethodOptions(encoder_handlers.get())));
upb::InlinedEnvironment<512> env;
- std::string input = read_string("upb/descriptor/descriptor.pb");
std::string output;
upb::StringSink string_sink(&output);
upb::pb::Encoder* encoder =
@@ -35,9 +52,10 @@ void test_pb_roundtrip() {
string_sink.input());
upb::pb::Decoder* decoder =
upb::pb::Decoder::Create(&env, method.get(), encoder->input());
- bool ok = upb::BufferSource::PutBuffer(input, decoder->input());
+ ok = upb::BufferSource::PutBuffer(input, decoder->input());
ASSERT(ok);
ASSERT(input == output);
+ upb::SymbolTable::Free(symtab);
}
extern "C" {
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback