1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <stdarg.h> 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <string> 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "conformance.pb.h" 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "conformance_test.h" 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/common.h> 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/stringprintf.h> 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/text_format.h> 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/json_util.h> 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/field_comparator.h> 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/message_differencer.h> 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/type_resolver_util.h> 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format_lite.h> 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "third_party/jsoncpp/json.h" 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::ConformanceRequest; 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::ConformanceResponse; 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::TestAllTypes; 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::WireFormat; 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::Descriptor; 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::FieldDescriptor; 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::internal::WireFormatLite; 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::TextFormat; 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::DefaultFieldComparator; 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::JsonToBinaryString; 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::MessageDifferencer; 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::NewTypeResolverForDescriptorPool; 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::Status; 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing std::string; 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace { 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic const char kTypeUrlPrefix[] = "type.googleapis.com"; 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic string GetTypeUrl(const Descriptor* message) { 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return string(kTypeUrlPrefix) + "/" + message->full_name(); 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/* Routines for building arbitrary protos *************************************/ 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// We would use CodedOutputStream except that we want more freedom to build 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// arbitrary protos (even invalid ones). 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerconst string empty; 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring cat(const string& a, const string& b, 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& c = empty, 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& d = empty, 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& e = empty, 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& f = empty, 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& g = empty, 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& h = empty, 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& i = empty, 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& j = empty, 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& k = empty, 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& l = empty) { 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string ret; 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.reserve(a.size() + b.size() + c.size() + d.size() + e.size() + f.size() + 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer g.size() + h.size() + i.size() + j.size() + k.size() + l.size()); 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(a); 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(b); 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(c); 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(d); 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(e); 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(f); 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(g); 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(h); 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(i); 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(j); 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(k); 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ret.append(l); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return ret; 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// The maximum number of bytes that it takes to encode a 64-bit varint. 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define VARINT_MAX_LEN 10 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammersize_t vencode64(uint64_t val, char *buf) { 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (val == 0) { buf[0] = 0; return 1; } 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer size_t i = 0; 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (val) { 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint8_t byte = val & 0x7fU; 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer val >>= 7; 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (val) byte |= 0x80U; 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer buf[i++] = byte; 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return i; 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring varint(uint64_t x) { 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer char buf[VARINT_MAX_LEN]; 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer size_t len = vencode64(x, buf); 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return string(buf, len); 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TODO: proper byte-swapping for big-endian machines. 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring fixed32(void *data) { return string(static_cast<char*>(data), 4); } 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring fixed64(void *data) { return string(static_cast<char*>(data), 8); } 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring delim(const string& buf) { return cat(varint(buf.size()), buf); } 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring uint32(uint32_t u32) { return fixed32(&u32); } 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring uint64(uint64_t u64) { return fixed64(&u64); } 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring flt(float f) { return fixed32(&f); } 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring dbl(double d) { return fixed64(&d); } 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring zz32(int32_t x) { return varint(WireFormatLite::ZigZagEncode32(x)); } 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring zz64(int64_t x) { return varint(WireFormatLite::ZigZagEncode64(x)); } 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring tag(uint32_t fieldnum, char wire_type) { 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return varint((fieldnum << 3) | wire_type); 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring submsg(uint32_t fn, const string& buf) { 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return cat( tag(fn, WireFormatLite::WIRETYPE_LENGTH_DELIMITED), delim(buf) ); 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define UNKNOWN_FIELD 666 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammeruint32_t GetFieldNumberForType(FieldDescriptor::Type type, bool repeated) { 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor* d = TestAllTypes().GetDescriptor(); 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < d->field_count(); i++) { 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* f = d->field(i); 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (f->type() == type && f->is_repeated() == repeated) { 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return f->number(); 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(FATAL) << "Couldn't find field with type " << (int)type; 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return 0; 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring UpperCase(string str) { 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < str.size(); i++) { 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer str[i] = toupper(str[i]); 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return str; 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // anonymous namespace 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google { 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportSuccess(const string& test_name) { 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (expected_to_fail_.erase(test_name) != 0) { 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ERROR: test %s is in the failure list, but test succeeded. " 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Remove it from the failure list.\n", 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_name.c_str()); 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unexpected_succeeding_tests_.insert(test_name); 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer successes_++; 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportFailure(const string& test_name, 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ConformanceRequest& request, 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ConformanceResponse& response, 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const char* fmt, ...) { 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (expected_to_fail_.erase(test_name) == 1) { 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer expected_failures_++; 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!verbose_) 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "ERROR, test=%s: ", test_name.c_str()); 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unexpected_failing_tests_.insert(test_name); 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer va_list args; 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer va_start(args, fmt); 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendV(&output_, fmt, args); 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer va_end(args); 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, " request=%s, response=%s\n", 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.ShortDebugString().c_str(), 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response.ShortDebugString().c_str()); 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportSkip(const string& test_name, 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ConformanceRequest& request, 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ConformanceResponse& response) { 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (verbose_) { 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "SKIPPED, test=%s request=%s, response=%s\n", 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_name.c_str(), request.ShortDebugString().c_str(), 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response.ShortDebugString().c_str()); 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skipped_.insert(test_name); 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunTest(const string& test_name, 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ConformanceRequest& request, 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse* response) { 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (test_names_.insert(test_name).second == false) { 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(FATAL) << "Duplicated test name: " << test_name; 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string serialized_request; 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string serialized_response; 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.SerializeToString(&serialized_request); 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer runner_->RunTest(test_name, serialized_request, &serialized_response); 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!response->ParseFromString(serialized_response)) { 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response->Clear(); 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response->set_runtime_error("response proto could not be parsed."); 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (verbose_) { 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "conformance test: name=%s, request=%s, response=%s\n", 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_name.c_str(), 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.ShortDebugString().c_str(), 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response->ShortDebugString().c_str()); 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidInputTest( 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const string& input, WireFormat input_format, 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& equivalent_text_format, WireFormat requested_output) { 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes reference_message; 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_CHECK( 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::ParseFromString(equivalent_text_format, &reference_message)) 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer << "Failed to parse data for test case: " << test_name 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer << ", data: " << equivalent_text_format; 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceRequest request; 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse response; 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer switch (input_format) { 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case conformance::PROTOBUF: 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_protobuf_payload(input); 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer break; 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case conformance::JSON: 260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_json_payload(input); 261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer break; 262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer default: 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(FATAL) << "Unspecified input format"; 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_requested_output_format(requested_output); 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunTest(test_name, request, &response); 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes test_message; 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer switch (response.result_case()) { 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kParseError: 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kRuntimeError: 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kSerializeError: 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(test_name, request, response, 278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Failed to parse JSON input or produce JSON output."); 279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kSkipped: 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSkip(test_name, request, response); 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kJsonPayload: { 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (requested_output != conformance::JSON) { 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure( 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_name, request, response, 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Test was asked for protobuf output but provided JSON instead."); 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string binary_protobuf; 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Status status = 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer JsonToBinaryString(type_resolver_.get(), type_url_, 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response.json_payload(), &binary_protobuf); 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!status.ok()) { 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(test_name, request, response, 298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "JSON output we received from test was unparseable."); 299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!test_message.ParseFromString(binary_protobuf)) { 303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(test_name, request, response, 304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "INTERNAL ERROR: internal JSON->protobuf transcode " 305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "yielded unparseable proto."); 306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer break; 310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer case ConformanceResponse::kProtobufPayload: { 313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (requested_output != conformance::PROTOBUF) { 314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure( 315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_name, request, response, 316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Test was asked for JSON output but provided protobuf instead."); 317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!test_message.ParseFromString(response.protobuf_payload())) { 321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(test_name, request, response, 322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Protobuf output we received from test was unparseable."); 323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer break; 327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer default: 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_LOG(FATAL) << test_name << ": unknown payload type: " 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer << response.result_case(); 332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer MessageDifferencer differencer; 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DefaultFieldComparator field_comparator; 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_comparator.set_treat_nan_as_equal(true); 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer differencer.set_field_comparator(&field_comparator); 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string differences; 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer differencer.ReportDifferencesToString(&differences); 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (differencer.Compare(reference_message, test_message)) { 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSuccess(test_name); 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(test_name, request, response, 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Output was not equivalent to reference message: %s.", 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer differences.c_str()); 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Expect that this precise protobuf will cause a parse error. 351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectParseFailureForProto( 352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& proto, const string& test_name) { 353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceRequest request; 354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse response; 355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_protobuf_payload(proto); 356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string effective_test_name = "ProtobufInput." + test_name; 357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We don't expect output, but if the program erroneously accepts the protobuf 359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // we let it send its response as this. We must not leave it unspecified. 360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_requested_output_format(conformance::PROTOBUF); 361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunTest(effective_test_name, request, &response); 363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (response.result_case() == ConformanceResponse::kParseError) { 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSuccess(effective_test_name); 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else if (response.result_case() == ConformanceResponse::kSkipped) { 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSkip(effective_test_name, request, response); 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Should have failed to parse, but didn't."); 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Expect that this protobuf will cause a parse error, even if it is followed 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// by valid protobuf data. We can try running this twice: once with this 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// data verbatim and once with this data followed by some valid data. 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TODO(haberman): implement the second of these. 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectHardParseFailureForProto( 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& proto, const string& test_name) { 380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return ExpectParseFailureForProto(proto, test_name); 381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTest( 384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const string& input_json, 385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& equivalent_text_format) { 386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidInputTest("JsonInput." + test_name + ".ProtobufOutput", input_json, 387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer conformance::JSON, equivalent_text_format, 388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer conformance::PROTOBUF); 389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidInputTest("JsonInput." + test_name + ".JsonOutput", input_json, 390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer conformance::JSON, equivalent_text_format, 391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer conformance::JSON); 392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTestWithProtobufInput( 395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const TestAllTypes& input, 396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& equivalent_text_format) { 397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidInputTest("ProtobufInput." + test_name + ".JsonOutput", 398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer input.SerializeAsString(), conformance::PROTOBUF, 399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer equivalent_text_format, conformance::JSON); 400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// According to proto3 JSON specification, JSON serializers follow more strict 403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// rules than parsers (e.g., a serializer must serialize int32 values as JSON 404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// numbers while the parser is allowed to accept them as JSON strings). This 405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// method allows strict checking on a proto3 JSON serializer by inspecting 406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// the JSON output directly. 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTestWithValidator( 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const string& input_json, 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Validator& validator) { 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceRequest request; 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse response; 412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_json_payload(input_json); 413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_requested_output_format(conformance::JSON); 414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string effective_test_name = "JsonInput." + test_name + ".Validator"; 416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunTest(effective_test_name, request, &response); 418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (response.result_case() == ConformanceResponse::kSkipped) { 420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSkip(effective_test_name, request, response); 421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (response.result_case() != ConformanceResponse::kJsonPayload) { 425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Expected JSON payload but got type %d.", 427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer response.result_case()); 428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Json::Reader reader; 431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Json::Value value; 432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!reader.parse(response.json_payload(), value)) { 433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "JSON payload cannot be parsed as valid JSON: %s", 435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.getFormattedErrorMessages().c_str()); 436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!validator(value)) { 439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "JSON payload validation failed."); 441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return; 442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSuccess(effective_test_name); 444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectParseFailureForJson( 447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const string& input_json) { 448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceRequest request; 449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse response; 450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_json_payload(input_json); 451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string effective_test_name = "JsonInput." + test_name; 452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We don't expect output, but if the program erroneously accepts the protobuf 454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // we let it send its response as this. We must not leave it unspecified. 455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_requested_output_format(conformance::JSON); 456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunTest(effective_test_name, request, &response); 458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (response.result_case() == ConformanceResponse::kParseError) { 459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSuccess(effective_test_name); 460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else if (response.result_case() == ConformanceResponse::kSkipped) { 461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSkip(effective_test_name, request, response); 462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Should have failed to parse, but didn't."); 465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectSerializeFailureForJson( 469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& test_name, const string& text_format) { 470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes payload_message; 471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_CHECK( 472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TextFormat::ParseFromString(text_format, &payload_message)) 473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer << "Failed to parse: " << text_format; 474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceRequest request; 476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ConformanceResponse response; 477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_protobuf_payload(payload_message.SerializeAsString()); 478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string effective_test_name = test_name + ".JsonOutput"; 479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer request.set_requested_output_format(conformance::JSON); 480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunTest(effective_test_name, request, &response); 482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (response.result_case() == ConformanceResponse::kSerializeError) { 483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSuccess(effective_test_name); 484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else if (response.result_case() == ConformanceResponse::kSkipped) { 485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportSkip(effective_test_name, request, response); 486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReportFailure(effective_test_name, request, response, 488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Should have failed to serialize, but didn't."); 489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::TestPrematureEOFForType(FieldDescriptor::Type type) { 493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Incomplete values for each wire type. 494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static const string incompletes[6] = { 495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string("\x80"), // VARINT 496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string("abcdefg"), // 64BIT 497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string("\x80"), // DELIMITED (partial length) 498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string(), // START_GROUP (no value required) 499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string(), // END_GROUP (no value required) 500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string("abc") // 32BIT 501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint32_t fieldnum = GetFieldNumberForType(type, false); 504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer uint32_t rep_fieldnum = GetFieldNumberForType(type, true); 505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType( 506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static_cast<WireFormatLite::FieldType>(type)); 507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& incomplete = incompletes[wire_type]; 508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string type_name = 509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer UpperCase(string(".") + FieldDescriptor::TypeName(type)); 510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tag(fieldnum, wire_type), 513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofBeforeKnownNonRepeatedValue" + type_name); 514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tag(rep_fieldnum, wire_type), 517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofBeforeKnownRepeatedValue" + type_name); 518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer tag(UNKNOWN_FIELD, wire_type), 521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofBeforeUnknownValue" + type_name); 522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(fieldnum, wire_type), incomplete ), 525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInsideKnownNonRepeatedValue" + type_name); 526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(rep_fieldnum, wire_type), incomplete ), 529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInsideKnownRepeatedValue" + type_name); 530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(UNKNOWN_FIELD, wire_type), incomplete ), 533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInsideUnknownValue" + type_name); 534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { 536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(fieldnum, wire_type), varint(1) ), 538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInDelimitedDataForKnownNonRepeatedValue" + type_name); 539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(rep_fieldnum, wire_type), varint(1) ), 542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInDelimitedDataForKnownRepeatedValue" + type_name); 543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // EOF in the middle of delimited data for unknown value. 545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(UNKNOWN_FIELD, wire_type), varint(1) ), 547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInDelimitedDataForUnknownValue" + type_name); 548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (type == FieldDescriptor::TYPE_MESSAGE) { 550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Submessage ends in the middle of a value. 551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string incomplete_submsg = 552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(WireFormatLite::TYPE_INT32, WireFormatLite::WIRETYPE_VARINT), 553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer incompletes[WireFormatLite::WIRETYPE_VARINT] ); 554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectHardParseFailureForProto( 555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED), 556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer varint(incomplete_submsg.size()), 557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer incomplete_submsg ), 558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInSubmessageValue" + type_name); 559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else if (type != FieldDescriptor::TYPE_GROUP) { 561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Non-delimited, non-group: eligible for packing. 562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Packed region ends in the middle of a value. 564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectHardParseFailureForProto( 565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED), 566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer varint(incomplete.size()), 567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer incomplete ), 568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInPackedFieldValue" + type_name); 569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // EOF in the middle of packed region. 571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForProto( 572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED), 573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer varint(1) ), 574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrematureEofInPackedField" + type_name); 575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::SetFailureList(const vector<string>& failure_list) { 579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer expected_to_fail_.clear(); 580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::copy(failure_list.begin(), failure_list.end(), 581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::inserter(expected_to_fail_, expected_to_fail_.end())); 582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool ConformanceTestSuite::CheckSetEmpty(const set<string>& set_to_check, 585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const char* msg) { 586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (set_to_check.empty()) { 587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return true; 588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "\n"); 590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "%s:\n", msg); 591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (set<string>::const_iterator iter = set_to_check.begin(); 592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer iter != set_to_check.end(); ++iter) { 593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, " %s\n", iter->c_str()); 594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "\n"); 596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner, 601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::string* output) { 602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer runner_ = runner; 603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer successes_ = 0; 604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer expected_failures_ = 0; 605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skipped_.clear(); 606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_names_.clear(); 607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unexpected_failing_tests_.clear(); 608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unexpected_succeeding_tests_.clear(); 609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer type_resolver_.reset(NewTypeResolverForDescriptorPool( 610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer kTypeUrlPrefix, DescriptorPool::generated_pool())); 611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer type_url_ = GetTypeUrl(TestAllTypes::descriptor()); 612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer output_ = "\nCONFORMANCE TEST BEGIN ====================================\n\n"; 614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 1; i <= FieldDescriptor::MAX_TYPE; i++) { 616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (i == FieldDescriptor::TYPE_GROUP) continue; 617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestPrematureEOFForType(static_cast<FieldDescriptor::Type>(i)); 618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest("HelloWorld", "{\"optionalString\":\"Hello, World!\"}", 621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_string: 'Hello, World!'"); 622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Test field name conventions. 624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameInSnakeCase", 626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldname1": 1, 628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName2": 2, 629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldName3": 3 630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldname1: 1 633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_name2: 2 634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer _field_name3: 3 635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameWithNumbers", 638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field0name5": 5, 640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field0Name6": 6 641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field0name5: 5 644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_0_name6: 6 645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameWithMixedCases", 648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName7": 7, 650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName8": 8, 651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName9": 9, 652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName10": 10, 653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fIELDNAME11": 11, 654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fIELDName12": 12 655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldName7: 7 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldName8: 8 659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_Name9: 9 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Field_Name10: 10 661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FIELD_NAME11: 11 662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FIELD_name12: 12 663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Using the original proto field name in JSON is also allowed. 665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OriginalProtoFieldName", 667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldname1": 1, 669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field_name2": 2, 670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "_field_name3": 3, 671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field0name5": 5, 672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field_0_name6": 6, 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName7": 7, 674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldName8": 8, 675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field_Name9": 9, 676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Field_Name10": 10, 677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FIELD_NAME11": 11, 678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FIELD_name12": 12 679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldname1: 1 682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_name2: 2 683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer _field_name3: 3 684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field0name5: 5 685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_0_name6: 6 686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldName7: 7 687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldName8: 8 688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer field_Name9: 9 689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Field_Name10: 10 690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FIELD_NAME11: 11 691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FIELD_name12: 12 692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Field names can be escaped. 694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameEscaped", 696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"fieldn\u0061me1": 1})", 697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldname1: 1"); 698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Field names must be quoted (or it's not valid JSON). 699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameNotQuoted", 701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "{fieldname1: 1}"); 702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Trailing comma is not allowed (not valid JSON). 703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TrailingCommaInAnObject", 705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"fieldname1":1,})"); 706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // JSON doesn't support comments. 707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "JsonWithComments", 709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // This is a comment. 711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldname1": 1 712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })"); 713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Duplicated field names are not allowed. 714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameDuplicate", 716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedMessage": {a: 1}, 718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedMessage": {} 719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })"); 720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameDuplicateDifferentCasing1", 722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_message": {a: 1}, 724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedMessage": {} 725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })"); 726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameDuplicateDifferentCasing2", 728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedMessage": {a: 1}, 730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_message": {} 731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })"); 732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Serializers should use lowerCamelCase by default. 733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameInLowerCamelCase", 735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldname1": 1, 737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName2": 2, 738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldName3": 3 739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value.isMember("fieldname1") && 742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fieldName2") && 743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("FieldName3"); 744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameWithNumbers", 747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field0name5": 5, 749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "field0Name6": 6 750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value.isMember("field0name5") && 753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("field0Name6"); 754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldNameWithMixedCases", 757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName7": 7, 759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName8": 8, 760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName9": 9, 761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fieldName10": 10, 762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fIELDNAME11": 11, 763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "fIELDName12": 12 764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value.isMember("fieldName7") && 767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fieldName8") && 768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fieldName9") && 769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fieldName10") && 770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fIELDNAME11") && 771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value.isMember("fIELDName12"); 772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Integer fields. 775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldMaxValue", 777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 2147483647})", 778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 2147483647"); 779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldMinValue", 781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": -2147483648})", 782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: -2147483648"); 783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32FieldMaxValue", 785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32": 4294967295})", 786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint32: 4294967295"); 787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldMaxValue", 789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "9223372036854775807"})", 790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int64: 9223372036854775807"); 791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldMinValue", 793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "-9223372036854775808"})", 794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int64: -9223372036854775808"); 795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldMaxValue", 797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": "18446744073709551615"})", 798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint64: 18446744073709551615"); 799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldMaxValueNotQuoted", 801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": 9223372036854775807})", 802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int64: 9223372036854775807"); 803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldMinValueNotQuoted", 805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": -9223372036854775808})", 806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int64: -9223372036854775808"); 807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldMaxValueNotQuoted", 809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": 18446744073709551615})", 810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint64: 18446744073709551615"); 811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Values can be represented as JSON strings. 812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldStringValue", 814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": "2147483647"})", 815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 2147483647"); 816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldStringValueEscaped", 818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": "2\u003147483647"})", 819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 2147483647"); 820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parsers reject out-of-bound integer values. 822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldTooLarge", 824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 2147483648})"); 825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldTooSmall", 827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": -2147483649})"); 828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32FieldTooLarge", 830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32": 4294967296})"); 831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldTooLarge", 833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "9223372036854775808"})"); 834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldTooSmall", 836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "-9223372036854775809"})"); 837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldTooLarge", 839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": "18446744073709551616"})"); 840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parser reject non-integer numeric values as well. 841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldNotInteger", 843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 0.5})"); 844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32FieldNotInteger", 846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32": 0.5})"); 847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldNotInteger", 849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "0.5"})"); 850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldNotInteger", 852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": "0.5"})"); 853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Integers but represented as float values are accepted. 855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldFloatTrailingZero", 857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 100000.000})", 858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 100000"); 859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldExponentialFormat", 861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 1e5})", 862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 100000"); 863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldMaxFloatValue", 865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 2.147483647e9})", 866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: 2147483647"); 867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldMinFloatValue", 869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": -2.147483648e9})", 870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32: -2147483648"); 871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32FieldMaxFloatValue", 873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32": 4.294967295e9})", 874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint32: 4294967295"); 875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parser reject non-numeric values. 877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldNotNumber", 879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": "3x3"})"); 880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32FieldNotNumber", 882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32": "3x3"})"); 883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldNotNumber", 885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": "3x3"})"); 886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldNotNumber", 888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": "3x3"})"); 889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // JSON does not allow "+" on numric values. 890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldPlusSign", 892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": +1})"); 893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // JSON doesn't allow leading 0s. 894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldLeadingZero", 896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": 01})"); 897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldNegativeWithLeadingZero", 899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": -01})"); 900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // String values must follow the same syntax rule. Specifically leading 901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // or traling spaces are not allowed. 902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldLeadingSpace", 904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": " 1"})"); 905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32FieldTrailingSpace", 907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32": "1 "})"); 908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 64-bit values are serialized as strings. 910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64FieldBeString", 912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64": 1})", 913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalInt64"].type() == Json::stringValue && 915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value["optionalInt64"].asString() == "1"; 916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64FieldBeString", 919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64": 1})", 920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalUint64"].type() == Json::stringValue && 922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value["optionalUint64"].asString() == "1"; 923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Bool fields. 926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldTrue", 928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":true})", 929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_bool: true"); 930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldFalse", 932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":false})", 933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_bool: false"); 934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Other forms are not allowed. 936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldIntegerZero", 938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":0})"); 939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldIntegerOne", 941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":1})"); 942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldCamelCaseTrue", 944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":True})"); 945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldCamelCaseFalse", 947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":False})"); 948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldAllCapitalTrue", 950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":TRUE})"); 951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldAllCapitalFalse", 953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":FALSE})"); 954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldDoubleQuotedTrue", 956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":"true"})"); 957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolFieldDoubleQuotedFalse", 959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBool":"false"})"); 960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Float fields. 962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldMinPositiveValue", 964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": 1.175494e-38})", 965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: 1.175494e-38"); 966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldMaxNegativeValue", 968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": -1.175494e-38})", 969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: -1.175494e-38"); 970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldMaxPositiveValue", 972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": 3.402823e+38})", 973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: 3.402823e+38"); 974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldMinNegativeValue", 976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": 3.402823e+38})", 977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: 3.402823e+38"); 978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Values can be quoted. 979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldQuotedValue", 981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": "1"})", 982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: 1"); 983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Special values. 984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNan", 986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": "NaN"})", 987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: nan"); 988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldInfinity", 990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": "Infinity"})", 991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: inf"); 992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNegativeInfinity", 994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": "-Infinity"})", 995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: -inf"); 996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Non-cannonical Nan will be correctly normalized. 997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes message; 999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // IEEE floating-point standard 32-bit quiet NaN: 1000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 0111 1111 1xxx xxxx xxxx xxxx xxxx xxxx 1001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.set_optional_float( 1002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormatLite::DecodeFloat(0x7FA12345)); 1003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithProtobufInput( 1004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNormalizeQuietNan", message, 1005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: nan"); 1006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // IEEE floating-point standard 64-bit signaling NaN: 1007b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 1111 1111 1xxx xxxx xxxx xxxx xxxx xxxx 1008b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.set_optional_float( 1009b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormatLite::DecodeFloat(0xFFB54321)); 1010b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithProtobufInput( 1011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNormalizeSignalingNan", message, 1012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float: nan"); 1013b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1014b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1015b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Special values must be quoted. 1016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNanNotQuoted", 1018b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": NaN})"); 1019b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1020b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldInfinityNotQuoted", 1021b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": Infinity})"); 1022b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1023b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldNegativeInfinityNotQuoted", 1024b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": -Infinity})"); 1025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parsers should reject out-of-bound values. 1026b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldTooSmall", 1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": -3.502823e+38})"); 1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FloatFieldTooLarge", 1031b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloat": 3.502823e+38})"); 1032b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1033b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Double fields. 1034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1035b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldMinPositiveValue", 1036b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": 2.22507e-308})", 1037b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: 2.22507e-308"); 1038b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1039b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldMaxNegativeValue", 1040b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": -2.22507e-308})", 1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: -2.22507e-308"); 1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldMaxPositiveValue", 1044b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": 1.79769e+308})", 1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: 1.79769e+308"); 1046b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1047b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldMinNegativeValue", 1048b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": -1.79769e+308})", 1049b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: -1.79769e+308"); 1050b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Values can be quoted. 1051b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1052b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldQuotedValue", 1053b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": "1"})", 1054b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: 1"); 1055b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Speical values. 1056b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1057b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNan", 1058b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": "NaN"})", 1059b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: nan"); 1060b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1061b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldInfinity", 1062b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": "Infinity"})", 1063b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: inf"); 1064b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1065b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNegativeInfinity", 1066b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": "-Infinity"})", 1067b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: -inf"); 1068b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Non-cannonical Nan will be correctly normalized. 1069b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer { 1070b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes message; 1071b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.set_optional_double( 1072b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormatLite::DecodeDouble(0x7FFA123456789ABCLL)); 1073b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithProtobufInput( 1074b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNormalizeQuietNan", message, 1075b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: nan"); 1076b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.set_optional_double( 1077b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WireFormatLite::DecodeDouble(0xFFFBCBA987654321LL)); 1078b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithProtobufInput( 1079b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNormalizeSignalingNan", message, 1080b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double: nan"); 1081b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1082b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1083b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Special values must be quoted. 1084b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1085b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNanNotQuoted", 1086b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": NaN})"); 1087b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1088b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldInfinityNotQuoted", 1089b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": Infinity})"); 1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldNegativeInfinityNotQuoted", 1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": -Infinity})"); 1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Parsers should reject out-of-bound values. 1095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldTooSmall", 1097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": -1.89769e+308})"); 1098b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DoubleFieldTooLarge", 1100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDouble": +1.89769e+308})"); 1101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Enum fields. 1103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumField", 1105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedEnum": "FOO"})", 1106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_enum: FOO"); 1107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Enum values must be represented as strings. 1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumFieldNotQuoted", 1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedEnum": FOO})"); 1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Numeric values are allowed. 1112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumFieldNumericValueZero", 1114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedEnum": 0})", 1115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_enum: FOO"); 1116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumFieldNumericValueNonZero", 1118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedEnum": 1})", 1119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_enum: BAR"); 1120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Unknown enum values are represented as numeric values. 1121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumFieldUnknownValue", 1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedEnum": 123})", 1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalNestedEnum"].type() == Json::intValue && 1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value["optionalNestedEnum"].asInt() == 123; 1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // String fields. 1130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringField", 1132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "Hello world!"})", 1133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_string: \"Hello world!\""); 1134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnicode", 1136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Google in Chinese. 1137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "谷歌"})", 1138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string: "谷歌")"); 1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldEscape", 1141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\"\\\/\b\f\n\r\t"})", 1142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string: "\"\\/\b\f\n\r\t")"); 1143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnicodeEscape", 1145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\u8C37\u6B4C"})", 1146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string: "谷歌")"); 1147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnicodeEscapeWithLowercaseHexLetters", 1149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\u8c37\u6b4c"})", 1150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string: "谷歌")"); 1151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldSurrogatePair", 1153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The character is an emoji: grinning face with smiling eyes. 1154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\uD83D\uDE01"})", 1155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string: "\xF0\x9F\x98\x81")"); 1156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Unicode escapes must start with "\u" (lowercase u). 1158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUppercaseEscapeLetter", 1160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\U8C37\U6b4C"})"); 1161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldInvalidEscape", 1163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\uXXXX\u6B4C"})"); 1164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnterminatedEscape", 1166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\u8C3"})"); 1167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnpairedHighSurrogate", 1169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\uD800"})"); 1170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldUnpairedLowSurrogate", 1172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\uDC00"})"); 1173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldSurrogateInWrongOrder", 1175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": "\uDE01\uD83D"})"); 1176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringFieldNotAString", 1178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalString": 12345})"); 1179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Bytes fields. 1181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BytesField", 1183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBytes": "AQI="})", 1184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_bytes: "\x01\x02")"); 1185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BytesFieldNoPadding", 1187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBytes": "AQI"})"); 1188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BytesFieldInvalidBase64Characters", 1190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBytes": "-_=="})"); 1191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Message fields. 1193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MessageField", 1195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalNestedMessage": {"a": 1234}})", 1196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_nested_message: {a: 1234}"); 1197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Oneof fields. 1199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OneofFieldDuplicate", 1201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"oneofUint32": 1, "oneofString": "test"})"); 1202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Repeated fields. 1204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrimitiveRepeatedField", 1206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, 2, 3, 4]})", 1207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_int32: [1, 2, 3, 4]"); 1208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "EnumRepeatedField", 1210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedEnum": ["FOO", "BAR", "BAZ"]})", 1211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_nested_enum: [FOO, BAR, BAZ]"); 1212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "StringRepeatedField", 1214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedString": ["Hello", "world"]})", 1215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(repeated_string: ["Hello", "world"])"); 1216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BytesRepeatedField", 1218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedBytes": ["AAEC", "AQI="]})", 1219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(repeated_bytes: ["\x00\x01\x02", "\x01\x02"])"); 1220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MessageRepeatedField", 1222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedMessage": [{"a": 1234}, {"a": 5678}]})", 1223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_nested_message: {a: 1234}" 1224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_nested_message: {a: 5678}"); 1225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Repeated field elements are of incorrect type. 1227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingIntegersGotBool", 1229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, false, 3, 4]})"); 1230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingIntegersGotString", 1232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, 2, "name", 4]})"); 1233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage", 1235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, 2, 3, {"a": 4}]})"); 1236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingStringsGotInt", 1238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedString": ["1", 2, "3", "4"]})"); 1239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingStringsGotBool", 1241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedString": ["1", "2", false, "4"]})"); 1242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingStringsGotMessage", 1244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedString": ["1", 2, "3", {"a": 4}]})"); 1245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingMessagesGotInt", 1247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedMessage": [{"a": 1}, 2]})"); 1248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingMessagesGotBool", 1250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedMessage": [{"a": 1}, false]})"); 1251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldWrongElementTypeExpectingMessagesGotString", 1253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedMessage": [{"a": 1}, "2"]})"); 1254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Trailing comma in the repeated field is not allowed. 1255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldTrailingComma", 1257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, 2, 3, 4,]})"); 1258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Map fields. 1260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32MapField", 1262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt32Int32": {"1": 2, "3": 4}})", 1263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int32_int32: {key: 1 value: 2}" 1264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int32_int32: {key: 3 value: 4}"); 1265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32MapFieldKeyNotQuoted", 1267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt32Int32": {1: 2, 3: 4}})"); 1268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32MapField", 1270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapUint32Uint32": {"1": 2, "3": 4}})", 1271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_uint32_uint32: {key: 1 value: 2}" 1272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_uint32_uint32: {key: 3 value: 4}"); 1273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint32MapFieldKeyNotQuoted", 1275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapUint32Uint32": {1: 2, 3: 4}})"); 1276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64MapField", 1278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt64Int64": {"1": 2, "3": 4}})", 1279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int64_int64: {key: 1 value: 2}" 1280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int64_int64: {key: 3 value: 4}"); 1281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64MapFieldKeyNotQuoted", 1283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt64Int64": {1: 2, 3: 4}})"); 1284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64MapField", 1286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapUint64Uint64": {"1": 2, "3": 4}})", 1287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_uint64_uint64: {key: 1 value: 2}" 1288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_uint64_uint64: {key: 3 value: 4}"); 1289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Uint64MapFieldKeyNotQuoted", 1291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapUint64Uint64": {1: 2, 3: 4}})"); 1292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolMapField", 1294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapBoolBool": {"true": true, "false": false}})", 1295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_bool_bool: {key: true value: true}" 1296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_bool_bool: {key: false value: false}"); 1297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolMapFieldKeyNotQuoted", 1299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapBoolBool": {true: true, false: false}})"); 1300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MessageMapField", 1302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "mapStringNestedMessage": { 1304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "hello": {"a": 1234}, 1305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "world": {"a": 5678} 1306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_string_nested_message: { 1310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "hello" 1311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {a: 1234} 1312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer map_string_nested_message: { 1314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "world" 1315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {a: 5678} 1316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Since Map keys are represented as JSON strings, escaping should be allowed. 1319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int32MapEscapedKey", 1321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt32Int32": {"\u0031": 2}})", 1322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int32_int32: {key: 1 value: 2}"); 1323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Int64MapEscapedKey", 1325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt64Int64": {"\u0031": 2}})", 1326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_int64_int64: {key: 1 value: 2}"); 1327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "BoolMapEscapedKey", 1329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapBoolBool": {"tr\u0075e": true}})", 1330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "map_bool_bool: {key: true value: true}"); 1331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // "null" is accepted for all fields types. 1333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AllFieldAcceptNull", 1335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32": null, 1337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt64": null, 1338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint32": null, 1339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint64": null, 1340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBool": null, 1341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalString": null, 1342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBytes": null, 1343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedEnum": null, 1344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalNestedMessage": null, 1345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedInt32": null, 1346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedInt64": null, 1347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedUint32": null, 1348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedUint64": null, 1349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedBool": null, 1350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedString": null, 1351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedBytes": null, 1352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedNestedEnum": null, 1353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedNestedMessage": null, 1354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "mapInt32Int32": null, 1355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "mapBoolBool": null, 1356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "mapStringNestedMessage": null 1357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ""); 1359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Repeated field elements cannot be null. 1361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldPrimitiveElementIsNull", 1363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32": [1, null, 2]})"); 1364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFieldMessageElementIsNull", 1366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedNestedMessage": [{"a":1}, null, {"a":2}]})"); 1367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Map field keys cannot be null. 1368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MapFieldKeyIsNull", 1370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt32Int32": {null: 1}})"); 1371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Map field values cannot be null. 1372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "MapFieldValueIsNull", 1374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"mapInt32Int32": {"0": null}})"); 1375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Wrapper types. 1377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalBoolWrapper", 1379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBoolWrapper": false})", 1380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_bool_wrapper: {value: false}"); 1381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalInt32Wrapper", 1383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt32Wrapper": 0})", 1384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int32_wrapper: {value: 0}"); 1385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalUint32Wrapper", 1387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint32Wrapper": 0})", 1388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint32_wrapper: {value: 0}"); 1389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalInt64Wrapper", 1391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalInt64Wrapper": 0})", 1392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_int64_wrapper: {value: 0}"); 1393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalUint64Wrapper", 1395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalUint64Wrapper": 0})", 1396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_uint64_wrapper: {value: 0}"); 1397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalFloatWrapper", 1399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFloatWrapper": 0})", 1400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_float_wrapper: {value: 0}"); 1401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalDoubleWrapper", 1403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDoubleWrapper": 0})", 1404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_double_wrapper: {value: 0}"); 1405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalStringWrapper", 1407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalStringWrapper": ""})", 1408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_string_wrapper: {value: ""})"); 1409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalBytesWrapper", 1411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalBytesWrapper": ""})", 1412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_bytes_wrapper: {value: ""})"); 1413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "OptionalWrapperTypesWithNonDefaultValue", 1415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBoolWrapper": true, 1417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32Wrapper": 1, 1418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint32Wrapper": 1, 1419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt64Wrapper": "1", 1420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint64Wrapper": "1", 1421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalFloatWrapper": 1, 1422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalDoubleWrapper": 1, 1423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalStringWrapper": "1", 1424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBytesWrapper": "AQI=" 1425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_bool_wrapper: {value: true} 1428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_int32_wrapper: {value: 1} 1429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_uint32_wrapper: {value: 1} 1430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_int64_wrapper: {value: 1} 1431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_uint64_wrapper: {value: 1} 1432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_float_wrapper: {value: 1} 1433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_double_wrapper: {value: 1} 1434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_string_wrapper: {value: "1"} 1435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_bytes_wrapper: {value: "\x01\x02"} 1436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedBoolWrapper", 1439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedBoolWrapper": [true, false]})", 1440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_bool_wrapper: {value: true}" 1441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_bool_wrapper: {value: false}"); 1442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedInt32Wrapper", 1444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt32Wrapper": [0, 1]})", 1445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_int32_wrapper: {value: 0}" 1446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_int32_wrapper: {value: 1}"); 1447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedUint32Wrapper", 1449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedUint32Wrapper": [0, 1]})", 1450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_uint32_wrapper: {value: 0}" 1451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_uint32_wrapper: {value: 1}"); 1452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedInt64Wrapper", 1454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedInt64Wrapper": [0, 1]})", 1455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_int64_wrapper: {value: 0}" 1456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_int64_wrapper: {value: 1}"); 1457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedUint64Wrapper", 1459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedUint64Wrapper": [0, 1]})", 1460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_uint64_wrapper: {value: 0}" 1461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_uint64_wrapper: {value: 1}"); 1462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedFloatWrapper", 1464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedFloatWrapper": [0, 1]})", 1465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_float_wrapper: {value: 0}" 1466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_float_wrapper: {value: 1}"); 1467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedDoubleWrapper", 1469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedDoubleWrapper": [0, 1]})", 1470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_double_wrapper: {value: 0}" 1471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_double_wrapper: {value: 1}"); 1472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedStringWrapper", 1474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedStringWrapper": ["", "AQI="]})", 1475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer repeated_string_wrapper: {value: ""} 1477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer repeated_string_wrapper: {value: "AQI="} 1478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "RepeatedBytesWrapper", 1481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedBytesWrapper": ["", "AQI="]})", 1482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer repeated_bytes_wrapper: {value: ""} 1484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer repeated_bytes_wrapper: {value: "\x01\x02"} 1485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "WrapperTypesWithNullValue", 1488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBoolWrapper": null, 1490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32Wrapper": null, 1491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint32Wrapper": null, 1492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt64Wrapper": null, 1493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalUint64Wrapper": null, 1494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalFloatWrapper": null, 1495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalDoubleWrapper": null, 1496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalStringWrapper": null, 1497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalBytesWrapper": null, 1498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedBoolWrapper": null, 1499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedInt32Wrapper": null, 1500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedUint32Wrapper": null, 1501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedInt64Wrapper": null, 1502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedUint64Wrapper": null, 1503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedFloatWrapper": null, 1504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedDoubleWrapper": null, 1505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedStringWrapper": null, 1506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedBytesWrapper": null 1507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ""); 1509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Duration 1511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationMinValue", 1513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "-315576000000.999999999s"})", 1514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_duration: {seconds: -315576000000 nanos: -999999999}"); 1515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationMaxValue", 1517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "315576000000.999999999s"})", 1518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_duration: {seconds: 315576000000 nanos: 999999999}"); 1519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationRepeatedValue", 1521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"repeatedDuration": ["1.5s", "-1.5s"]})", 1522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_duration: {seconds: 1 nanos: 500000000}" 1523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_duration: {seconds: -1 nanos: -500000000}"); 1524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationMissingS", 1527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "1"})"); 1528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationJsonInputTooSmall", 1530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "-315576000001.000000000s"})"); 1531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationJsonInputTooLarge", 1533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "315576000001.000000000s"})"); 1534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationProtoInputTooSmall", 1536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_duration: {seconds: -315576000001 nanos: 0}"); 1537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationProtoInputTooLarge", 1539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_duration: {seconds: 315576000001 nanos: 0}"); 1540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationHasZeroFractionalDigit", 1543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "1.000000000s"})", 1544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalDuration"].asString() == "1s"; 1546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationHas3FractionalDigits", 1549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "1.010000000s"})", 1550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalDuration"].asString() == "1.010s"; 1552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationHas6FractionalDigits", 1555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "1.000010000s"})", 1556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalDuration"].asString() == "1.000010s"; 1558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "DurationHas9FractionalDigits", 1561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalDuration": "1.000000010s"})", 1562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalDuration"].asString() == "1.000000010s"; 1564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Timestamp 1567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampMinValue", 1569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0001-01-01T00:00:00Z"})", 1570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: -62135596800}"); 1571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampMaxValue", 1573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "9999-12-31T23:59:59.999999999Z"})", 1574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: 253402300799 nanos: 999999999}"); 1575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampRepeatedValue", 1577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeatedTimestamp": [ 1579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "0001-01-01T00:00:00Z", 1580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "9999-12-31T23:59:59.999999999Z" 1581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ] 1582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_timestamp: {seconds: -62135596800}" 1584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "repeated_timestamp: {seconds: 253402300799 nanos: 999999999}"); 1585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampWithPositiveOffset", 1587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1970-01-01T08:00:00+08:00"})", 1588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: 0}"); 1589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampWithNegativeOffset", 1591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})", 1592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: 0}"); 1593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputTooSmall", 1596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0000-01-01T00:00:00Z"})"); 1597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputTooLarge", 1599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "10000-01-01T00:00:00Z"})"); 1600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputMissingZ", 1602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0001-01-01T00:00:00"})"); 1603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputMissingT", 1605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0001-01-01 00:00:00Z"})"); 1606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputLowercaseZ", 1608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0001-01-01T00:00:00z"})"); 1609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampJsonInputLowercaseT", 1611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "0001-01-01t00:00:00Z"})"); 1612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampProtoInputTooSmall", 1614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: -62135596801}"); 1615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampProtoInputTooLarge", 1617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_timestamp: {seconds: 253402300800}"); 1618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampZeroNormalized", 1620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})", 1621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalTimestamp"].asString() == 1623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1970-01-01T00:00:00Z"; 1624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampHasZeroFractionalDigit", 1627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1970-01-01T00:00:00.000000000Z"})", 1628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalTimestamp"].asString() == 1630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1970-01-01T00:00:00Z"; 1631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampHas3FractionalDigits", 1634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1970-01-01T00:00:00.010000000Z"})", 1635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalTimestamp"].asString() == 1637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1970-01-01T00:00:00.010Z"; 1638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampHas6FractionalDigits", 1641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1970-01-01T00:00:00.000010000Z"})", 1642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalTimestamp"].asString() == 1644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1970-01-01T00:00:00.000010Z"; 1645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTestWithValidator( 1647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "TimestampHas9FractionalDigits", 1648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalTimestamp": "1970-01-01T00:00:00.000000010Z"})", 1649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [](const Json::Value& value) { 1650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value["optionalTimestamp"].asString() == 1651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "1970-01-01T00:00:00.000000010Z"; 1652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 1653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // FieldMask 1655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldMask", 1657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFieldMask": "foo,barBaz"})", 1658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_field_mask: {paths: "foo" paths: "bar_baz"})"); 1659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectParseFailureForJson( 1660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldMaskInvalidCharacter", 1661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalFieldMask": "foo,bar_bar"})"); 1662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldMaskPathsDontRoundTrip", 1664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_field_mask: {paths: "fooBar"})"); 1665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldMaskNumbersDontRoundTrip", 1667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_field_mask: {paths: "foo_3_bar"})"); 1668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ExpectSerializeFailureForJson( 1669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "FieldMaskTooManyUnderscore", 1670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_field_mask: {paths: "foo__bar"})"); 1671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Struct 1673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Struct", 1675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalStruct": { 1677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "nullValue": null, 1678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "intValue": 1234, 1679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "boolValue": true, 1680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "doubleValue": 1234.5678, 1681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "stringValue": "Hello world!", 1682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "listValue": [1234, "5678"], 1683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "objectValue": { 1684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": 0 1685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_struct: { 1690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "nullValue" 1692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {null_value: NULL_VALUE} 1693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "intValue" 1696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {number_value: 1234} 1697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "boolValue" 1700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {bool_value: true} 1701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "doubleValue" 1704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {number_value: 1234.5678} 1705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "stringValue" 1708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: {string_value: "Hello world!"} 1709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "listValue" 1712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer list_value: { 1714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer values: { 1715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 1234 1716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer values: { 1718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string_value: "5678" 1719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "objectValue" 1725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer struct_value: { 1727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "value" 1729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 0 1731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Value 1739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptInteger", 1741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": 1})", 1742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_value: { number_value: 1}"); 1743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptFloat", 1745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": 1.5})", 1746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_value: { number_value: 1.5}"); 1747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptBool", 1749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": false})", 1750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_value: { bool_value: false}"); 1751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptNull", 1753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": null})", 1754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optional_value: { null_value: NULL_VALUE}"); 1755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptString", 1757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": "hello"})", 1758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"(optional_value: { string_value: "hello"})"); 1759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptList", 1761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": [0, "hello"]})", 1762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_value: { 1764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer list_value: { 1765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer values: { 1766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 0 1767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer values: { 1769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string_value: "hello" 1770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "ValueAcceptObject", 1776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({"optionalValue": {"value": 1}})", 1777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_value: { 1779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer struct_value: { 1780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "value" 1782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 1 1784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Any 1791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Any", 1793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/conformance.TestAllTypes", 1796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32": 12345 1797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/conformance.TestAllTypes] { 1802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_int32: 12345 1803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyNested", 1808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Any", 1811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": { 1812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/conformance.TestAllTypes", 1813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32": 12345 1814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Any] { 1820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/conformance.TestAllTypes] { 1821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_int32: 12345 1822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The special "@type" tag is not required to appear first. 1827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyUnorderedTypeTag", 1829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalInt32": 12345, 1832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/conformance.TestAllTypes" 1833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/conformance.TestAllTypes] { 1838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_int32: 12345 1839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Well-known types in Any. 1843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithInt32ValueWrapper", 1845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Int32Value", 1848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": 12345 1849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Int32Value] { 1854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: 12345 1855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithDuration", 1860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Duration", 1863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": "1.5s" 1864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Duration] { 1869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer seconds: 1 1870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer nanos: 500000000 1871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithTimestamp", 1876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Timestamp", 1879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": "1970-01-01T00:00:00Z" 1880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Timestamp] { 1885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer seconds: 0 1886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer nanos: 0 1887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithFieldMask", 1892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.FieldMask", 1895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": "foo,barBaz" 1896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.FieldMask] { 1901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer paths: ["foo", "bar_baz"] 1902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithStruct", 1907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Struct", 1910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": { 1911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "foo": 1 1912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Struct] { 1918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "foo" 1920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 1 1922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithValueForJsonObject", 1929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Value", 1932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": { 1933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "foo": 1 1934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Value] { 1940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer struct_value: { 1941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fields: { 1942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer key: "foo" 1943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: { 1944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 1 1945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RunValidJsonTest( 1952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "AnyWithValueForInteger", 1953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"({ 1954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "optionalAny": { 1955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "@type": "type.googleapis.com/google.protobuf.Value", 1956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "value": 1 1957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer })", 1959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer R"( 1960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer optional_any: { 1961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer [type.googleapis.com/google.protobuf.Value] { 1962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer number_value: 1 1963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer )"); 1966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool ok = true; 1968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!CheckSetEmpty(expected_to_fail_, 1969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "These tests were listed in the failure list, but they " 1970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "don't exist. Remove them from the failure list")) { 1971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ok = false; 1972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!CheckSetEmpty(unexpected_failing_tests_, 1974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "These tests failed. If they can't be fixed right now, " 1975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "you can add them to the failure list so the overall " 1976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "suite can succeed")) { 1977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ok = false; 1978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Sometimes the testee may be fixed before we update the failure list (e.g., 1981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the testee is from a different component). We warn about this case but 1982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // don't consider it an overall test failure. 1983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer CheckSetEmpty(unexpected_succeeding_tests_, 1984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "These tests succeeded, even though they were listed in " 1985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "the failure list. Remove them from the failure list"); 1986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (verbose_) { 1988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer CheckSetEmpty(skipped_, 1989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "These tests were skipped (probably because support for some " 1990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "features is not implemented)"); 1991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, 1994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "CONFORMANCE SUITE %s: %d successes, %d skipped, " 1995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "%d expected failures, %d unexpected failures.\n", 1996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ok ? "PASSED" : "FAILED", successes_, skipped_.size(), 1997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer expected_failures_, unexpected_failing_tests_.size()); 1998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringAppendF(&output_, "\n"); 1999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer output->assign(output_); 2001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return ok; 2003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 2004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 2005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 2006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace google 2007