diff options
Diffstat (limited to 'third_party/protobuf/3.2.0/src/google/protobuf/util/internal')
51 files changed, 0 insertions, 16640 deletions
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h deleted file mode 100644 index a018a09ef7..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h +++ /dev/null @@ -1,103 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__ - -#include <google/protobuf/stubs/common.h> - -// This file contains constants used by //net/proto2/util/converter. - -namespace google { -namespace protobuf { -namespace util { -namespace converter { -// Prefix for type URLs. -const char kTypeServiceBaseUrl[] = "type.googleapis.com"; - -// Format string for RFC3339 timestamp formatting. -const char kRfc3339TimeFormat[] = "%E4Y-%m-%dT%H:%M:%S"; - -// Same as above, but the year value is not zero-padded i.e. this accepts -// timestamps like "1-01-0001T23:59:59Z" instead of "0001-01-0001T23:59:59Z". -const char kRfc3339TimeFormatNoPadding[] = "%Y-%m-%dT%H:%M:%S"; - -// Minimun seconds allowed in a google.protobuf.Timestamp value. -const int64 kTimestampMinSeconds = -62135596800LL; - -// Maximum seconds allowed in a google.protobuf.Timestamp value. -const int64 kTimestampMaxSeconds = 253402300799LL; - -// Minimum seconds allowed in a google.protobuf.Duration value. -const int64 kDurationMinSeconds = -315576000000LL; - -// Maximum seconds allowed in a google.protobuf.Duration value. -const int64 kDurationMaxSeconds = 315576000000LL; - -// Nano seconds in a second. -const int32 kNanosPerSecond = 1000000000; - -// Type url representing NULL values in google.protobuf.Struct type. -const char kStructNullValueTypeUrl[] = - "type.googleapis.com/google.protobuf.NullValue"; - -// Type string for google.protobuf.Struct -const char kStructType[] = "google.protobuf.Struct"; - -// Type string for struct.proto's google.protobuf.Value value type. -const char kStructValueType[] = "google.protobuf.Value"; - -// Type string for struct.proto's google.protobuf.ListValue value type. -const char kStructListValueType[] = "google.protobuf.ListValue"; - -// Type string for google.protobuf.Timestamp -const char kTimestampType[] = "google.protobuf.Timestamp"; - -// Type string for google.protobuf.Duration -const char kDurationType[] = "google.protobuf.Duration"; - -// Type URL for struct value type google.protobuf.Value -const char kStructValueTypeUrl[] = "type.googleapis.com/google.protobuf.Value"; - -// Type URL for struct value type google.protobuf.Value -const char kStructTypeUrl[] = "type.googleapis.com/google.protobuf.Struct"; - -// Type string for google.protobuf.Any -const char kAnyType[] = "google.protobuf.Any"; - -// The type URL of google.protobuf.FieldMask; -const char kFieldMaskTypeUrl[] = - "type.googleapis.com/google.protobuf.FieldMask"; - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc deleted file mode 100644 index 213c2c40c0..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc +++ /dev/null @@ -1,406 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/datapiece.h> - -#include <google/protobuf/struct.pb.h> -#include <google/protobuf/type.pb.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/mathlimits.h> -#include <google/protobuf/stubs/mathutil.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::EnumDescriptor; -using google::protobuf::EnumValueDescriptor; -; -; -; -using util::error::Code; -using util::Status; -using util::StatusOr; - -namespace { - -inline Status InvalidArgument(StringPiece value_str) { - return Status(util::error::INVALID_ARGUMENT, value_str); -} - -template <typename To, typename From> -StatusOr<To> ValidateNumberConversion(To after, From before) { - if (after == before && - MathUtil::Sign<From>(before) == MathUtil::Sign<To>(after)) { - return after; - } else { - return InvalidArgument(::google::protobuf::internal::is_integral<From>::value - ? ValueAsString(before) - : ::google::protobuf::internal::is_same<From, double>::value - ? DoubleAsString(before) - : FloatAsString(before)); - } -} - -// For general conversion between -// int32, int64, uint32, uint64, double and float -// except conversion between double and float. -template <typename To, typename From> -StatusOr<To> NumberConvertAndCheck(From before) { - if (::google::protobuf::internal::is_same<From, To>::value) return before; - - To after = static_cast<To>(before); - return ValidateNumberConversion(after, before); -} - -// For conversion to integer types (int32, int64, uint32, uint64) from floating -// point types (double, float) only. -template <typename To, typename From> -StatusOr<To> FloatingPointToIntConvertAndCheck(From before) { - if (::google::protobuf::internal::is_same<From, To>::value) return before; - - To after = static_cast<To>(before); - return ValidateNumberConversion(after, before); -} - -// For conversion between double and float only. -StatusOr<double> FloatToDouble(float before) { - // Casting float to double should just work as double has more precision - // than float. - return static_cast<double>(before); -} - -StatusOr<float> DoubleToFloat(double before) { - if (MathLimits<double>::IsNaN(before)) { - return std::numeric_limits<float>::quiet_NaN(); - } else if (!MathLimits<double>::IsFinite(before)) { - // Converting a double +inf/-inf to float should just work. - return static_cast<float>(before); - } else if (before > std::numeric_limits<float>::max() || - before < -std::numeric_limits<float>::max()) { - // Double value outside of the range of float. - return InvalidArgument(DoubleAsString(before)); - } else { - return static_cast<float>(before); - } -} - -} // namespace - -StatusOr<int32> DataPiece::ToInt32() const { - if (type_ == TYPE_STRING) return StringToNumber<int32>(safe_strto32); - - if (type_ == TYPE_DOUBLE) - return FloatingPointToIntConvertAndCheck<int32, double>(double_); - - if (type_ == TYPE_FLOAT) - return FloatingPointToIntConvertAndCheck<int32, float>(float_); - - return GenericConvert<int32>(); -} - -StatusOr<uint32> DataPiece::ToUint32() const { - if (type_ == TYPE_STRING) return StringToNumber<uint32>(safe_strtou32); - - if (type_ == TYPE_DOUBLE) - return FloatingPointToIntConvertAndCheck<uint32, double>(double_); - - if (type_ == TYPE_FLOAT) - return FloatingPointToIntConvertAndCheck<uint32, float>(float_); - - return GenericConvert<uint32>(); -} - -StatusOr<int64> DataPiece::ToInt64() const { - if (type_ == TYPE_STRING) return StringToNumber<int64>(safe_strto64); - - if (type_ == TYPE_DOUBLE) - return FloatingPointToIntConvertAndCheck<int64, double>(double_); - - if (type_ == TYPE_FLOAT) - return FloatingPointToIntConvertAndCheck<int64, float>(float_); - - return GenericConvert<int64>(); -} - -StatusOr<uint64> DataPiece::ToUint64() const { - if (type_ == TYPE_STRING) return StringToNumber<uint64>(safe_strtou64); - - if (type_ == TYPE_DOUBLE) - return FloatingPointToIntConvertAndCheck<uint64, double>(double_); - - if (type_ == TYPE_FLOAT) - return FloatingPointToIntConvertAndCheck<uint64, float>(float_); - - return GenericConvert<uint64>(); -} - -StatusOr<double> DataPiece::ToDouble() const { - if (type_ == TYPE_FLOAT) { - return FloatToDouble(float_); - } - if (type_ == TYPE_STRING) { - if (str_ == "Infinity") return std::numeric_limits<double>::infinity(); - if (str_ == "-Infinity") return -std::numeric_limits<double>::infinity(); - if (str_ == "NaN") return std::numeric_limits<double>::quiet_NaN(); - StatusOr<double> value = StringToNumber<double>(safe_strtod); - if (value.ok() && !MathLimits<double>::IsFinite(value.ValueOrDie())) { - // safe_strtod converts out-of-range values to +inf/-inf, but we want - // to report them as errors. - return InvalidArgument(StrCat("\"", str_, "\"")); - } else { - return value; - } - } - return GenericConvert<double>(); -} - -StatusOr<float> DataPiece::ToFloat() const { - if (type_ == TYPE_DOUBLE) { - return DoubleToFloat(double_); - } - if (type_ == TYPE_STRING) { - if (str_ == "Infinity") return std::numeric_limits<float>::infinity(); - if (str_ == "-Infinity") return -std::numeric_limits<float>::infinity(); - if (str_ == "NaN") return std::numeric_limits<float>::quiet_NaN(); - // SafeStrToFloat() is used instead of safe_strtof() because the later - // does not fail on inputs like SimpleDtoa(DBL_MAX). - return StringToNumber<float>(SafeStrToFloat); - } - return GenericConvert<float>(); -} - -StatusOr<bool> DataPiece::ToBool() const { - switch (type_) { - case TYPE_BOOL: - return bool_; - case TYPE_STRING: - return StringToNumber<bool>(safe_strtob); - default: - return InvalidArgument( - ValueAsStringOrDefault("Wrong type. Cannot convert to Bool.")); - } -} - -StatusOr<string> DataPiece::ToString() const { - switch (type_) { - case TYPE_STRING: - return str_.ToString(); - case TYPE_BYTES: { - string base64; - Base64Escape(str_, &base64); - return base64; - } - default: - return InvalidArgument( - ValueAsStringOrDefault("Cannot convert to string.")); - } -} - -string DataPiece::ValueAsStringOrDefault(StringPiece default_string) const { - switch (type_) { - case TYPE_INT32: - return SimpleItoa(i32_); - case TYPE_INT64: - return SimpleItoa(i64_); - case TYPE_UINT32: - return SimpleItoa(u32_); - case TYPE_UINT64: - return SimpleItoa(u64_); - case TYPE_DOUBLE: - return DoubleAsString(double_); - case TYPE_FLOAT: - return FloatAsString(float_); - case TYPE_BOOL: - return SimpleBtoa(bool_); - case TYPE_STRING: - return StrCat("\"", str_.ToString(), "\""); - case TYPE_BYTES: { - string base64; - WebSafeBase64Escape(str_, &base64); - return StrCat("\"", base64, "\""); - } - case TYPE_NULL: - return "null"; - default: - return default_string.ToString(); - } -} - -StatusOr<string> DataPiece::ToBytes() const { - if (type_ == TYPE_BYTES) return str_.ToString(); - if (type_ == TYPE_STRING) { - string decoded; - if (!DecodeBase64(str_, &decoded)) { - return InvalidArgument(ValueAsStringOrDefault("Invalid data in input.")); - } - return decoded; - } else { - return InvalidArgument(ValueAsStringOrDefault( - "Wrong type. Only String or Bytes can be converted to Bytes.")); - } -} - -StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type, - bool use_lower_camel_for_enums) const { - if (type_ == TYPE_NULL) return google::protobuf::NULL_VALUE; - - if (type_ == TYPE_STRING) { - // First try the given value as a name. - string enum_name = str_.ToString(); - const google::protobuf::EnumValue* value = - FindEnumValueByNameOrNull(enum_type, enum_name); - if (value != NULL) return value->number(); - - // Check if int version of enum is sent as string. - StatusOr<int32> int_value = ToInt32(); - if (int_value.ok()) { - if (const google::protobuf::EnumValue* enum_value = - FindEnumValueByNumberOrNull(enum_type, int_value.ValueOrDie())) { - return enum_value->number(); - } - } - - // Next try a normalized name. - for (string::iterator it = enum_name.begin(); it != enum_name.end(); ++it) { - *it = *it == '-' ? '_' : ascii_toupper(*it); - } - value = FindEnumValueByNameOrNull(enum_type, enum_name); - if (value != NULL) return value->number(); - - // If use_lower_camel_for_enums is true try with enum name without - // underscore. This will also accept camel case names as the enum_name has - // been normalized before. - if (use_lower_camel_for_enums) { - value = FindEnumValueByNameWithoutUnderscoreOrNull(enum_type, enum_name); - if (value != NULL) return value->number(); - } - } else { - // We don't need to check whether the value is actually declared in the - // enum because we preserve unknown enum values as well. - return ToInt32(); - } - return InvalidArgument( - ValueAsStringOrDefault("Cannot find enum with given value.")); -} - -template <typename To> -StatusOr<To> DataPiece::GenericConvert() const { - switch (type_) { - case TYPE_INT32: - return NumberConvertAndCheck<To, int32>(i32_); - case TYPE_INT64: - return NumberConvertAndCheck<To, int64>(i64_); - case TYPE_UINT32: - return NumberConvertAndCheck<To, uint32>(u32_); - case TYPE_UINT64: - return NumberConvertAndCheck<To, uint64>(u64_); - case TYPE_DOUBLE: - return NumberConvertAndCheck<To, double>(double_); - case TYPE_FLOAT: - return NumberConvertAndCheck<To, float>(float_); - default: // TYPE_ENUM, TYPE_STRING, TYPE_CORD, TYPE_BOOL - return InvalidArgument(ValueAsStringOrDefault( - "Wrong type. Bool, Enum, String and Cord not supported in " - "GenericConvert.")); - } -} - -template <typename To> -StatusOr<To> DataPiece::StringToNumber(bool (*func)(StringPiece, To*)) const { - if (str_.size() > 0 && (str_[0] == ' ' || str_[str_.size() - 1] == ' ')) { - return InvalidArgument(StrCat("\"", str_, "\"")); - } - To result; - if (func(str_, &result)) return result; - return InvalidArgument(StrCat("\"", str_.ToString(), "\"")); -} - -bool DataPiece::DecodeBase64(StringPiece src, string* dest) const { - // Try web-safe decode first, if it fails, try the non-web-safe decode. - if (WebSafeBase64Unescape(src, dest)) { - if (use_strict_base64_decoding_) { - // In strict mode, check if the escaped version gives us the same value as - // unescaped. - string encoded; - // WebSafeBase64Escape does no padding by default. - WebSafeBase64Escape(*dest, &encoded); - // Remove trailing padding '=' characters before comparison. - StringPiece src_no_padding = StringPiece(src).substr( - 0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length()); - return encoded == src_no_padding; - } - return true; - } - - if (Base64Unescape(src, dest)) { - if (use_strict_base64_decoding_) { - string encoded; - Base64Escape( - reinterpret_cast<const unsigned char*>(dest->data()), dest->length(), - &encoded, false); - StringPiece src_no_padding = StringPiece(src).substr( - 0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length()); - return encoded == src_no_padding; - } - return true; - } - - return false; -} - -void DataPiece::InternalCopy(const DataPiece& other) { - type_ = other.type_; - use_strict_base64_decoding_ = other.use_strict_base64_decoding_; - switch (type_) { - case TYPE_INT32: - case TYPE_INT64: - case TYPE_UINT32: - case TYPE_UINT64: - case TYPE_DOUBLE: - case TYPE_FLOAT: - case TYPE_BOOL: - case TYPE_ENUM: - case TYPE_NULL: - case TYPE_BYTES: - case TYPE_STRING: { - str_ = other.str_; - break; - } - } -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h deleted file mode 100644 index 83516d0972..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h +++ /dev/null @@ -1,219 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__ - -#include <string> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/statusor.h> - - -namespace google { -namespace protobuf { -class Enum; -} // namespace protobuf - - -namespace protobuf { -namespace util { -namespace converter { - -// Container for a single piece of data together with its data type. -// -// For primitive types (int32, int64, uint32, uint64, double, float, bool), -// the data is stored by value. -// -// For string, a StringPiece is stored. For Cord, a pointer to Cord is stored. -// Just like StringPiece, the DataPiece class does not own the storage for -// the actual string or Cord, so it is the user's responsiblity to guarantee -// that the underlying storage is still valid when the DataPiece is accessed. -class LIBPROTOBUF_EXPORT DataPiece { - public: - // Identifies data type of the value. - // These are the types supported by DataPiece. - enum Type { - TYPE_INT32 = 1, - TYPE_INT64 = 2, - TYPE_UINT32 = 3, - TYPE_UINT64 = 4, - TYPE_DOUBLE = 5, - TYPE_FLOAT = 6, - TYPE_BOOL = 7, - TYPE_ENUM = 8, - TYPE_STRING = 9, - TYPE_BYTES = 10, - TYPE_NULL = 11, // explicit NULL type - }; - - // Constructors and Destructor - explicit DataPiece(const int32 value) - : type_(TYPE_INT32), i32_(value), use_strict_base64_decoding_(false) {} - explicit DataPiece(const int64 value) - : type_(TYPE_INT64), i64_(value), use_strict_base64_decoding_(false) {} - explicit DataPiece(const uint32 value) - : type_(TYPE_UINT32), u32_(value), use_strict_base64_decoding_(false) {} - explicit DataPiece(const uint64 value) - : type_(TYPE_UINT64), u64_(value), use_strict_base64_decoding_(false) {} - explicit DataPiece(const double value) - : type_(TYPE_DOUBLE), - double_(value), - use_strict_base64_decoding_(false) {} - explicit DataPiece(const float value) - : type_(TYPE_FLOAT), float_(value), use_strict_base64_decoding_(false) {} - explicit DataPiece(const bool value) - : type_(TYPE_BOOL), bool_(value), use_strict_base64_decoding_(false) {} - DataPiece(StringPiece value, bool use_strict_base64_decoding) - : type_(TYPE_STRING), - str_(StringPiecePod::CreateFromStringPiece(value)), - use_strict_base64_decoding_(use_strict_base64_decoding) {} - // Constructor for bytes. The second parameter is not used. - DataPiece(StringPiece value, bool dummy, bool use_strict_base64_decoding) - : type_(TYPE_BYTES), - str_(StringPiecePod::CreateFromStringPiece(value)), - use_strict_base64_decoding_(use_strict_base64_decoding) {} - - DataPiece(const DataPiece& r) : type_(r.type_) { InternalCopy(r); } - - DataPiece& operator=(const DataPiece& x) { - InternalCopy(x); - return *this; - } - - static DataPiece NullData() { return DataPiece(TYPE_NULL, 0); } - - virtual ~DataPiece() { - } - - // Accessors - Type type() const { return type_; } - - bool use_strict_base64_decoding() { return use_strict_base64_decoding_; } - - StringPiece str() const { - GOOGLE_LOG_IF(DFATAL, type_ != TYPE_STRING) << "Not a string type."; - return str_; - } - - - // Parses, casts or converts the value stored in the DataPiece into an int32. - util::StatusOr<int32> ToInt32() const; - - // Parses, casts or converts the value stored in the DataPiece into a uint32. - util::StatusOr<uint32> ToUint32() const; - - // Parses, casts or converts the value stored in the DataPiece into an int64. - util::StatusOr<int64> ToInt64() const; - - // Parses, casts or converts the value stored in the DataPiece into a uint64. - util::StatusOr<uint64> ToUint64() const; - - // Parses, casts or converts the value stored in the DataPiece into a double. - util::StatusOr<double> ToDouble() const; - - // Parses, casts or converts the value stored in the DataPiece into a float. - util::StatusOr<float> ToFloat() const; - - // Parses, casts or converts the value stored in the DataPiece into a bool. - util::StatusOr<bool> ToBool() const; - - // Parses, casts or converts the value stored in the DataPiece into a string. - util::StatusOr<string> ToString() const; - - // Tries to convert the value contained in this datapiece to string. If the - // conversion fails, it returns the default_string. - string ValueAsStringOrDefault(StringPiece default_string) const; - - util::StatusOr<string> ToBytes() const; - - // Converts a value into protocol buffer enum number. If the value is a - // string, first attempts conversion by name, trying names as follows: - // 1) the directly provided string value. - // 2) the value upper-cased and replacing '-' by '_' - // 3) if use_lower_camel_for_enums is true it also attempts by comparing - // enum name without underscore with the value upper cased above. - // If the value is not a string, attempts to convert to a 32-bit integer. - // If none of these succeeds, returns a conversion error status. - util::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type, - bool use_lower_camel_for_enums) const; - - private: - // Disallow implicit constructor. - DataPiece(); - - // Helper to create NULL or ENUM types. - DataPiece(Type type, int32 val) - : type_(type), i32_(val), use_strict_base64_decoding_(false) {} - - // For numeric conversion between - // int32, int64, uint32, uint64, double, float and bool - template <typename To> - util::StatusOr<To> GenericConvert() const; - - // For conversion from string to - // int32, int64, uint32, uint64, double, float and bool - template <typename To> - util::StatusOr<To> StringToNumber(bool (*func)(StringPiece, To*)) const; - - // Decodes a base64 string. Returns true on success. - bool DecodeBase64(StringPiece src, string* dest) const; - - // Helper function to initialize this DataPiece with 'other'. - void InternalCopy(const DataPiece& other); - - // Data type for this piece of data. - Type type_; - - typedef ::google::protobuf::internal::StringPiecePod StringPiecePod; - - // Stored piece of data. - union { - int32 i32_; - int64 i64_; - uint32 u32_; - uint64 u64_; - double double_; - float float_; - bool bool_; - StringPiecePod str_; - }; - - // Uses a stricter version of base64 decoding for byte fields. - bool use_strict_base64_decoding_; -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc deleted file mode 100644 index 1772219ab2..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc +++ /dev/null @@ -1,601 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/default_value_objectwriter.h> - -#include <google/protobuf/stubs/hash.h> - -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/map_util.h> - -namespace google { -namespace protobuf { -namespace util { -using util::Status; -using util::StatusOr; -namespace converter { - -namespace { -// Helper function to convert string value to given data type by calling the -// passed converter function on the DataPiece created from "value" argument. -// If value is empty or if conversion fails, the default_value is returned. -template <typename T> -T ConvertTo(StringPiece value, StatusOr<T> (DataPiece::*converter_fn)() const, - T default_value) { - if (value.empty()) return default_value; - StatusOr<T> result = (DataPiece(value, true).*converter_fn)(); - return result.ok() ? result.ValueOrDie() : default_value; -} -} // namespace - -DefaultValueObjectWriter::DefaultValueObjectWriter( - TypeResolver* type_resolver, const google::protobuf::Type& type, - ObjectWriter* ow) - : typeinfo_(TypeInfo::NewTypeInfo(type_resolver)), - own_typeinfo_(true), - type_(type), - current_(NULL), - root_(NULL), - suppress_empty_list_(false), - field_scrub_callback_(NULL), - ow_(ow) {} - -DefaultValueObjectWriter::~DefaultValueObjectWriter() { - for (int i = 0; i < string_values_.size(); ++i) { - delete string_values_[i]; - } - if (own_typeinfo_) { - delete typeinfo_; - } -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBool(StringPiece name, - bool value) { - if (current_ == NULL) { - ow_->RenderBool(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt32( - StringPiece name, int32 value) { - if (current_ == NULL) { - ow_->RenderInt32(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint32( - StringPiece name, uint32 value) { - if (current_ == NULL) { - ow_->RenderUint32(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt64( - StringPiece name, int64 value) { - if (current_ == NULL) { - ow_->RenderInt64(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint64( - StringPiece name, uint64 value) { - if (current_ == NULL) { - ow_->RenderUint64(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderDouble( - StringPiece name, double value) { - if (current_ == NULL) { - ow_->RenderDouble(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderFloat( - StringPiece name, float value) { - if (current_ == NULL) { - ow_->RenderBool(name, value); - } else { - RenderDataPiece(name, DataPiece(value)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderString( - StringPiece name, StringPiece value) { - if (current_ == NULL) { - ow_->RenderString(name, value); - } else { - // Since StringPiece is essentially a pointer, takes a copy of "value" to - // avoid ownership issues. - string_values_.push_back(new string(value.ToString())); - RenderDataPiece(name, DataPiece(*string_values_.back(), true)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBytes( - StringPiece name, StringPiece value) { - if (current_ == NULL) { - ow_->RenderBytes(name, value); - } else { - // Since StringPiece is essentially a pointer, takes a copy of "value" to - // avoid ownership issues. - string_values_.push_back(new string(value.ToString())); - RenderDataPiece(name, DataPiece(*string_values_.back(), false, true)); - } - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::RenderNull( - StringPiece name) { - if (current_ == NULL) { - ow_->RenderNull(name); - } else { - RenderDataPiece(name, DataPiece::NullData()); - } - return this; -} - -void DefaultValueObjectWriter::RegisterFieldScrubCallBack( - FieldScrubCallBackPtr field_scrub_callback) { - field_scrub_callback_.reset(field_scrub_callback.release()); -} - -DefaultValueObjectWriter::Node::Node( - const string& name, const google::protobuf::Type* type, NodeKind kind, - const DataPiece& data, bool is_placeholder, const std::vector<string>& path, - bool suppress_empty_list, FieldScrubCallBack* field_scrub_callback) - : name_(name), - type_(type), - kind_(kind), - is_any_(false), - data_(data), - is_placeholder_(is_placeholder), - path_(path), - suppress_empty_list_(suppress_empty_list), - field_scrub_callback_(field_scrub_callback) {} - -DefaultValueObjectWriter::Node* DefaultValueObjectWriter::Node::FindChild( - StringPiece name) { - if (name.empty() || kind_ != OBJECT) { - return NULL; - } - for (int i = 0; i < children_.size(); ++i) { - Node* child = children_[i]; - if (child->name() == name) { - return child; - } - } - return NULL; -} - -void DefaultValueObjectWriter::Node::WriteTo(ObjectWriter* ow) { - if (kind_ == PRIMITIVE) { - ObjectWriter::RenderDataPieceTo(data_, name_, ow); - return; - } - - // Render maps. Empty maps are rendered as "{}". - if (kind_ == MAP) { - ow->StartObject(name_); - WriteChildren(ow); - ow->EndObject(); - return; - } - - // Write out lists. If we didn't have any list in response, write out empty - // list. - if (kind_ == LIST) { - // Suppress empty lists if requested. - if (suppress_empty_list_ && is_placeholder_) return; - - ow->StartList(name_); - WriteChildren(ow); - ow->EndList(); - return; - } - - // If is_placeholder_ = true, we didn't see this node in the response, so - // skip output. - if (is_placeholder_) return; - - ow->StartObject(name_); - WriteChildren(ow); - ow->EndObject(); -} - -void DefaultValueObjectWriter::Node::WriteChildren(ObjectWriter* ow) { - for (int i = 0; i < children_.size(); ++i) { - Node* child = children_[i]; - child->WriteTo(ow); - } -} - -const google::protobuf::Type* DefaultValueObjectWriter::Node::GetMapValueType( - const google::protobuf::Type& found_type, const TypeInfo* typeinfo) { - // If this field is a map, we should use the type of its "Value" as - // the type of the child node. - for (int i = 0; i < found_type.fields_size(); ++i) { - const google::protobuf::Field& sub_field = found_type.fields(i); - if (sub_field.number() != 2) { - continue; - } - if (sub_field.kind() != google::protobuf::Field_Kind_TYPE_MESSAGE) { - // This map's value type is not a message type. We don't need to - // get the field_type in this case. - break; - } - util::StatusOr<const google::protobuf::Type*> sub_type = - typeinfo->ResolveTypeUrl(sub_field.type_url()); - if (!sub_type.ok()) { - GOOGLE_LOG(WARNING) << "Cannot resolve type '" << sub_field.type_url() << "'."; - } else { - return sub_type.ValueOrDie(); - } - break; - } - return NULL; -} - -void DefaultValueObjectWriter::Node::PopulateChildren( - const TypeInfo* typeinfo) { - // Ignores well known types that don't require automatically populating their - // primitive children. For type "Any", we only populate its children when the - // "@type" field is set. - // TODO(tsun): remove "kStructValueType" from the list. It's being checked - // now because of a bug in the tool-chain that causes the "oneof_index" - // of kStructValueType to not be set correctly. - if (type_ == NULL || type_->name() == kAnyType || - type_->name() == kStructType || type_->name() == kTimestampType || - type_->name() == kDurationType || type_->name() == kStructValueType) { - return; - } - std::vector<Node*> new_children; - hash_map<string, int> orig_children_map; - - // Creates a map of child nodes to speed up lookup. - for (int i = 0; i < children_.size(); ++i) { - InsertIfNotPresent(&orig_children_map, children_[i]->name_, i); - } - - for (int i = 0; i < type_->fields_size(); ++i) { - const google::protobuf::Field& field = type_->fields(i); - - // This code is checking if the field to be added to the tree should be - // scrubbed or not by calling the field_scrub_callback_ callback function. - std::vector<string> path; - if (!path_.empty()) { - path.insert(path.begin(), path_.begin(), path_.end()); - } - path.push_back(field.name()); - if (field_scrub_callback_ != NULL && - field_scrub_callback_->Run(path, &field)) { - continue; - } - - hash_map<string, int>::iterator found = - orig_children_map.find(field.name()); - // If the child field has already been set, we just add it to the new list - // of children. - if (found != orig_children_map.end()) { - new_children.push_back(children_[found->second]); - children_[found->second] = NULL; - continue; - } - - const google::protobuf::Type* field_type = NULL; - bool is_map = false; - NodeKind kind = PRIMITIVE; - - if (field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) { - kind = OBJECT; - util::StatusOr<const google::protobuf::Type*> found_result = - typeinfo->ResolveTypeUrl(field.type_url()); - if (!found_result.ok()) { - // "field" is of an unknown type. - GOOGLE_LOG(WARNING) << "Cannot resolve type '" << field.type_url() << "'."; - } else { - const google::protobuf::Type* found_type = found_result.ValueOrDie(); - is_map = IsMap(field, *found_type); - - if (!is_map) { - field_type = found_type; - } else { - // If this field is a map, we should use the type of its "Value" as - // the type of the child node. - field_type = GetMapValueType(*found_type, typeinfo); - kind = MAP; - } - } - } - - if (!is_map && - field.cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) { - kind = LIST; - } - - // If oneof_index() != 0, the child field is part of a "oneof", which means - // the child field is optional and we shouldn't populate its default value. - if (field.oneof_index() != 0) continue; - - // If the child field is of primitive type, sets its data to the default - // value of its type. - google::protobuf::scoped_ptr<Node> child(new Node( - field.json_name(), field_type, kind, - kind == PRIMITIVE ? CreateDefaultDataPieceForField(field, typeinfo) - : DataPiece::NullData(), - true, path, suppress_empty_list_, field_scrub_callback_)); - new_children.push_back(child.release()); - } - // Adds all leftover nodes in children_ to the beginning of new_child. - for (int i = 0; i < children_.size(); ++i) { - if (children_[i] == NULL) { - continue; - } - new_children.insert(new_children.begin(), children_[i]); - children_[i] = NULL; - } - children_.swap(new_children); -} - -void DefaultValueObjectWriter::MaybePopulateChildrenOfAny(Node* node) { - // If this is an "Any" node with "@type" already given and no other children - // have been added, populates its children. - if (node != NULL && node->is_any() && node->type() != NULL && - node->type()->name() != kAnyType && node->number_of_children() == 1) { - node->PopulateChildren(typeinfo_); - } -} - -DataPiece DefaultValueObjectWriter::FindEnumDefault( - const google::protobuf::Field& field, const TypeInfo* typeinfo) { - if (!field.default_value().empty()) - return DataPiece(field.default_value(), true); - - const google::protobuf::Enum* enum_type = - typeinfo->GetEnumByTypeUrl(field.type_url()); - if (!enum_type) { - GOOGLE_LOG(WARNING) << "Could not find enum with type '" << field.type_url() - << "'"; - return DataPiece::NullData(); - } - // We treat the first value as the default if none is specified. - return enum_type->enumvalue_size() > 0 - ? DataPiece(enum_type->enumvalue(0).name(), true) - : DataPiece::NullData(); -} - -DataPiece DefaultValueObjectWriter::CreateDefaultDataPieceForField( - const google::protobuf::Field& field, const TypeInfo* typeinfo) { - switch (field.kind()) { - case google::protobuf::Field_Kind_TYPE_DOUBLE: { - return DataPiece(ConvertTo<double>( - field.default_value(), &DataPiece::ToDouble, static_cast<double>(0))); - } - case google::protobuf::Field_Kind_TYPE_FLOAT: { - return DataPiece(ConvertTo<float>( - field.default_value(), &DataPiece::ToFloat, static_cast<float>(0))); - } - case google::protobuf::Field_Kind_TYPE_INT64: - case google::protobuf::Field_Kind_TYPE_SINT64: - case google::protobuf::Field_Kind_TYPE_SFIXED64: { - return DataPiece(ConvertTo<int64>( - field.default_value(), &DataPiece::ToInt64, static_cast<int64>(0))); - } - case google::protobuf::Field_Kind_TYPE_UINT64: - case google::protobuf::Field_Kind_TYPE_FIXED64: { - return DataPiece(ConvertTo<uint64>( - field.default_value(), &DataPiece::ToUint64, static_cast<uint64>(0))); - } - case google::protobuf::Field_Kind_TYPE_INT32: - case google::protobuf::Field_Kind_TYPE_SINT32: - case google::protobuf::Field_Kind_TYPE_SFIXED32: { - return DataPiece(ConvertTo<int32>( - field.default_value(), &DataPiece::ToInt32, static_cast<int32>(0))); - } - case google::protobuf::Field_Kind_TYPE_BOOL: { - return DataPiece( - ConvertTo<bool>(field.default_value(), &DataPiece::ToBool, false)); - } - case google::protobuf::Field_Kind_TYPE_STRING: { - return DataPiece(field.default_value(), true); - } - case google::protobuf::Field_Kind_TYPE_BYTES: { - return DataPiece(field.default_value(), false, true); - } - case google::protobuf::Field_Kind_TYPE_UINT32: - case google::protobuf::Field_Kind_TYPE_FIXED32: { - return DataPiece(ConvertTo<uint32>( - field.default_value(), &DataPiece::ToUint32, static_cast<uint32>(0))); - } - case google::protobuf::Field_Kind_TYPE_ENUM: { - return FindEnumDefault(field, typeinfo); - } - default: { return DataPiece::NullData(); } - } -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::StartObject( - StringPiece name) { - if (current_ == NULL) { - std::vector<string> path; - root_.reset(new Node(name.ToString(), &type_, OBJECT, DataPiece::NullData(), - false, path, suppress_empty_list_, - field_scrub_callback_.get())); - root_->PopulateChildren(typeinfo_); - current_ = root_.get(); - return this; - } - MaybePopulateChildrenOfAny(current_); - Node* child = current_->FindChild(name); - if (current_->kind() == LIST || current_->kind() == MAP || child == NULL) { - // If current_ is a list or a map node, we should create a new child and use - // the type of current_ as the type of the new child. - google::protobuf::scoped_ptr<Node> node(new Node( - name.ToString(), ((current_->kind() == LIST || current_->kind() == MAP) - ? current_->type() - : NULL), - OBJECT, DataPiece::NullData(), false, - child == NULL ? current_->path() : child->path(), - suppress_empty_list_, field_scrub_callback_.get())); - child = node.get(); - current_->AddChild(node.release()); - } - - child->set_is_placeholder(false); - if (child->kind() == OBJECT && child->number_of_children() == 0) { - child->PopulateChildren(typeinfo_); - } - - stack_.push(current_); - current_ = child; - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::EndObject() { - if (stack_.empty()) { - // The root object ends here. Writes out the tree. - WriteRoot(); - return this; - } - current_ = stack_.top(); - stack_.pop(); - return this; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::StartList( - StringPiece name) { - if (current_ == NULL) { - std::vector<string> path; - root_.reset(new Node(name.ToString(), &type_, LIST, DataPiece::NullData(), - false, path, suppress_empty_list_, - field_scrub_callback_.get())); - current_ = root_.get(); - return this; - } - MaybePopulateChildrenOfAny(current_); - Node* child = current_->FindChild(name); - if (child == NULL || child->kind() != LIST) { - google::protobuf::scoped_ptr<Node> node( - new Node(name.ToString(), NULL, LIST, DataPiece::NullData(), false, - child == NULL ? current_->path() : child->path(), - suppress_empty_list_, field_scrub_callback_.get())); - child = node.get(); - current_->AddChild(node.release()); - } - child->set_is_placeholder(false); - - stack_.push(current_); - current_ = child; - return this; -} - -void DefaultValueObjectWriter::WriteRoot() { - root_->WriteTo(ow_); - root_.reset(NULL); - current_ = NULL; -} - -DefaultValueObjectWriter* DefaultValueObjectWriter::EndList() { - if (stack_.empty()) { - WriteRoot(); - return this; - } - current_ = stack_.top(); - stack_.pop(); - return this; -} - -void DefaultValueObjectWriter::RenderDataPiece(StringPiece name, - const DataPiece& data) { - MaybePopulateChildrenOfAny(current_); - if (current_->type() != NULL && current_->type()->name() == kAnyType && - name == "@type") { - util::StatusOr<string> data_string = data.ToString(); - if (data_string.ok()) { - const string& string_value = data_string.ValueOrDie(); - // If the type of current_ is "Any" and its "@type" field is being set - // here, sets the type of current_ to be the type specified by the - // "@type". - util::StatusOr<const google::protobuf::Type*> found_type = - typeinfo_->ResolveTypeUrl(string_value); - if (!found_type.ok()) { - GOOGLE_LOG(WARNING) << "Failed to resolve type '" << string_value << "'."; - } else { - current_->set_type(found_type.ValueOrDie()); - } - current_->set_is_any(true); - // If the "@type" field is placed after other fields, we should populate - // other children of primitive type now. Otherwise, we should wait until - // the first value field is rendered before we populate the children, - // because the "value" field of a Any message could be omitted. - if (current_->number_of_children() > 1 && current_->type() != NULL) { - current_->PopulateChildren(typeinfo_); - } - } - } - Node* child = current_->FindChild(name); - if (child == NULL || child->kind() != PRIMITIVE) { - // No children are found, creates a new child. - google::protobuf::scoped_ptr<Node> node( - new Node(name.ToString(), NULL, PRIMITIVE, data, false, - child == NULL ? current_->path() : child->path(), - suppress_empty_list_, field_scrub_callback_.get())); - current_->AddChild(node.release()); - } else { - child->set_data(data); - } -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h deleted file mode 100644 index dc4551c943..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h +++ /dev/null @@ -1,285 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__ - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <stack> -#include <vector> - -#include <google/protobuf/stubs/callback.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/internal/datapiece.h> -#include <google/protobuf/util/internal/object_writer.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/stubs/stringpiece.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// An ObjectWriter that renders non-repeated primitive fields of proto messages -// with their default values. DefaultValueObjectWriter holds objects, lists and -// fields it receives in a tree structure and writes them out to another -// ObjectWriter when EndObject() is called on the root object. It also writes -// out all non-repeated primitive fields that haven't been explicitly rendered -// with their default values (0 for numbers, "" for strings, etc). -class LIBPROTOBUF_EXPORT DefaultValueObjectWriter : public ObjectWriter { - public: - // A Callback function to check whether a field needs to be scrubbed. - // - // Returns true if the field should not be present in the output. Returns - // false otherwise. - // - // The 'path' parameter is a vector of path to the field from root. For - // example: if a nested field "a.b.c" (b is the parent message field of c and - // a is the parent message field of b), then the vector should contain { "a", - // "b", "c" }. - // - // The Field* should point to the google::protobuf::Field of "c". - typedef ResultCallback2<bool /*return*/, - const std::vector<string>& /*path of the field*/, - const google::protobuf::Field* /*field*/> - FieldScrubCallBack; - - // A unique pointer to a DefaultValueObjectWriter::FieldScrubCallBack. - typedef google::protobuf::scoped_ptr<FieldScrubCallBack> FieldScrubCallBackPtr; - - DefaultValueObjectWriter(TypeResolver* type_resolver, - const google::protobuf::Type& type, - ObjectWriter* ow); - - virtual ~DefaultValueObjectWriter(); - - // ObjectWriter methods. - virtual DefaultValueObjectWriter* StartObject(StringPiece name); - - virtual DefaultValueObjectWriter* EndObject(); - - virtual DefaultValueObjectWriter* StartList(StringPiece name); - - virtual DefaultValueObjectWriter* EndList(); - - virtual DefaultValueObjectWriter* RenderBool(StringPiece name, bool value); - - virtual DefaultValueObjectWriter* RenderInt32(StringPiece name, int32 value); - - virtual DefaultValueObjectWriter* RenderUint32(StringPiece name, - uint32 value); - - virtual DefaultValueObjectWriter* RenderInt64(StringPiece name, int64 value); - - virtual DefaultValueObjectWriter* RenderUint64(StringPiece name, - uint64 value); - - virtual DefaultValueObjectWriter* RenderDouble(StringPiece name, - double value); - - virtual DefaultValueObjectWriter* RenderFloat(StringPiece name, float value); - - virtual DefaultValueObjectWriter* RenderString(StringPiece name, - StringPiece value); - virtual DefaultValueObjectWriter* RenderBytes(StringPiece name, - StringPiece value); - - virtual DefaultValueObjectWriter* RenderNull(StringPiece name); - - // Register the callback for scrubbing of fields. Owership of - // field_scrub_callback pointer is also transferred to this class - void RegisterFieldScrubCallBack(FieldScrubCallBackPtr field_scrub_callback); - - // If set to true, empty lists are suppressed from output when default values - // are written. - void set_suppress_empty_list(bool value) { suppress_empty_list_ = value; } - - private: - enum NodeKind { - PRIMITIVE = 0, - OBJECT = 1, - LIST = 2, - MAP = 3, - }; - - // "Node" represents a node in the tree that holds the input of - // DefaultValueObjectWriter. - class LIBPROTOBUF_EXPORT Node { - public: - Node(const string& name, const google::protobuf::Type* type, NodeKind kind, - const DataPiece& data, bool is_placeholder, - const std::vector<string>& path, bool suppress_empty_list, - FieldScrubCallBack* field_scrub_callback); - virtual ~Node() { - for (int i = 0; i < children_.size(); ++i) { - delete children_[i]; - } - } - - // Adds a child to this node. Takes ownership of this child. - void AddChild(Node* child) { children_.push_back(child); } - - // Finds the child given its name. - Node* FindChild(StringPiece name); - - // Populates children of this Node based on its type. If there are already - // children created, they will be merged to the result. Caller should pass - // in TypeInfo for looking up types of the children. - void PopulateChildren(const TypeInfo* typeinfo); - - // If this node is a leaf (has data), writes the current node to the - // ObjectWriter; if not, then recursively writes the children to the - // ObjectWriter. - void WriteTo(ObjectWriter* ow); - - // Accessors - const string& name() const { return name_; } - - const std::vector<string>& path() const { return path_; } - - const google::protobuf::Type* type() const { return type_; } - - void set_type(const google::protobuf::Type* type) { type_ = type; } - - NodeKind kind() const { return kind_; } - - int number_of_children() const { return children_.size(); } - - void set_data(const DataPiece& data) { data_ = data; } - - bool is_any() const { return is_any_; } - - void set_is_any(bool is_any) { is_any_ = is_any; } - - void set_is_placeholder(bool is_placeholder) { - is_placeholder_ = is_placeholder; - } - - private: - // Returns the Value Type of a map given the Type of the map entry and a - // TypeInfo instance. - const google::protobuf::Type* GetMapValueType( - const google::protobuf::Type& entry_type, const TypeInfo* typeinfo); - - // Calls WriteTo() on every child in children_. - void WriteChildren(ObjectWriter* ow); - - // The name of this node. - string name_; - // google::protobuf::Type of this node. Owned by TypeInfo. - const google::protobuf::Type* type_; - // The kind of this node. - NodeKind kind_; - // Whether this is a node for "Any". - bool is_any_; - // The data of this node when it is a leaf node. - DataPiece data_; - // Children of this node. - std::vector<Node*> children_; - // Whether this node is a placeholder for an object or list automatically - // generated when creating the parent node. Should be set to false after - // the parent node's StartObject()/StartList() method is called with this - // node's name. - bool is_placeholder_; - - // Path of the field of this node - std::vector<string> path_; - - // Whether to suppress empty list output. - bool suppress_empty_list_; - - // Pointer to function for determining whether a field needs to be scrubbed - // or not. This callback is owned by the creator of this node. - FieldScrubCallBack* field_scrub_callback_; - - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node); - }; - - // Populates children of "node" if it is an "any" Node and its real type has - // been given. - void MaybePopulateChildrenOfAny(Node* node); - - // Writes the root_ node to ow_ and resets the root_ and current_ pointer to - // NULL. - void WriteRoot(); - - // Creates a DataPiece containing the default value of the type of the field. - static DataPiece CreateDefaultDataPieceForField( - const google::protobuf::Field& field, const TypeInfo* typeinfo); - - // Adds or replaces the data_ of a primitive child node. - void RenderDataPiece(StringPiece name, const DataPiece& data); - - // Returns the default enum value as a DataPiece, or the first enum value if - // there is no default. For proto3, where we cannot specify an explicit - // default, a zero value will always be returned. - static DataPiece FindEnumDefault(const google::protobuf::Field& field, - const TypeInfo* typeinfo); - - // Type information for all the types used in the descriptor. Used to find - // google::protobuf::Type of nested messages/enums. - const TypeInfo* typeinfo_; - // Whether the TypeInfo object is owned by this class. - bool own_typeinfo_; - // google::protobuf::Type of the root message type. - const google::protobuf::Type& type_; - // Holds copies of strings passed to RenderString. - std::vector<string*> string_values_; - - // The current Node. Owned by its parents. - Node* current_; - // The root Node. - google::protobuf::scoped_ptr<Node> root_; - // The stack to hold the path of Nodes from current_ to root_; - std::stack<Node*> stack_; - - // Whether to suppress output of empty lists. - bool suppress_empty_list_; - - // Unique Pointer to function for determining whether a field needs to be - // scrubbed or not. - FieldScrubCallBackPtr field_scrub_callback_; - - ObjectWriter* ow_; - - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DefaultValueObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc deleted file mode 100644 index e1dd697aec..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc +++ /dev/null @@ -1,189 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/default_value_objectwriter.h> -#include <google/protobuf/util/internal/expecting_objectwriter.h> -#include <google/protobuf/util/internal/testdata/default_value_test.pb.h> -#include <google/protobuf/util/internal/type_info_test_helper.h> -#include <google/protobuf/util/internal/constants.h> -#include <gtest/gtest.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { -namespace testing { - -using google::protobuf::testing::DefaultValueTest; - -// Base class for setting up required state for running default values tests on -// different descriptors. -class BaseDefaultValueObjectWriterTest - : public ::testing::TestWithParam<testing::TypeInfoSource> { - protected: - explicit BaseDefaultValueObjectWriterTest(const Descriptor* descriptor) - : helper_(GetParam()), mock_(), expects_(&mock_) { - helper_.ResetTypeInfo(descriptor); - testing_.reset(helper_.NewDefaultValueWriter( - string(kTypeServiceBaseUrl) + "/" + descriptor->full_name(), &mock_)); - } - - virtual ~BaseDefaultValueObjectWriterTest() {} - - TypeInfoTestHelper helper_; - MockObjectWriter mock_; - ExpectingObjectWriter expects_; - google::protobuf::scoped_ptr<DefaultValueObjectWriter> testing_; -}; - -// Tests to cover some basic DefaultValueObjectWriter use cases. More tests are -// in the marshalling_test.cc and translator_integration_test.cc. -class DefaultValueObjectWriterTest : public BaseDefaultValueObjectWriterTest { - protected: - DefaultValueObjectWriterTest() - : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) {} - virtual ~DefaultValueObjectWriterTest() {} -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - DefaultValueObjectWriterTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(DefaultValueObjectWriterTest, Empty) { - // Set expectation - expects_.StartObject("") - ->RenderDouble("doubleValue", 0.0) - ->StartList("repeatedDouble") - ->EndList() - ->RenderFloat("floatValue", 0.0) - ->RenderInt64("int64Value", 0) - ->RenderUint64("uint64Value", 0) - ->RenderInt32("int32Value", 0) - ->RenderUint32("uint32Value", 0) - ->RenderBool("boolValue", false) - ->RenderString("stringValue", "") - ->RenderBytes("bytesValue", "") - ->RenderString("enumValue", "ENUM_FIRST") - ->EndObject(); - - // Actual testing - testing_->StartObject("")->EndObject(); -} - -TEST_P(DefaultValueObjectWriterTest, NonDefaultDouble) { - // Set expectation - expects_.StartObject("") - ->RenderDouble("doubleValue", 1.0) - ->StartList("repeatedDouble") - ->EndList() - ->RenderFloat("floatValue", 0.0) - ->RenderInt64("int64Value", 0) - ->RenderUint64("uint64Value", 0) - ->RenderInt32("int32Value", 0) - ->RenderUint32("uint32Value", 0) - ->RenderBool("boolValue", false) - ->RenderString("stringValue", "") - ->RenderString("enumValue", "ENUM_FIRST") - ->EndObject(); - - // Actual testing - testing_->StartObject("")->RenderDouble("doubleValue", 1.0)->EndObject(); -} - -TEST_P(DefaultValueObjectWriterTest, ShouldRetainUnknownField) { - // Set expectation - expects_.StartObject("") - ->RenderDouble("doubleValue", 1.0) - ->StartList("repeatedDouble") - ->EndList() - ->RenderFloat("floatValue", 0.0) - ->RenderInt64("int64Value", 0) - ->RenderUint64("uint64Value", 0) - ->RenderInt32("int32Value", 0) - ->RenderUint32("uint32Value", 0) - ->RenderBool("boolValue", false) - ->RenderString("stringValue", "") - ->RenderString("unknown", "abc") - ->StartObject("unknownObject") - ->RenderString("unknown", "def") - ->EndObject() - ->RenderString("enumValue", "ENUM_FIRST") - ->EndObject(); - - // Actual testing - testing_->StartObject("") - ->RenderDouble("doubleValue", 1.0) - ->RenderString("unknown", "abc") - ->StartObject("unknownObject") - ->RenderString("unknown", "def") - ->EndObject() - ->EndObject(); -} - - -class DefaultValueObjectWriterSuppressListTest - : public BaseDefaultValueObjectWriterTest { - protected: - DefaultValueObjectWriterSuppressListTest() - : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) { - testing_->set_suppress_empty_list(true); - } - ~DefaultValueObjectWriterSuppressListTest() {} -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - DefaultValueObjectWriterSuppressListTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(DefaultValueObjectWriterSuppressListTest, Empty) { - // Set expectation. Emtpy lists should be suppressed. - expects_.StartObject("") - ->RenderDouble("doubleValue", 0.0) - ->RenderFloat("floatValue", 0.0) - ->RenderInt64("int64Value", 0) - ->RenderUint64("uint64Value", 0) - ->RenderInt32("int32Value", 0) - ->RenderUint32("uint32Value", 0) - ->RenderBool("boolValue", false) - ->RenderString("stringValue", "") - ->RenderBytes("bytesValue", "") - ->RenderString("enumValue", "ENUM_FIRST") - ->EndObject(); - - // Actual testing - testing_->StartObject("")->EndObject(); -} -} // namespace testing -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc deleted file mode 100644 index 538307bae2..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/error_listener.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h deleted file mode 100644 index 1dc814a360..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h +++ /dev/null @@ -1,103 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__ - -#include <algorithm> -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <string> -#include <vector> - -#include <google/protobuf/stubs/callback.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/util/internal/location_tracker.h> -#include <google/protobuf/stubs/stringpiece.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// Interface for error listener. -class LIBPROTOBUF_EXPORT ErrorListener { - public: - virtual ~ErrorListener() {} - - // Reports an invalid name at the given location. - virtual void InvalidName(const LocationTrackerInterface& loc, - StringPiece invalid_name, StringPiece message) = 0; - - // Reports an invalid value for a field. - virtual void InvalidValue(const LocationTrackerInterface& loc, - StringPiece type_name, StringPiece value) = 0; - - // Reports a missing required field. - virtual void MissingField(const LocationTrackerInterface& loc, - StringPiece missing_name) = 0; - - protected: - ErrorListener() {} - - private: - // Do not add any data members to this class. - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorListener); -}; - -// An error listener that ignores all errors. -class LIBPROTOBUF_EXPORT NoopErrorListener : public ErrorListener { - public: - NoopErrorListener() {} - virtual ~NoopErrorListener() {} - - virtual void InvalidName(const LocationTrackerInterface& loc, - StringPiece invalid_name, StringPiece message) {} - - virtual void InvalidValue(const LocationTrackerInterface& loc, - StringPiece type_name, StringPiece value) {} - - virtual void MissingField(const LocationTrackerInterface& loc, - StringPiece missing_name) {} - - private: - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NoopErrorListener); -}; - - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h deleted file mode 100644 index ae98ddd86a..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h +++ /dev/null @@ -1,238 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__ - -// An implementation of ObjectWriter that automatically sets the -// gmock expectations for the response to a method. Every method -// returns the object itself for chaining. -// -// Usage: -// // Setup -// MockObjectWriter mock; -// ExpectingObjectWriter ow(&mock); -// -// // Set expectation -// ow.StartObject("") -// ->RenderString("key", "value") -// ->EndObject(); -// -// // Actual testing -// mock.StartObject(StringPiece()) -// ->RenderString("key", "value") -// ->EndObject(); - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/object_writer.h> -#include <gmock/gmock.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using testing::IsEmpty; -using testing::NanSensitiveDoubleEq; -using testing::NanSensitiveFloatEq; -using testing::Return; -using testing::StrEq; -using testing::TypedEq; - -class MockObjectWriter : public ObjectWriter { - public: - MockObjectWriter() {} - - MOCK_METHOD1(StartObject, ObjectWriter*(StringPiece)); - MOCK_METHOD0(EndObject, ObjectWriter*()); - MOCK_METHOD1(StartList, ObjectWriter*(StringPiece)); - MOCK_METHOD0(EndList, ObjectWriter*()); - MOCK_METHOD2(RenderBool, ObjectWriter*(StringPiece, bool)); - MOCK_METHOD2(RenderInt32, ObjectWriter*(StringPiece, int32)); - MOCK_METHOD2(RenderUint32, ObjectWriter*(StringPiece, uint32)); - MOCK_METHOD2(RenderInt64, ObjectWriter*(StringPiece, int64)); - MOCK_METHOD2(RenderUint64, ObjectWriter*(StringPiece, uint64)); - MOCK_METHOD2(RenderDouble, ObjectWriter*(StringPiece, double)); - MOCK_METHOD2(RenderFloat, ObjectWriter*(StringPiece, float)); - MOCK_METHOD2(RenderString, ObjectWriter*(StringPiece, StringPiece)); - MOCK_METHOD2(RenderBytes, ObjectWriter*(StringPiece, StringPiece)); - MOCK_METHOD1(RenderNull, ObjectWriter*(StringPiece)); -}; - -class ExpectingObjectWriter : public ObjectWriter { - public: - explicit ExpectingObjectWriter(MockObjectWriter* mock) : mock_(mock) {} - - virtual ObjectWriter* StartObject(StringPiece name) { - (name.empty() - ? EXPECT_CALL(*mock_, StartObject(IsEmpty())) - : EXPECT_CALL(*mock_, StartObject(StrEq(name.ToString())))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* EndObject() { - EXPECT_CALL(*mock_, EndObject()) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* StartList(StringPiece name) { - (name.empty() - ? EXPECT_CALL(*mock_, StartList(IsEmpty())) - : EXPECT_CALL(*mock_, StartList(StrEq(name.ToString())))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* EndList() { - EXPECT_CALL(*mock_, EndList()) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderBool(StringPiece name, bool value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderBool(IsEmpty(), TypedEq<bool>(value))) - : EXPECT_CALL(*mock_, RenderBool(StrEq(name.ToString()), - TypedEq<bool>(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderInt32(StringPiece name, int32 value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderInt32(IsEmpty(), TypedEq<int32>(value))) - : EXPECT_CALL(*mock_, RenderInt32(StrEq(name.ToString()), - TypedEq<int32>(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderUint32(StringPiece name, uint32 value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderUint32(IsEmpty(), TypedEq<uint32>(value))) - : EXPECT_CALL(*mock_, RenderUint32(StrEq(name.ToString()), - TypedEq<uint32>(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderInt64(StringPiece name, int64 value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderInt64(IsEmpty(), TypedEq<int64>(value))) - : EXPECT_CALL(*mock_, RenderInt64(StrEq(name.ToString()), - TypedEq<int64>(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderUint64(StringPiece name, uint64 value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderUint64(IsEmpty(), TypedEq<uint64>(value))) - : EXPECT_CALL(*mock_, RenderUint64(StrEq(name.ToString()), - TypedEq<uint64>(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderDouble(StringPiece name, double value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderDouble(IsEmpty(), - NanSensitiveDoubleEq(value))) - : EXPECT_CALL(*mock_, RenderDouble(StrEq(name.ToString()), - NanSensitiveDoubleEq(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderFloat(StringPiece name, float value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderFloat(IsEmpty(), - NanSensitiveFloatEq(value))) - : EXPECT_CALL(*mock_, RenderFloat(StrEq(name.ToString()), - NanSensitiveFloatEq(value)))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderString(StringPiece name, StringPiece value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderString(IsEmpty(), - TypedEq<StringPiece>(value.ToString()))) - : EXPECT_CALL(*mock_, RenderString(StrEq(name.ToString()), - TypedEq<StringPiece>(value.ToString())))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) { - (name.empty() - ? EXPECT_CALL(*mock_, RenderBytes(IsEmpty(), TypedEq<StringPiece>( - value.ToString()))) - : EXPECT_CALL(*mock_, - RenderBytes(StrEq(name.ToString()), - TypedEq<StringPiece>(value.ToString())))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation(); - return this; - } - - virtual ObjectWriter* RenderNull(StringPiece name) { - (name.empty() ? EXPECT_CALL(*mock_, RenderNull(IsEmpty())) - : EXPECT_CALL(*mock_, RenderNull(StrEq(name.ToString()))) - .WillOnce(Return(mock_)) - .RetiresOnSaturation()); - return this; - } - - private: - MockObjectWriter* mock_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ExpectingObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc deleted file mode 100644 index 53b90fb05d..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc +++ /dev/null @@ -1,225 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/field_mask_utility.h> - -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/status_macros.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -namespace { -inline util::Status CallPathSink(PathSinkCallback path_sink, - StringPiece arg) { - return path_sink->Run(arg); -} - -util::Status CreatePublicError(util::error::Code code, - const string& message) { - return util::Status(code, message); -} - -// Appends a FieldMask path segment to a prefix. -string AppendPathSegmentToPrefix(StringPiece prefix, StringPiece segment) { - if (prefix.empty()) { - return segment.ToString(); - } - if (segment.empty()) { - return prefix.ToString(); - } - // If the segment is a map key, appends it to the prefix without the ".". - if (segment.starts_with("[\"")) { - return StrCat(prefix, segment); - } - return StrCat(prefix, ".", segment); -} - -} // namespace - -string ConvertFieldMaskPath(const StringPiece path, - ConverterCallback converter) { - string result; - result.reserve(path.size() << 1); - - bool is_quoted = false; - bool is_escaping = false; - int current_segment_start = 0; - - // Loops until 1 passed the end of the input to make handling the last - // segment easier. - for (size_t i = 0; i <= path.size(); ++i) { - // Outputs quoted string as-is. - if (is_quoted) { - if (i == path.size()) { - break; - } - result.push_back(path[i]); - if (is_escaping) { - is_escaping = false; - } else if (path[i] == '\\') { - is_escaping = true; - } else if (path[i] == '\"') { - current_segment_start = i + 1; - is_quoted = false; - } - continue; - } - if (i == path.size() || path[i] == '.' || path[i] == '(' || - path[i] == ')' || path[i] == '\"') { - result += converter( - path.substr(current_segment_start, i - current_segment_start)); - if (i < path.size()) { - result.push_back(path[i]); - } - current_segment_start = i + 1; - } - if (i < path.size() && path[i] == '\"') { - is_quoted = true; - } - } - return result; -} - -util::Status DecodeCompactFieldMaskPaths(StringPiece paths, - PathSinkCallback path_sink) { - std::stack<string> prefix; - int length = paths.length(); - int previous_position = 0; - bool in_map_key = false; - bool is_escaping = false; - // Loops until 1 passed the end of the input to make the handle of the last - // segment easier. - for (int i = 0; i <= length; ++i) { - if (i != length) { - // Skips everything in a map key until we hit the end of it, which is - // marked by an un-escaped '"' immediately followed by a ']'. - if (in_map_key) { - if (is_escaping) { - is_escaping = false; - continue; - } - if (paths[i] == '\\') { - is_escaping = true; - continue; - } - if (paths[i] != '\"') { - continue; - } - // Un-escaped '"' must be followed with a ']'. - if (i >= length - 1 || paths[i + 1] != ']') { - return util::Status( - util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Map keys should be represented as [\"some_key\"].")); - } - // The end of the map key ("\"]") has been found. - in_map_key = false; - // Skips ']'. - i++; - // Checks whether the key ends at the end of a path segment. - if (i < length - 1 && paths[i + 1] != '.' && paths[i + 1] != ',' && - paths[i + 1] != ')' && paths[i + 1] != '(') { - return util::Status( - util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Map keys should be at the end of a path segment.")); - } - is_escaping = false; - continue; - } - - // We are not in a map key, look for the start of one. - if (paths[i] == '[') { - if (i >= length - 1 || paths[i + 1] != '\"') { - return util::Status( - util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Map keys should be represented as [\"some_key\"].")); - } - // "[\"" starts a map key. - in_map_key = true; - i++; // Skips the '\"'. - continue; - } - // If the current character is not a special character (',', '(' or ')'), - // continue to the next. - if (paths[i] != ',' && paths[i] != ')' && paths[i] != '(') { - continue; - } - } - // Gets the current segment - sub-string between previous position (after - // '(', ')', ',', or the beginning of the input) and the current position. - StringPiece segment = - paths.substr(previous_position, i - previous_position); - string current_prefix = prefix.empty() ? "" : prefix.top(); - - if (i < length && paths[i] == '(') { - // Builds a prefix and save it into the stack. - prefix.push(AppendPathSegmentToPrefix(current_prefix, segment)); - } else if (!segment.empty()) { - // When the current charactor is ')', ',' or the current position has - // passed the end of the input, builds and outputs a new paths by - // concatenating the last prefix with the current segment. - RETURN_IF_ERROR(CallPathSink( - path_sink, AppendPathSegmentToPrefix(current_prefix, segment))); - } - - // Removes the last prefix after seeing a ')'. - if (i < length && paths[i] == ')') { - if (prefix.empty()) { - return util::Status( - util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Cannot find matching '(' for all ')'.")); - } - prefix.pop(); - } - previous_position = i + 1; - } - if (in_map_key) { - return util::Status(util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Cannot find matching ']' for all '['.")); - } - if (!prefix.empty()) { - return util::Status(util::error::INVALID_ARGUMENT, - StrCat("Invalid FieldMask '", paths, - "'. Cannot find matching ')' for all '('.")); - } - return util::Status::OK; -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h deleted file mode 100644 index 59f36f756f..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h +++ /dev/null @@ -1,72 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// FieldMask related utility methods. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__ - -#include <functional> -#include <stack> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/status.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -typedef string (*ConverterCallback)(StringPiece); -typedef ResultCallback1<util::Status, StringPiece>* PathSinkCallback; - -// Applies a 'converter' to each segment of a FieldMask path and returns the -// result. Quoted strings in the 'path' are copied to the output as-is without -// converting their content. Escaping is supported within quoted strings. -// For example, "ab\"_c" will be returned as "ab\"_c" without any changes. -string ConvertFieldMaskPath(const StringPiece path, - ConverterCallback converter); - -// Decodes a compact list of FieldMasks. For example, "a.b,a.c.d,a.c.e" will be -// decoded into a list of field paths - "a.b", "a.c.d", "a.c.e". And the results -// will be sent to 'path_sink', i.e. 'path_sink' will be called once per -// resulting path. -// Note that we also support Apiary style FieldMask form. The above example in -// the Apiary style will look like "a.b,a.c(d,e)". -util::Status DecodeCompactFieldMaskPaths(StringPiece paths, - PathSinkCallback path_sink); - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc deleted file mode 100644 index 47e4dd6df9..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc +++ /dev/null @@ -1,404 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/json_escaping.h> - -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -namespace { - -// Array of hex characters for conversion to hex. -static const char kHex[] = "0123456789abcdef"; - -// Characters 0x00 to 0x9f are very commonly used, so we provide a special -// table lookup. -// -// For unicode code point ch < 0xa0: -// kCommonEscapes[ch] is the escaped string of ch, if escaping is needed; -// or an empty string, if escaping is not needed. -static const char kCommonEscapes[160][7] = { - // C0 (ASCII and derivatives) control characters - "\\u0000", "\\u0001", "\\u0002", "\\u0003", // 0x00 - "\\u0004", "\\u0005", "\\u0006", "\\u0007", - "\\b", "\\t", "\\n", "\\u000b", - "\\f", "\\r", "\\u000e", "\\u000f", - "\\u0010", "\\u0011", "\\u0012", "\\u0013", // 0x10 - "\\u0014", "\\u0015", "\\u0016", "\\u0017", - "\\u0018", "\\u0019", "\\u001a", "\\u001b", - "\\u001c", "\\u001d", "\\u001e", "\\u001f", - // Escaping of " and \ are required by www.json.org string definition. - // Escaping of < and > are required for HTML security. - "", "", "\\\"", "", "", "", "", "", // 0x20 - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", // 0x30 - "", "", "", "", "\\u003c", "", "\\u003e", "", - "", "", "", "", "", "", "", "", // 0x40 - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", // 0x50 - "", "", "", "", "\\\\", "", "", "", - "", "", "", "", "", "", "", "", // 0x60 - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", // 0x70 - "", "", "", "", "", "", "", "\\u007f", - // C1 (ISO 8859 and Unicode) extended control characters - "\\u0080", "\\u0081", "\\u0082", "\\u0083", // 0x80 - "\\u0084", "\\u0085", "\\u0086", "\\u0087", - "\\u0088", "\\u0089", "\\u008a", "\\u008b", - "\\u008c", "\\u008d", "\\u008e", "\\u008f", - "\\u0090", "\\u0091", "\\u0092", "\\u0093", // 0x90 - "\\u0094", "\\u0095", "\\u0096", "\\u0097", - "\\u0098", "\\u0099", "\\u009a", "\\u009b", - "\\u009c", "\\u009d", "\\u009e", "\\u009f" -}; - -// Determines if the given char value is a unicode high-surrogate code unit. -// Such values do not represent characters by themselves, but are used in the -// representation of supplementary characters in the utf-16 encoding. -inline bool IsHighSurrogate(uint16 c) { - // Optimized form of: - // return c >= kMinHighSurrogate && c <= kMaxHighSurrogate; - // (Reduced from 3 ALU instructions to 2 ALU instructions) - return (c & ~(JsonEscaping::kMaxHighSurrogate - - JsonEscaping::kMinHighSurrogate)) - == JsonEscaping::kMinHighSurrogate; -} - -// Determines if the given char value is a unicode low-surrogate code unit. -// Such values do not represent characters by themselves, but are used in the -// representation of supplementary characters in the utf-16 encoding. -inline bool IsLowSurrogate(uint16 c) { - // Optimized form of: - // return c >= kMinLowSurrogate && c <= kMaxLowSurrogate; - // (Reduced from 3 ALU instructions to 2 ALU instructions) - return (c & ~(JsonEscaping::kMaxLowSurrogate - - JsonEscaping::kMinLowSurrogate)) - == JsonEscaping::kMinLowSurrogate; -} - -// Determines if the given char value is a unicode surrogate code unit (either -// high-surrogate or low-surrogate). -inline bool IsSurrogate(uint32 c) { - // Optimized form of: - // return c >= kMinHighSurrogate && c <= kMaxLowSurrogate; - // (Reduced from 3 ALU instructions to 2 ALU instructions) - return (c & 0xfffff800) == JsonEscaping::kMinHighSurrogate; -} - -// Returns true if the given unicode code point cp is -// in the supplementary character range. -inline bool IsSupplementalCodePoint(uint32 cp) { - // Optimized form of: - // return kMinSupplementaryCodePoint <= cp && cp <= kMaxCodePoint; - // (Reduced from 3 ALU instructions to 2 ALU instructions) - return (cp & ~(JsonEscaping::kMinSupplementaryCodePoint - 1)) - < JsonEscaping::kMaxCodePoint; -} - -// Returns true if the given unicode code point cp is a valid -// unicode code point (i.e. in the range 0 <= cp <= kMaxCodePoint). -inline bool IsValidCodePoint(uint32 cp) { - return cp <= JsonEscaping::kMaxCodePoint; -} - -// Converts the specified surrogate pair to its supplementary code point value. -// It is the callers' responsibility to validate the specified surrogate pair. -inline uint32 ToCodePoint(uint16 high, uint16 low) { - // Optimized form of: - // return ((high - kMinHighSurrogate) << 10) - // + (low - kMinLowSurrogate) - // + kMinSupplementaryCodePoint; - // (Reduced from 5 ALU instructions to 3 ALU instructions) - return (high << 10) + low + - (JsonEscaping::kMinSupplementaryCodePoint - - (static_cast<unsigned>(JsonEscaping::kMinHighSurrogate) << 10) - - JsonEscaping::kMinLowSurrogate); -} - -// Returns the low surrogate for the given unicode code point. The result is -// meaningless if the given code point is not a supplementary character. -inline uint16 ToLowSurrogate(uint32 cp) { - return (cp & (JsonEscaping::kMaxLowSurrogate - - JsonEscaping::kMinLowSurrogate)) - + JsonEscaping::kMinLowSurrogate; -} - -// Returns the high surrogate for the given unicode code point. The result is -// meaningless if the given code point is not a supplementary character. -inline uint16 ToHighSurrogate(uint32 cp) { - return (cp >> 10) + (JsonEscaping::kMinHighSurrogate - - (JsonEscaping::kMinSupplementaryCodePoint >> 10)); -} - -// Input str is encoded in UTF-8. A unicode code point could be encoded in -// UTF-8 using anywhere from 1 to 4 characters, and it could span multiple -// reads of the ByteSource. -// -// This function reads the next unicode code point from the input (str) at -// the given position (index), taking into account any left-over partial -// code point from the previous iteration (cp), together with the number -// of characters left to read to complete this code point (num_left). -// -// This function assumes that the input (str) is valid at the given position -// (index). In order words, at least one character could be read successfully. -// -// The code point read (partial or complete) is stored in (cp). Upon return, -// (num_left) stores the number of characters that has yet to be read in -// order to complete the current unicode code point. If the read is complete, -// then (num_left) is 0. Also, (num_read) is the number of characters read. -// -// Returns false if we encounter an invalid UTF-8 string. Returns true -// otherwise, including the case when we reach the end of the input (str) -// before a complete unicode code point is read. -bool ReadCodePoint(StringPiece str, int index, - uint32 *cp, int* num_left, int *num_read) { - if (*num_left == 0) { - // Last read was complete. Start reading a new unicode code point. - *cp = static_cast<uint8>(str[index++]); - *num_read = 1; - // The length of the code point is determined from reading the first byte. - // - // If the first byte is between: - // 0..0x7f: that's the value of the code point. - // 0x80..0xbf: <invalid> - // 0xc0..0xdf: 11-bit code point encoded in 2 bytes. - // bit 10-6, bit 5-0 - // 0xe0..0xef: 16-bit code point encoded in 3 bytes. - // bit 15-12, bit 11-6, bit 5-0 - // 0xf0..0xf7: 21-bit code point encoded in 4 bytes. - // bit 20-18, bit 17-12, bit 11-6, bit 5-0 - // 0xf8..0xff: <invalid> - // - // Meaning of each bit: - // <msb> bit 7: 0 - single byte code point: bits 6-0 are values. - // 1 - multibyte code point - // bit 6: 0 - subsequent bytes of multibyte code point: - // bits 5-0 are values. - // 1 - first byte of multibyte code point - // bit 5: 0 - first byte of 2-byte code point: bits 4-0 are values. - // 1 - first byte of code point with >= 3 bytes. - // bit 4: 0 - first byte of 3-byte code point: bits 3-0 are values. - // 1 - first byte of code point with >= 4 bytes. - // bit 3: 0 - first byte of 4-byte code point: bits 2-0 are values. - // 1 - reserved for future expansion. - if (*cp <= 0x7f) { - return true; - } else if (*cp <= 0xbf) { - return false; - } else if (*cp <= 0xdf) { - *cp &= 0x1f; - *num_left = 1; - } else if (*cp <= 0xef) { - *cp &= 0x0f; - *num_left = 2; - } else if (*cp <= 0xf7) { - *cp &= 0x07; - *num_left = 3; - } else { - return false; - } - } else { - // Last read was partial. Initialize num_read to 0 and continue reading - // the last unicode code point. - *num_read = 0; - } - while (*num_left > 0 && index < str.size()) { - uint32 ch = static_cast<uint8>(str[index++]); - --(*num_left); - ++(*num_read); - *cp = (*cp << 6) | (ch & 0x3f); - if (ch < 0x80 || ch > 0xbf) return false; - } - return *num_left > 0 || (!IsSurrogate(*cp) && IsValidCodePoint(*cp)); -} - -// Stores the 16-bit unicode code point as its hexadecimal digits in buffer -// and returns a StringPiece that points to this buffer. The input buffer needs -// to be at least 6 bytes long. -StringPiece ToHex(uint16 cp, char* buffer) { - buffer[5] = kHex[cp & 0x0f]; - cp >>= 4; - buffer[4] = kHex[cp & 0x0f]; - cp >>= 4; - buffer[3] = kHex[cp & 0x0f]; - cp >>= 4; - buffer[2] = kHex[cp & 0x0f]; - return StringPiece(buffer).substr(0, 6); -} - -// Stores the 32-bit unicode code point as its hexadecimal digits in buffer -// and returns a StringPiece that points to this buffer. The input buffer needs -// to be at least 12 bytes long. -StringPiece ToSurrogateHex(uint32 cp, char* buffer) { - uint16 low = ToLowSurrogate(cp); - uint16 high = ToHighSurrogate(cp); - - buffer[11] = kHex[low & 0x0f]; - low >>= 4; - buffer[10] = kHex[low & 0x0f]; - low >>= 4; - buffer[9] = kHex[low & 0x0f]; - low >>= 4; - buffer[8] = kHex[low & 0x0f]; - - buffer[5] = kHex[high & 0x0f]; - high >>= 4; - buffer[4] = kHex[high & 0x0f]; - high >>= 4; - buffer[3] = kHex[high & 0x0f]; - high >>= 4; - buffer[2] = kHex[high & 0x0f]; - - return StringPiece(buffer, 12); -} - -// If the given unicode code point needs escaping, then returns the -// escaped form. The returned StringPiece either points to statically -// pre-allocated char[] or to the given buffer. The input buffer needs -// to be at least 12 bytes long. -// -// If the given unicode code point does not need escaping, an empty -// StringPiece is returned. -StringPiece EscapeCodePoint(uint32 cp, char* buffer) { - if (cp < 0xa0) return kCommonEscapes[cp]; - switch (cp) { - // These are not required by json spec - // but used to prevent security bugs in javascript. - case 0xfeff: // Zero width no-break space - case 0xfff9: // Interlinear annotation anchor - case 0xfffa: // Interlinear annotation separator - case 0xfffb: // Interlinear annotation terminator - - case 0x00ad: // Soft-hyphen - case 0x06dd: // Arabic end of ayah - case 0x070f: // Syriac abbreviation mark - case 0x17b4: // Khmer vowel inherent Aq - case 0x17b5: // Khmer vowel inherent Aa - return ToHex(cp, buffer); - - default: - if ((cp >= 0x0600 && cp <= 0x0603) || // Arabic signs - (cp >= 0x200b && cp <= 0x200f) || // Zero width etc. - (cp >= 0x2028 && cp <= 0x202e) || // Separators etc. - (cp >= 0x2060 && cp <= 0x2064) || // Invisible etc. - (cp >= 0x206a && cp <= 0x206f)) { // Shaping etc. - return ToHex(cp, buffer); - } - - if (cp == 0x000e0001 || // Language tag - (cp >= 0x0001d173 && cp <= 0x0001d17a) || // Music formatting - (cp >= 0x000e0020 && cp <= 0x000e007f)) { // TAG symbols - return ToSurrogateHex(cp, buffer); - } - } - return StringPiece(); -} - -// Tries to escape the given code point first. If the given code point -// does not need to be escaped, but force_output is true, then render -// the given multi-byte code point in UTF8 in the buffer and returns it. -StringPiece EscapeCodePoint(uint32 cp, char* buffer, bool force_output) { - StringPiece sp = EscapeCodePoint(cp, buffer); - if (force_output && sp.empty()) { - buffer[5] = (cp & 0x3f) | 0x80; - cp >>= 6; - if (cp <= 0x1f) { - buffer[4] = cp | 0xc0; - sp = StringPiece(buffer + 4, 2); - return sp; - } - buffer[4] = (cp & 0x3f) | 0x80; - cp >>= 6; - if (cp <= 0x0f) { - buffer[3] = cp | 0xe0; - sp = StringPiece(buffer + 3, 3); - return sp; - } - buffer[3] = (cp & 0x3f) | 0x80; - buffer[2] = ((cp >> 6) & 0x07) | 0xf0; - sp = StringPiece(buffer + 2, 4); - } - return sp; -} - -} // namespace - -void JsonEscaping::Escape(strings::ByteSource* input, - strings::ByteSink* output) { - char buffer[12] = "\\udead\\ubee"; - uint32 cp = 0; // Current unicode code point. - int num_left = 0; // Num of chars to read to complete the code point. - while (input->Available() > 0) { - StringPiece str = input->Peek(); - StringPiece escaped; - int i = 0; - int num_read; - bool ok; - bool cp_was_split = num_left > 0; - // Loop until we encounter either - // i) a code point that needs to be escaped; or - // ii) a split code point is completely read; or - // iii) a character that is not a valid utf8; or - // iv) end of the StringPiece str is reached. - do { - ok = ReadCodePoint(str, i, &cp, &num_left, &num_read); - if (num_left > 0 || !ok) break; // case iii or iv - escaped = EscapeCodePoint(cp, buffer, cp_was_split); - if (!escaped.empty()) break; // case i or ii - i += num_read; - num_read = 0; - } while (i < str.length()); // case iv - // First copy the un-escaped prefix, if any, to the output ByteSink. - if (i > 0) input->CopyTo(output, i); - if (num_read > 0) input->Skip(num_read); - if (!ok) { - // Case iii: Report error. - // TODO(wpoon): Add error reporting. - num_left = 0; - } else if (num_left == 0 && !escaped.empty()) { - // Case i or ii: Append the escaped code point to the output ByteSink. - output->Append(escaped.data(), escaped.size()); - } - } - if (num_left > 0) { - // Treat as case iii: report error. - // TODO(wpoon): Add error reporting. - } -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h deleted file mode 100644 index e3e329fc96..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h +++ /dev/null @@ -1,91 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_ -#define NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_ - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/bytestream.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -class JsonEscaping { - public: - // The minimum value of a unicode high-surrogate code unit in the utf-16 - // encoding. A high-surrogate is also known as a leading-surrogate. - // See http://www.unicode.org/glossary/#high_surrogate_code_unit - static const uint16 kMinHighSurrogate = 0xd800; - - // The maximum value of a unicide high-surrogate code unit in the utf-16 - // encoding. A high-surrogate is also known as a leading-surrogate. - // See http://www.unicode.org/glossary/#high_surrogate_code_unit - static const uint16 kMaxHighSurrogate = 0xdbff; - - // The minimum value of a unicode low-surrogate code unit in the utf-16 - // encoding. A low-surrogate is also known as a trailing-surrogate. - // See http://www.unicode.org/glossary/#low_surrogate_code_unit - static const uint16 kMinLowSurrogate = 0xdc00; - - // The maximum value of a unicode low-surrogate code unit in the utf-16 - // encoding. A low-surrogate is also known as a trailing surrogate. - // See http://www.unicode.org/glossary/#low_surrogate_code_unit - static const uint16 kMaxLowSurrogate = 0xdfff; - - // The minimum value of a unicode supplementary code point. - // See http://www.unicode.org/glossary/#supplementary_code_point - static const uint32 kMinSupplementaryCodePoint = 0x010000; - - // The minimum value of a unicode code point. - // See http://www.unicode.org/glossary/#code_point - static const uint32 kMinCodePoint = 0x000000; - - // The maximum value of a unicode code point. - // See http://www.unicode.org/glossary/#code_point - static const uint32 kMaxCodePoint = 0x10ffff; - - JsonEscaping() {} - virtual ~JsonEscaping() {} - - // Escape the given ByteSource to the given ByteSink. - static void Escape(strings::ByteSource* input, strings::ByteSink* output); - - private: - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JsonEscaping); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -#endif // NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_ -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc deleted file mode 100644 index 6e4edd8836..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc +++ /dev/null @@ -1,196 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/json_objectwriter.h> - -#include <math.h> - -#include <google/protobuf/stubs/casts.h> -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/util/internal/json_escaping.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/mathlimits.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using strings::ArrayByteSource; -; - -JsonObjectWriter::~JsonObjectWriter() { - if (!element_->is_root()) { - GOOGLE_LOG(WARNING) << "JsonObjectWriter was not fully closed."; - } -} - -JsonObjectWriter* JsonObjectWriter::StartObject(StringPiece name) { - WritePrefix(name); - WriteChar('{'); - Push(); - return this; -} - -JsonObjectWriter* JsonObjectWriter::EndObject() { - Pop(); - WriteChar('}'); - if (element()->is_root()) NewLine(); - return this; -} - -JsonObjectWriter* JsonObjectWriter::StartList(StringPiece name) { - WritePrefix(name); - WriteChar('['); - Push(); - return this; -} - -JsonObjectWriter* JsonObjectWriter::EndList() { - Pop(); - WriteChar(']'); - if (element()->is_root()) NewLine(); - return this; -} - -JsonObjectWriter* JsonObjectWriter::RenderBool(StringPiece name, bool value) { - return RenderSimple(name, value ? "true" : "false"); -} - -JsonObjectWriter* JsonObjectWriter::RenderInt32(StringPiece name, int32 value) { - return RenderSimple(name, SimpleItoa(value)); -} - -JsonObjectWriter* JsonObjectWriter::RenderUint32(StringPiece name, - uint32 value) { - return RenderSimple(name, SimpleItoa(value)); -} - -JsonObjectWriter* JsonObjectWriter::RenderInt64(StringPiece name, int64 value) { - WritePrefix(name); - WriteChar('"'); - stream_->WriteString(SimpleItoa(value)); - WriteChar('"'); - return this; -} - -JsonObjectWriter* JsonObjectWriter::RenderUint64(StringPiece name, - uint64 value) { - WritePrefix(name); - WriteChar('"'); - stream_->WriteString(SimpleItoa(value)); - WriteChar('"'); - return this; -} - -JsonObjectWriter* JsonObjectWriter::RenderDouble(StringPiece name, - double value) { - if (MathLimits<double>::IsFinite(value)) { - return RenderSimple(name, SimpleDtoa(value)); - } - - // Render quoted with NaN/Infinity-aware DoubleAsString. - return RenderString(name, DoubleAsString(value)); -} - -JsonObjectWriter* JsonObjectWriter::RenderFloat(StringPiece name, float value) { - if (MathLimits<float>::IsFinite(value)) { - return RenderSimple(name, SimpleFtoa(value)); - } - - // Render quoted with NaN/Infinity-aware FloatAsString. - return RenderString(name, FloatAsString(value)); -} - -JsonObjectWriter* JsonObjectWriter::RenderString(StringPiece name, - StringPiece value) { - WritePrefix(name); - WriteChar('"'); - ArrayByteSource source(value); - JsonEscaping::Escape(&source, &sink_); - WriteChar('"'); - return this; -} - -JsonObjectWriter* JsonObjectWriter::RenderBytes(StringPiece name, - StringPiece value) { - WritePrefix(name); - string base64; - - if (use_websafe_base64_for_bytes_) - WebSafeBase64EscapeWithPadding(value.ToString(), &base64); - else - Base64Escape(value, &base64); - - WriteChar('"'); - // TODO(wpoon): Consider a ByteSink solution that writes the base64 bytes - // directly to the stream, rather than first putting them - // into a string and then writing them to the stream. - stream_->WriteRaw(base64.data(), base64.size()); - WriteChar('"'); - return this; -} - -JsonObjectWriter* JsonObjectWriter::RenderNull(StringPiece name) { - return RenderSimple(name, "null"); -} - -JsonObjectWriter* JsonObjectWriter::RenderNullAsEmpty(StringPiece name) { - return RenderSimple(name, ""); -} - -void JsonObjectWriter::WritePrefix(StringPiece name) { - bool not_first = !element()->is_first(); - if (not_first) WriteChar(','); - if (not_first || !element()->is_root()) NewLine(); - bool empty_key_ok = GetAndResetEmptyKeyOk(); - if (!name.empty() || empty_key_ok) { - WriteChar('"'); - if (!name.empty()) { - ArrayByteSource source(name); - JsonEscaping::Escape(&source, &sink_); - } - stream_->WriteString("\":"); - if (!indent_string_.empty()) WriteChar(' '); - } -} - -bool JsonObjectWriter::GetAndResetEmptyKeyOk() { - bool retval = empty_name_ok_for_next_key_; - empty_name_ok_for_next_key_ = false; - return retval; -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h deleted file mode 100644 index 31edc2927f..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h +++ /dev/null @@ -1,233 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__ - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <string> - -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/util/internal/structured_objectwriter.h> -#include <google/protobuf/stubs/bytestream.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// An ObjectWriter implementation that outputs JSON. This ObjectWriter -// supports writing a compact form or a pretty printed form. -// -// Sample usage: -// string output; -// StringOutputStream* str_stream = new StringOutputStream(&output); -// CodedOutputStream* out_stream = new CodedOutputStream(str_stream); -// JsonObjectWriter* ow = new JsonObjectWriter(" ", out_stream); -// ow->StartObject("") -// ->RenderString("name", "value") -// ->RenderString("emptystring", string()) -// ->StartObject("nested") -// ->RenderInt64("light", 299792458); -// ->RenderDouble("pi", 3.141592653589793); -// ->EndObject() -// ->StartList("empty") -// ->EndList() -// ->EndObject(); -// -// And then the output string would become: -// { -// "name": "value", -// "emptystring": "", -// "nested": { -// "light": "299792458", -// "pi": 3.141592653589793 -// }, -// "empty": [] -// } -// -// JsonObjectWriter does not validate if calls actually result in valid JSON. -// For example, passing an empty name when one would be required won't result -// in an error, just an invalid output. -// -// Note that all int64 and uint64 are rendered as strings instead of numbers. -// This is because JavaScript parses numbers as 64-bit float thus int64 and -// uint64 would lose precision if rendered as numbers. -// -// JsonObjectWriter is thread-unsafe. -class LIBPROTOBUF_EXPORT JsonObjectWriter : public StructuredObjectWriter { - public: - JsonObjectWriter(StringPiece indent_string, - google::protobuf::io::CodedOutputStream* out) - : element_(new Element(NULL)), - stream_(out), - sink_(out), - indent_string_(indent_string.ToString()), - use_websafe_base64_for_bytes_(false), - empty_name_ok_for_next_key_(false) {} - virtual ~JsonObjectWriter(); - - // ObjectWriter methods. - virtual JsonObjectWriter* StartObject(StringPiece name); - virtual JsonObjectWriter* EndObject(); - virtual JsonObjectWriter* StartList(StringPiece name); - virtual JsonObjectWriter* EndList(); - virtual JsonObjectWriter* RenderBool(StringPiece name, bool value); - virtual JsonObjectWriter* RenderInt32(StringPiece name, int32 value); - virtual JsonObjectWriter* RenderUint32(StringPiece name, uint32 value); - virtual JsonObjectWriter* RenderInt64(StringPiece name, int64 value); - virtual JsonObjectWriter* RenderUint64(StringPiece name, uint64 value); - virtual JsonObjectWriter* RenderDouble(StringPiece name, double value); - virtual JsonObjectWriter* RenderFloat(StringPiece name, float value); - virtual JsonObjectWriter* RenderString(StringPiece name, StringPiece value); - virtual JsonObjectWriter* RenderBytes(StringPiece name, StringPiece value); - virtual JsonObjectWriter* RenderNull(StringPiece name); - virtual JsonObjectWriter* RenderNullAsEmpty(StringPiece name); - - void set_use_websafe_base64_for_bytes(bool value) { - use_websafe_base64_for_bytes_ = value; - } - - // Whether empty strings should be rendered for the next JSON key. This - // setting is only valid until the next key is rendered, after which it gets - // reset to false. - virtual void empty_name_ok_for_next_key() { - empty_name_ok_for_next_key_ = true; - } - - protected: - class LIBPROTOBUF_EXPORT Element : public BaseElement { - public: - explicit Element(Element* parent) : BaseElement(parent), is_first_(true) {} - - // Called before each field of the Element is to be processed. - // Returns true if this is the first call (processing the first field). - bool is_first() { - if (is_first_) { - is_first_ = false; - return true; - } - return false; - } - - private: - bool is_first_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Element); - }; - - virtual Element* element() { return element_.get(); } - - private: - class LIBPROTOBUF_EXPORT ByteSinkWrapper : public strings::ByteSink { - public: - explicit ByteSinkWrapper(google::protobuf::io::CodedOutputStream* stream) - : stream_(stream) {} - virtual ~ByteSinkWrapper() {} - - // ByteSink methods. - virtual void Append(const char* bytes, size_t n) { - stream_->WriteRaw(bytes, n); - } - - private: - google::protobuf::io::CodedOutputStream* stream_; - - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSinkWrapper); - }; - - // Renders a simple value as a string. By default all non-string Render - // methods convert their argument to a string and call this method. This - // method can then be used to render the simple value without escaping it. - JsonObjectWriter* RenderSimple(StringPiece name, const string& value) { - WritePrefix(name); - stream_->WriteString(value); - return this; - } - - // Pushes a new element to the stack. - void Push() { element_.reset(new Element(element_.release())); } - - // Pops an element off of the stack and deletes the popped element. - void Pop() { - bool needs_newline = !element_->is_first(); - element_.reset(element_->pop<Element>()); - if (needs_newline) NewLine(); - } - - // If pretty printing is enabled, this will write a newline to the output, - // followed by optional indentation. Otherwise this method is a noop. - void NewLine() { - if (!indent_string_.empty()) { - WriteChar('\n'); - for (int i = 0; i < element()->level(); i++) { - stream_->WriteString(indent_string_); - } - } - } - - // Writes a prefix. This will write out any pretty printing and - // commas that are required, followed by the name and a ':' if - // the name is not null. - void WritePrefix(StringPiece name); - - // Writes an individual character to the output. - void WriteChar(const char c) { stream_->WriteRaw(&c, sizeof(c)); } - - // Returns the current value of empty_name_ok_for_next_key_ and resets it to - // false. - bool GetAndResetEmptyKeyOk(); - - google::protobuf::scoped_ptr<Element> element_; - google::protobuf::io::CodedOutputStream* stream_; - ByteSinkWrapper sink_; - const string indent_string_; - - // Whether to use regular or websafe base64 encoding for byte fields. Defaults - // to regular base64 encoding. - bool use_websafe_base64_for_bytes_; - - // Whether empty strings should be rendered for the next JSON key. This - // setting is only valid until the next key is rendered, after which it gets - // reset to false. - bool empty_name_ok_for_next_key_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc deleted file mode 100644 index bbd9d78a43..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc +++ /dev/null @@ -1,313 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/json_objectwriter.h> - -#include <google/protobuf/io/zero_copy_stream_impl_lite.h> -#include <google/protobuf/util/internal/utility.h> -#include <gtest/gtest.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::io::CodedOutputStream; -using google::protobuf::io::StringOutputStream; - -class JsonObjectWriterTest : public ::testing::Test { - protected: - JsonObjectWriterTest() - : str_stream_(new StringOutputStream(&output_)), - out_stream_(new CodedOutputStream(str_stream_)), - ow_(NULL) {} - - virtual ~JsonObjectWriterTest() { - delete ow_; - delete out_stream_; - delete str_stream_; - } - - string output_; - StringOutputStream* const str_stream_; - CodedOutputStream* const out_stream_; - JsonObjectWriter* ow_; -}; - -TEST_F(JsonObjectWriterTest, EmptyRootObject) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("")->EndObject(); - EXPECT_EQ("{}", output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, EmptyObject) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->RenderString("test", "value") - ->StartObject("empty") - ->EndObject() - ->EndObject(); - EXPECT_EQ("{\"test\":\"value\",\"empty\":{}}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, EmptyRootList) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartList("")->EndList(); - EXPECT_EQ("[]", output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, EmptyList) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->RenderString("test", "value") - ->StartList("empty") - ->EndList() - ->EndObject(); - EXPECT_EQ("{\"test\":\"value\",\"empty\":[]}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, ObjectInObject) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->StartObject("nested") - ->RenderString("field", "value") - ->EndObject() - ->EndObject(); - EXPECT_EQ("{\"nested\":{\"field\":\"value\"}}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, ListInObject) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->StartList("nested") - ->RenderString("", "value") - ->EndList() - ->EndObject(); - EXPECT_EQ("{\"nested\":[\"value\"]}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, ObjectInList) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartList("") - ->StartObject("") - ->RenderString("field", "value") - ->EndObject() - ->EndList(); - EXPECT_EQ("[{\"field\":\"value\"}]", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, ListInList) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartList("") - ->StartList("") - ->RenderString("", "value") - ->EndList() - ->EndList(); - EXPECT_EQ("[[\"value\"]]", output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, RenderPrimitives) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->RenderBool("bool", true) - ->RenderDouble("double", std::numeric_limits<double>::max()) - ->RenderFloat("float", std::numeric_limits<float>::max()) - ->RenderInt32("int", std::numeric_limits<int32>::min()) - ->RenderInt64("long", std::numeric_limits<int64>::min()) - ->RenderBytes("bytes", "abracadabra") - ->RenderString("string", "string") - ->RenderBytes("emptybytes", "") - ->RenderString("emptystring", string()) - ->EndObject(); - EXPECT_EQ( - "{\"bool\":true," - "\"double\":" + - ValueAsString<double>(std::numeric_limits<double>::max()) + - "," - "\"float\":" + - ValueAsString<float>(std::numeric_limits<float>::max()) + - "," - "\"int\":-2147483648," - "\"long\":\"-9223372036854775808\"," - "\"bytes\":\"YWJyYWNhZGFicmE=\"," - "\"string\":\"string\"," - "\"emptybytes\":\"\"," - "\"emptystring\":\"\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, BytesEncodesAsNonWebSafeBase64) { - string s; - s.push_back('\377'); - s.push_back('\357'); - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("")->RenderBytes("bytes", s)->EndObject(); - // Non-web-safe would encode this as "/+8=" - EXPECT_EQ("{\"bytes\":\"/+8=\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, PrettyPrintList) { - ow_ = new JsonObjectWriter(" ", out_stream_); - ow_->StartObject("") - ->StartList("items") - ->RenderString("", "item1") - ->RenderString("", "item2") - ->RenderString("", "item3") - ->EndList() - ->StartList("empty") - ->EndList() - ->EndObject(); - EXPECT_EQ( - "{\n" - " \"items\": [\n" - " \"item1\",\n" - " \"item2\",\n" - " \"item3\"\n" - " ],\n" - " \"empty\": []\n" - "}\n", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, PrettyPrintObject) { - ow_ = new JsonObjectWriter(" ", out_stream_); - ow_->StartObject("") - ->StartObject("items") - ->RenderString("key1", "item1") - ->RenderString("key2", "item2") - ->RenderString("key3", "item3") - ->EndObject() - ->StartObject("empty") - ->EndObject() - ->EndObject(); - EXPECT_EQ( - "{\n" - " \"items\": {\n" - " \"key1\": \"item1\",\n" - " \"key2\": \"item2\",\n" - " \"key3\": \"item3\"\n" - " },\n" - " \"empty\": {}\n" - "}\n", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, PrettyPrintEmptyObjectInEmptyList) { - ow_ = new JsonObjectWriter(" ", out_stream_); - ow_->StartObject("") - ->StartList("list") - ->StartObject("") - ->EndObject() - ->EndList() - ->EndObject(); - EXPECT_EQ( - "{\n" - " \"list\": [\n" - " {}\n" - " ]\n" - "}\n", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, PrettyPrintDoubleIndent) { - ow_ = new JsonObjectWriter(" ", out_stream_); - ow_->StartObject("") - ->RenderBool("bool", true) - ->RenderInt32("int", 42) - ->EndObject(); - EXPECT_EQ( - "{\n" - " \"bool\": true,\n" - " \"int\": 42\n" - "}\n", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, StringsEscapedAndEnclosedInDoubleQuotes) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("")->RenderString("string", "'<>&\\\"\r\n")->EndObject(); - EXPECT_EQ("{\"string\":\"'\\u003c\\u003e&\\\\\\\"\\r\\n\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, Stringification) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->RenderDouble("double_nan", std::numeric_limits<double>::quiet_NaN()) - ->RenderFloat("float_nan", std::numeric_limits<float>::quiet_NaN()) - ->RenderDouble("double_pos", std::numeric_limits<double>::infinity()) - ->RenderFloat("float_pos", std::numeric_limits<float>::infinity()) - ->RenderDouble("double_neg", -std::numeric_limits<double>::infinity()) - ->RenderFloat("float_neg", -std::numeric_limits<float>::infinity()) - ->EndObject(); - EXPECT_EQ( - "{\"double_nan\":\"NaN\"," - "\"float_nan\":\"NaN\"," - "\"double_pos\":\"Infinity\"," - "\"float_pos\":\"Infinity\"," - "\"double_neg\":\"-Infinity\"," - "\"float_neg\":\"-Infinity\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, TestRegularByteEncoding) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->StartObject("") - ->RenderBytes("bytes", "\x03\xef\xc0") - ->EndObject(); - - // Test that we get regular (non websafe) base64 encoding on byte fields by - // default. - EXPECT_EQ("{\"bytes\":\"A+/A\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -TEST_F(JsonObjectWriterTest, TestWebsafeByteEncoding) { - ow_ = new JsonObjectWriter("", out_stream_); - ow_->set_use_websafe_base64_for_bytes(true); - ow_->StartObject("") - ->RenderBytes("bytes", "\x03\xef\xc0\x10") - ->EndObject(); - - // Test that we get websafe base64 encoding when explicitly asked. - EXPECT_EQ("{\"bytes\":\"A-_AEA==\"}", - output_.substr(0, out_stream_->ByteCount())); -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc deleted file mode 100644 index b38030c3c6..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc +++ /dev/null @@ -1,844 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/json_stream_parser.h> - -#include <algorithm> -#include <cctype> -#include <cerrno> -#include <cstdlib> -#include <cstring> -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif - -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/object_writer.h> -#include <google/protobuf/util/internal/json_escaping.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/mathlimits.h> - - -namespace google { -namespace protobuf { -namespace util { - -// Allow these symbols to be referenced as util::Status, util::error::* in -// this file. -using util::Status; -namespace error { -using util::error::CANCELLED; -using util::error::INTERNAL; -using util::error::INVALID_ARGUMENT; -} // namespace error - -namespace converter { - -// Number of digits in an escaped UTF-16 code unit ('\\' 'u' X X X X) -static const int kUnicodeEscapedLength = 6; - -// Length of the true, false, and null literals. -static const int true_len = strlen("true"); -static const int false_len = strlen("false"); -static const int null_len = strlen("null"); - -inline bool IsLetter(char c) { - return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || (c == '_') || - (c == '$'); -} - -inline bool IsAlphanumeric(char c) { - return IsLetter(c) || ('0' <= c && c <= '9'); -} - -static bool ConsumeKey(StringPiece* input, StringPiece* key) { - if (input->empty() || !IsLetter((*input)[0])) return false; - int len = 1; - for (; len < input->size(); ++len) { - if (!IsAlphanumeric((*input)[len])) { - break; - } - } - *key = StringPiece(input->data(), len); - *input = StringPiece(input->data() + len, input->size() - len); - return true; -} - -static bool MatchKey(StringPiece input) { - return !input.empty() && IsLetter(input[0]); -} - -JsonStreamParser::JsonStreamParser(ObjectWriter* ow) - : ow_(ow), - stack_(), - leftover_(), - json_(), - p_(), - key_(), - key_storage_(), - finishing_(false), - parsed_(), - parsed_storage_(), - string_open_(0), - chunk_storage_(), - coerce_to_utf8_(false), - allow_empty_null_(false), - loose_float_number_conversion_(false) { - // Initialize the stack with a single value to be parsed. - stack_.push(VALUE); -} - -JsonStreamParser::~JsonStreamParser() {} - - -util::Status JsonStreamParser::Parse(StringPiece json) { - StringPiece chunk = json; - // If we have leftovers from a previous chunk, append the new chunk to it - // and create a new StringPiece pointing at the string's data. This could - // be large but we rely on the chunks to be small, assuming they are - // fragments of a Cord. - if (!leftover_.empty()) { - // Don't point chunk to leftover_ because leftover_ will be updated in - // ParseChunk(chunk). - chunk_storage_.swap(leftover_); - json.AppendToString(&chunk_storage_); - chunk = StringPiece(chunk_storage_); - } - - // Find the structurally valid UTF8 prefix and parse only that. - int n = internal::UTF8SpnStructurallyValid(chunk); - if (n > 0) { - util::Status status = ParseChunk(chunk.substr(0, n)); - - // Any leftover characters are stashed in leftover_ for later parsing when - // there is more data available. - chunk.substr(n).AppendToString(&leftover_); - return status; - } else { - chunk.CopyToString(&leftover_); - return util::Status::OK; - } -} - -util::Status JsonStreamParser::FinishParse() { - // If we do not expect anything and there is nothing left to parse we're all - // done. - if (stack_.empty() && leftover_.empty()) { - return util::Status::OK; - } - - // Storage for UTF8-coerced string. - google::protobuf::scoped_array<char> utf8; - if (coerce_to_utf8_) { - utf8.reset(new char[leftover_.size()]); - char* coerced = internal::UTF8CoerceToStructurallyValid(leftover_, utf8.get(), ' '); - p_ = json_ = StringPiece(coerced, leftover_.size()); - } else { - p_ = json_ = leftover_; - if (!internal::IsStructurallyValidUTF8(leftover_)) { - return ReportFailure("Encountered non UTF-8 code points."); - } - } - - // Parse the remainder in finishing mode, which reports errors for things like - // unterminated strings or unknown tokens that would normally be retried. - finishing_ = true; - util::Status result = RunParser(); - if (result.ok()) { - SkipWhitespace(); - if (!p_.empty()) { - result = ReportFailure("Parsing terminated before end of input."); - } - } - return result; -} - -util::Status JsonStreamParser::ParseChunk(StringPiece chunk) { - // Do not do any work if the chunk is empty. - if (chunk.empty()) return util::Status::OK; - - p_ = json_ = chunk; - - finishing_ = false; - util::Status result = RunParser(); - if (!result.ok()) return result; - - SkipWhitespace(); - if (p_.empty()) { - // If we parsed everything we had, clear the leftover. - leftover_.clear(); - } else { - // If we do not expect anything i.e. stack is empty, and we have non-empty - // string left to parse, we report an error. - if (stack_.empty()) { - return ReportFailure("Parsing terminated before end of input."); - } - // If we expect future data i.e. stack is non-empty, and we have some - // unparsed data left, we save it for later parse. - leftover_ = p_.ToString(); - } - return util::Status::OK; -} - -util::Status JsonStreamParser::RunParser() { - while (!stack_.empty()) { - ParseType type = stack_.top(); - TokenType t = (string_open_ == 0) ? GetNextTokenType() : BEGIN_STRING; - stack_.pop(); - util::Status result; - switch (type) { - case VALUE: - result = ParseValue(t); - break; - - case OBJ_MID: - result = ParseObjectMid(t); - break; - - case ENTRY: - result = ParseEntry(t); - break; - - case ENTRY_MID: - result = ParseEntryMid(t); - break; - - case ARRAY_VALUE: - result = ParseArrayValue(t); - break; - - case ARRAY_MID: - result = ParseArrayMid(t); - break; - - default: - result = util::Status(util::error::INTERNAL, - StrCat("Unknown parse type: ", type)); - break; - } - if (!result.ok()) { - // If we were cancelled, save our state and try again later. - if (!finishing_ && result == util::Status(error::CANCELLED, "")) { - stack_.push(type); - // If we have a key we still need to render, make sure to save off the - // contents in our own storage. - if (!key_.empty() && key_storage_.empty()) { - key_.AppendToString(&key_storage_); - key_ = StringPiece(key_storage_); - } - result = util::Status::OK; - } - return result; - } - } - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseValue(TokenType type) { - switch (type) { - case BEGIN_OBJECT: - return HandleBeginObject(); - case BEGIN_ARRAY: - return HandleBeginArray(); - case BEGIN_STRING: - return ParseString(); - case BEGIN_NUMBER: - return ParseNumber(); - case BEGIN_TRUE: - return ParseTrue(); - case BEGIN_FALSE: - return ParseFalse(); - case BEGIN_NULL: - return ParseNull(); - case UNKNOWN: - return ReportUnknown("Expected a value."); - default: { - if (allow_empty_null_ && IsEmptyNullAllowed(type)) { - return ParseEmptyNull(); - } - - // Special case for having been cut off while parsing, wait for more data. - // This handles things like 'fals' being at the end of the string, we - // don't know if the next char would be e, completing it, or something - // else, making it invalid. - if (!finishing_ && p_.length() < false_len) { - return util::Status(error::CANCELLED, ""); - } - return ReportFailure("Unexpected token."); - } - } -} - -util::Status JsonStreamParser::ParseString() { - util::Status result = ParseStringHelper(); - if (result.ok()) { - ow_->RenderString(key_, parsed_); - key_ = StringPiece(); - parsed_ = StringPiece(); - parsed_storage_.clear(); - } - return result; -} - -util::Status JsonStreamParser::ParseStringHelper() { - // If we haven't seen the start quote, grab it and remember it for later. - if (string_open_ == 0) { - string_open_ = *p_.data(); - GOOGLE_DCHECK(string_open_ == '\"' || string_open_ == '\''); - Advance(); - } - // Track where we last copied data from so we can minimize copying. - const char* last = p_.data(); - while (!p_.empty()) { - const char* data = p_.data(); - if (*data == '\\') { - // We're about to handle an escape, copy all bytes from last to data. - if (last < data) { - parsed_storage_.append(last, data - last); - } - // If we ran out of string after the \, cancel or report an error - // depending on if we expect more data later. - if (p_.length() == 1) { - if (!finishing_) { - return util::Status(error::CANCELLED, ""); - } - return ReportFailure("Closing quote expected in string."); - } - // Parse a unicode escape if we found \u in the string. - if (data[1] == 'u') { - util::Status result = ParseUnicodeEscape(); - if (!result.ok()) { - return result; - } - // Move last pointer past the unicode escape and continue. - last = p_.data(); - continue; - } - // Handle the standard set of backslash-escaped characters. - switch (data[1]) { - case 'b': - parsed_storage_.push_back('\b'); - break; - case 'f': - parsed_storage_.push_back('\f'); - break; - case 'n': - parsed_storage_.push_back('\n'); - break; - case 'r': - parsed_storage_.push_back('\r'); - break; - case 't': - parsed_storage_.push_back('\t'); - break; - case 'v': - parsed_storage_.push_back('\v'); - break; - default: - parsed_storage_.push_back(data[1]); - } - // We handled two characters, so advance past them and continue. - p_.remove_prefix(2); - last = p_.data(); - continue; - } - // If we found the closing quote note it, advance past it, and return. - if (*data == string_open_) { - // If we didn't copy anything, reuse the input buffer. - if (parsed_storage_.empty()) { - parsed_ = StringPiece(last, data - last); - } else { - if (last < data) { - parsed_storage_.append(last, data - last); - } - parsed_ = StringPiece(parsed_storage_); - } - // Clear the quote char so next time we try to parse a string we'll - // start fresh. - string_open_ = 0; - Advance(); - return util::Status::OK; - } - // Normal character, just advance past it. - Advance(); - } - // If we ran out of characters, copy over what we have so far. - if (last < p_.data()) { - parsed_storage_.append(last, p_.data() - last); - } - // If we didn't find the closing quote but we expect more data, cancel for now - if (!finishing_) { - return util::Status(error::CANCELLED, ""); - } - // End of string reached without a closing quote, report an error. - string_open_ = 0; - return ReportFailure("Closing quote expected in string."); -} - -// Converts a unicode escaped character to a decimal value stored in a char32 -// for use in UTF8 encoding utility. We assume that str begins with \uhhhh and -// convert that from the hex number to a decimal value. -// -// There are some security exploits with UTF-8 that we should be careful of: -// - http://www.unicode.org/reports/tr36/#UTF-8_Exploit -// - http://sites/intl-eng/design-guide/core-application -util::Status JsonStreamParser::ParseUnicodeEscape() { - if (p_.length() < kUnicodeEscapedLength) { - if (!finishing_) { - return util::Status(error::CANCELLED, ""); - } - return ReportFailure("Illegal hex string."); - } - GOOGLE_DCHECK_EQ('\\', p_.data()[0]); - GOOGLE_DCHECK_EQ('u', p_.data()[1]); - uint32 code = 0; - for (int i = 2; i < kUnicodeEscapedLength; ++i) { - if (!isxdigit(p_.data()[i])) { - return ReportFailure("Invalid escape sequence."); - } - code = (code << 4) + hex_digit_to_int(p_.data()[i]); - } - if (code >= JsonEscaping::kMinHighSurrogate && - code <= JsonEscaping::kMaxHighSurrogate) { - if (p_.length() < 2 * kUnicodeEscapedLength) { - if (!finishing_) { - return util::Status(error::CANCELLED, ""); - } - if (!coerce_to_utf8_) { - return ReportFailure("Missing low surrogate."); - } - } else if (p_.data()[kUnicodeEscapedLength] == '\\' && - p_.data()[kUnicodeEscapedLength + 1] == 'u') { - uint32 low_code = 0; - for (int i = kUnicodeEscapedLength + 2; i < 2 * kUnicodeEscapedLength; - ++i) { - if (!isxdigit(p_.data()[i])) { - return ReportFailure("Invalid escape sequence."); - } - low_code = (low_code << 4) + hex_digit_to_int(p_.data()[i]); - } - if (low_code >= JsonEscaping::kMinLowSurrogate && - low_code <= JsonEscaping::kMaxLowSurrogate) { - // Convert UTF-16 surrogate pair to 21-bit Unicode codepoint. - code = (((code & 0x3FF) << 10) | (low_code & 0x3FF)) + - JsonEscaping::kMinSupplementaryCodePoint; - // Advance past the first code unit escape. - p_.remove_prefix(kUnicodeEscapedLength); - } else if (!coerce_to_utf8_) { - return ReportFailure("Invalid low surrogate."); - } - } else if (!coerce_to_utf8_) { - return ReportFailure("Missing low surrogate."); - } - } - if (!coerce_to_utf8_ && !IsValidCodePoint(code)) { - return ReportFailure("Invalid unicode code point."); - } - char buf[UTFmax]; - int len = EncodeAsUTF8Char(code, buf); - // Advance past the [final] code unit escape. - p_.remove_prefix(kUnicodeEscapedLength); - parsed_storage_.append(buf, len); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseNumber() { - NumberResult number; - util::Status result = ParseNumberHelper(&number); - if (result.ok()) { - switch (number.type) { - case NumberResult::DOUBLE: - ow_->RenderDouble(key_, number.double_val); - key_ = StringPiece(); - break; - - case NumberResult::INT: - ow_->RenderInt64(key_, number.int_val); - key_ = StringPiece(); - break; - - case NumberResult::UINT: - ow_->RenderUint64(key_, number.uint_val); - key_ = StringPiece(); - break; - - default: - return ReportFailure("Unable to parse number."); - } - } - return result; -} - -util::Status JsonStreamParser::ParseNumberHelper(NumberResult* result) { - const char* data = p_.data(); - int length = p_.length(); - - // Look for the first non-numeric character, or the end of the string. - int index = 0; - bool floating = false; - bool negative = data[index] == '-'; - // Find the first character that cannot be part of the number. Along the way - // detect if the number needs to be parsed as a double. - // Note that this restricts numbers to the JSON specification, so for example - // we do not support hex or octal notations. - for (; index < length; ++index) { - char c = data[index]; - if (isdigit(c)) continue; - if (c == '.' || c == 'e' || c == 'E') { - floating = true; - continue; - } - if (c == '+' || c == '-' || c == 'x') continue; - // Not a valid number character, break out. - break; - } - - // If the entire input is a valid number, and we may have more content in the - // future, we abort for now and resume when we know more. - if (index == length && !finishing_) { - return util::Status(error::CANCELLED, ""); - } - - // Create a string containing just the number, so we can use safe_strtoX - string number = p_.substr(0, index).ToString(); - - // Floating point number, parse as a double. - if (floating) { - if (!safe_strtod(number, &result->double_val)) { - return ReportFailure("Unable to parse number."); - } - if (!loose_float_number_conversion_ && - !MathLimits<double>::IsFinite(result->double_val)) { - return ReportFailure("Number exceeds the range of double."); - } - result->type = NumberResult::DOUBLE; - p_.remove_prefix(index); - return util::Status::OK; - } - - // Positive non-floating point number, parse as a uint64. - if (!negative) { - // Octal/Hex numbers are not valid JSON values. - if (number.length() >= 2 && number[0] == '0') { - return ReportFailure("Octal/hex numbers are not valid JSON values."); - } - if (!safe_strtou64(number, &result->uint_val)) { - return ReportFailure("Unable to parse number."); - } - result->type = NumberResult::UINT; - p_.remove_prefix(index); - return util::Status::OK; - } - - // Octal/Hex numbers are not valid JSON values. - if (number.length() >= 3 && number[1] == '0') { - return ReportFailure("Octal/hex numbers are not valid JSON values."); - } - // Negative non-floating point number, parse as an int64. - if (!safe_strto64(number, &result->int_val)) { - return ReportFailure("Unable to parse number."); - } - result->type = NumberResult::INT; - p_.remove_prefix(index); - return util::Status::OK; -} - -util::Status JsonStreamParser::HandleBeginObject() { - GOOGLE_DCHECK_EQ('{', *p_.data()); - Advance(); - ow_->StartObject(key_); - key_ = StringPiece(); - stack_.push(ENTRY); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseObjectMid(TokenType type) { - if (type == UNKNOWN) { - return ReportUnknown("Expected , or } after key:value pair."); - } - - // Object is complete, advance past the comma and render the EndObject. - if (type == END_OBJECT) { - Advance(); - ow_->EndObject(); - return util::Status::OK; - } - // Found a comma, advance past it and get ready for an entry. - if (type == VALUE_SEPARATOR) { - Advance(); - stack_.push(ENTRY); - return util::Status::OK; - } - // Illegal token after key:value pair. - return ReportFailure("Expected , or } after key:value pair."); -} - -util::Status JsonStreamParser::ParseEntry(TokenType type) { - if (type == UNKNOWN) { - return ReportUnknown("Expected an object key or }."); - } - - // Close the object and return. This allows for trailing commas. - if (type == END_OBJECT) { - ow_->EndObject(); - Advance(); - return util::Status::OK; - } - - util::Status result; - if (type == BEGIN_STRING) { - // Key is a string (standard JSON), parse it and store the string. - result = ParseStringHelper(); - if (result.ok()) { - key_storage_.clear(); - if (!parsed_storage_.empty()) { - parsed_storage_.swap(key_storage_); - key_ = StringPiece(key_storage_); - } else { - key_ = parsed_; - } - parsed_ = StringPiece(); - } - } else if (type == BEGIN_KEY) { - // Key is a bare key (back compat), create a StringPiece pointing to it. - result = ParseKey(); - } else { - // Unknown key type, report an error. - result = ReportFailure("Expected an object key or }."); - } - // On success we next expect an entry mid ':' then an object mid ',' or '}' - if (result.ok()) { - stack_.push(OBJ_MID); - stack_.push(ENTRY_MID); - } - return result; -} - -util::Status JsonStreamParser::ParseEntryMid(TokenType type) { - if (type == UNKNOWN) { - return ReportUnknown("Expected : between key:value pair."); - } - if (type == ENTRY_SEPARATOR) { - Advance(); - stack_.push(VALUE); - return util::Status::OK; - } - return ReportFailure("Expected : between key:value pair."); -} - -util::Status JsonStreamParser::HandleBeginArray() { - GOOGLE_DCHECK_EQ('[', *p_.data()); - Advance(); - ow_->StartList(key_); - key_ = StringPiece(); - stack_.push(ARRAY_VALUE); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseArrayValue(TokenType type) { - if (type == UNKNOWN) { - return ReportUnknown("Expected a value or ] within an array."); - } - - if (type == END_ARRAY) { - ow_->EndList(); - Advance(); - return util::Status::OK; - } - - // The ParseValue call may push something onto the stack so we need to make - // sure an ARRAY_MID is after it, so we push it on now. Also, the parsing of - // empty-null array value is relying on this ARRAY_MID token. - stack_.push(ARRAY_MID); - util::Status result = ParseValue(type); - if (result == util::Status(error::CANCELLED, "")) { - // If we were cancelled, pop back off the ARRAY_MID so we don't try to - // push it on again when we try over. - stack_.pop(); - } - return result; -} - -util::Status JsonStreamParser::ParseArrayMid(TokenType type) { - if (type == UNKNOWN) { - return ReportUnknown("Expected , or ] after array value."); - } - - if (type == END_ARRAY) { - ow_->EndList(); - Advance(); - return util::Status::OK; - } - - // Found a comma, advance past it and expect an array value next. - if (type == VALUE_SEPARATOR) { - Advance(); - stack_.push(ARRAY_VALUE); - return util::Status::OK; - } - // Illegal token after array value. - return ReportFailure("Expected , or ] after array value."); -} - -util::Status JsonStreamParser::ParseTrue() { - ow_->RenderBool(key_, true); - key_ = StringPiece(); - p_.remove_prefix(true_len); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseFalse() { - ow_->RenderBool(key_, false); - key_ = StringPiece(); - p_.remove_prefix(false_len); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseNull() { - ow_->RenderNull(key_); - key_ = StringPiece(); - p_.remove_prefix(null_len); - return util::Status::OK; -} - -util::Status JsonStreamParser::ParseEmptyNull() { - ow_->RenderNull(key_); - key_ = StringPiece(); - return util::Status::OK; -} - -bool JsonStreamParser::IsEmptyNullAllowed(TokenType type) { - if (stack_.empty()) return false; - return (stack_.top() == ARRAY_MID && type == VALUE_SEPARATOR) || - stack_.top() == OBJ_MID; -} - -util::Status JsonStreamParser::ReportFailure(StringPiece message) { - static const int kContextLength = 20; - const char* p_start = p_.data(); - const char* json_start = json_.data(); - const char* begin = std::max(p_start - kContextLength, json_start); - const char* end = - std::min(p_start + kContextLength, json_start + json_.size()); - StringPiece segment(begin, end - begin); - string location(p_start - begin, ' '); - location.push_back('^'); - return util::Status(util::error::INVALID_ARGUMENT, - StrCat(message, "\n", segment, "\n", location)); -} - -util::Status JsonStreamParser::ReportUnknown(StringPiece message) { - // If we aren't finishing the parse, cancel parsing and try later. - if (!finishing_) { - return util::Status(error::CANCELLED, ""); - } - if (p_.empty()) { - return ReportFailure(StrCat("Unexpected end of string. ", message)); - } - return ReportFailure(message); -} - -void JsonStreamParser::SkipWhitespace() { - while (!p_.empty() && ascii_isspace(*p_.data())) { - Advance(); - } -} - -void JsonStreamParser::Advance() { - // Advance by moving one UTF8 character while making sure we don't go beyond - // the length of StringPiece. - p_.remove_prefix(std::min<int>( - p_.length(), UTF8FirstLetterNumBytes(p_.data(), p_.length()))); -} - -util::Status JsonStreamParser::ParseKey() { - StringPiece original = p_; - if (!ConsumeKey(&p_, &key_)) { - return ReportFailure("Invalid key or variable name."); - } - // If we consumed everything but expect more data, reset p_ and cancel since - // we can't know if the key was complete or not. - if (!finishing_ && p_.empty()) { - p_ = original; - return util::Status(error::CANCELLED, ""); - } - // Since we aren't using the key storage, clear it out. - key_storage_.clear(); - return util::Status::OK; -} - -JsonStreamParser::TokenType JsonStreamParser::GetNextTokenType() { - SkipWhitespace(); - - int size = p_.size(); - if (size == 0) { - // If we ran out of data, report unknown and we'll place the previous parse - // type onto the stack and try again when we have more data. - return UNKNOWN; - } - // TODO(sven): Split this method based on context since different contexts - // support different tokens. Would slightly speed up processing? - const char* data = p_.data(); - if (*data == '\"' || *data == '\'') return BEGIN_STRING; - if (*data == '-' || ('0' <= *data && *data <= '9')) { - return BEGIN_NUMBER; - } - if (size >= true_len && !strncmp(data, "true", true_len)) { - return BEGIN_TRUE; - } - if (size >= false_len && !strncmp(data, "false", false_len)) { - return BEGIN_FALSE; - } - if (size >= null_len && !strncmp(data, "null", null_len)) { - return BEGIN_NULL; - } - if (*data == '{') return BEGIN_OBJECT; - if (*data == '}') return END_OBJECT; - if (*data == '[') return BEGIN_ARRAY; - if (*data == ']') return END_ARRAY; - if (*data == ':') return ENTRY_SEPARATOR; - if (*data == ',') return VALUE_SEPARATOR; - if (MatchKey(p_)) { - return BEGIN_KEY; - } - - // We don't know that we necessarily have an invalid token here, just that we - // can't parse what we have so far. So we don't report an error and just - // return UNKNOWN so we can try again later when we have more data, or if we - // finish and we have leftovers. - return UNKNOWN; -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h deleted file mode 100644 index 6b9d46ee22..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h +++ /dev/null @@ -1,269 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__ - -#include <stack> -#include <string> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/status.h> - -namespace google { -namespace util { -class Status; -} // namespace util - -namespace protobuf { -namespace util { -namespace converter { - -class ObjectWriter; - -// A JSON parser that can parse a stream of JSON chunks rather than needing the -// entire JSON string up front. It is a modified version of the parser in -// //net/proto/json/json-parser.h that has been changed in the following ways: -// - Changed from recursion to an explicit stack to allow resumption -// - Added support for int64 and uint64 numbers -// - Removed support for octal and decimal escapes -// - Removed support for numeric keys -// - Removed support for functions (javascript) -// - Removed some lax-comma support (but kept trailing comma support) -// - Writes directly to an ObjectWriter rather than using subclassing -// -// Here is an example usage: -// JsonStreamParser parser(ow_.get()); -// util::Status result = parser.Parse(chunk1); -// result.Update(parser.Parse(chunk2)); -// result.Update(parser.FinishParse()); -// GOOGLE_DCHECK(result.ok()) << "Failed to parse JSON"; -// -// This parser is thread-compatible as long as only one thread is calling a -// Parse() method at a time. -class LIBPROTOBUF_EXPORT JsonStreamParser { - public: - // Creates a JsonStreamParser that will write to the given ObjectWriter. - explicit JsonStreamParser(ObjectWriter* ow); - virtual ~JsonStreamParser(); - - // Parses a UTF-8 encoded JSON string from a StringPiece. - util::Status Parse(StringPiece json); - - - // Finish parsing the JSON string. - util::Status FinishParse(); - - - private: - enum TokenType { - BEGIN_STRING, // " or ' - BEGIN_NUMBER, // - or digit - BEGIN_TRUE, // true - BEGIN_FALSE, // false - BEGIN_NULL, // null - BEGIN_OBJECT, // { - END_OBJECT, // } - BEGIN_ARRAY, // [ - END_ARRAY, // ] - ENTRY_SEPARATOR, // : - VALUE_SEPARATOR, // , - BEGIN_KEY, // letter, _, $ or digit. Must begin with non-digit - UNKNOWN // Unknown token or we ran out of the stream. - }; - - enum ParseType { - VALUE, // Expects a {, [, true, false, null, string or number - OBJ_MID, // Expects a ',' or } - ENTRY, // Expects a key or } - ENTRY_MID, // Expects a : - ARRAY_VALUE, // Expects a value or ] - ARRAY_MID // Expects a ',' or ] - }; - - // Holds the result of parsing a number - struct NumberResult { - enum Type { DOUBLE, INT, UINT }; - Type type; - union { - double double_val; - int64 int_val; - uint64 uint_val; - }; - }; - - // Parses a single chunk of JSON, returning an error if the JSON was invalid. - util::Status ParseChunk(StringPiece json); - - // Runs the parser based on stack_ and p_, until the stack is empty or p_ runs - // out of data. If we unexpectedly run out of p_ we push the latest back onto - // the stack and return. - util::Status RunParser(); - - // Parses a value from p_ and writes it to ow_. - // A value may be an object, array, true, false, null, string or number. - util::Status ParseValue(TokenType type); - - // Parses a string and writes it out to the ow_. - util::Status ParseString(); - - // Parses a string, storing the result in parsed_. - util::Status ParseStringHelper(); - - // This function parses unicode escape sequences in strings. It returns an - // error when there's a parsing error, either the size is not the expected - // size or a character is not a hex digit. When it returns str will contain - // what has been successfully parsed so far. - util::Status ParseUnicodeEscape(); - - // Expects p_ to point to a JSON number, writes the number to the writer using - // the appropriate Render method based on the type of number. - util::Status ParseNumber(); - - // Parse a number into a NumberResult, reporting an error if no number could - // be parsed. This method will try to parse into a uint64, int64, or double - // based on whether the number was positive or negative or had a decimal - // component. - util::Status ParseNumberHelper(NumberResult* result); - - // Handles a { during parsing of a value. - util::Status HandleBeginObject(); - - // Parses from the ENTRY state. - util::Status ParseEntry(TokenType type); - - // Parses from the ENTRY_MID state. - util::Status ParseEntryMid(TokenType type); - - // Parses from the OBJ_MID state. - util::Status ParseObjectMid(TokenType type); - - // Handles a [ during parsing of a value. - util::Status HandleBeginArray(); - - // Parses from the ARRAY_VALUE state. - util::Status ParseArrayValue(TokenType type); - - // Parses from the ARRAY_MID state. - util::Status ParseArrayMid(TokenType type); - - // Expects p_ to point to an unquoted literal - util::Status ParseTrue(); - util::Status ParseFalse(); - util::Status ParseNull(); - util::Status ParseEmptyNull(); - - // Whether an empty-null is allowed in the current state. - bool IsEmptyNullAllowed(TokenType type); - - // Report a failure as a util::Status. - util::Status ReportFailure(StringPiece message); - - // Report a failure due to an UNKNOWN token type. We check if we hit the - // end of the stream and if we're finishing or not to detect what type of - // status to return in this case. - util::Status ReportUnknown(StringPiece message); - - // Advance p_ past all whitespace or until the end of the string. - void SkipWhitespace(); - - // Advance p_ one UTF-8 character - void Advance(); - - // Expects p_ to point to the beginning of a key. - util::Status ParseKey(); - - // Return the type of the next token at p_. - TokenType GetNextTokenType(); - - // The object writer to write parse events to. - ObjectWriter* ow_; - - // The stack of parsing we still need to do. When the stack runs empty we will - // have parsed a single value from the root (e.g. an object or list). - std::stack<ParseType> stack_; - - // Contains any leftover text from a previous chunk that we weren't able to - // fully parse, for example the start of a key or number. - string leftover_; - - // The current chunk of JSON being parsed. Primarily used for providing - // context during error reporting. - StringPiece json_; - - // A pointer within the current JSON being parsed, used to track location. - StringPiece p_; - - // Stores the last key read, as we separate parsing of keys and values. - StringPiece key_; - - // Storage for key_ if we need to keep ownership, for example between chunks - // or if the key was unescaped from a JSON string. - string key_storage_; - - // True during the FinishParse() call, so we know that any errors are fatal. - // For example an unterminated string will normally result in cancelling and - // trying during the next chunk, but during FinishParse() it is an error. - bool finishing_; - - // String we parsed during a call to ParseStringHelper(). - StringPiece parsed_; - - // Storage for the string we parsed. This may be empty if the string was able - // to be parsed directly from the input. - string parsed_storage_; - - // The character that opened the string, either ' or ". - // A value of 0 indicates that string parsing is not in process. - char string_open_; - - // Storage for the chunk that are being parsed in ParseChunk(). - string chunk_storage_; - - // Whether to allow non UTF-8 encoded input and replace invalid code points. - bool coerce_to_utf8_; - - // Whether allows empty string represented null array value or object entry - // value. - bool allow_empty_null_; - - // Whether allows out-of-range floating point numbers or reject them. - bool loose_float_number_conversion_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonStreamParser); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc deleted file mode 100644 index ca71ff2419..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc +++ /dev/null @@ -1,845 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/json_stream_parser.h> - -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/time.h> -#include <google/protobuf/util/internal/expecting_objectwriter.h> -#include <google/protobuf/util/internal/object_writer.h> -#include <google/protobuf/stubs/strutil.h> -#include <gtest/gtest.h> -#include <google/protobuf/stubs/status.h> - - -namespace google { -namespace protobuf { -namespace util { -using util::Status; -namespace error { -using util::error::INVALID_ARGUMENT; -} // namespace error -namespace converter { - -using util::Status; - -// Tests for the JSON Stream Parser. These tests are intended to be -// comprehensive and cover the following: -// -// Positive tests: -// - true, false, null -// - empty object or array. -// - negative and positive double and int, unsigned int -// - single and double quoted strings -// - string key, unquoted key, numeric key -// - array containing array, object, value -// - object containing array, object, value -// - unicode handling in strings -// - ascii escaping (\b, \f, \n, \r, \t, \v) -// - trailing commas -// -// Negative tests: -// - illegal literals -// - mismatched quotes failure on strings -// - unterminated string failure -// - unexpected end of string failure -// - mismatched object and array closing -// - Failure to close array or object -// - numbers too large -// - invalid unicode escapes. -// - invalid unicode sequences. -// - numbers as keys -// -// For each test we split the input string on every possible character to ensure -// the parser is able to handle arbitrarily split input for all cases. We also -// do a final test of the entire test case one character at a time. -// -// It is verified that expected calls to the mocked objects are in sequence. -class JsonStreamParserTest : public ::testing::Test { - protected: - JsonStreamParserTest() : mock_(), ow_(&mock_) {} - virtual ~JsonStreamParserTest() {} - - util::Status RunTest(StringPiece json, int split, bool coerce_utf8 = false, - bool allow_empty_null = false, - bool loose_float_number_conversion = false) { - JsonStreamParser parser(&mock_); - - // Special case for split == length, test parsing one character at a time. - if (split == json.length()) { - GOOGLE_LOG(INFO) << "Testing split every char: " << json; - for (int i = 0; i < json.length(); ++i) { - StringPiece single = json.substr(i, 1); - util::Status result = parser.Parse(single); - if (!result.ok()) { - return result; - } - } - return parser.FinishParse(); - } - - // Normal case, split at the split point and parse two substrings. - StringPiece first = json.substr(0, split); - StringPiece rest = json.substr(split); - GOOGLE_LOG(INFO) << "Testing split: " << first << "><" << rest; - util::Status result = parser.Parse(first); - if (result.ok()) { - result = parser.Parse(rest); - if (result.ok()) { - result = parser.FinishParse(); - } - } - return result; - } - - void DoTest(StringPiece json, int split, bool coerce_utf8 = false, - bool allow_empty_null = false, - bool loose_float_number_conversion = false) { - util::Status result = RunTest(json, split, coerce_utf8, allow_empty_null, - loose_float_number_conversion); - if (!result.ok()) { - GOOGLE_LOG(WARNING) << result; - } - EXPECT_OK(result); - } - - void DoErrorTest(StringPiece json, int split, StringPiece error_prefix, - bool coerce_utf8 = false, bool allow_empty_null = false) { - util::Status result = - RunTest(json, split, coerce_utf8, allow_empty_null); - EXPECT_EQ(util::error::INVALID_ARGUMENT, result.error_code()); - StringPiece error_message(result.error_message()); - EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size())); - } - - -#ifndef _MSC_VER - // TODO(xiaofeng): We have to disable InSequence check for MSVC because it - // causes stack overflow due to its use of a linked list that is desctructed - // recursively. - ::testing::InSequence in_sequence_; -#endif // !_MSC_VER - MockObjectWriter mock_; - ExpectingObjectWriter ow_; -}; - - -// Positive tests - -// - true, false, null -TEST_F(JsonStreamParserTest, SimpleTrue) { - StringPiece str = "true"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderBool("", true); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleFalse) { - StringPiece str = "false"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderBool("", false); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleNull) { - StringPiece str = "null"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderNull(""); - DoTest(str, i); - } -} - -// - empty object and array. -TEST_F(JsonStreamParserTest, EmptyObject) { - StringPiece str = "{}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->EndObject(); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, EmptyList) { - StringPiece str = "[]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("")->EndList(); - DoTest(str, i); - } -} - -// - negative and positive double and int, unsigned int -TEST_F(JsonStreamParserTest, SimpleDouble) { - StringPiece str = "42.5"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderDouble("", 42.5); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, ScientificDouble) { - StringPiece str = "1.2345e-10"; - for (int i = 0; i < str.length(); ++i) { - ow_.RenderDouble("", 1.2345e-10); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleNegativeDouble) { - StringPiece str = "-1045.235"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderDouble("", -1045.235); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleInt) { - StringPiece str = "123456"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderUint64("", 123456); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleNegativeInt) { - StringPiece str = "-79497823553162765"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderInt64("", -79497823553162765LL); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleUnsignedInt) { - StringPiece str = "11779497823553162765"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderUint64("", 11779497823553162765ULL); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, OctalNumberIsInvalid) { - StringPiece str = "01234"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values."); - } - str = "-01234"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values."); - } -} - -TEST_F(JsonStreamParserTest, HexNumberIsInvalid) { - StringPiece str = "0x1234"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values."); - } - str = "-0x1234"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values."); - } - str = "12x34"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Unable to parse number."); - } -} - -// - single and double quoted strings -TEST_F(JsonStreamParserTest, EmptyDoubleQuotedString) { - StringPiece str = "\"\""; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderString("", ""); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, EmptySingleQuotedString) { - StringPiece str = "''"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderString("", ""); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleDoubleQuotedString) { - StringPiece str = "\"Some String\""; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderString("", "Some String"); - DoTest(str, i); - } -} - -TEST_F(JsonStreamParserTest, SimpleSingleQuotedString) { - StringPiece str = "'Another String'"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderString("", "Another String"); - DoTest(str, i); - } -} - -// - string key, unquoted key, numeric key -TEST_F(JsonStreamParserTest, ObjectKeyTypes) { - StringPiece str = - "{'s': true, \"d\": false, key: null, snake_key: [], camelKey: {}}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("") - ->RenderBool("s", true) - ->RenderBool("d", false) - ->RenderNull("key") - ->StartList("snake_key") - ->EndList() - ->StartObject("camelKey") - ->EndObject() - ->EndObject(); - DoTest(str, i); - } -} - -// - array containing primitive values (true, false, null, num, string) -TEST_F(JsonStreamParserTest, ArrayPrimitiveValues) { - StringPiece str = "[true, false, null, 'one', \"two\"]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->RenderBool("", true) - ->RenderBool("", false) - ->RenderNull("") - ->RenderString("", "one") - ->RenderString("", "two") - ->EndList(); - DoTest(str, i); - } -} - -// - array containing array, object -TEST_F(JsonStreamParserTest, ArrayComplexValues) { - StringPiece str = - "[[22, -127, 45.3, -1056.4, 11779497823553162765], {'key': true}]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->StartList("") - ->RenderUint64("", 22) - ->RenderInt64("", -127) - ->RenderDouble("", 45.3) - ->RenderDouble("", -1056.4) - ->RenderUint64("", 11779497823553162765ULL) - ->EndList() - ->StartObject("") - ->RenderBool("key", true) - ->EndObject() - ->EndList(); - DoTest(str, i); - } -} - - -// - object containing array, object, value (true, false, null, num, string) -TEST_F(JsonStreamParserTest, ObjectValues) { - StringPiece str = - "{t: true, f: false, n: null, s: 'a string', d: \"another string\", pi: " - "22, ni: -127, pd: 45.3, nd: -1056.4, pl: 11779497823553162765, l: [[]], " - "o: {'key': true}}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("") - ->RenderBool("t", true) - ->RenderBool("f", false) - ->RenderNull("n") - ->RenderString("s", "a string") - ->RenderString("d", "another string") - ->RenderUint64("pi", 22) - ->RenderInt64("ni", -127) - ->RenderDouble("pd", 45.3) - ->RenderDouble("nd", -1056.4) - ->RenderUint64("pl", 11779497823553162765ULL) - ->StartList("l") - ->StartList("") - ->EndList() - ->EndList() - ->StartObject("o") - ->RenderBool("key", true) - ->EndObject() - ->EndObject(); - DoTest(str, i); - } -} - - -TEST_F(JsonStreamParserTest, RejectNonUtf8WhenNotCoerced) { - StringPiece json = "{\"address\":\xFF\"חרושת 23, רעננה, ישראל\"}"; - for (int i = 0; i <= json.length(); ++i) { - DoErrorTest(json, i, "Encountered non UTF-8 code points."); - } - json = "{\"address\": \"חרושת 23,\xFFרעננה, ישראל\"}"; - for (int i = 0; i <= json.length(); ++i) { - DoErrorTest(json, i, "Encountered non UTF-8 code points."); - } - DoErrorTest("\xFF{}", 0, "Encountered non UTF-8 code points."); -} - -// - unicode handling in strings -TEST_F(JsonStreamParserTest, UnicodeEscaping) { - StringPiece str = "[\"\\u0639\\u0631\\u0628\\u0649\"]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->RenderString("", "\xD8\xB9\xD8\xB1\xD8\xA8\xD9\x89") - ->EndList(); - DoTest(str, i); - } -} - -// - unicode UTF-16 surrogate pair handling in strings -TEST_F(JsonStreamParserTest, UnicodeSurrogatePairEscaping) { - StringPiece str = - "[\"\\u0bee\\ud800\\uddf1\\uD80C\\uDDA4\\uD83d\\udC1D\\uD83C\\uDF6F\"]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->RenderString("", - "\xE0\xAF\xAE\xF0\x90\x87\xB1\xF0\x93\x86\xA4\xF0" - "\x9F\x90\x9D\xF0\x9F\x8D\xAF") - ->EndList(); - DoTest(str, i); - } -} - - -TEST_F(JsonStreamParserTest, UnicodeEscapingInvalidCodePointWhenNotCoerced) { - // A low surrogate alone. - StringPiece str = "[\"\\ude36\"]"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid unicode code point."); - } -} - -TEST_F(JsonStreamParserTest, UnicodeEscapingMissingLowSurrogateWhenNotCoerced) { - // A high surrogate alone. - StringPiece str = "[\"\\ud83d\"]"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Missing low surrogate."); - } - // A high surrogate with some trailing characters. - str = "[\"\\ud83d|ude36\"]"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Missing low surrogate."); - } - // A high surrogate with half a low surrogate. - str = "[\"\\ud83d\\ude--\"]"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid escape sequence."); - } - // Two high surrogates. - str = "[\"\\ud83d\\ud83d\"]"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid low surrogate."); - } -} - -// - ascii escaping (\b, \f, \n, \r, \t, \v) -TEST_F(JsonStreamParserTest, AsciiEscaping) { - StringPiece str = - "[\"\\b\", \"\\ning\", \"test\\f\", \"\\r\\t\", \"test\\\\\\ving\"]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->RenderString("", "\b") - ->RenderString("", "\ning") - ->RenderString("", "test\f") - ->RenderString("", "\r\t") - ->RenderString("", "test\\\ving") - ->EndList(); - DoTest(str, i); - } -} - -// - trailing commas, we support a single trailing comma but no internal commas. -TEST_F(JsonStreamParserTest, TrailingCommas) { - StringPiece str = "[['a',true,], {b: null,},]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("") - ->StartList("") - ->RenderString("", "a") - ->RenderBool("", true) - ->EndList() - ->StartObject("") - ->RenderNull("b") - ->EndObject() - ->EndList(); - DoTest(str, i); - } -} - -// Negative tests - -// illegal literals -TEST_F(JsonStreamParserTest, ExtraTextAfterTrue) { - StringPiece str = "truee"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderBool("", true); - DoErrorTest(str, i, "Parsing terminated before end of input."); - } -} - -TEST_F(JsonStreamParserTest, InvalidNumberDashOnly) { - StringPiece str = "-"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Unable to parse number."); - } -} - -TEST_F(JsonStreamParserTest, InvalidNumberDashName) { - StringPiece str = "-foo"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Unable to parse number."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralInArray) { - StringPiece str = "[nule]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Unexpected token."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralInObject) { - StringPiece str = "{123false}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -// mismatched quotes failure on strings -TEST_F(JsonStreamParserTest, MismatchedSingleQuotedLiteral) { - StringPiece str = "'Some str\""; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -TEST_F(JsonStreamParserTest, MismatchedDoubleQuotedLiteral) { - StringPiece str = "\"Another string that ends poorly!'"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -// unterminated strings -TEST_F(JsonStreamParserTest, UnterminatedLiteralString) { - StringPiece str = "\"Forgot the rest of i"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -TEST_F(JsonStreamParserTest, UnterminatedStringEscape) { - StringPiece str = "\"Forgot the rest of \\"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -TEST_F(JsonStreamParserTest, UnterminatedStringInArray) { - StringPiece str = "[\"Forgot to close the string]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -TEST_F(JsonStreamParserTest, UnterminatedStringInObject) { - StringPiece str = "{f: \"Forgot to close the string}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -TEST_F(JsonStreamParserTest, UnterminatedObject) { - StringPiece str = "{"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Unexpected end of string."); - } -} - - -// mismatched object and array closing -TEST_F(JsonStreamParserTest, MismatchedCloseObject) { - StringPiece str = "{'key': true]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->RenderBool("key", true); - DoErrorTest(str, i, "Expected , or } after key:value pair."); - } -} - -TEST_F(JsonStreamParserTest, MismatchedCloseArray) { - StringPiece str = "[true, null}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("")->RenderBool("", true)->RenderNull(""); - DoErrorTest(str, i, "Expected , or ] after array value."); - } -} - -// Invalid object keys. -TEST_F(JsonStreamParserTest, InvalidNumericObjectKey) { - StringPiece str = "{42: true}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralObjectInObject) { - StringPiece str = "{{bob: true}}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralArrayInObject) { - StringPiece str = "{[null]}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralValueInObject) { - StringPiece str = "{false}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, MissingColonAfterStringInObject) { - StringPiece str = "{\"key\"}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected : between key:value pair."); - } -} - -TEST_F(JsonStreamParserTest, MissingColonAfterKeyInObject) { - StringPiece str = "{key}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected : between key:value pair."); - } -} - -TEST_F(JsonStreamParserTest, EndOfTextAfterKeyInObject) { - StringPiece str = "{key"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Unexpected end of string."); - } -} - -TEST_F(JsonStreamParserTest, MissingValueAfterColonInObject) { - StringPiece str = "{key:}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Unexpected token."); - } -} - -TEST_F(JsonStreamParserTest, MissingCommaBetweenObjectEntries) { - StringPiece str = "{key:20 'hello': true}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->RenderUint64("key", 20); - DoErrorTest(str, i, "Expected , or } after key:value pair."); - } -} - -TEST_F(JsonStreamParserTest, InvalidLiteralAsObjectKey) { - StringPiece str = "{false: 20}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, ExtraCharactersAfterObject) { - StringPiece str = "{}}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->EndObject(); - DoErrorTest(str, i, "Parsing terminated before end of input."); - } -} - -// numbers too large -TEST_F(JsonStreamParserTest, PositiveNumberTooBig) { - StringPiece str = "[18446744073709551616]"; // 2^64 - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Unable to parse number."); - } -} - -TEST_F(JsonStreamParserTest, NegativeNumberTooBig) { - StringPiece str = "[-18446744073709551616]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Unable to parse number."); - } -} - -TEST_F(JsonStreamParserTest, DoubleTooBig) { - StringPiece str = "[1.89769e+308]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Number exceeds the range of double."); - } - str = "[-1.89769e+308]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Number exceeds the range of double."); - } -} - - -// invalid bare backslash. -TEST_F(JsonStreamParserTest, UnfinishedEscape) { - StringPiece str = "\"\\"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Closing quote expected in string."); - } -} - -// invalid bare backslash u. -TEST_F(JsonStreamParserTest, UnfinishedUnicodeEscape) { - StringPiece str = "\"\\u"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Illegal hex string."); - } -} - -// invalid unicode sequence. -TEST_F(JsonStreamParserTest, UnicodeEscapeCutOff) { - StringPiece str = "\"\\u12"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Illegal hex string."); - } -} - -// invalid unicode sequence (valid in modern EcmaScript but not in JSON). -TEST_F(JsonStreamParserTest, BracketedUnicodeEscape) { - StringPiece str = "\"\\u{1f36f}\""; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid escape sequence."); - } -} - - -TEST_F(JsonStreamParserTest, UnicodeEscapeInvalidCharacters) { - StringPiece str = "\"\\u12$4hello"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid escape sequence."); - } -} - -// invalid unicode sequence in low half surrogate: g is not a hex digit. -TEST_F(JsonStreamParserTest, UnicodeEscapeLowHalfSurrogateInvalidCharacters) { - StringPiece str = "\"\\ud800\\udcfg\""; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Invalid escape sequence."); - } -} - -// Extra commas with an object or array. -TEST_F(JsonStreamParserTest, ExtraCommaInObject) { - StringPiece str = "{'k1': true,,'k2': false}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->RenderBool("k1", true); - DoErrorTest(str, i, "Expected an object key or }."); - } -} - -TEST_F(JsonStreamParserTest, ExtraCommaInArray) { - StringPiece str = "[true,,false}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("")->RenderBool("", true); - DoErrorTest(str, i, "Unexpected token."); - } -} - -// Extra text beyond end of value. -TEST_F(JsonStreamParserTest, ExtraTextAfterLiteral) { - StringPiece str = "'hello', 'world'"; - for (int i = 0; i <= str.length(); ++i) { - ow_.RenderString("", "hello"); - DoErrorTest(str, i, "Parsing terminated before end of input."); - } -} - -TEST_F(JsonStreamParserTest, ExtraTextAfterObject) { - StringPiece str = "{'key': true} 'oops'"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject("")->RenderBool("key", true)->EndObject(); - DoErrorTest(str, i, "Parsing terminated before end of input."); - } -} - -TEST_F(JsonStreamParserTest, ExtraTextAfterArray) { - StringPiece str = "[null] 'oops'"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList("")->RenderNull("")->EndList(); - DoErrorTest(str, i, "Parsing terminated before end of input."); - } -} - -// Random unknown text in the value. -TEST_F(JsonStreamParserTest, UnknownCharactersAsValue) { - StringPiece str = "*"; - for (int i = 0; i <= str.length(); ++i) { - DoErrorTest(str, i, "Expected a value."); - } -} - -TEST_F(JsonStreamParserTest, UnknownCharactersInArray) { - StringPiece str = "[*]"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartList(""); - DoErrorTest(str, i, "Expected a value or ] within an array."); - } -} - -TEST_F(JsonStreamParserTest, UnknownCharactersInObject) { - StringPiece str = "{'key': *}"; - for (int i = 0; i <= str.length(); ++i) { - ow_.StartObject(""); - DoErrorTest(str, i, "Expected a value."); - } -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h deleted file mode 100644 index 0864b05737..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h +++ /dev/null @@ -1,65 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__ - -#include <string> - -#include <google/protobuf/stubs/common.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// LocationTrackerInterface is an interface for classes that track -// the location information for the purpose of error reporting. -class LIBPROTOBUF_EXPORT LocationTrackerInterface { - public: - virtual ~LocationTrackerInterface() {} - - // Returns the object location as human readable string. - virtual string ToString() const = 0; - - protected: - LocationTrackerInterface() {} - - private: - // Please do not add any data members to this class. - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LocationTrackerInterface); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h deleted file mode 100644 index 591c35dbbb..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h +++ /dev/null @@ -1,63 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__ - -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/util/internal/error_listener.h> -#include <google/protobuf/util/internal/location_tracker.h> -#include <gmock/gmock.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -class MockErrorListener : public ErrorListener { - public: - MockErrorListener() {} - virtual ~MockErrorListener() {} - - MOCK_METHOD3(InvalidName, void(const LocationTrackerInterface& loc, - StringPiece unknown_name, - StringPiece message)); - MOCK_METHOD3(InvalidValue, void(const LocationTrackerInterface& loc, - StringPiece type_name, StringPiece value)); - MOCK_METHOD2(MissingField, void(const LocationTrackerInterface& loc, - StringPiece missing_name)); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h deleted file mode 100644 index 8586cecc91..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h +++ /dev/null @@ -1,64 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__ - -#include <string> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/location_tracker.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// An empty concrete implementation of LocationTrackerInterface. -class ObjectLocationTracker : public LocationTrackerInterface { - public: - // Creates an empty location tracker. - ObjectLocationTracker() {} - - virtual ~ObjectLocationTracker() {} - - // Returns empty because nothing is tracked. - virtual string ToString() const { return ""; } - - private: - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectLocationTracker); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h deleted file mode 100644 index 2c31cfb09e..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h +++ /dev/null @@ -1,79 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__ - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/status.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -class ObjectWriter; - -// An ObjectSource is anything that can write to an ObjectWriter. -// Implementation of this interface typically provide constructors or -// factory methods to create an instance based on some source data, for -// example, a character stream, or protobuf. -// -// Derived classes could be thread-unsafe. -class LIBPROTOBUF_EXPORT ObjectSource { - public: - virtual ~ObjectSource() {} - - // Writes to the ObjectWriter - virtual util::Status WriteTo(ObjectWriter* ow) const { - return NamedWriteTo("", ow); - } - - // Writes to the ObjectWriter with a custom name for the message. - // This is useful when you chain ObjectSource together by embedding one - // within another. - virtual util::Status NamedWriteTo(StringPiece name, - ObjectWriter* ow) const = 0; - - protected: - ObjectSource() {} - - private: - // Do not add any data members to this class. - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectSource); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc deleted file mode 100644 index 57cc08a1d7..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/object_writer.h> - -#include <google/protobuf/util/internal/datapiece.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// static -void ObjectWriter::RenderDataPieceTo(const DataPiece& data, StringPiece name, - ObjectWriter* ow) { - switch (data.type()) { - case DataPiece::TYPE_INT32: { - ow->RenderInt32(name, data.ToInt32().ValueOrDie()); - break; - } - case DataPiece::TYPE_INT64: { - ow->RenderInt64(name, data.ToInt64().ValueOrDie()); - break; - } - case DataPiece::TYPE_UINT32: { - ow->RenderUint32(name, data.ToUint32().ValueOrDie()); - break; - } - case DataPiece::TYPE_UINT64: { - ow->RenderUint64(name, data.ToUint64().ValueOrDie()); - break; - } - case DataPiece::TYPE_DOUBLE: { - ow->RenderDouble(name, data.ToDouble().ValueOrDie()); - break; - } - case DataPiece::TYPE_FLOAT: { - ow->RenderFloat(name, data.ToFloat().ValueOrDie()); - break; - } - case DataPiece::TYPE_BOOL: { - ow->RenderBool(name, data.ToBool().ValueOrDie()); - break; - } - case DataPiece::TYPE_STRING: { - ow->RenderString(name, data.ToString().ValueOrDie()); - break; - } - case DataPiece::TYPE_BYTES: { - ow->RenderBytes(name, data.ToBytes().ValueOrDie()); - break; - } - case DataPiece::TYPE_NULL: { - ow->RenderNull(name); - break; - } - default: - break; - } -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h deleted file mode 100644 index b6fbd19bf7..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h +++ /dev/null @@ -1,146 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__ - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringpiece.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -class DataPiece; - -// An ObjectWriter is an interface for writing a stream of events -// representing objects and collections. Implementation of this -// interface can be used to write an object stream to an in-memory -// structure, protobufs, JSON, XML, or any other output format -// desired. The ObjectSource interface is typically used as the -// source of an object stream. -// -// See JsonObjectWriter for a sample implementation of ObjectWriter -// and its use. -// -// Derived classes could be thread-unsafe. -// -// TODO(xinb): seems like a prime candidate to apply the RAII paradigm -// and get rid the need to call EndXXX(). -class LIBPROTOBUF_EXPORT ObjectWriter { - public: - virtual ~ObjectWriter() {} - - // Starts an object. If the name is empty, the object will not be named. - virtual ObjectWriter* StartObject(StringPiece name) = 0; - - // Ends an object. - virtual ObjectWriter* EndObject() = 0; - - // Starts a list. If the name is empty, the list will not be named. - virtual ObjectWriter* StartList(StringPiece name) = 0; - - // Ends a list. - virtual ObjectWriter* EndList() = 0; - - // Renders a boolean value. - virtual ObjectWriter* RenderBool(StringPiece name, bool value) = 0; - - // Renders an 32-bit integer value. - virtual ObjectWriter* RenderInt32(StringPiece name, int32 value) = 0; - - // Renders an 32-bit unsigned integer value. - virtual ObjectWriter* RenderUint32(StringPiece name, uint32 value) = 0; - - // Renders a 64-bit integer value. - virtual ObjectWriter* RenderInt64(StringPiece name, int64 value) = 0; - - // Renders an 64-bit unsigned integer value. - virtual ObjectWriter* RenderUint64(StringPiece name, uint64 value) = 0; - - // Renders a double value. - virtual ObjectWriter* RenderDouble(StringPiece name, double value) = 0; - - // Renders a float value. - virtual ObjectWriter* RenderFloat(StringPiece name, float value) = 0; - - // Renders a StringPiece value. This is for rendering strings. - virtual ObjectWriter* RenderString(StringPiece name, StringPiece value) = 0; - - // Renders a bytes value. - virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) = 0; - - // Renders a Null value. - virtual ObjectWriter* RenderNull(StringPiece name) = 0; - - - // Renders a DataPiece object to a ObjectWriter. - static void RenderDataPieceTo(const DataPiece& data, StringPiece name, - ObjectWriter* ow); - - // Indicates whether this ObjectWriter has completed writing the root message, - // usually this means writing of one complete object. Subclasses must override - // this behavior appropriately. - virtual bool done() { return false; } - - void set_use_strict_base64_decoding(bool value) { - use_strict_base64_decoding_ = value; - } - - bool use_strict_base64_decoding() const { - return use_strict_base64_decoding_; - } - - // Whether empty strings should be rendered for the next name for Start/Render - // calls. This setting is only valid until the next key is rendered, after - // which it gets reset. - // It is up to the derived classes to interpret this and render accordingly. - // Default implementation ignores this setting. - virtual void empty_name_ok_for_next_key() {} - - protected: - ObjectWriter() : use_strict_base64_decoding_(true) {} - - private: - // If set to true, we use the stricter version of base64 decoding for byte - // fields by making sure decoded version encodes back to the original string. - bool use_strict_base64_decoding_; - - // Do not add any data members to this class. - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc deleted file mode 100644 index 8bebf2ab1f..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc +++ /dev/null @@ -1,799 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/proto_writer.h> - -#include <functional> -#include <stack> - -#include <google/protobuf/stubs/once.h> -#include <google/protobuf/stubs/time.h> -#include <google/protobuf/wire_format_lite.h> -#include <google/protobuf/util/internal/field_mask_utility.h> -#include <google/protobuf/util/internal/object_location_tracker.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/map_util.h> -#include <google/protobuf/stubs/statusor.h> - - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::internal::WireFormatLite; -using google::protobuf::io::CodedOutputStream; -using util::error::INVALID_ARGUMENT; -using util::Status; -using util::StatusOr; - - -ProtoWriter::ProtoWriter(TypeResolver* type_resolver, - const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener) - : master_type_(type), - typeinfo_(TypeInfo::NewTypeInfo(type_resolver)), - own_typeinfo_(true), - done_(false), - ignore_unknown_fields_(false), - use_lower_camel_for_enums_(false), - element_(NULL), - size_insert_(), - output_(output), - buffer_(), - adapter_(&buffer_), - stream_(new CodedOutputStream(&adapter_)), - listener_(listener), - invalid_depth_(0), - tracker_(new ObjectLocationTracker()) {} - -ProtoWriter::ProtoWriter(const TypeInfo* typeinfo, - const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener) - : master_type_(type), - typeinfo_(typeinfo), - own_typeinfo_(false), - done_(false), - ignore_unknown_fields_(false), - use_lower_camel_for_enums_(false), - element_(NULL), - size_insert_(), - output_(output), - buffer_(), - adapter_(&buffer_), - stream_(new CodedOutputStream(&adapter_)), - listener_(listener), - invalid_depth_(0), - tracker_(new ObjectLocationTracker()) {} - -ProtoWriter::~ProtoWriter() { - if (own_typeinfo_) { - delete typeinfo_; - } - if (element_ == NULL) return; - // Cleanup explicitly in order to avoid destructor stack overflow when input - // is deeply nested. - // Cast to BaseElement to avoid doing additional checks (like missing fields) - // during pop(). - google::protobuf::scoped_ptr<BaseElement> element( - static_cast<BaseElement*>(element_.get())->pop<BaseElement>()); - while (element != NULL) { - element.reset(element->pop<BaseElement>()); - } -} - -namespace { - -// Writes an INT32 field, including tag to the stream. -inline Status WriteInt32(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int32> i32 = data.ToInt32(); - if (i32.ok()) { - WireFormatLite::WriteInt32(field_number, i32.ValueOrDie(), stream); - } - return i32.status(); -} - -// writes an SFIXED32 field, including tag, to the stream. -inline Status WriteSFixed32(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int32> i32 = data.ToInt32(); - if (i32.ok()) { - WireFormatLite::WriteSFixed32(field_number, i32.ValueOrDie(), stream); - } - return i32.status(); -} - -// Writes an SINT32 field, including tag, to the stream. -inline Status WriteSInt32(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int32> i32 = data.ToInt32(); - if (i32.ok()) { - WireFormatLite::WriteSInt32(field_number, i32.ValueOrDie(), stream); - } - return i32.status(); -} - -// Writes a FIXED32 field, including tag, to the stream. -inline Status WriteFixed32(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<uint32> u32 = data.ToUint32(); - if (u32.ok()) { - WireFormatLite::WriteFixed32(field_number, u32.ValueOrDie(), stream); - } - return u32.status(); -} - -// Writes a UINT32 field, including tag, to the stream. -inline Status WriteUInt32(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<uint32> u32 = data.ToUint32(); - if (u32.ok()) { - WireFormatLite::WriteUInt32(field_number, u32.ValueOrDie(), stream); - } - return u32.status(); -} - -// Writes an INT64 field, including tag, to the stream. -inline Status WriteInt64(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int64> i64 = data.ToInt64(); - if (i64.ok()) { - WireFormatLite::WriteInt64(field_number, i64.ValueOrDie(), stream); - } - return i64.status(); -} - -// Writes an SFIXED64 field, including tag, to the stream. -inline Status WriteSFixed64(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int64> i64 = data.ToInt64(); - if (i64.ok()) { - WireFormatLite::WriteSFixed64(field_number, i64.ValueOrDie(), stream); - } - return i64.status(); -} - -// Writes an SINT64 field, including tag, to the stream. -inline Status WriteSInt64(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<int64> i64 = data.ToInt64(); - if (i64.ok()) { - WireFormatLite::WriteSInt64(field_number, i64.ValueOrDie(), stream); - } - return i64.status(); -} - -// Writes a FIXED64 field, including tag, to the stream. -inline Status WriteFixed64(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<uint64> u64 = data.ToUint64(); - if (u64.ok()) { - WireFormatLite::WriteFixed64(field_number, u64.ValueOrDie(), stream); - } - return u64.status(); -} - -// Writes a UINT64 field, including tag, to the stream. -inline Status WriteUInt64(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<uint64> u64 = data.ToUint64(); - if (u64.ok()) { - WireFormatLite::WriteUInt64(field_number, u64.ValueOrDie(), stream); - } - return u64.status(); -} - -// Writes a DOUBLE field, including tag, to the stream. -inline Status WriteDouble(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<double> d = data.ToDouble(); - if (d.ok()) { - WireFormatLite::WriteDouble(field_number, d.ValueOrDie(), stream); - } - return d.status(); -} - -// Writes a FLOAT field, including tag, to the stream. -inline Status WriteFloat(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<float> f = data.ToFloat(); - if (f.ok()) { - WireFormatLite::WriteFloat(field_number, f.ValueOrDie(), stream); - } - return f.status(); -} - -// Writes a BOOL field, including tag, to the stream. -inline Status WriteBool(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<bool> b = data.ToBool(); - if (b.ok()) { - WireFormatLite::WriteBool(field_number, b.ValueOrDie(), stream); - } - return b.status(); -} - -// Writes a BYTES field, including tag, to the stream. -inline Status WriteBytes(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<string> c = data.ToBytes(); - if (c.ok()) { - WireFormatLite::WriteBytes(field_number, c.ValueOrDie(), stream); - } - return c.status(); -} - -// Writes a STRING field, including tag, to the stream. -inline Status WriteString(int field_number, const DataPiece& data, - CodedOutputStream* stream) { - StatusOr<string> s = data.ToString(); - if (s.ok()) { - WireFormatLite::WriteString(field_number, s.ValueOrDie(), stream); - } - return s.status(); -} - -// Writes an ENUM field, including tag, to the stream. -inline Status WriteEnum(int field_number, const DataPiece& data, - const google::protobuf::Enum* enum_type, - CodedOutputStream* stream, - bool use_lower_camel_for_enums) { - StatusOr<int> e = data.ToEnum(enum_type, use_lower_camel_for_enums); - if (e.ok()) { - WireFormatLite::WriteEnum(field_number, e.ValueOrDie(), stream); - } - return e.status(); -} - -// Given a google::protobuf::Type, returns the set of all required fields. -std::set<const google::protobuf::Field*> GetRequiredFields( - const google::protobuf::Type& type) { - std::set<const google::protobuf::Field*> required; - for (int i = 0; i < type.fields_size(); i++) { - const google::protobuf::Field& field = type.fields(i); - if (field.cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REQUIRED) { - required.insert(&field); - } - } - return required; -} - -} // namespace - -ProtoWriter::ProtoElement::ProtoElement(const TypeInfo* typeinfo, - const google::protobuf::Type& type, - ProtoWriter* enclosing) - : BaseElement(NULL), - ow_(enclosing), - parent_field_(NULL), - typeinfo_(typeinfo), - proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3), - type_(type), - size_index_(-1), - array_index_(-1), - // oneof_indices_ values are 1-indexed (0 means not present). - oneof_indices_(type.oneofs_size() + 1) { - if (!proto3_) { - required_fields_ = GetRequiredFields(type_); - } -} - -ProtoWriter::ProtoElement::ProtoElement(ProtoWriter::ProtoElement* parent, - const google::protobuf::Field* field, - const google::protobuf::Type& type, - bool is_list) - : BaseElement(parent), - ow_(this->parent()->ow_), - parent_field_(field), - typeinfo_(this->parent()->typeinfo_), - proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3), - type_(type), - size_index_( - !is_list && field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE - ? ow_->size_insert_.size() - : -1), - array_index_(is_list ? 0 : -1), - // oneof_indices_ values are 1-indexed (0 means not present). - oneof_indices_(type_.oneofs_size() + 1) { - if (!is_list) { - if (ow_->IsRepeated(*field)) { - // Update array_index_ if it is an explicit list. - if (this->parent()->array_index_ >= 0) this->parent()->array_index_++; - } else if (!proto3_) { - // For required fields tracking. - this->parent()->RegisterField(field); - } - - if (field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) { - if (!proto3_) { - required_fields_ = GetRequiredFields(type_); - } - int start_pos = ow_->stream_->ByteCount(); - // length of serialized message is the final buffer position minus - // starting buffer position, plus length adjustments for size fields - // of any nested messages. We start with -start_pos here, so we only - // need to add the final buffer position to it at the end. - SizeInfo info = {start_pos, -start_pos}; - ow_->size_insert_.push_back(info); - } - } -} - -ProtoWriter::ProtoElement* ProtoWriter::ProtoElement::pop() { - if (!proto3_) { - // Calls the registered error listener for any required field(s) not yet - // seen. - for (std::set<const google::protobuf::Field*>::iterator it = - required_fields_.begin(); - it != required_fields_.end(); ++it) { - ow_->MissingField((*it)->name()); - } - } - // Computes the total number of proto bytes used by a message, also adjusts - // the size of all parent messages by the length of this size field. - // If size_index_ < 0, this is not a message, so no size field is added. - if (size_index_ >= 0) { - // Add the final buffer position to compute the total length of this - // serialized message. The stored value (before this addition) already - // contains the total length of the size fields of all nested messages - // minus the initial buffer position. - ow_->size_insert_[size_index_].size += ow_->stream_->ByteCount(); - // Calculate the length required to serialize the size field of the - // message, and propagate this additional size information upward to - // all enclosing messages. - int size = ow_->size_insert_[size_index_].size; - int length = CodedOutputStream::VarintSize32(size); - for (ProtoElement* e = parent(); e != NULL; e = e->parent()) { - // Only nested messages have size field, lists do not have size field. - if (e->size_index_ >= 0) { - ow_->size_insert_[e->size_index_].size += length; - } - } - } - return BaseElement::pop<ProtoElement>(); -} - -void ProtoWriter::ProtoElement::RegisterField( - const google::protobuf::Field* field) { - if (!required_fields_.empty() && - field->cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REQUIRED) { - required_fields_.erase(field); - } -} - -string ProtoWriter::ProtoElement::ToString() const { - if (parent() == NULL) return ""; - string loc = parent()->ToString(); - if (!ow_->IsRepeated(*parent_field_) || - parent()->parent_field_ != parent_field_) { - string name = parent_field_->name(); - int i = 0; - while (i < name.size() && (ascii_isalnum(name[i]) || name[i] == '_')) ++i; - if (i > 0 && i == name.size()) { // safe field name - if (loc.empty()) { - loc = name; - } else { - StrAppend(&loc, ".", name); - } - } else { - StrAppend(&loc, "[\"", CEscape(name), "\"]"); - } - } - if (ow_->IsRepeated(*parent_field_) && array_index_ > 0) { - StrAppend(&loc, "[", array_index_ - 1, "]"); - } - return loc.empty() ? "." : loc; -} - -bool ProtoWriter::ProtoElement::IsOneofIndexTaken(int32 index) { - return oneof_indices_[index]; -} - -void ProtoWriter::ProtoElement::TakeOneofIndex(int32 index) { - oneof_indices_[index] = true; -} - -void ProtoWriter::InvalidName(StringPiece unknown_name, StringPiece message) { - listener_->InvalidName(location(), ToSnakeCase(unknown_name), message); -} - -void ProtoWriter::InvalidValue(StringPiece type_name, StringPiece value) { - listener_->InvalidValue(location(), type_name, value); -} - -void ProtoWriter::MissingField(StringPiece missing_name) { - listener_->MissingField(location(), missing_name); -} - -ProtoWriter* ProtoWriter::StartObject(StringPiece name) { - // Starting the root message. Create the root ProtoElement and return. - if (element_ == NULL) { - if (!name.empty()) { - InvalidName(name, "Root element should not be named."); - } - element_.reset(new ProtoElement(typeinfo_, master_type_, this)); - return this; - } - - const google::protobuf::Field* field = NULL; - field = BeginNamed(name, false); - if (field == NULL) return this; - - // Check to see if this field is a oneof and that no oneof in that group has - // already been set. - if (!ValidOneof(*field, name)) { - ++invalid_depth_; - return this; - } - - const google::protobuf::Type* type = LookupType(field); - if (type == NULL) { - ++invalid_depth_; - InvalidName(name, - StrCat("Missing descriptor for field: ", field->type_url())); - return this; - } - - return StartObjectField(*field, *type); -} - -ProtoWriter* ProtoWriter::EndObject() { - if (invalid_depth_ > 0) { - --invalid_depth_; - return this; - } - - if (element_ != NULL) { - element_.reset(element_->pop()); - } - - - // If ending the root element, - // then serialize the full message with calculated sizes. - if (element_ == NULL) { - WriteRootMessage(); - } - return this; -} - -ProtoWriter* ProtoWriter::StartList(StringPiece name) { - const google::protobuf::Field* field = BeginNamed(name, true); - if (field == NULL) return this; - - if (!ValidOneof(*field, name)) { - ++invalid_depth_; - return this; - } - - const google::protobuf::Type* type = LookupType(field); - if (type == NULL) { - ++invalid_depth_; - InvalidName(name, - StrCat("Missing descriptor for field: ", field->type_url())); - return this; - } - - return StartListField(*field, *type); -} - -ProtoWriter* ProtoWriter::EndList() { - if (invalid_depth_ > 0) { - --invalid_depth_; - } else if (element_ != NULL) { - element_.reset(element_->pop()); - } - return this; -} - -ProtoWriter* ProtoWriter::RenderDataPiece(StringPiece name, - const DataPiece& data) { - Status status; - if (invalid_depth_ > 0) return this; - - const google::protobuf::Field* field = Lookup(name); - if (field == NULL) return this; - - if (!ValidOneof(*field, name)) return this; - - const google::protobuf::Type* type = LookupType(field); - if (type == NULL) { - InvalidName(name, - StrCat("Missing descriptor for field: ", field->type_url())); - return this; - } - - return RenderPrimitiveField(*field, *type, data); -} - -bool ProtoWriter::ValidOneof(const google::protobuf::Field& field, - StringPiece unnormalized_name) { - if (element_ == NULL) return true; - - if (field.oneof_index() > 0) { - if (element_->IsOneofIndexTaken(field.oneof_index())) { - InvalidValue( - "oneof", - StrCat("oneof field '", - element_->type().oneofs(field.oneof_index() - 1), - "' is already set. Cannot set '", unnormalized_name, "'")); - return false; - } - element_->TakeOneofIndex(field.oneof_index()); - } - return true; -} - -bool ProtoWriter::IsRepeated(const google::protobuf::Field& field) { - return field.cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED; -} - -ProtoWriter* ProtoWriter::StartObjectField(const google::protobuf::Field& field, - const google::protobuf::Type& type) { - WriteTag(field); - element_.reset(new ProtoElement(element_.release(), &field, type, false)); - return this; -} - -ProtoWriter* ProtoWriter::StartListField(const google::protobuf::Field& field, - const google::protobuf::Type& type) { - element_.reset(new ProtoElement(element_.release(), &field, type, true)); - return this; -} - -ProtoWriter* ProtoWriter::RenderPrimitiveField( - const google::protobuf::Field& field, const google::protobuf::Type& type, - const DataPiece& data) { - Status status; - - // Pushing a ProtoElement and then pop it off at the end for 2 purposes: - // error location reporting and required field accounting. - // - // For proto3, since there is no required field tracking, we only need to push - // ProtoElement for error cases. - if (!element_->proto3()) { - element_.reset(new ProtoElement(element_.release(), &field, type, false)); - } - - if (field.kind() == google::protobuf::Field_Kind_TYPE_UNKNOWN || - field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) { - // Push a ProtoElement for location reporting purposes. - if (element_->proto3()) { - element_.reset(new ProtoElement(element_.release(), &field, type, false)); - } - InvalidValue(field.type_url().empty() - ? google::protobuf::Field_Kind_Name(field.kind()) - : field.type_url(), - data.ValueAsStringOrDefault("")); - element_.reset(element()->pop()); - return this; - } - - switch (field.kind()) { - case google::protobuf::Field_Kind_TYPE_INT32: { - status = WriteInt32(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED32: { - status = WriteSFixed32(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT32: { - status = WriteSInt32(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED32: { - status = WriteFixed32(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT32: { - status = WriteUInt32(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_INT64: { - status = WriteInt64(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED64: { - status = WriteSFixed64(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT64: { - status = WriteSInt64(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED64: { - status = WriteFixed64(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT64: { - status = WriteUInt64(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_DOUBLE: { - status = WriteDouble(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_FLOAT: { - status = WriteFloat(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_BOOL: { - status = WriteBool(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_BYTES: { - status = WriteBytes(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_STRING: { - status = WriteString(field.number(), data, stream_.get()); - break; - } - case google::protobuf::Field_Kind_TYPE_ENUM: { - status = WriteEnum(field.number(), data, - typeinfo_->GetEnumByTypeUrl(field.type_url()), - stream_.get(), use_lower_camel_for_enums_); - break; - } - default: // TYPE_GROUP or TYPE_MESSAGE - status = Status(INVALID_ARGUMENT, data.ToString().ValueOrDie()); - } - - if (!status.ok()) { - // Push a ProtoElement for location reporting purposes. - if (element_->proto3()) { - element_.reset(new ProtoElement(element_.release(), &field, type, false)); - } - InvalidValue(google::protobuf::Field_Kind_Name(field.kind()), - status.error_message()); - element_.reset(element()->pop()); - return this; - } - - if (!element_->proto3()) element_.reset(element()->pop()); - - return this; -} - -const google::protobuf::Field* ProtoWriter::BeginNamed(StringPiece name, - bool is_list) { - if (invalid_depth_ > 0) { - ++invalid_depth_; - return NULL; - } - const google::protobuf::Field* field = Lookup(name); - if (field == NULL) { - ++invalid_depth_; - // InvalidName() already called in Lookup(). - return NULL; - } - if (is_list && !IsRepeated(*field)) { - ++invalid_depth_; - InvalidName(name, "Proto field is not repeating, cannot start list."); - return NULL; - } - return field; -} - -const google::protobuf::Field* ProtoWriter::Lookup( - StringPiece unnormalized_name) { - ProtoElement* e = element(); - if (e == NULL) { - InvalidName(unnormalized_name, "Root element must be a message."); - return NULL; - } - if (unnormalized_name.empty()) { - // Objects in repeated field inherit the same field descriptor. - if (e->parent_field() == NULL) { - InvalidName(unnormalized_name, "Proto fields must have a name."); - } else if (!IsRepeated(*e->parent_field())) { - InvalidName(unnormalized_name, "Proto fields must have a name."); - return NULL; - } - return e->parent_field(); - } - const google::protobuf::Field* field = - typeinfo_->FindField(&e->type(), unnormalized_name); - if (field == NULL && !ignore_unknown_fields_) { - InvalidName(unnormalized_name, "Cannot find field."); - } - return field; -} - -const google::protobuf::Type* ProtoWriter::LookupType( - const google::protobuf::Field* field) { - return ((field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE || - field->kind() == google::protobuf::Field_Kind_TYPE_GROUP) - ? typeinfo_->GetTypeByTypeUrl(field->type_url()) - : &element_->type()); -} - -void ProtoWriter::WriteRootMessage() { - GOOGLE_DCHECK(!done_); - int curr_pos = 0; - // Calls the destructor of CodedOutputStream to remove any uninitialized - // memory from the Cord before we read it. - stream_.reset(NULL); - const void* data; - int length; - google::protobuf::io::ArrayInputStream input_stream(buffer_.data(), buffer_.size()); - while (input_stream.Next(&data, &length)) { - if (length == 0) continue; - int num_bytes = length; - // Write up to where we need to insert the size field. - // The number of bytes we may write is the smaller of: - // - the current fragment size - // - the distance to the next position where a size field needs to be - // inserted. - if (!size_insert_.empty() && - size_insert_.front().pos - curr_pos < num_bytes) { - num_bytes = size_insert_.front().pos - curr_pos; - } - output_->Append(static_cast<const char*>(data), num_bytes); - if (num_bytes < length) { - input_stream.BackUp(length - num_bytes); - } - curr_pos += num_bytes; - // Insert the size field. - // size_insert_.front(): the next <index, size> pair to be written. - // size_insert_.front().pos: position of the size field. - // size_insert_.front().size: the size (integer) to be inserted. - if (!size_insert_.empty() && curr_pos == size_insert_.front().pos) { - // Varint32 occupies at most 10 bytes. - uint8 insert_buffer[10]; - uint8* insert_buffer_pos = CodedOutputStream::WriteVarint32ToArray( - size_insert_.front().size, insert_buffer); - output_->Append(reinterpret_cast<const char*>(insert_buffer), - insert_buffer_pos - insert_buffer); - size_insert_.pop_front(); - } - } - output_->Flush(); - stream_.reset(new CodedOutputStream(&adapter_)); - done_ = true; -} - -void ProtoWriter::WriteTag(const google::protobuf::Field& field) { - WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType( - static_cast<WireFormatLite::FieldType>(field.kind())); - stream_->WriteTag(WireFormatLite::MakeTag(field.number(), wire_type)); -} - - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h deleted file mode 100644 index 21dff88d72..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h +++ /dev/null @@ -1,353 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__ - -#include <deque> -#include <string> -#include <vector> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/internal/datapiece.h> -#include <google/protobuf/util/internal/error_listener.h> -#include <google/protobuf/util/internal/structured_objectwriter.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/stubs/bytestream.h> -#include <google/protobuf/stubs/hash.h> - -namespace google { -namespace protobuf { -namespace io { -class CodedOutputStream; -} // namespace io -} // namespace protobuf - - -namespace protobuf { -class Type; -class Field; -} // namespace protobuf - - -namespace protobuf { -namespace util { -namespace converter { - -class ObjectLocationTracker; - -// An ObjectWriter that can write protobuf bytes directly from writer events. -// This class does not support special types like Struct or Map. However, since -// this class supports raw protobuf, it can be used to provide support for -// special types by inheriting from it or by wrapping it. -// -// It also supports streaming. -class LIBPROTOBUF_EXPORT ProtoWriter : public StructuredObjectWriter { - public: -// Constructor. Does not take ownership of any parameter passed in. - ProtoWriter(TypeResolver* type_resolver, const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener); - virtual ~ProtoWriter(); - - // ObjectWriter methods. - virtual ProtoWriter* StartObject(StringPiece name); - virtual ProtoWriter* EndObject(); - virtual ProtoWriter* StartList(StringPiece name); - virtual ProtoWriter* EndList(); - virtual ProtoWriter* RenderBool(StringPiece name, bool value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderInt32(StringPiece name, int32 value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderUint32(StringPiece name, uint32 value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderInt64(StringPiece name, int64 value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderUint64(StringPiece name, uint64 value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderDouble(StringPiece name, double value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderFloat(StringPiece name, float value) { - return RenderDataPiece(name, DataPiece(value)); - } - virtual ProtoWriter* RenderString(StringPiece name, StringPiece value) { - return RenderDataPiece(name, - DataPiece(value, use_strict_base64_decoding())); - } - virtual ProtoWriter* RenderBytes(StringPiece name, StringPiece value) { - return RenderDataPiece( - name, DataPiece(value, false, use_strict_base64_decoding())); - } - virtual ProtoWriter* RenderNull(StringPiece name) { - return RenderDataPiece(name, DataPiece::NullData()); - } - - - // Renders a DataPiece 'value' into a field whose wire type is determined - // from the given field 'name'. - virtual ProtoWriter* RenderDataPiece(StringPiece name, - const DataPiece& value); - - // Returns the location tracker to use for tracking locations for errors. - const LocationTrackerInterface& location() { - return element_ != NULL ? *element_ : *tracker_; - } - - // When true, we finished writing to output a complete message. - bool done() { return done_; } - - // Returns the proto stream object. - google::protobuf::io::CodedOutputStream* stream() { return stream_.get(); } - - // Getters and mutators of invalid_depth_. - void IncrementInvalidDepth() { ++invalid_depth_; } - void DecrementInvalidDepth() { --invalid_depth_; } - int invalid_depth() { return invalid_depth_; } - - ErrorListener* listener() { return listener_; } - - const TypeInfo* typeinfo() { return typeinfo_; } - - void set_ignore_unknown_fields(bool ignore_unknown_fields) { - ignore_unknown_fields_ = ignore_unknown_fields; - } - - void set_use_lower_camel_for_enums(bool use_lower_camel_for_enums) { - use_lower_camel_for_enums_ = use_lower_camel_for_enums; - } - - protected: - class LIBPROTOBUF_EXPORT ProtoElement : public BaseElement, public LocationTrackerInterface { - public: - // Constructor for the root element. No parent nor field. - ProtoElement(const TypeInfo* typeinfo, const google::protobuf::Type& type, - ProtoWriter* enclosing); - - // Constructor for a field of an element. - ProtoElement(ProtoElement* parent, const google::protobuf::Field* field, - const google::protobuf::Type& type, bool is_list); - - virtual ~ProtoElement() {} - - // Called just before the destructor for clean up: - // - reports any missing required fields - // - computes the space needed by the size field, and augment the - // length of all parent messages by this additional space. - // - releases and returns the parent pointer. - ProtoElement* pop(); - - // Accessors - // parent_field() may be NULL if we are at root. - const google::protobuf::Field* parent_field() const { - return parent_field_; - } - const google::protobuf::Type& type() const { return type_; } - - // Registers field for accounting required fields. - void RegisterField(const google::protobuf::Field* field); - - // To report location on error messages. - virtual string ToString() const; - - virtual ProtoElement* parent() const { - return static_cast<ProtoElement*>(BaseElement::parent()); - } - - // Returns true if the index is already taken by a preceding oneof input. - bool IsOneofIndexTaken(int32 index); - - // Marks the oneof 'index' as taken. Future inputs to this oneof will - // generate an error. - void TakeOneofIndex(int32 index); - - bool proto3() { return proto3_; } - - private: - // Used for access to variables of the enclosing instance of - // ProtoWriter. - ProtoWriter* ow_; - - // Describes the element as a field in the parent message. - // parent_field_ is NULL if and only if this element is the root element. - const google::protobuf::Field* parent_field_; - - // TypeInfo to lookup types. - const TypeInfo* typeinfo_; - - // Whether the type_ is proto3 or not. - bool proto3_; - - // Additional variables if this element is a message: - // (Root element is always a message). - // type_ : the type of this element. - // required_fields_ : set of required fields. - // size_index_ : index into ProtoWriter::size_insert_ - // for later insertion of serialized message length. - const google::protobuf::Type& type_; - std::set<const google::protobuf::Field*> required_fields_; - const int size_index_; - - // Tracks position in repeated fields, needed for LocationTrackerInterface. - int array_index_; - - // Set of oneof indices already seen for the type_. Used to validate - // incoming messages so no more than one oneof is set. - std::vector<bool> oneof_indices_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoElement); - }; - - // Container for inserting 'size' information at the 'pos' position. - struct SizeInfo { - const int pos; - int size; - }; - - ProtoWriter(const TypeInfo* typeinfo, const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener); - - virtual ProtoElement* element() { return element_.get(); } - - // Helper methods for calling ErrorListener. See error_listener.h. - void InvalidName(StringPiece unknown_name, StringPiece message); - void InvalidValue(StringPiece type_name, StringPiece value); - void MissingField(StringPiece missing_name); - - // Common code for BeginObject() and BeginList() that does invalid_depth_ - // bookkeeping associated with name lookup. - const google::protobuf::Field* BeginNamed(StringPiece name, bool is_list); - - // Lookup the field in the current element. Looks in the base descriptor - // and in any extension. This will report an error if the field cannot be - // found when ignore_unknown_names_ is false or if multiple matching - // extensions are found. - const google::protobuf::Field* Lookup(StringPiece name); - - // Lookup the field type in the type descriptor. Returns NULL if the type - // is not known. - const google::protobuf::Type* LookupType( - const google::protobuf::Field* field); - - // Write serialized output to the final output ByteSink, inserting all - // the size information for nested messages that are missing from the - // intermediate Cord buffer. - void WriteRootMessage(); - - // Helper method to write proto tags based on the given field. - void WriteTag(const google::protobuf::Field& field); - - - // Returns true if the field for type_ can be set as a oneof. If field is not - // a oneof type, this function does nothing and returns true. - // If another field for this oneof is already set, this function returns - // false. It also calls the appropriate error callback. - // unnormalized_name is used for error string. - bool ValidOneof(const google::protobuf::Field& field, - StringPiece unnormalized_name); - - // Returns true if the field is repeated. - bool IsRepeated(const google::protobuf::Field& field); - - // Starts an object given the field and the enclosing type. - ProtoWriter* StartObjectField(const google::protobuf::Field& field, - const google::protobuf::Type& type); - - // Starts a list given the field and the enclosing type. - ProtoWriter* StartListField(const google::protobuf::Field& field, - const google::protobuf::Type& type); - - // Renders a primitve field given the field and the enclosing type. - ProtoWriter* RenderPrimitiveField(const google::protobuf::Field& field, - const google::protobuf::Type& type, - const DataPiece& value); - - private: - // Variables for describing the structure of the input tree: - // master_type_: descriptor for the whole protobuf message. - // typeinfo_ : the TypeInfo object to lookup types. - const google::protobuf::Type& master_type_; - const TypeInfo* typeinfo_; - // Whether we own the typeinfo_ object. - bool own_typeinfo_; - - // Indicates whether we finished writing root message completely. - bool done_; - - // If true, don't report unknown field names to the listener. - bool ignore_unknown_fields_; - - // If true, check if enum name in camel case or without underscore matches the - // field name. - bool use_lower_camel_for_enums_; - - // Variable for internal state processing: - // element_ : the current element. - // size_insert_: sizes of nested messages. - // pos - position to insert the size field. - // size - size value to be inserted. - google::protobuf::scoped_ptr<ProtoElement> element_; - std::deque<SizeInfo> size_insert_; - - // Variables for output generation: - // output_ : pointer to an external ByteSink for final user-visible output. - // buffer_ : buffer holding partial message before being ready for output_. - // adapter_ : internal adapter between CodedOutputStream and buffer_. - // stream_ : wrapper for writing tags and other encodings in wire format. - strings::ByteSink* output_; - string buffer_; - google::protobuf::io::StringOutputStream adapter_; - google::protobuf::scoped_ptr<google::protobuf::io::CodedOutputStream> stream_; - - // Variables for error tracking and reporting: - // listener_ : a place to report any errors found. - // invalid_depth_: number of enclosing invalid nested messages. - // tracker_ : the root location tracker interface. - ErrorListener* listener_; - int invalid_depth_; - google::protobuf::scoped_ptr<LocationTrackerInterface> tracker_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc deleted file mode 100644 index 3591febfc3..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc +++ /dev/null @@ -1,1123 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/protostream_objectsource.h> - -#include <utility> - -#include <google/protobuf/stubs/casts.h> -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/stringprintf.h> -#include <google/protobuf/stubs/time.h> -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/wire_format.h> -#include <google/protobuf/wire_format_lite.h> -#include <google/protobuf/util/internal/field_mask_utility.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/map_util.h> -#include <google/protobuf/stubs/status_macros.h> - - -namespace google { -namespace protobuf { -namespace util { -using util::Status; -using util::StatusOr; -namespace error { -using util::error::Code; -using util::error::INTERNAL; -} -namespace converter { - -using google::protobuf::Descriptor; -using google::protobuf::EnumValueDescriptor; -using google::protobuf::FieldDescriptor; -using google::protobuf::internal::WireFormat; -using google::protobuf::internal::WireFormatLite; -using util::Status; -using util::StatusOr; - -namespace { - -static int kDefaultMaxRecursionDepth = 64; - -// Finds a field with the given number. NULL if none found. -const google::protobuf::Field* FindFieldByNumber( - const google::protobuf::Type& type, int number); - -// Returns true if the field is packable. -bool IsPackable(const google::protobuf::Field& field); - -// Finds an enum value with the given number. NULL if none found. -const google::protobuf::EnumValue* FindEnumValueByNumber( - const google::protobuf::Enum& tech_enum, int number); - -// Utility function to format nanos. -const string FormatNanos(uint32 nanos, bool with_trailing_zeros); - -StatusOr<string> MapKeyDefaultValueAsString( - const google::protobuf::Field& field) { - switch (field.kind()) { - case google::protobuf::Field_Kind_TYPE_BOOL: - return string("false"); - case google::protobuf::Field_Kind_TYPE_INT32: - case google::protobuf::Field_Kind_TYPE_INT64: - case google::protobuf::Field_Kind_TYPE_UINT32: - case google::protobuf::Field_Kind_TYPE_UINT64: - case google::protobuf::Field_Kind_TYPE_SINT32: - case google::protobuf::Field_Kind_TYPE_SINT64: - case google::protobuf::Field_Kind_TYPE_SFIXED32: - case google::protobuf::Field_Kind_TYPE_SFIXED64: - case google::protobuf::Field_Kind_TYPE_FIXED32: - case google::protobuf::Field_Kind_TYPE_FIXED64: - return string("0"); - case google::protobuf::Field_Kind_TYPE_STRING: - return string(); - default: - return Status(util::error::INTERNAL, "Invalid map key type."); - } -} -} // namespace - - -ProtoStreamObjectSource::ProtoStreamObjectSource( - google::protobuf::io::CodedInputStream* stream, TypeResolver* type_resolver, - const google::protobuf::Type& type) - : stream_(stream), - typeinfo_(TypeInfo::NewTypeInfo(type_resolver)), - own_typeinfo_(true), - type_(type), - use_lower_camel_for_enums_(false), - recursion_depth_(0), - max_recursion_depth_(kDefaultMaxRecursionDepth), - render_unknown_fields_(false), - add_trailing_zeros_for_timestamp_and_duration_(false) { - GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL."; -} - -ProtoStreamObjectSource::ProtoStreamObjectSource( - google::protobuf::io::CodedInputStream* stream, const TypeInfo* typeinfo, - const google::protobuf::Type& type) - : stream_(stream), - typeinfo_(typeinfo), - own_typeinfo_(false), - type_(type), - use_lower_camel_for_enums_(false), - recursion_depth_(0), - max_recursion_depth_(kDefaultMaxRecursionDepth), - render_unknown_fields_(false), - add_trailing_zeros_for_timestamp_and_duration_(false) { - GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL."; -} - -ProtoStreamObjectSource::~ProtoStreamObjectSource() { - if (own_typeinfo_) { - delete typeinfo_; - } -} - -Status ProtoStreamObjectSource::NamedWriteTo(StringPiece name, - ObjectWriter* ow) const { - return WriteMessage(type_, name, 0, true, ow); -} - -const google::protobuf::Field* ProtoStreamObjectSource::FindAndVerifyField( - const google::protobuf::Type& type, uint32 tag) const { - // Lookup the new field in the type by tag number. - const google::protobuf::Field* field = FindFieldByNumber(type, tag >> 3); - // Verify if the field corresponds to the wire type in tag. - // If there is any discrepancy, mark the field as not found. - if (field != NULL) { - WireFormatLite::WireType expected_type = - WireFormatLite::WireTypeForFieldType( - static_cast<WireFormatLite::FieldType>(field->kind())); - WireFormatLite::WireType actual_type = WireFormatLite::GetTagWireType(tag); - if (actual_type != expected_type && - (!IsPackable(*field) || - actual_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED)) { - field = NULL; - } - } - return field; -} - -Status ProtoStreamObjectSource::WriteMessage(const google::protobuf::Type& type, - StringPiece name, - const uint32 end_tag, - bool include_start_and_end, - ObjectWriter* ow) const { - - const TypeRenderer* type_renderer = FindTypeRenderer(type.name()); - if (type_renderer != NULL) { - return (*type_renderer)(this, type, name, ow); - } - - const google::protobuf::Field* field = NULL; - string field_name; - // last_tag set to dummy value that is different from tag. - uint32 tag = stream_->ReadTag(), last_tag = tag + 1; - google::protobuf::UnknownFieldSet unknown_fields; - - if (include_start_and_end) { - ow->StartObject(name); - } - while (tag != end_tag) { - if (tag != last_tag) { // Update field only if tag is changed. - last_tag = tag; - field = FindAndVerifyField(type, tag); - if (field != NULL) { - field_name = field->json_name(); - } - } - if (field == NULL) { - // If we didn't find a field, skip this unknown tag. - // TODO(wpoon): Check return boolean value. - WireFormat::SkipField(stream_, tag, - render_unknown_fields_ ? &unknown_fields : NULL); - tag = stream_->ReadTag(); - continue; - } - - if (field->cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) { - bool check_maps = true; - - if (check_maps && IsMap(*field)) { - ow->StartObject(field_name); - ASSIGN_OR_RETURN(tag, RenderMap(field, field_name, tag, ow)); - ow->EndObject(); - } else { - ASSIGN_OR_RETURN(tag, RenderList(field, field_name, tag, ow)); - } - } else { - // Render the field. - RETURN_IF_ERROR(RenderField(field, field_name, ow)); - tag = stream_->ReadTag(); - } - } - - - if (include_start_and_end) { - ow->EndObject(); - } - return Status::OK; -} - -StatusOr<uint32> ProtoStreamObjectSource::RenderList( - const google::protobuf::Field* field, StringPiece name, uint32 list_tag, - ObjectWriter* ow) const { - uint32 tag_to_return = 0; - ow->StartList(name); - if (IsPackable(*field) && - list_tag == - WireFormatLite::MakeTag(field->number(), - WireFormatLite::WIRETYPE_LENGTH_DELIMITED)) { - RETURN_IF_ERROR(RenderPacked(field, ow)); - // Since packed fields have a single tag, read another tag from stream to - // return. - tag_to_return = stream_->ReadTag(); - } else { - do { - RETURN_IF_ERROR(RenderField(field, "", ow)); - } while ((tag_to_return = stream_->ReadTag()) == list_tag); - } - ow->EndList(); - return tag_to_return; -} - -StatusOr<uint32> ProtoStreamObjectSource::RenderMap( - const google::protobuf::Field* field, StringPiece name, uint32 list_tag, - ObjectWriter* ow) const { - const google::protobuf::Type* field_type = - typeinfo_->GetTypeByTypeUrl(field->type_url()); - uint32 tag_to_return = 0; - do { - // Render map entry message type. - uint32 buffer32; - stream_->ReadVarint32(&buffer32); // message length - int old_limit = stream_->PushLimit(buffer32); - string map_key; - for (uint32 tag = stream_->ReadTag(); tag != 0; tag = stream_->ReadTag()) { - const google::protobuf::Field* field = - FindAndVerifyField(*field_type, tag); - if (field == NULL) { - WireFormat::SkipField(stream_, tag, NULL); - continue; - } - // Map field numbers are key = 1 and value = 2 - if (field->number() == 1) { - map_key = ReadFieldValueAsString(*field); - } else if (field->number() == 2) { - if (map_key.empty()) { - // An absent map key is treated as the default. - const google::protobuf::Field* key_field = - FindFieldByNumber(*field_type, 1); - if (key_field == NULL) { - // The Type info for this map entry is incorrect. It should always - // have a field named "key" and with field number 1. - return Status(util::error::INTERNAL, "Invalid map entry."); - } - ASSIGN_OR_RETURN(map_key, MapKeyDefaultValueAsString(*key_field)); - // Key is empty, force it to render as empty (for string values). - ow->empty_name_ok_for_next_key(); - } - RETURN_IF_ERROR(RenderField(field, map_key, ow)); - } else { - // The Type info for this map entry is incorrect. It should contain - // exactly two fields with field number 1 and 2. - return Status(util::error::INTERNAL, "Invalid map entry."); - } - } - stream_->PopLimit(old_limit); - } while ((tag_to_return = stream_->ReadTag()) == list_tag); - return tag_to_return; -} - -Status ProtoStreamObjectSource::RenderPacked( - const google::protobuf::Field* field, ObjectWriter* ow) const { - uint32 length; - stream_->ReadVarint32(&length); - int old_limit = stream_->PushLimit(length); - while (stream_->BytesUntilLimit() > 0) { - RETURN_IF_ERROR(RenderField(field, StringPiece(), ow)); - } - stream_->PopLimit(old_limit); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderTimestamp( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece field_name, ObjectWriter* ow) { - std::pair<int64, int32> p = os->ReadSecondsAndNanos(type); - int64 seconds = p.first; - int32 nanos = p.second; - if (seconds > kTimestampMaxSeconds || seconds < kTimestampMinSeconds) { - return Status( - util::error::INTERNAL, - StrCat("Timestamp seconds exceeds limit for field: ", field_name)); - } - - if (nanos < 0 || nanos >= kNanosPerSecond) { - return Status( - util::error::INTERNAL, - StrCat("Timestamp nanos exceeds limit for field: ", field_name)); - } - - ow->RenderString(field_name, - ::google::protobuf::internal::FormatTime(seconds, nanos)); - - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderDuration( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece field_name, ObjectWriter* ow) { - std::pair<int64, int32> p = os->ReadSecondsAndNanos(type); - int64 seconds = p.first; - int32 nanos = p.second; - if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds) { - return Status( - util::error::INTERNAL, - StrCat("Duration seconds exceeds limit for field: ", field_name)); - } - - if (nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) { - return Status( - util::error::INTERNAL, - StrCat("Duration nanos exceeds limit for field: ", field_name)); - } - - string sign = ""; - if (seconds < 0) { - if (nanos > 0) { - return Status(util::error::INTERNAL, - StrCat("Duration nanos is non-negative, but seconds is " - "negative for field: ", - field_name)); - } - sign = "-"; - seconds = -seconds; - nanos = -nanos; - } else if (seconds == 0 && nanos < 0) { - sign = "-"; - nanos = -nanos; - } - string formatted_duration = StringPrintf( - "%s%lld%ss", sign.c_str(), seconds, - FormatNanos(nanos, os->add_trailing_zeros_for_timestamp_and_duration_) - .c_str()); - ow->RenderString(field_name, formatted_duration); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderDouble(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint64 buffer64 = 0; // default value of Double wrapper value - if (tag != 0) { - os->stream_->ReadLittleEndian64(&buffer64); - os->stream_->ReadTag(); - } - ow->RenderDouble(field_name, bit_cast<double>(buffer64)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderFloat(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint32 buffer32 = 0; // default value of Float wrapper value - if (tag != 0) { - os->stream_->ReadLittleEndian32(&buffer32); - os->stream_->ReadTag(); - } - ow->RenderFloat(field_name, bit_cast<float>(buffer32)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderInt64(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint64 buffer64 = 0; // default value of Int64 wrapper value - if (tag != 0) { - os->stream_->ReadVarint64(&buffer64); - os->stream_->ReadTag(); - } - ow->RenderInt64(field_name, bit_cast<int64>(buffer64)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderUInt64(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint64 buffer64 = 0; // default value of UInt64 wrapper value - if (tag != 0) { - os->stream_->ReadVarint64(&buffer64); - os->stream_->ReadTag(); - } - ow->RenderUint64(field_name, bit_cast<uint64>(buffer64)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderInt32(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint32 buffer32 = 0; // default value of Int32 wrapper value - if (tag != 0) { - os->stream_->ReadVarint32(&buffer32); - os->stream_->ReadTag(); - } - ow->RenderInt32(field_name, bit_cast<int32>(buffer32)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderUInt32(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint32 buffer32 = 0; // default value of UInt32 wrapper value - if (tag != 0) { - os->stream_->ReadVarint32(&buffer32); - os->stream_->ReadTag(); - } - ow->RenderUint32(field_name, bit_cast<uint32>(buffer32)); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderBool(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint64 buffer64 = 0; // results in 'false' value as default, which is the - // default value of Bool wrapper - if (tag != 0) { - os->stream_->ReadVarint64(&buffer64); - os->stream_->ReadTag(); - } - ow->RenderBool(field_name, buffer64 != 0); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderString(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint32 buffer32; - string str; // default value of empty for String wrapper - if (tag != 0) { - os->stream_->ReadVarint32(&buffer32); // string size. - os->stream_->ReadString(&str, buffer32); - os->stream_->ReadTag(); - } - ow->RenderString(field_name, str); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderBytes(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - uint32 buffer32; - string str; - if (tag != 0) { - os->stream_->ReadVarint32(&buffer32); - os->stream_->ReadString(&str, buffer32); - os->stream_->ReadTag(); - } - ow->RenderBytes(field_name, str); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderStruct(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - const google::protobuf::Field* field = NULL; - uint32 tag = os->stream_->ReadTag(); - ow->StartObject(field_name); - while (tag != 0) { - field = os->FindAndVerifyField(type, tag); - // google.protobuf.Struct has only one field that is a map. Hence we use - // RenderMap to render that field. - if (os->IsMap(*field)) { - ASSIGN_OR_RETURN(tag, os->RenderMap(field, field_name, tag, ow)); - } - } - ow->EndObject(); - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderStructValue( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece field_name, ObjectWriter* ow) { - const google::protobuf::Field* field = NULL; - for (uint32 tag = os->stream_->ReadTag(); tag != 0; - tag = os->stream_->ReadTag()) { - field = os->FindAndVerifyField(type, tag); - if (field == NULL) { - WireFormat::SkipField(os->stream_, tag, NULL); - continue; - } - RETURN_IF_ERROR(os->RenderField(field, field_name, ow)); - } - return Status::OK; -} - -// TODO(skarvaje): Avoid code duplication of for loops and SkipField logic. -Status ProtoStreamObjectSource::RenderStructListValue( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece field_name, ObjectWriter* ow) { - uint32 tag = os->stream_->ReadTag(); - - // Render empty list when we find empty ListValue message. - if (tag == 0) { - ow->StartList(field_name); - ow->EndList(); - return Status::OK; - } - - while (tag != 0) { - const google::protobuf::Field* field = os->FindAndVerifyField(type, tag); - if (field == NULL) { - WireFormat::SkipField(os->stream_, tag, NULL); - tag = os->stream_->ReadTag(); - continue; - } - ASSIGN_OR_RETURN(tag, os->RenderList(field, field_name, tag, ow)); - } - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderAny(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece field_name, - ObjectWriter* ow) { - // An Any is of the form { string type_url = 1; bytes value = 2; } - uint32 tag; - string type_url; - string value; - - // First read out the type_url and value from the proto stream - for (tag = os->stream_->ReadTag(); tag != 0; tag = os->stream_->ReadTag()) { - const google::protobuf::Field* field = os->FindAndVerifyField(type, tag); - if (field == NULL) { - WireFormat::SkipField(os->stream_, tag, NULL); - continue; - } - // 'type_url' has field number of 1 and 'value' has field number 2 - // //google/protobuf/any.proto - if (field->number() == 1) { - // read type_url - uint32 type_url_size; - os->stream_->ReadVarint32(&type_url_size); - os->stream_->ReadString(&type_url, type_url_size); - } else if (field->number() == 2) { - // read value - uint32 value_size; - os->stream_->ReadVarint32(&value_size); - os->stream_->ReadString(&value, value_size); - } - } - - // If there is no value, we don't lookup the type, we just output it (if - // present). If both type and value are empty we output an empty object. - if (value.empty()) { - ow->StartObject(field_name); - if (!type_url.empty()) { - ow->RenderString("@type", type_url); - } - ow->EndObject(); - return util::Status::OK; - } - - // If there is a value but no type, we cannot render it, so report an error. - if (type_url.empty()) { - // TODO(sven): Add an external message once those are ready. - return util::Status(util::error::INTERNAL, - "Invalid Any, the type_url is missing."); - } - - util::StatusOr<const google::protobuf::Type*> resolved_type = - os->typeinfo_->ResolveTypeUrl(type_url); - - if (!resolved_type.ok()) { - // Convert into an internal error, since this means the backend gave us - // an invalid response (missing or invalid type information). - return util::Status(util::error::INTERNAL, - resolved_type.status().error_message()); - } - // nested_type cannot be null at this time. - const google::protobuf::Type* nested_type = resolved_type.ValueOrDie(); - - google::protobuf::io::ArrayInputStream zero_copy_stream(value.data(), value.size()); - google::protobuf::io::CodedInputStream in_stream(&zero_copy_stream); - // We know the type so we can render it. Recursively parse the nested stream - // using a nested ProtoStreamObjectSource using our nested type information. - ProtoStreamObjectSource nested_os(&in_stream, os->typeinfo_, *nested_type); - - // We manually call start and end object here so we can inject the @type. - ow->StartObject(field_name); - ow->RenderString("@type", type_url); - util::Status result = - nested_os.WriteMessage(nested_os.type_, "value", 0, false, ow); - ow->EndObject(); - return result; -} - -Status ProtoStreamObjectSource::RenderFieldMask( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece field_name, ObjectWriter* ow) { - string combined; - uint32 buffer32; - uint32 paths_field_tag = 0; - for (uint32 tag = os->stream_->ReadTag(); tag != 0; - tag = os->stream_->ReadTag()) { - if (paths_field_tag == 0) { - const google::protobuf::Field* field = os->FindAndVerifyField(type, tag); - if (field != NULL && field->number() == 1 && - field->name() == "paths") { - paths_field_tag = tag; - } - } - if (paths_field_tag != tag) { - return util::Status(util::error::INTERNAL, - "Invalid FieldMask, unexpected field."); - } - string str; - os->stream_->ReadVarint32(&buffer32); // string size. - os->stream_->ReadString(&str, buffer32); - if (!combined.empty()) { - combined.append(","); - } - combined.append(ConvertFieldMaskPath(str, &ToCamelCase)); - } - ow->RenderString(field_name, combined); - return Status::OK; -} - - -hash_map<string, ProtoStreamObjectSource::TypeRenderer>* - ProtoStreamObjectSource::renderers_ = NULL; -GOOGLE_PROTOBUF_DECLARE_ONCE(source_renderers_init_); - -void ProtoStreamObjectSource::InitRendererMap() { - renderers_ = new hash_map<string, ProtoStreamObjectSource::TypeRenderer>(); - (*renderers_)["google.protobuf.Timestamp"] = - &ProtoStreamObjectSource::RenderTimestamp; - (*renderers_)["google.protobuf.Duration"] = - &ProtoStreamObjectSource::RenderDuration; - (*renderers_)["google.protobuf.DoubleValue"] = - &ProtoStreamObjectSource::RenderDouble; - (*renderers_)["google.protobuf.FloatValue"] = - &ProtoStreamObjectSource::RenderFloat; - (*renderers_)["google.protobuf.Int64Value"] = - &ProtoStreamObjectSource::RenderInt64; - (*renderers_)["google.protobuf.UInt64Value"] = - &ProtoStreamObjectSource::RenderUInt64; - (*renderers_)["google.protobuf.Int32Value"] = - &ProtoStreamObjectSource::RenderInt32; - (*renderers_)["google.protobuf.UInt32Value"] = - &ProtoStreamObjectSource::RenderUInt32; - (*renderers_)["google.protobuf.BoolValue"] = - &ProtoStreamObjectSource::RenderBool; - (*renderers_)["google.protobuf.StringValue"] = - &ProtoStreamObjectSource::RenderString; - (*renderers_)["google.protobuf.BytesValue"] = - &ProtoStreamObjectSource::RenderBytes; - (*renderers_)["google.protobuf.Any"] = &ProtoStreamObjectSource::RenderAny; - (*renderers_)["google.protobuf.Struct"] = - &ProtoStreamObjectSource::RenderStruct; - (*renderers_)["google.protobuf.Value"] = - &ProtoStreamObjectSource::RenderStructValue; - (*renderers_)["google.protobuf.ListValue"] = - &ProtoStreamObjectSource::RenderStructListValue; - (*renderers_)["google.protobuf.FieldMask"] = - &ProtoStreamObjectSource::RenderFieldMask; - ::google::protobuf::internal::OnShutdown(&DeleteRendererMap); -} - -void ProtoStreamObjectSource::DeleteRendererMap() { - delete ProtoStreamObjectSource::renderers_; - renderers_ = NULL; -} - -// static -ProtoStreamObjectSource::TypeRenderer* -ProtoStreamObjectSource::FindTypeRenderer(const string& type_url) { - ::google::protobuf::GoogleOnceInit(&source_renderers_init_, &InitRendererMap); - return FindOrNull(*renderers_, type_url); -} - -Status ProtoStreamObjectSource::RenderField( - const google::protobuf::Field* field, StringPiece field_name, - ObjectWriter* ow) const { - // Short-circuit message types as it tends to call WriteMessage recursively - // and ends up using a lot of stack space. Keep the stack usage of this - // message small in order to preserve stack space and not crash. - if (field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); // message length - int old_limit = stream_->PushLimit(buffer32); - // Get the nested message type for this field. - const google::protobuf::Type* type = - typeinfo_->GetTypeByTypeUrl(field->type_url()); - if (type == NULL) { - return Status(util::error::INTERNAL, - StrCat("Invalid configuration. Could not find the type: ", - field->type_url())); - } - - // Short-circuit any special type rendering to save call-stack space. - const TypeRenderer* type_renderer = FindTypeRenderer(type->name()); - - bool use_type_renderer = type_renderer != NULL; - - if (use_type_renderer) { - RETURN_IF_ERROR((*type_renderer)(this, *type, field_name, ow)); - } else { - RETURN_IF_ERROR(IncrementRecursionDepth(type->name(), field_name)); - RETURN_IF_ERROR(WriteMessage(*type, field_name, 0, true, ow)); - --recursion_depth_; - } - if (!stream_->ConsumedEntireMessage()) { - return Status(util::error::INVALID_ARGUMENT, - "Nested protocol message not parsed in its entirety."); - } - stream_->PopLimit(old_limit); - } else { - // Render all other non-message types. - return RenderNonMessageField(field, field_name, ow); - } - return Status::OK; -} - -Status ProtoStreamObjectSource::RenderNonMessageField( - const google::protobuf::Field* field, StringPiece field_name, - ObjectWriter* ow) const { - // Temporary buffers of different types. - uint32 buffer32; - uint64 buffer64; - string strbuffer; - switch (field->kind()) { - case google::protobuf::Field_Kind_TYPE_BOOL: { - stream_->ReadVarint64(&buffer64); - ow->RenderBool(field_name, buffer64 != 0); - break; - } - case google::protobuf::Field_Kind_TYPE_INT32: { - stream_->ReadVarint32(&buffer32); - ow->RenderInt32(field_name, bit_cast<int32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_INT64: { - stream_->ReadVarint64(&buffer64); - ow->RenderInt64(field_name, bit_cast<int64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT32: { - stream_->ReadVarint32(&buffer32); - ow->RenderUint32(field_name, bit_cast<uint32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT64: { - stream_->ReadVarint64(&buffer64); - ow->RenderUint64(field_name, bit_cast<uint64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT32: { - stream_->ReadVarint32(&buffer32); - ow->RenderInt32(field_name, WireFormatLite::ZigZagDecode32(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT64: { - stream_->ReadVarint64(&buffer64); - ow->RenderInt64(field_name, WireFormatLite::ZigZagDecode64(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED32: { - stream_->ReadLittleEndian32(&buffer32); - ow->RenderInt32(field_name, bit_cast<int32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED64: { - stream_->ReadLittleEndian64(&buffer64); - ow->RenderInt64(field_name, bit_cast<int64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED32: { - stream_->ReadLittleEndian32(&buffer32); - ow->RenderUint32(field_name, bit_cast<uint32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED64: { - stream_->ReadLittleEndian64(&buffer64); - ow->RenderUint64(field_name, bit_cast<uint64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_FLOAT: { - stream_->ReadLittleEndian32(&buffer32); - ow->RenderFloat(field_name, bit_cast<float>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_DOUBLE: { - stream_->ReadLittleEndian64(&buffer64); - ow->RenderDouble(field_name, bit_cast<double>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_ENUM: { - stream_->ReadVarint32(&buffer32); - - // If the field represents an explicit NULL value, render null. - if (field->type_url() == kStructNullValueTypeUrl) { - ow->RenderNull(field_name); - break; - } - - // Get the nested enum type for this field. - // TODO(skarvaje): Avoid string manipulation. Find ways to speed this - // up. - const google::protobuf::Enum* en = - typeinfo_->GetEnumByTypeUrl(field->type_url()); - // Lookup the name of the enum, and render that. Unknown enum values - // are printed as integers. - if (en != NULL) { - const google::protobuf::EnumValue* enum_value = - FindEnumValueByNumber(*en, buffer32); - if (enum_value != NULL) { - if (use_lower_camel_for_enums_) - ow->RenderString(field_name, ToCamelCase(enum_value->name())); - else - ow->RenderString(field_name, enum_value->name()); - } else { - ow->RenderInt32(field_name, buffer32); - } - } else { - ow->RenderInt32(field_name, buffer32); - } - break; - } - case google::protobuf::Field_Kind_TYPE_STRING: { - stream_->ReadVarint32(&buffer32); // string size. - stream_->ReadString(&strbuffer, buffer32); - ow->RenderString(field_name, strbuffer); - break; - } - case google::protobuf::Field_Kind_TYPE_BYTES: { - stream_->ReadVarint32(&buffer32); // bytes size. - stream_->ReadString(&strbuffer, buffer32); - ow->RenderBytes(field_name, strbuffer); - break; - } - default: - break; - } - return Status::OK; -} - -// TODO(skarvaje): Fix this to avoid code duplication. -const string ProtoStreamObjectSource::ReadFieldValueAsString( - const google::protobuf::Field& field) const { - string result; - switch (field.kind()) { - case google::protobuf::Field_Kind_TYPE_BOOL: { - uint64 buffer64; - stream_->ReadVarint64(&buffer64); - result = buffer64 != 0 ? "true" : "false"; - break; - } - case google::protobuf::Field_Kind_TYPE_INT32: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); - result = SimpleItoa(bit_cast<int32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_INT64: { - uint64 buffer64; - stream_->ReadVarint64(&buffer64); - result = SimpleItoa(bit_cast<int64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT32: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); - result = SimpleItoa(bit_cast<uint32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_UINT64: { - uint64 buffer64; - stream_->ReadVarint64(&buffer64); - result = SimpleItoa(bit_cast<uint64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT32: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); - result = SimpleItoa(WireFormatLite::ZigZagDecode32(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_SINT64: { - uint64 buffer64; - stream_->ReadVarint64(&buffer64); - result = SimpleItoa(WireFormatLite::ZigZagDecode64(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED32: { - uint32 buffer32; - stream_->ReadLittleEndian32(&buffer32); - result = SimpleItoa(bit_cast<int32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_SFIXED64: { - uint64 buffer64; - stream_->ReadLittleEndian64(&buffer64); - result = SimpleItoa(bit_cast<int64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED32: { - uint32 buffer32; - stream_->ReadLittleEndian32(&buffer32); - result = SimpleItoa(bit_cast<uint32>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_FIXED64: { - uint64 buffer64; - stream_->ReadLittleEndian64(&buffer64); - result = SimpleItoa(bit_cast<uint64>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_FLOAT: { - uint32 buffer32; - stream_->ReadLittleEndian32(&buffer32); - result = SimpleFtoa(bit_cast<float>(buffer32)); - break; - } - case google::protobuf::Field_Kind_TYPE_DOUBLE: { - uint64 buffer64; - stream_->ReadLittleEndian64(&buffer64); - result = SimpleDtoa(bit_cast<double>(buffer64)); - break; - } - case google::protobuf::Field_Kind_TYPE_ENUM: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); - // Get the nested enum type for this field. - // TODO(skarvaje): Avoid string manipulation. Find ways to speed this - // up. - const google::protobuf::Enum* en = - typeinfo_->GetEnumByTypeUrl(field.type_url()); - // Lookup the name of the enum, and render that. Skips unknown enums. - if (en != NULL) { - const google::protobuf::EnumValue* enum_value = - FindEnumValueByNumber(*en, buffer32); - if (enum_value != NULL) { - result = enum_value->name(); - } - } - break; - } - case google::protobuf::Field_Kind_TYPE_STRING: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); // string size. - stream_->ReadString(&result, buffer32); - break; - } - case google::protobuf::Field_Kind_TYPE_BYTES: { - uint32 buffer32; - stream_->ReadVarint32(&buffer32); // bytes size. - stream_->ReadString(&result, buffer32); - break; - } - default: - break; - } - return result; -} - -// Field is a map if it is a repeated message and it has an option "map_type". -// TODO(skarvaje): Consider pre-computing the IsMap() into Field directly. -bool ProtoStreamObjectSource::IsMap( - const google::protobuf::Field& field) const { - const google::protobuf::Type* field_type = - typeinfo_->GetTypeByTypeUrl(field.type_url()); - return field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE && - google::protobuf::util::converter::IsMap(field, *field_type); -} - -std::pair<int64, int32> ProtoStreamObjectSource::ReadSecondsAndNanos( - const google::protobuf::Type& type) const { - uint64 seconds = 0; - uint32 nanos = 0; - uint32 tag = 0; - int64 signed_seconds = 0; - int32 signed_nanos = 0; - - for (tag = stream_->ReadTag(); tag != 0; tag = stream_->ReadTag()) { - const google::protobuf::Field* field = FindAndVerifyField(type, tag); - if (field == NULL) { - WireFormat::SkipField(stream_, tag, NULL); - continue; - } - // 'seconds' has field number of 1 and 'nanos' has field number 2 - // //google/protobuf/timestamp.proto & duration.proto - if (field->number() == 1) { - // read seconds - stream_->ReadVarint64(&seconds); - signed_seconds = bit_cast<int64>(seconds); - } else if (field->number() == 2) { - // read nanos - stream_->ReadVarint32(&nanos); - signed_nanos = bit_cast<int32>(nanos); - } - } - return std::pair<int64, int32>(signed_seconds, signed_nanos); -} - -Status ProtoStreamObjectSource::IncrementRecursionDepth( - StringPiece type_name, StringPiece field_name) const { - if (++recursion_depth_ > max_recursion_depth_) { - return Status( - util::error::INVALID_ARGUMENT, - StrCat("Message too deep. Max recursion depth reached for type '", - type_name, "', field '", field_name, "'")); - } - return Status::OK; -} - -namespace { -// TODO(skarvaje): Speed this up by not doing a linear scan. -const google::protobuf::Field* FindFieldByNumber( - const google::protobuf::Type& type, int number) { - for (int i = 0; i < type.fields_size(); ++i) { - if (type.fields(i).number() == number) { - return &type.fields(i); - } - } - return NULL; -} - -// TODO(skarvaje): Replace FieldDescriptor by implementing IsTypePackable() -// using tech Field. -bool IsPackable(const google::protobuf::Field& field) { - return field.cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED && - google::protobuf::FieldDescriptor::IsTypePackable( - static_cast<google::protobuf::FieldDescriptor::Type>(field.kind())); -} - -// TODO(skarvaje): Speed this up by not doing a linear scan. -const google::protobuf::EnumValue* FindEnumValueByNumber( - const google::protobuf::Enum& tech_enum, int number) { - for (int i = 0; i < tech_enum.enumvalue_size(); ++i) { - const google::protobuf::EnumValue& ev = tech_enum.enumvalue(i); - if (ev.number() == number) { - return &ev; - } - } - return NULL; -} - -// TODO(skarvaje): Look into optimizing this by not doing computation on -// double. -const string FormatNanos(uint32 nanos, bool with_trailing_zeros) { - if (nanos == 0) { - return with_trailing_zeros ? ".000" : ""; - } - - const char* format = - (nanos % 1000 != 0) ? "%.9f" : (nanos % 1000000 != 0) ? "%.6f" : "%.3f"; - string formatted = - StringPrintf(format, static_cast<double>(nanos) / kNanosPerSecond); - // remove the leading 0 before decimal. - return formatted.substr(1); -} -} // namespace - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h deleted file mode 100644 index 88ca652b2d..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h +++ /dev/null @@ -1,308 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ - -#include <functional> -#include <google/protobuf/stubs/hash.h> -#include <string> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/type.pb.h> -#include <google/protobuf/util/internal/object_source.h> -#include <google/protobuf/util/internal/object_writer.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/status.h> -#include <google/protobuf/stubs/statusor.h> - - -namespace google { -namespace protobuf { -class Field; -class Type; -} // namespace protobuf - - -namespace protobuf { -namespace util { -namespace converter { - -class TypeInfo; - -// An ObjectSource that can parse a stream of bytes as a protocol buffer. -// Its WriteTo() method can be given an ObjectWriter. -// This implementation uses a google.protobuf.Type for tag and name lookup. -// The field names are converted into lower camel-case when writing to the -// ObjectWriter. -// -// Sample usage: (suppose input is: string proto) -// ArrayInputStream arr_stream(proto.data(), proto.size()); -// CodedInputStream in_stream(&arr_stream); -// ProtoStreamObjectSource os(&in_stream, /*ServiceTypeInfo*/ typeinfo, -// <your message google::protobuf::Type>); -// -// Status status = os.WriteTo(<some ObjectWriter>); -class LIBPROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource { - public: - ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, - TypeResolver* type_resolver, - const google::protobuf::Type& type); - - virtual ~ProtoStreamObjectSource(); - - virtual util::Status NamedWriteTo(StringPiece name, ObjectWriter* ow) const; - - // Sets whether or not to use lowerCamelCase casing for enum values. If set to - // false, enum values are output without any case conversions. - // - // For example, if we have an enum: - // enum Type { - // ACTION_AND_ADVENTURE = 1; - // } - // Type type = 20; - // - // And this option is set to true. Then the rendered "type" field will have - // the string "actionAndAdventure". - // { - // ... - // "type": "actionAndAdventure", - // ... - // } - // - // If set to false, the rendered "type" field will have the string - // "ACTION_AND_ADVENTURE". - // { - // ... - // "type": "ACTION_AND_ADVENTURE", - // ... - // } - void set_use_lower_camel_for_enums(bool value) { - use_lower_camel_for_enums_ = value; - } - - // Sets the max recursion depth of proto message to be deserialized. Proto - // messages over this depth will fail to be deserialized. - // Default value is 64. - void set_max_recursion_depth(int max_depth) { - max_recursion_depth_ = max_depth; - } - - - protected: - // Writes a proto2 Message to the ObjectWriter. When the given end_tag is - // found this method will complete, allowing it to be used for parsing both - // nested messages (end with 0) and nested groups (end with group end tag). - // The include_start_and_end parameter allows this method to be called when - // already inside of an object, and skip calling StartObject and EndObject. - virtual util::Status WriteMessage(const google::protobuf::Type& descriptor, - StringPiece name, const uint32 end_tag, - bool include_start_and_end, - ObjectWriter* ow) const; - - // Renders a repeating field (packed or unpacked). Returns the next tag after - // reading all sequential repeating elements. The caller should use this tag - // before reading more tags from the stream. - virtual util::StatusOr<uint32> RenderList( - const google::protobuf::Field* field, StringPiece name, uint32 list_tag, - ObjectWriter* ow) const; - - // Looks up a field and verify its consistency with wire type in tag. - const google::protobuf::Field* FindAndVerifyField( - const google::protobuf::Type& type, uint32 tag) const; - - // Renders a field value to the ObjectWriter. - util::Status RenderField(const google::protobuf::Field* field, - StringPiece field_name, ObjectWriter* ow) const; - - // Reads field value according to Field spec in 'field' and returns the read - // value as string. This only works for primitive datatypes (no message - // types). - const string ReadFieldValueAsString( - const google::protobuf::Field& field) const; - - - private: - ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, - const TypeInfo* typeinfo, - const google::protobuf::Type& type); - // Function that renders a well known type with a modified behavior. - typedef util::Status (*TypeRenderer)(const ProtoStreamObjectSource*, - const google::protobuf::Type&, - StringPiece, ObjectWriter*); - - // TODO(skarvaje): Mark these methods as non-const as they modify internal - // state (stream_). - // - // Renders a NWP map. - // Returns the next tag after reading all map entries. The caller should use - // this tag before reading more tags from the stream. - util::StatusOr<uint32> RenderMap(const google::protobuf::Field* field, - StringPiece name, uint32 list_tag, - ObjectWriter* ow) const; - - // Renders a packed repeating field. A packed field is stored as: - // {tag length item1 item2 item3} instead of the less efficient - // {tag item1 tag item2 tag item3}. - util::Status RenderPacked(const google::protobuf::Field* field, - ObjectWriter* ow) const; - - // Renders a google.protobuf.Timestamp value to ObjectWriter - static util::Status RenderTimestamp(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Renders a google.protobuf.Duration value to ObjectWriter - static util::Status RenderDuration(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Following RenderTYPE functions render well known types in - // google/protobuf/wrappers.proto corresponding to TYPE. - static util::Status RenderDouble(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderFloat(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderInt64(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderUInt64(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderInt32(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderUInt32(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderBool(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderString(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - static util::Status RenderBytes(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Renders a google.protobuf.Struct to ObjectWriter. - static util::Status RenderStruct(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Helper to render google.protobuf.Struct's Value fields to ObjectWriter. - static util::Status RenderStructValue(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Helper to render google.protobuf.Struct's ListValue fields to ObjectWriter. - static util::Status RenderStructListValue( - const ProtoStreamObjectSource* os, const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Render the "Any" type. - static util::Status RenderAny(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - // Render the "FieldMask" type. - static util::Status RenderFieldMask(const ProtoStreamObjectSource* os, - const google::protobuf::Type& type, - StringPiece name, ObjectWriter* ow); - - static hash_map<string, TypeRenderer>* renderers_; - static void InitRendererMap(); - static void DeleteRendererMap(); - static TypeRenderer* FindTypeRenderer(const string& type_url); - - // Same as above but renders all non-message field types. Callers don't call - // this function directly. They just use RenderField. - util::Status RenderNonMessageField(const google::protobuf::Field* field, - StringPiece field_name, - ObjectWriter* ow) const; - - - // Utility function to detect proto maps. The 'field' MUST be repeated. - bool IsMap(const google::protobuf::Field& field) const; - - // Utility to read int64 and int32 values from a message type in stream_. - // Used for reading google.protobuf.Timestamp and Duration messages. - std::pair<int64, int32> ReadSecondsAndNanos( - const google::protobuf::Type& type) const; - - // Helper function to check recursion depth and increment it. It will return - // Status::OK if the current depth is allowed. Otherwise an error is returned. - // type_name and field_name are used for error reporting. - util::Status IncrementRecursionDepth(StringPiece type_name, - StringPiece field_name) const; - - // Input stream to read from. Ownership rests with the caller. - google::protobuf::io::CodedInputStream* stream_; - - // Type information for all the types used in the descriptor. Used to find - // google::protobuf::Type of nested messages/enums. - const TypeInfo* typeinfo_; - - // Whether this class owns the typeinfo_ object. If true the typeinfo_ object - // should be deleted in the destructor. - bool own_typeinfo_; - - // google::protobuf::Type of the message source. - const google::protobuf::Type& type_; - - - // Whether to render enums using lowerCamelCase. Defaults to false. - bool use_lower_camel_for_enums_; - - // Tracks current recursion depth. - mutable int recursion_depth_; - - // Maximum allowed recursion depth. - int max_recursion_depth_; - - // Whether to render unknown fields. - bool render_unknown_fields_; - - // Whether to add trailing zeros for timestamp and duration. - bool add_trailing_zeros_for_timestamp_and_duration_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc deleted file mode 100644 index 1286bdb998..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc +++ /dev/null @@ -1,1034 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/protostream_objectsource.h> - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <sstream> - -#include <google/protobuf/stubs/casts.h> -#include <google/protobuf/any.pb.h> -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl_lite.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/expecting_objectwriter.h> -#include <google/protobuf/util/internal/testdata/anys.pb.h> -#include <google/protobuf/util/internal/testdata/books.pb.h> -#include <google/protobuf/util/internal/testdata/field_mask.pb.h> -#include <google/protobuf/util/internal/testdata/maps.pb.h> -#include <google/protobuf/util/internal/testdata/proto3.pb.h> -#include <google/protobuf/util/internal/testdata/struct.pb.h> -#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h> -#include <google/protobuf/util/internal/type_info_test_helper.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/stubs/strutil.h> -#include <gtest/gtest.h> - - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::Descriptor; -using google::protobuf::DescriptorPool; -using google::protobuf::FileDescriptorProto; -using google::protobuf::Message; -using google::protobuf::io::ArrayInputStream; -using google::protobuf::io::CodedInputStream; -using util::Status; -using google::protobuf::testing::AnyM; -using google::protobuf::testing::AnyOut; -using google::protobuf::testing::Author; -using google::protobuf::testing::BadAuthor; -using google::protobuf::testing::BadNestedBook; -using google::protobuf::testing::Book; -using google::protobuf::testing::Book_Label; -using google::protobuf::testing::Cyclic; -using google::protobuf::testing::FieldMaskTest; -using google::protobuf::testing::MapOut; -using google::protobuf::testing::MapOutWireFormat; -using google::protobuf::testing::NestedBook; -using google::protobuf::testing::NestedFieldMask; -using google::protobuf::testing::PackedPrimitive; -using google::protobuf::testing::Primitive; -using google::protobuf::testing::Proto3Message; -using google::protobuf::testing::StructType; -using google::protobuf::testing::TimestampDuration; -using ::testing::_; - - -namespace { -string GetTypeUrl(const Descriptor* descriptor) { - return string(kTypeServiceBaseUrl) + "/" + descriptor->full_name(); -} -} // namespace - -class ProtostreamObjectSourceTest - : public ::testing::TestWithParam<testing::TypeInfoSource> { - protected: - ProtostreamObjectSourceTest() - : helper_(GetParam()), - mock_(), - ow_(&mock_), - use_lower_camel_for_enums_(false), - add_trailing_zeros_(false) { - helper_.ResetTypeInfo(Book::descriptor(), Proto3Message::descriptor()); - } - - virtual ~ProtostreamObjectSourceTest() {} - - void DoTest(const Message& msg, const Descriptor* descriptor) { - Status status = ExecuteTest(msg, descriptor); - EXPECT_EQ(Status::OK, status); - } - - Status ExecuteTest(const Message& msg, const Descriptor* descriptor) { - std::ostringstream oss; - msg.SerializePartialToOstream(&oss); - string proto = oss.str(); - ArrayInputStream arr_stream(proto.data(), proto.size()); - CodedInputStream in_stream(&arr_stream); - - google::protobuf::scoped_ptr<ProtoStreamObjectSource> os( - helper_.NewProtoSource(&in_stream, GetTypeUrl(descriptor))); - if (use_lower_camel_for_enums_) os->set_use_lower_camel_for_enums(true); - os->set_max_recursion_depth(64); - return os->WriteTo(&mock_); - } - - void PrepareExpectingObjectWriterForRepeatedPrimitive() { - ow_.StartObject("") - ->StartList("repFix32") - ->RenderUint32("", bit_cast<uint32>(3201)) - ->RenderUint32("", bit_cast<uint32>(0)) - ->RenderUint32("", bit_cast<uint32>(3202)) - ->EndList() - ->StartList("repU32") - ->RenderUint32("", bit_cast<uint32>(3203)) - ->RenderUint32("", bit_cast<uint32>(0)) - ->EndList() - ->StartList("repI32") - ->RenderInt32("", 0) - ->RenderInt32("", 3204) - ->RenderInt32("", 3205) - ->EndList() - ->StartList("repSf32") - ->RenderInt32("", 3206) - ->RenderInt32("", 0) - ->EndList() - ->StartList("repS32") - ->RenderInt32("", 0) - ->RenderInt32("", 3207) - ->RenderInt32("", 3208) - ->EndList() - ->StartList("repFix64") - ->RenderUint64("", bit_cast<uint64>(6401LL)) - ->RenderUint64("", bit_cast<uint64>(0LL)) - ->EndList() - ->StartList("repU64") - ->RenderUint64("", bit_cast<uint64>(0LL)) - ->RenderUint64("", bit_cast<uint64>(6402LL)) - ->RenderUint64("", bit_cast<uint64>(6403LL)) - ->EndList() - ->StartList("repI64") - ->RenderInt64("", 6404L) - ->RenderInt64("", 0L) - ->EndList() - ->StartList("repSf64") - ->RenderInt64("", 0L) - ->RenderInt64("", 6405L) - ->RenderInt64("", 6406L) - ->EndList() - ->StartList("repS64") - ->RenderInt64("", 6407L) - ->RenderInt64("", 0L) - ->EndList() - ->StartList("repFloat") - ->RenderFloat("", 0.0f) - ->RenderFloat("", 32.1f) - ->RenderFloat("", 32.2f) - ->EndList() - ->StartList("repDouble") - ->RenderDouble("", 64.1L) - ->RenderDouble("", 0.0L) - ->EndList() - ->StartList("repBool") - ->RenderBool("", true) - ->RenderBool("", false) - ->EndList() - ->EndObject(); - } - - Primitive PrepareRepeatedPrimitive() { - Primitive primitive; - primitive.add_rep_fix32(3201); - primitive.add_rep_fix32(0); - primitive.add_rep_fix32(3202); - primitive.add_rep_u32(3203); - primitive.add_rep_u32(0); - primitive.add_rep_i32(0); - primitive.add_rep_i32(3204); - primitive.add_rep_i32(3205); - primitive.add_rep_sf32(3206); - primitive.add_rep_sf32(0); - primitive.add_rep_s32(0); - primitive.add_rep_s32(3207); - primitive.add_rep_s32(3208); - primitive.add_rep_fix64(6401L); - primitive.add_rep_fix64(0L); - primitive.add_rep_u64(0L); - primitive.add_rep_u64(6402L); - primitive.add_rep_u64(6403L); - primitive.add_rep_i64(6404L); - primitive.add_rep_i64(0L); - primitive.add_rep_sf64(0L); - primitive.add_rep_sf64(6405L); - primitive.add_rep_sf64(6406L); - primitive.add_rep_s64(6407L); - primitive.add_rep_s64(0L); - primitive.add_rep_float(0.0f); - primitive.add_rep_float(32.1f); - primitive.add_rep_float(32.2f); - primitive.add_rep_double(64.1L); - primitive.add_rep_double(0.0); - primitive.add_rep_bool(true); - primitive.add_rep_bool(false); - - PrepareExpectingObjectWriterForRepeatedPrimitive(); - return primitive; - } - - PackedPrimitive PreparePackedPrimitive() { - PackedPrimitive primitive; - primitive.add_rep_fix32(3201); - primitive.add_rep_fix32(0); - primitive.add_rep_fix32(3202); - primitive.add_rep_u32(3203); - primitive.add_rep_u32(0); - primitive.add_rep_i32(0); - primitive.add_rep_i32(3204); - primitive.add_rep_i32(3205); - primitive.add_rep_sf32(3206); - primitive.add_rep_sf32(0); - primitive.add_rep_s32(0); - primitive.add_rep_s32(3207); - primitive.add_rep_s32(3208); - primitive.add_rep_fix64(6401L); - primitive.add_rep_fix64(0L); - primitive.add_rep_u64(0L); - primitive.add_rep_u64(6402L); - primitive.add_rep_u64(6403L); - primitive.add_rep_i64(6404L); - primitive.add_rep_i64(0L); - primitive.add_rep_sf64(0L); - primitive.add_rep_sf64(6405L); - primitive.add_rep_sf64(6406L); - primitive.add_rep_s64(6407L); - primitive.add_rep_s64(0L); - primitive.add_rep_float(0.0f); - primitive.add_rep_float(32.1f); - primitive.add_rep_float(32.2f); - primitive.add_rep_double(64.1L); - primitive.add_rep_double(0.0); - primitive.add_rep_bool(true); - primitive.add_rep_bool(false); - - PrepareExpectingObjectWriterForRepeatedPrimitive(); - return primitive; - } - - void UseLowerCamelForEnums() { use_lower_camel_for_enums_ = true; } - - void AddTrailingZeros() { add_trailing_zeros_ = true; } - - testing::TypeInfoTestHelper helper_; - - ::testing::NiceMock<MockObjectWriter> mock_; - ExpectingObjectWriter ow_; - bool use_lower_camel_for_enums_; - bool add_trailing_zeros_; -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtostreamObjectSourceTest, EmptyMessage) { - Book empty; - ow_.StartObject("")->EndObject(); - DoTest(empty, Book::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, Primitives) { - Primitive primitive; - primitive.set_fix32(3201); - primitive.set_u32(3202); - primitive.set_i32(3203); - primitive.set_sf32(3204); - primitive.set_s32(3205); - primitive.set_fix64(6401L); - primitive.set_u64(6402L); - primitive.set_i64(6403L); - primitive.set_sf64(6404L); - primitive.set_s64(6405L); - primitive.set_str("String Value"); - primitive.set_bytes("Some Bytes"); - primitive.set_float_(32.1f); - primitive.set_double_(64.1L); - primitive.set_bool_(true); - - ow_.StartObject("") - ->RenderUint32("fix32", bit_cast<uint32>(3201)) - ->RenderUint32("u32", bit_cast<uint32>(3202)) - ->RenderInt32("i32", 3203) - ->RenderInt32("sf32", 3204) - ->RenderInt32("s32", 3205) - ->RenderUint64("fix64", bit_cast<uint64>(6401LL)) - ->RenderUint64("u64", bit_cast<uint64>(6402LL)) - ->RenderInt64("i64", 6403L) - ->RenderInt64("sf64", 6404L) - ->RenderInt64("s64", 6405L) - ->RenderString("str", "String Value") - ->RenderBytes("bytes", "Some Bytes") - ->RenderFloat("float", 32.1f) - ->RenderDouble("double", 64.1L) - ->RenderBool("bool", true) - ->EndObject(); - DoTest(primitive, Primitive::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, RepeatingPrimitives) { - Primitive primitive = PrepareRepeatedPrimitive(); - primitive.add_rep_str("String One"); - primitive.add_rep_str("String Two"); - primitive.add_rep_bytes("Some Bytes"); - - ow_.StartList("repStr") - ->RenderString("", "String One") - ->RenderString("", "String Two") - ->EndList() - ->StartList("repBytes") - ->RenderBytes("", "Some Bytes") - ->EndList(); - DoTest(primitive, Primitive::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, CustomJsonName) { - Author author; - author.set_id(12345); - - ow_.StartObject("")->RenderUint64("@id", 12345)->EndObject(); - DoTest(author, Author::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, NestedMessage) { - Author* author = new Author(); - author->set_name("Tolstoy"); - Book book; - book.set_title("My Book"); - book.set_allocated_author(author); - - ow_.StartObject("") - ->RenderString("title", "My Book") - ->StartObject("author") - ->RenderString("name", "Tolstoy") - ->EndObject() - ->EndObject(); - DoTest(book, Book::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, RepeatingField) { - Author author; - author.set_alive(false); - author.set_name("john"); - author.add_pseudonym("phil"); - author.add_pseudonym("bob"); - - ow_.StartObject("") - ->RenderBool("alive", false) - ->RenderString("name", "john") - ->StartList("pseudonym") - ->RenderString("", "phil") - ->RenderString("", "bob") - ->EndList() - ->EndObject(); - DoTest(author, Author::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, PackedRepeatingFields) { - DoTest(PreparePackedPrimitive(), PackedPrimitive::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, NonPackedPackableFieldsActuallyPacked) { - // Protostream is packed, but parse with non-packed Primitive. - DoTest(PreparePackedPrimitive(), Primitive::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, PackedPackableFieldNotActuallyPacked) { - // Protostream is not packed, but parse with PackedPrimitive. - DoTest(PrepareRepeatedPrimitive(), PackedPrimitive::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, BadAuthor) { - Author author; - author.set_alive(false); - author.set_name("john"); - author.set_id(1234L); - author.add_pseudonym("phil"); - author.add_pseudonym("bob"); - - ow_.StartObject("") - ->StartList("alive") - ->RenderBool("", false) - ->EndList() - ->StartList("name") - ->RenderUint64("", static_cast<uint64>('j')) - ->RenderUint64("", static_cast<uint64>('o')) - ->RenderUint64("", static_cast<uint64>('h')) - ->RenderUint64("", static_cast<uint64>('n')) - ->EndList() - ->RenderString("pseudonym", "phil") - ->RenderString("pseudonym", "bob") - ->EndObject(); - // Protostream created with Author, but parsed with BadAuthor. - DoTest(author, BadAuthor::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, NestedBookToBadNestedBook) { - Book* book = new Book(); - book->set_length(250); - book->set_published(2014L); - NestedBook nested; - nested.set_allocated_book(book); - - ow_.StartObject("") - ->StartList("book") - ->RenderUint32("", 24) // tag for field length (3 << 3) - ->RenderUint32("", 250) - ->RenderUint32("", 32) // tag for field published (4 << 3) - ->RenderUint32("", 2014) - ->EndList() - ->EndObject(); - // Protostream created with NestedBook, but parsed with BadNestedBook. - DoTest(nested, BadNestedBook::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, BadNestedBookToNestedBook) { - BadNestedBook nested; - nested.add_book(1); - nested.add_book(2); - nested.add_book(3); - nested.add_book(4); - nested.add_book(5); - nested.add_book(6); - nested.add_book(7); - - ow_.StartObject("")->StartObject("book")->EndObject()->EndObject(); - // Protostream created with BadNestedBook, but parsed with NestedBook. - DoTest(nested, NestedBook::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, - LongRepeatedListDoesNotBreakIntoMultipleJsonLists) { - Book book; - - int repeat = 10000; - for (int i = 0; i < repeat; ++i) { - Book_Label* label = book.add_labels(); - label->set_key(StrCat("i", i)); - label->set_value(StrCat("v", i)); - } - - // Make sure StartList and EndList are called exactly once (see b/18227499 for - // problems when this doesn't happen) - EXPECT_CALL(mock_, StartList(_)).Times(1); - EXPECT_CALL(mock_, EndList()).Times(1); - - DoTest(book, Book::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, LowerCamelEnumOutputTest) { - Book book; - book.set_type(Book::ACTION_AND_ADVENTURE); - - UseLowerCamelForEnums(); - - ow_.StartObject("")->RenderString("type", "actionAndAdventure")->EndObject(); - DoTest(book, Book::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, EnumCaseIsUnchangedByDefault) { - Book book; - book.set_type(Book::ACTION_AND_ADVENTURE); - ow_.StartObject("") - ->RenderString("type", "ACTION_AND_ADVENTURE") - ->EndObject(); - DoTest(book, Book::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, UnknownEnum) { - Proto3Message message; - message.set_enum_value(static_cast<Proto3Message::NestedEnum>(1234)); - ow_.StartObject("") - ->RenderInt32("enumValue", 1234) - ->EndObject(); - DoTest(message, Proto3Message::descriptor()); -} - -TEST_P(ProtostreamObjectSourceTest, CyclicMessageDepthTest) { - Cyclic cyclic; - cyclic.set_m_int(123); - - Book* book = cyclic.mutable_m_book(); - book->set_title("book title"); - Cyclic* current = cyclic.mutable_m_cyclic(); - Author* current_author = cyclic.add_m_author(); - for (int i = 0; i < 63; ++i) { - Author* next = current_author->add_friend_(); - next->set_id(i); - next->set_name(StrCat("author_name_", i)); - next->set_alive(true); - current_author = next; - } - - // Recursive message with depth (65) > max (max is 64). - for (int i = 0; i < 64; ++i) { - Cyclic* next = current->mutable_m_cyclic(); - next->set_m_str(StrCat("count_", i)); - current = next; - } - - Status status = ExecuteTest(cyclic, Cyclic::descriptor()); - EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code()); -} - -class ProtostreamObjectSourceMapsTest : public ProtostreamObjectSourceTest { - protected: - ProtostreamObjectSourceMapsTest() { - helper_.ResetTypeInfo(MapOut::descriptor()); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceMapsTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -// Tests JSON map. -// -// This is the example expected output. -// { -// "map1": { -// "key1": { -// "foo": "foovalue" -// }, -// "key2": { -// "foo": "barvalue" -// } -// }, -// "map2": { -// "nestedself": { -// "map1": { -// "nested_key1": { -// "foo": "nested_foo" -// } -// }, -// "bar": "nested_bar_string" -// } -// }, -// "map3": { -// "111": "one one one" -// }, -// "bar": "top bar" -// } -TEST_P(ProtostreamObjectSourceMapsTest, MapsTest) { - MapOut out; - (*out.mutable_map1())["key1"].set_foo("foovalue"); - (*out.mutable_map1())["key2"].set_foo("barvalue"); - - MapOut* nested_value = &(*out.mutable_map2())["nestedself"]; - (*nested_value->mutable_map1())["nested_key1"].set_foo("nested_foo"); - nested_value->set_bar("nested_bar_string"); - - (*out.mutable_map3())[111] = "one one one"; - - out.set_bar("top bar"); - - ow_.StartObject("") - ->StartObject("map1") - ->StartObject("key1") - ->RenderString("foo", "foovalue") - ->EndObject() - ->StartObject("key2") - ->RenderString("foo", "barvalue") - ->EndObject() - ->StartObject("map2") - ->StartObject("nestedself") - ->StartObject("map1") - ->StartObject("nested_key1") - ->RenderString("foo", "nested_foo") - ->EndObject() - ->EndObject() - ->RenderString("bar", "nested_bar_string") - ->EndObject() - ->EndObject() - ->StartObject("map3") - ->RenderString("111", "one one one") - ->EndObject() - ->EndObject() - ->RenderString("bar", "top bar") - ->EndObject(); - - DoTest(out, MapOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceMapsTest, MissingKeysTest) { - // MapOutWireFormat has the same wire representation with MapOut but uses - // repeated message fields to represent map fields so we can intentionally - // leave out the key field or the value field of a map entry. - MapOutWireFormat out; - // Create some map entries without keys. They will be rendered with the - // default values ("" for strings, "0" for integers, etc.). - // { - // "map1": { - // "": { - // "foo": "foovalue" - // } - // }, - // "map2": { - // "": { - // "map1": { - // "nested_key1": { - // "foo": "nested_foo" - // } - // } - // } - // }, - // "map3": { - // "0": "one one one" - // }, - // "map4": { - // "false": "bool" - // } - // } - out.add_map1()->mutable_value()->set_foo("foovalue"); - MapOut* nested = out.add_map2()->mutable_value(); - (*nested->mutable_map1())["nested_key1"].set_foo("nested_foo"); - out.add_map3()->set_value("one one one"); - out.add_map4()->set_value("bool"); - - ow_.StartObject("") - ->StartObject("map1") - ->StartObject("") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject() - ->StartObject("map2") - ->StartObject("") - ->StartObject("map1") - ->StartObject("nested_key1") - ->RenderString("foo", "nested_foo") - ->EndObject() - ->EndObject() - ->EndObject() - ->EndObject() - ->StartObject("map3") - ->RenderString("0", "one one one") - ->EndObject() - ->StartObject("map4") - ->RenderString("false", "bool") - ->EndObject() - ->EndObject(); - - DoTest(out, MapOut::descriptor()); -} - -class ProtostreamObjectSourceAnysTest : public ProtostreamObjectSourceTest { - protected: - ProtostreamObjectSourceAnysTest() { - helper_.ResetTypeInfo(AnyOut::descriptor(), - google::protobuf::Any::descriptor()); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceAnysTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -// Tests JSON any support. -// -// This is the example expected output. -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.testing.AnyM" -// "foo": "foovalue" -// } -// } -TEST_P(ProtostreamObjectSourceAnysTest, BasicAny) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - - AnyM m; - m.set_foo("foovalue"); - any->PackFrom(m); - - ow_.StartObject("") - ->StartObject("any") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.AnyM") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject(); - - DoTest(out, AnyOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, RecursiveAny) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any nested_any; - nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM"); - - AnyM m; - m.set_foo("foovalue"); - nested_any.set_value(m.SerializeAsString()); - - any->set_value(nested_any.SerializeAsString()); - - ow_.StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.AnyM") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject() - ->EndObject(); - - DoTest(out, AnyOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, DoubleRecursiveAny) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any nested_any; - nested_any.set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any second_nested_any; - second_nested_any.set_type_url( - "type.googleapis.com/google.protobuf.testing.AnyM"); - - AnyM m; - m.set_foo("foovalue"); - second_nested_any.set_value(m.SerializeAsString()); - nested_any.set_value(second_nested_any.SerializeAsString()); - any->set_value(nested_any.SerializeAsString()); - - ow_.StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.AnyM") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject() - ->EndObject() - ->EndObject(); - - DoTest(out, AnyOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, EmptyAnyOutputsEmptyObject) { - AnyOut out; - out.mutable_any(); - - ow_.StartObject("")->StartObject("any")->EndObject()->EndObject(); - - DoTest(out, AnyOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, EmptyWithTypeAndNoValueOutputsType) { - AnyOut out; - out.mutable_any()->set_type_url("foo.googleapis.com/my.Type"); - - ow_.StartObject("") - ->StartObject("any") - ->RenderString("@type", "foo.googleapis.com/my.Type") - ->EndObject() - ->EndObject(); - - DoTest(out, AnyOut::descriptor()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, MissingTypeUrlError) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - - AnyM m; - m.set_foo("foovalue"); - any->set_value(m.SerializeAsString()); - - // We start the "AnyOut" part and then fail when we hit the Any object. - ow_.StartObject(""); - - Status status = ExecuteTest(out, AnyOut::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeServiceError) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("foo.googleapis.com/my.own.Type"); - - AnyM m; - m.set_foo("foovalue"); - any->set_value(m.SerializeAsString()); - - // We start the "AnyOut" part and then fail when we hit the Any object. - ow_.StartObject(""); - - Status status = ExecuteTest(out, AnyOut::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeError) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("type.googleapis.com/unknown.Type"); - - AnyM m; - m.set_foo("foovalue"); - any->set_value(m.SerializeAsString()); - - // We start the "AnyOut" part and then fail when we hit the Any object. - ow_.StartObject(""); - - Status status = ExecuteTest(out, AnyOut::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -class ProtostreamObjectSourceStructTest : public ProtostreamObjectSourceTest { - protected: - ProtostreamObjectSourceStructTest() { - helper_.ResetTypeInfo(StructType::descriptor(), - google::protobuf::Struct::descriptor()); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceStructTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -// Tests struct -// -// "object": { -// "k1": 123, -// "k2": true -// } -TEST_P(ProtostreamObjectSourceStructTest, StructRenderSuccess) { - StructType out; - google::protobuf::Struct* s = out.mutable_object(); - s->mutable_fields()->operator[]("k1").set_number_value(123); - s->mutable_fields()->operator[]("k2").set_bool_value(true); - - ow_.StartObject("") - ->StartObject("object") - ->RenderDouble("k1", 123) - ->RenderBool("k2", true) - ->EndObject() - ->EndObject(); - - DoTest(out, StructType::descriptor()); -} - -TEST_P(ProtostreamObjectSourceStructTest, MissingValueSkipsField) { - StructType out; - google::protobuf::Struct* s = out.mutable_object(); - s->mutable_fields()->operator[]("k1"); - - ow_.StartObject("")->StartObject("object")->EndObject()->EndObject(); - - DoTest(out, StructType::descriptor()); -} - -class ProtostreamObjectSourceFieldMaskTest - : public ProtostreamObjectSourceTest { - protected: - ProtostreamObjectSourceFieldMaskTest() { - helper_.ResetTypeInfo(FieldMaskTest::descriptor(), - google::protobuf::FieldMask::descriptor()); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceFieldMaskTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtostreamObjectSourceFieldMaskTest, FieldMaskRenderSuccess) { - FieldMaskTest out; - out.set_id("1"); - out.mutable_single_mask()->add_paths("path1"); - out.mutable_single_mask()->add_paths("snake_case_path2"); - ::google::protobuf::FieldMask* mask = out.add_repeated_mask(); - mask->add_paths("path3"); - mask = out.add_repeated_mask(); - mask->add_paths("snake_case_path4"); - mask->add_paths("path5"); - NestedFieldMask* nested = out.add_nested_mask(); - nested->set_data("data"); - nested->mutable_single_mask()->add_paths("nested.path1"); - nested->mutable_single_mask()->add_paths("nested_field.snake_case_path2"); - mask = nested->add_repeated_mask(); - mask->add_paths("nested_field.path3"); - mask->add_paths("nested.snake_case_path4"); - mask = nested->add_repeated_mask(); - mask->add_paths("nested.path5"); - mask = nested->add_repeated_mask(); - mask->add_paths( - "snake_case.map_field[\"map_key_should_be_ignored\"].nested_snake_case." - "map_field[\"map_key_sho\\\"uld_be_ignored\"]"); - - ow_.StartObject("") - ->RenderString("id", "1") - ->RenderString("singleMask", "path1,snakeCasePath2") - ->StartList("repeatedMask") - ->RenderString("", "path3") - ->RenderString("", "snakeCasePath4,path5") - ->EndList() - ->StartList("nestedMask") - ->StartObject("") - ->RenderString("data", "data") - ->RenderString("singleMask", "nested.path1,nestedField.snakeCasePath2") - ->StartList("repeatedMask") - ->RenderString("", "nestedField.path3,nested.snakeCasePath4") - ->RenderString("", "nested.path5") - ->RenderString("", - "snakeCase.mapField[\"map_key_should_be_ignored\"]." - "nestedSnakeCase.mapField[\"map_key_sho\\\"uld_be_" - "ignored\"]") - ->EndList() - ->EndObject() - ->EndList() - ->EndObject(); - - DoTest(out, FieldMaskTest::descriptor()); -} - -class ProtostreamObjectSourceTimestampTest - : public ProtostreamObjectSourceTest { - protected: - ProtostreamObjectSourceTimestampTest() { - helper_.ResetTypeInfo(TimestampDuration::descriptor()); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtostreamObjectSourceTimestampTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtostreamObjectSourceTimestampTest, InvalidTimestampBelowMinTest) { - TimestampDuration out; - google::protobuf::Timestamp* ts = out.mutable_ts(); - // Min allowed seconds - 1 - ts->set_seconds(kTimestampMinSeconds - 1); - ow_.StartObject(""); - - Status status = ExecuteTest(out, TimestampDuration::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceTimestampTest, InvalidTimestampAboveMaxTest) { - TimestampDuration out; - google::protobuf::Timestamp* ts = out.mutable_ts(); - // Max allowed seconds + 1 - ts->set_seconds(kTimestampMaxSeconds + 1); - ow_.StartObject(""); - - Status status = ExecuteTest(out, TimestampDuration::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationBelowMinTest) { - TimestampDuration out; - google::protobuf::Duration* dur = out.mutable_dur(); - // Min allowed seconds - 1 - dur->set_seconds(kDurationMinSeconds - 1); - ow_.StartObject(""); - - Status status = ExecuteTest(out, TimestampDuration::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationAboveMaxTest) { - TimestampDuration out; - google::protobuf::Duration* dur = out.mutable_dur(); - // Min allowed seconds + 1 - dur->set_seconds(kDurationMaxSeconds + 1); - ow_.StartObject(""); - - Status status = ExecuteTest(out, TimestampDuration::descriptor()); - EXPECT_EQ(util::error::INTERNAL, status.error_code()); -} - -TEST_P(ProtostreamObjectSourceTimestampTest, TimestampDurationDefaultValue) { - TimestampDuration out; - out.mutable_ts()->set_seconds(0); - out.mutable_dur()->set_seconds(0); - - ow_.StartObject("") - ->RenderString("ts", "1970-01-01T00:00:00Z") - ->RenderString("dur", "0s") - ->EndObject(); - - DoTest(out, TimestampDuration::descriptor()); -} - - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc deleted file mode 100644 index 6c9bc30e75..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc +++ /dev/null @@ -1,1265 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/protostream_objectwriter.h> - -#include <functional> -#include <stack> - -#include <google/protobuf/stubs/once.h> -#include <google/protobuf/stubs/time.h> -#include <google/protobuf/wire_format_lite.h> -#include <google/protobuf/util/internal/field_mask_utility.h> -#include <google/protobuf/util/internal/object_location_tracker.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/map_util.h> -#include <google/protobuf/stubs/statusor.h> - - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::internal::WireFormatLite; -using util::error::INVALID_ARGUMENT; -using util::Status; -using util::StatusOr; - - -ProtoStreamObjectWriter::ProtoStreamObjectWriter( - TypeResolver* type_resolver, const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener, - const ProtoStreamObjectWriter::Options& options) - : ProtoWriter(type_resolver, type, output, listener), - master_type_(type), - current_(NULL), - options_(options) { - set_ignore_unknown_fields(options_.ignore_unknown_fields); - set_use_lower_camel_for_enums(options_.use_lower_camel_for_enums); -} - -ProtoStreamObjectWriter::ProtoStreamObjectWriter( - const TypeInfo* typeinfo, const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener) - : ProtoWriter(typeinfo, type, output, listener), - master_type_(type), - current_(NULL), - options_(ProtoStreamObjectWriter::Options::Defaults()) {} - -ProtoStreamObjectWriter::~ProtoStreamObjectWriter() { - if (current_ == NULL) return; - // Cleanup explicitly in order to avoid destructor stack overflow when input - // is deeply nested. - // Cast to BaseElement to avoid doing additional checks (like missing fields) - // during pop(). - google::protobuf::scoped_ptr<BaseElement> element( - static_cast<BaseElement*>(current_.get())->pop<BaseElement>()); - while (element != NULL) { - element.reset(element->pop<BaseElement>()); - } -} - -namespace { -// Utility method to split a string representation of Timestamp or Duration and -// return the parts. -void SplitSecondsAndNanos(StringPiece input, StringPiece* seconds, - StringPiece* nanos) { - size_t idx = input.rfind('.'); - if (idx != string::npos) { - *seconds = input.substr(0, idx); - *nanos = input.substr(idx + 1); - } else { - *seconds = input; - *nanos = StringPiece(); - } -} - -Status GetNanosFromStringPiece(StringPiece s_nanos, - const char* parse_failure_message, - const char* exceeded_limit_message, - int32* nanos) { - *nanos = 0; - - // Count the number of leading 0s and consume them. - int num_leading_zeros = 0; - while (s_nanos.Consume("0")) { - num_leading_zeros++; - } - int32 i_nanos = 0; - // 's_nanos' contains fractional seconds -- i.e. 'nanos' is equal to - // "0." + s_nanos.ToString() seconds. An int32 is used for the - // conversion to 'nanos', rather than a double, so that there is no - // loss of precision. - if (!s_nanos.empty() && !safe_strto32(s_nanos.ToString(), &i_nanos)) { - return Status(INVALID_ARGUMENT, parse_failure_message); - } - if (i_nanos > kNanosPerSecond || i_nanos < 0) { - return Status(INVALID_ARGUMENT, exceeded_limit_message); - } - // s_nanos should only have digits. No whitespace. - if (s_nanos.find_first_not_of("0123456789") != StringPiece::npos) { - return Status(INVALID_ARGUMENT, parse_failure_message); - } - - if (i_nanos > 0) { - // 'scale' is the number of digits to the right of the decimal - // point in "0." + s_nanos.ToString() - int32 scale = num_leading_zeros + s_nanos.size(); - // 'conversion' converts i_nanos into nanoseconds. - // conversion = kNanosPerSecond / static_cast<int32>(std::pow(10, scale)) - // For efficiency, we precompute the conversion factor. - int32 conversion = 0; - switch (scale) { - case 1: - conversion = 100000000; - break; - case 2: - conversion = 10000000; - break; - case 3: - conversion = 1000000; - break; - case 4: - conversion = 100000; - break; - case 5: - conversion = 10000; - break; - case 6: - conversion = 1000; - break; - case 7: - conversion = 100; - break; - case 8: - conversion = 10; - break; - case 9: - conversion = 1; - break; - default: - return Status(INVALID_ARGUMENT, exceeded_limit_message); - } - *nanos = i_nanos * conversion; - } - - return Status::OK; -} - -} // namespace - -ProtoStreamObjectWriter::AnyWriter::AnyWriter(ProtoStreamObjectWriter* parent) - : parent_(parent), - ow_(), - invalid_(false), - data_(), - output_(&data_), - depth_(0), - is_well_known_type_(false), - well_known_type_render_(NULL) {} - -ProtoStreamObjectWriter::AnyWriter::~AnyWriter() {} - -void ProtoStreamObjectWriter::AnyWriter::StartObject(StringPiece name) { - ++depth_; - // If an object writer is absent, that means we have not called StartAny() - // before reaching here, which happens when we have data before the "@type" - // field. - if (ow_ == NULL) { - // Save data before the "@type" field for later replay. - uninterpreted_events_.push_back(Event(Event::START_OBJECT, name)); - } else if (is_well_known_type_ && depth_ == 1) { - // For well-known types, the only other field besides "@type" should be a - // "value" field. - if (name != "value" && !invalid_) { - parent_->InvalidValue("Any", - "Expect a \"value\" field for well-known types."); - invalid_ = true; - } - ow_->StartObject(""); - } else { - // Forward the call to the child writer if: - // 1. the type is not a well-known type. - // 2. or, we are in a nested Any, Struct, or Value object. - ow_->StartObject(name); - } -} - -bool ProtoStreamObjectWriter::AnyWriter::EndObject() { - --depth_; - if (ow_ == NULL) { - if (depth_ >= 0) { - // Save data before the "@type" field for later replay. - uninterpreted_events_.push_back(Event(Event::END_OBJECT)); - } - } else if (depth_ >= 0 || !is_well_known_type_) { - // As long as depth_ >= 0, we know we haven't reached the end of Any. - // Propagate these EndObject() calls to the contained ow_. For regular - // message types, we propagate the end of Any as well. - ow_->EndObject(); - } - // A negative depth_ implies that we have reached the end of Any - // object. Now we write out its contents. - if (depth_ < 0) { - WriteAny(); - return false; - } - return true; -} - -void ProtoStreamObjectWriter::AnyWriter::StartList(StringPiece name) { - ++depth_; - if (ow_ == NULL) { - // Save data before the "@type" field for later replay. - uninterpreted_events_.push_back(Event(Event::START_LIST, name)); - } else if (is_well_known_type_ && depth_ == 1) { - if (name != "value" && !invalid_) { - parent_->InvalidValue("Any", - "Expect a \"value\" field for well-known types."); - invalid_ = true; - } - ow_->StartList(""); - } else { - ow_->StartList(name); - } -} - -void ProtoStreamObjectWriter::AnyWriter::EndList() { - --depth_; - if (depth_ < 0) { - GOOGLE_LOG(DFATAL) << "Mismatched EndList found, should not be possible"; - depth_ = 0; - } - if (ow_ == NULL) { - // Save data before the "@type" field for later replay. - uninterpreted_events_.push_back(Event(Event::END_LIST)); - } else { - ow_->EndList(); - } -} - -void ProtoStreamObjectWriter::AnyWriter::RenderDataPiece( - StringPiece name, const DataPiece& value) { - // Start an Any only at depth_ 0. Other RenderDataPiece calls with "@type" - // should go to the contained ow_ as they indicate nested Anys. - if (depth_ == 0 && ow_ == NULL && name == "@type") { - StartAny(value); - } else if (ow_ == NULL) { - // Save data before the "@type" field. - uninterpreted_events_.push_back(Event(name, value)); - } else if (depth_ == 0 && is_well_known_type_) { - if (name != "value" && !invalid_) { - parent_->InvalidValue("Any", - "Expect a \"value\" field for well-known types."); - invalid_ = true; - } - if (well_known_type_render_ == NULL) { - // Only Any and Struct don't have a special type render but both of - // them expect a JSON object (i.e., a StartObject() call). - if (value.type() != DataPiece::TYPE_NULL && !invalid_) { - parent_->InvalidValue("Any", "Expect a JSON object."); - invalid_ = true; - } - } else { - ow_->ProtoWriter::StartObject(""); - Status status = (*well_known_type_render_)(ow_.get(), value); - if (!status.ok()) ow_->InvalidValue("Any", status.error_message()); - ow_->ProtoWriter::EndObject(); - } - } else { - ow_->RenderDataPiece(name, value); - } -} - -void ProtoStreamObjectWriter::AnyWriter::StartAny(const DataPiece& value) { - // Figure out the type url. This is a copy-paste from WriteString but we also - // need the value, so we can't just call through to that. - if (value.type() == DataPiece::TYPE_STRING) { - type_url_ = value.str().ToString(); - } else { - StatusOr<string> s = value.ToString(); - if (!s.ok()) { - parent_->InvalidValue("String", s.status().error_message()); - invalid_ = true; - return; - } - type_url_ = s.ValueOrDie(); - } - // Resolve the type url, and report an error if we failed to resolve it. - StatusOr<const google::protobuf::Type*> resolved_type = - parent_->typeinfo()->ResolveTypeUrl(type_url_); - if (!resolved_type.ok()) { - parent_->InvalidValue("Any", resolved_type.status().error_message()); - invalid_ = true; - return; - } - // At this point, type is never null. - const google::protobuf::Type* type = resolved_type.ValueOrDie(); - - well_known_type_render_ = FindTypeRenderer(type_url_); - if (well_known_type_render_ != NULL || - // Explicitly list Any and Struct here because they don't have a - // custom renderer. - type->name() == kAnyType || type->name() == kStructType) { - is_well_known_type_ = true; - } - - // Create our object writer and initialize it with the first StartObject - // call. - ow_.reset(new ProtoStreamObjectWriter(parent_->typeinfo(), *type, &output_, - parent_->listener())); - - // Don't call StartObject() for well-known types yet. Depending on the - // type of actual data, we may not need to call StartObject(). For - // example: - // { - // "@type": "type.googleapis.com/google.protobuf.Value", - // "value": [1, 2, 3], - // } - // With the above JSON representation, we will only call StartList() on the - // contained ow_. - if (!is_well_known_type_) { - ow_->StartObject(""); - } - - // Now we know the proto type and can interpret all data fields we gathered - // before the "@type" field. - for (int i = 0; i < uninterpreted_events_.size(); ++i) { - uninterpreted_events_[i].Replay(this); - } -} - -void ProtoStreamObjectWriter::AnyWriter::WriteAny() { - if (ow_ == NULL) { - if (uninterpreted_events_.empty()) { - // We never got any content, so just return immediately, which is - // equivalent to writing an empty Any. - return; - } else { - // There are uninterpreted data, but we never got a "@type" field. - if (!invalid_) { - parent_->InvalidValue("Any", StrCat("Missing @type for any field in ", - parent_->master_type_.name())); - invalid_ = true; - } - return; - } - } - // Render the type_url and value fields directly to the stream. - // type_url has tag 1 and value has tag 2. - WireFormatLite::WriteString(1, type_url_, parent_->stream()); - if (!data_.empty()) { - WireFormatLite::WriteBytes(2, data_, parent_->stream()); - } -} - -void ProtoStreamObjectWriter::AnyWriter::Event::Replay( - AnyWriter* writer) const { - switch (type_) { - case START_OBJECT: - writer->StartObject(name_); - break; - case END_OBJECT: - writer->EndObject(); - break; - case START_LIST: - writer->StartList(name_); - break; - case END_LIST: - writer->EndList(); - break; - case RENDER_DATA_PIECE: - writer->RenderDataPiece(name_, value_); - break; - } -} - -void ProtoStreamObjectWriter::AnyWriter::Event::DeepCopy() { - // DataPiece only contains a string reference. To make sure the referenced - // string value stays valid, we make a copy of the string value and update - // DataPiece to reference our own copy. - if (value_.type() == DataPiece::TYPE_STRING) { - value_.str().AppendToString(&value_storage_); - value_ = DataPiece(value_storage_, value_.use_strict_base64_decoding()); - } else if (value_.type() == DataPiece::TYPE_BYTES) { - value_storage_ = value_.ToBytes().ValueOrDie(); - value_ = - DataPiece(value_storage_, true, value_.use_strict_base64_decoding()); - } -} - -ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter* enclosing, - ItemType item_type, bool is_placeholder, - bool is_list) - : BaseElement(NULL), - ow_(enclosing), - any_(), - item_type_(item_type), - is_placeholder_(is_placeholder), - is_list_(is_list) { - if (item_type_ == ANY) { - any_.reset(new AnyWriter(ow_)); - } - if (item_type == MAP) { - map_keys_.reset(new hash_set<string>); - } -} - -ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter::Item* parent, - ItemType item_type, bool is_placeholder, - bool is_list) - : BaseElement(parent), - ow_(this->parent()->ow_), - any_(), - item_type_(item_type), - is_placeholder_(is_placeholder), - is_list_(is_list) { - if (item_type == ANY) { - any_.reset(new AnyWriter(ow_)); - } - if (item_type == MAP) { - map_keys_.reset(new hash_set<string>); - } -} - -bool ProtoStreamObjectWriter::Item::InsertMapKeyIfNotPresent( - StringPiece map_key) { - return InsertIfNotPresent(map_keys_.get(), map_key.ToString()); -} - -ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartObject( - StringPiece name) { - if (invalid_depth() > 0) { - IncrementInvalidDepth(); - return this; - } - - // Starting the root message. Create the root Item and return. - // ANY message type does not need special handling, just set the ItemType - // to ANY. - if (current_ == NULL) { - ProtoWriter::StartObject(name); - current_.reset(new Item( - this, master_type_.name() == kAnyType ? Item::ANY : Item::MESSAGE, - false, false)); - - // If master type is a special type that needs extra values to be written to - // stream, we write those values. - if (master_type_.name() == kStructType) { - // Struct has a map<string, Value> field called "fields". - // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto - // "fields": [ - Push("fields", Item::MAP, true, true); - return this; - } - - if (master_type_.name() == kStructValueType) { - // We got a StartObject call with google.protobuf.Value field. The only - // object within that type is a struct type. So start a struct. - // - // The struct field in Value type is named "struct_value" - // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto - // Also start the map field "fields" within the struct. - // "struct_value": { - // "fields": [ - Push("struct_value", Item::MESSAGE, true, false); - Push("fields", Item::MAP, true, true); - return this; - } - - if (master_type_.name() == kStructListValueType) { - InvalidValue(kStructListValueType, - "Cannot start root message with ListValue."); - } - - return this; - } - - // Send all ANY events to AnyWriter. - if (current_->IsAny()) { - current_->any()->StartObject(name); - return this; - } - - // If we are within a map, we render name as keys and send StartObject to the - // value field. - if (current_->IsMap()) { - if (!ValidMapKey(name)) { - IncrementInvalidDepth(); - return this; - } - - // Map is a repeated field of message type with a "key" and a "value" field. - // https://developers.google.com/protocol-buffers/docs/proto3?hl=en#maps - // message MapFieldEntry { - // key_type key = 1; - // value_type value = 2; - // } - // - // repeated MapFieldEntry map_field = N; - // - // That means, we render the following element within a list (hence no - // name): - // { "key": "<name>", "value": { - Push("", Item::MESSAGE, false, false); - ProtoWriter::RenderDataPiece("key", - DataPiece(name, use_strict_base64_decoding())); - Push("value", Item::MESSAGE, true, false); - - // Make sure we are valid so far after starting map fields. - if (invalid_depth() > 0) return this; - - // If top of stack is g.p.Struct type, start the struct the map field within - // it. - if (element() != NULL && IsStruct(*element()->parent_field())) { - // Render "fields": [ - Push("fields", Item::MAP, true, true); - return this; - } - - // If top of stack is g.p.Value type, start the Struct within it. - if (element() != NULL && IsStructValue(*element()->parent_field())) { - // Render - // "struct_value": { - // "fields": [ - Push("struct_value", Item::MESSAGE, true, false); - Push("fields", Item::MAP, true, true); - } - return this; - } - - const google::protobuf::Field* field = BeginNamed(name, false); - if (field == NULL) return this; - - if (IsStruct(*field)) { - // Start a struct object. - // Render - // "<name>": { - // "fields": { - Push(name, Item::MESSAGE, false, false); - Push("fields", Item::MAP, true, true); - return this; - } - - if (IsStructValue(*field)) { - // We got a StartObject call with google.protobuf.Value field. The only - // object within that type is a struct type. So start a struct. - // Render - // "<name>": { - // "struct_value": { - // "fields": { - Push(name, Item::MESSAGE, false, false); - Push("struct_value", Item::MESSAGE, true, false); - Push("fields", Item::MAP, true, true); - return this; - } - - if (IsMap(*field)) { - // Begin a map. A map is triggered by a StartObject() call if the current - // field has a map type. - // A map type is always repeated, hence set is_list to true. - // Render - // "<name>": [ - Push(name, Item::MAP, false, true); - return this; - } - - // A regular message type. Pass it directly to ProtoWriter. - // Render - // "<name>": { - Push(name, IsAny(*field) ? Item::ANY : Item::MESSAGE, false, false); - return this; -} - -ProtoStreamObjectWriter* ProtoStreamObjectWriter::EndObject() { - if (invalid_depth() > 0) { - DecrementInvalidDepth(); - return this; - } - - if (current_ == NULL) return this; - - if (current_->IsAny()) { - if (current_->any()->EndObject()) return this; - } - - Pop(); - - return this; -} - -ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartList(StringPiece name) { - if (invalid_depth() > 0) { - IncrementInvalidDepth(); - return this; - } - - // Since we cannot have a top-level repeated item in protobuf, the only way - // this is valid is if we start a special type google.protobuf.ListValue or - // google.protobuf.Value. - if (current_ == NULL) { - if (!name.empty()) { - InvalidName(name, "Root element should not be named."); - IncrementInvalidDepth(); - return this; - } - - // If master type is a special type that needs extra values to be written to - // stream, we write those values. - if (master_type_.name() == kStructValueType) { - // We got a StartList with google.protobuf.Value master type. This means - // we have to start the "list_value" within google.protobuf.Value. - // - // See - // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto - // - // Render - // "<name>": { - // "list_value": { - // "values": [ // Start this list. - ProtoWriter::StartObject(name); - current_.reset(new Item(this, Item::MESSAGE, false, false)); - Push("list_value", Item::MESSAGE, true, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - - if (master_type_.name() == kStructListValueType) { - // We got a StartList with google.protobuf.ListValue master type. This - // means we have to start the "values" within google.protobuf.ListValue. - // - // Render - // "<name>": { - // "values": [ // Start this list. - ProtoWriter::StartObject(name); - current_.reset(new Item(this, Item::MESSAGE, false, false)); - Push("values", Item::MESSAGE, true, true); - return this; - } - - // Send the event to ProtoWriter so proper errors can be reported. - // - // Render a regular list: - // "<name>": [ - ProtoWriter::StartList(name); - current_.reset(new Item(this, Item::MESSAGE, false, true)); - return this; - } - - if (current_->IsAny()) { - current_->any()->StartList(name); - return this; - } - - // If the top of stack is a map, we are starting a list value within a map. - // Since map does not allow repeated values, this can only happen when the map - // value is of a special type that renders a list in JSON. These can be one - // of 3 cases: - // i. We are rendering a list value within google.protobuf.Struct - // ii. We are rendering a list value within google.protobuf.Value - // iii. We are rendering a list value with type google.protobuf.ListValue. - if (current_->IsMap()) { - if (!ValidMapKey(name)) { - IncrementInvalidDepth(); - return this; - } - - // Start the repeated map entry object. - // Render - // { "key": "<name>", "value": { - Push("", Item::MESSAGE, false, false); - ProtoWriter::RenderDataPiece("key", - DataPiece(name, use_strict_base64_decoding())); - Push("value", Item::MESSAGE, true, false); - - // Make sure we are valid after pushing all above items. - if (invalid_depth() > 0) return this; - - // case i and ii above. Start "list_value" field within g.p.Value - if (element() != NULL && element()->parent_field() != NULL) { - // Render - // "list_value": { - // "values": [ // Start this list - if (IsStructValue(*element()->parent_field())) { - Push("list_value", Item::MESSAGE, true, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - - // Render - // "values": [ - if (IsStructListValue(*element()->parent_field())) { - // case iii above. Bind directly to g.p.ListValue - Push("values", Item::MESSAGE, true, true); - return this; - } - } - - // Report an error. - InvalidValue("Map", StrCat("Cannot have repeated items ('", name, - "') within a map.")); - return this; - } - - // When name is empty and stack is not empty, we are rendering an item within - // a list. - if (name.empty()) { - if (element() != NULL && element()->parent_field() != NULL) { - if (IsStructValue(*element()->parent_field())) { - // Since it is g.p.Value, we bind directly to the list_value. - // Render - // { // g.p.Value item within the list - // "list_value": { - // "values": [ - Push("", Item::MESSAGE, false, false); - Push("list_value", Item::MESSAGE, true, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - - if (IsStructListValue(*element()->parent_field())) { - // Since it is g.p.ListValue, we bind to it directly. - // Render - // { // g.p.ListValue item within the list - // "values": [ - Push("", Item::MESSAGE, false, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - } - - // Pass the event to underlying ProtoWriter. - Push(name, Item::MESSAGE, false, true); - return this; - } - - // name is not empty - const google::protobuf::Field* field = Lookup(name); - if (field == NULL) { - IncrementInvalidDepth(); - return this; - } - - if (IsStructValue(*field)) { - // If g.p.Value is repeated, start that list. Otherwise, start the - // "list_value" within it. - if (IsRepeated(*field)) { - // Render it just like a regular repeated field. - // "<name>": [ - Push(name, Item::MESSAGE, false, true); - return this; - } - - // Start the "list_value" field. - // Render - // "<name>": { - // "list_value": { - // "values": [ - Push(name, Item::MESSAGE, false, false); - Push("list_value", Item::MESSAGE, true, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - - if (IsStructListValue(*field)) { - // If g.p.ListValue is repeated, start that list. Otherwise, start the - // "values" within it. - if (IsRepeated(*field)) { - // Render it just like a regular repeated field. - // "<name>": [ - Push(name, Item::MESSAGE, false, true); - return this; - } - - // Start the "values" field within g.p.ListValue. - // Render - // "<name>": { - // "values": [ - Push(name, Item::MESSAGE, false, false); - Push("values", Item::MESSAGE, true, true); - return this; - } - - // If we are here, the field should be repeated. Report an error otherwise. - if (!IsRepeated(*field)) { - IncrementInvalidDepth(); - InvalidName(name, "Proto field is not repeating, cannot start list."); - return this; - } - - if (IsMap(*field)) { - InvalidValue("Map", - StrCat("Cannot bind a list to map for field '", name, "'.")); - IncrementInvalidDepth(); - return this; - } - - // Pass the event to ProtoWriter. - // Render - // "<name>": [ - Push(name, Item::MESSAGE, false, true); - return this; -} - -ProtoStreamObjectWriter* ProtoStreamObjectWriter::EndList() { - if (invalid_depth() > 0) { - DecrementInvalidDepth(); - return this; - } - - if (current_ == NULL) return this; - - if (current_->IsAny()) { - current_->any()->EndList(); - return this; - } - - Pop(); - return this; -} - -Status ProtoStreamObjectWriter::RenderStructValue(ProtoStreamObjectWriter* ow, - const DataPiece& data) { - string struct_field_name; - switch (data.type()) { - // Our JSON parser parses numbers as either int64, uint64, or double. - case DataPiece::TYPE_INT64: { - // If the option to treat integers as strings is set, then render them as - // strings. Otherwise, fallback to rendering them as double. - if (ow->options_.struct_integers_as_strings) { - StatusOr<int64> int_value = data.ToInt64(); - if (int_value.ok()) { - ow->ProtoWriter::RenderDataPiece( - "string_value", - DataPiece(SimpleItoa(int_value.ValueOrDie()), true)); - return Status::OK; - } - } - struct_field_name = "number_value"; - break; - } - case DataPiece::TYPE_UINT64: { - // If the option to treat integers as strings is set, then render them as - // strings. Otherwise, fallback to rendering them as double. - if (ow->options_.struct_integers_as_strings) { - StatusOr<uint64> int_value = data.ToUint64(); - if (int_value.ok()) { - ow->ProtoWriter::RenderDataPiece( - "string_value", - DataPiece(SimpleItoa(int_value.ValueOrDie()), true)); - return Status::OK; - } - } - struct_field_name = "number_value"; - break; - } - case DataPiece::TYPE_DOUBLE: { - struct_field_name = "number_value"; - break; - } - case DataPiece::TYPE_STRING: { - struct_field_name = "string_value"; - break; - } - case DataPiece::TYPE_BOOL: { - struct_field_name = "bool_value"; - break; - } - case DataPiece::TYPE_NULL: { - struct_field_name = "null_value"; - break; - } - default: { - return Status(INVALID_ARGUMENT, - "Invalid struct data type. Only number, string, boolean or " - "null values are supported."); - } - } - ow->ProtoWriter::RenderDataPiece(struct_field_name, data); - return Status::OK; -} - -Status ProtoStreamObjectWriter::RenderTimestamp(ProtoStreamObjectWriter* ow, - const DataPiece& data) { - if (data.type() == DataPiece::TYPE_NULL) return Status::OK; - if (data.type() != DataPiece::TYPE_STRING) { - return Status(INVALID_ARGUMENT, - StrCat("Invalid data type for timestamp, value is ", - data.ValueAsStringOrDefault(""))); - } - - StringPiece value(data.str()); - - int64 seconds; - int32 nanos; - if (!::google::protobuf::internal::ParseTime(value.ToString(), &seconds, - &nanos)) { - return Status(INVALID_ARGUMENT, StrCat("Invalid time format: ", value)); - } - - - ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds)); - ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos)); - return Status::OK; -} - -static inline util::Status RenderOneFieldPath(ProtoStreamObjectWriter* ow, - StringPiece path) { - ow->ProtoWriter::RenderDataPiece( - "paths", DataPiece(ConvertFieldMaskPath(path, &ToSnakeCase), true)); - return Status::OK; -} - -Status ProtoStreamObjectWriter::RenderFieldMask(ProtoStreamObjectWriter* ow, - const DataPiece& data) { - if (data.type() == DataPiece::TYPE_NULL) return Status::OK; - if (data.type() != DataPiece::TYPE_STRING) { - return Status(INVALID_ARGUMENT, - StrCat("Invalid data type for field mask, value is ", - data.ValueAsStringOrDefault(""))); - } - -// TODO(tsun): figure out how to do proto descriptor based snake case -// conversions as much as possible. Because ToSnakeCase sometimes returns the -// wrong value. - google::protobuf::scoped_ptr<ResultCallback1<util::Status, StringPiece> > callback( - NewPermanentCallback(&RenderOneFieldPath, ow)); - return DecodeCompactFieldMaskPaths(data.str(), callback.get()); -} - -Status ProtoStreamObjectWriter::RenderDuration(ProtoStreamObjectWriter* ow, - const DataPiece& data) { - if (data.type() == DataPiece::TYPE_NULL) return Status::OK; - if (data.type() != DataPiece::TYPE_STRING) { - return Status(INVALID_ARGUMENT, - StrCat("Invalid data type for duration, value is ", - data.ValueAsStringOrDefault(""))); - } - - StringPiece value(data.str()); - - if (!value.ends_with("s")) { - return Status(INVALID_ARGUMENT, - "Illegal duration format; duration must end with 's'"); - } - value = value.substr(0, value.size() - 1); - int sign = 1; - if (value.starts_with("-")) { - sign = -1; - value = value.substr(1); - } - - StringPiece s_secs, s_nanos; - SplitSecondsAndNanos(value, &s_secs, &s_nanos); - uint64 unsigned_seconds; - if (!safe_strtou64(s_secs, &unsigned_seconds)) { - return Status(INVALID_ARGUMENT, - "Invalid duration format, failed to parse seconds"); - } - - int32 nanos = 0; - Status nanos_status = GetNanosFromStringPiece( - s_nanos, "Invalid duration format, failed to parse nano seconds", - "Duration value exceeds limits", &nanos); - if (!nanos_status.ok()) { - return nanos_status; - } - nanos = sign * nanos; - - int64 seconds = sign * unsigned_seconds; - if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds || - nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) { - return Status(INVALID_ARGUMENT, "Duration value exceeds limits"); - } - - ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds)); - ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos)); - return Status::OK; -} - -Status ProtoStreamObjectWriter::RenderWrapperType(ProtoStreamObjectWriter* ow, - const DataPiece& data) { - if (data.type() == DataPiece::TYPE_NULL) return Status::OK; - ow->ProtoWriter::RenderDataPiece("value", data); - return Status::OK; -} - -ProtoStreamObjectWriter* ProtoStreamObjectWriter::RenderDataPiece( - StringPiece name, const DataPiece& data) { - Status status; - if (invalid_depth() > 0) return this; - - if (current_ == NULL) { - const TypeRenderer* type_renderer = - FindTypeRenderer(GetFullTypeWithUrl(master_type_.name())); - if (type_renderer == NULL) { - InvalidName(name, "Root element must be a message."); - return this; - } - // Render the special type. - // "<name>": { - // ... Render special type ... - // } - ProtoWriter::StartObject(name); - status = (*type_renderer)(this, data); - if (!status.ok()) { - InvalidValue(master_type_.name(), - StrCat("Field '", name, "', ", status.error_message())); - } - ProtoWriter::EndObject(); - return this; - } - - if (current_->IsAny()) { - current_->any()->RenderDataPiece(name, data); - return this; - } - - const google::protobuf::Field* field = NULL; - if (current_->IsMap()) { - if (!ValidMapKey(name)) return this; - - // Render an item in repeated map list. - // { "key": "<name>", "value": - Push("", Item::MESSAGE, false, false); - ProtoWriter::RenderDataPiece("key", - DataPiece(name, use_strict_base64_decoding())); - field = Lookup("value"); - if (field == NULL) { - Pop(); - GOOGLE_LOG(DFATAL) << "Map does not have a value field."; - return this; - } - - const TypeRenderer* type_renderer = FindTypeRenderer(field->type_url()); - if (type_renderer != NULL) { - // Map's value type is a special type. Render it like a message: - // "value": { - // ... Render special type ... - // } - Push("value", Item::MESSAGE, true, false); - status = (*type_renderer)(this, data); - if (!status.ok()) { - InvalidValue(field->type_url(), - StrCat("Field '", name, "', ", status.error_message())); - } - Pop(); - return this; - } - - // If we are rendering explicit null values and the backend proto field is - // not of the google.protobuf.NullType type, we do nothing. - if (data.type() == DataPiece::TYPE_NULL && - field->type_url() != kStructNullValueTypeUrl) { - Pop(); - return this; - } - - // Render the map value as a primitive type. - ProtoWriter::RenderDataPiece("value", data); - Pop(); - return this; - } - - field = Lookup(name); - if (field == NULL) return this; - - // Check if the field is of special type. Render it accordingly if so. - const TypeRenderer* type_renderer = FindTypeRenderer(field->type_url()); - if (type_renderer != NULL) { - // Pass through null value only for google.protobuf.Value. For other - // types we ignore null value just like for regular field types. - if (data.type() != DataPiece::TYPE_NULL || - field->type_url() == kStructValueTypeUrl) { - Push(name, Item::MESSAGE, false, false); - status = (*type_renderer)(this, data); - if (!status.ok()) { - InvalidValue(field->type_url(), - StrCat("Field '", name, "', ", status.error_message())); - } - Pop(); - } - return this; - } - - // If we are rendering explicit null values and the backend proto field is - // not of the google.protobuf.NullType type, we do nothing. - if (data.type() == DataPiece::TYPE_NULL && - field->type_url() != kStructNullValueTypeUrl) { - return this; - } - - ProtoWriter::RenderDataPiece(name, data); - return this; -} - -// Map of functions that are responsible for rendering well known type -// represented by the key. -hash_map<string, ProtoStreamObjectWriter::TypeRenderer>* - ProtoStreamObjectWriter::renderers_ = NULL; -GOOGLE_PROTOBUF_DECLARE_ONCE(writer_renderers_init_); - -void ProtoStreamObjectWriter::InitRendererMap() { - renderers_ = new hash_map<string, ProtoStreamObjectWriter::TypeRenderer>(); - (*renderers_)["type.googleapis.com/google.protobuf.Timestamp"] = - &ProtoStreamObjectWriter::RenderTimestamp; - (*renderers_)["type.googleapis.com/google.protobuf.Duration"] = - &ProtoStreamObjectWriter::RenderDuration; - (*renderers_)["type.googleapis.com/google.protobuf.FieldMask"] = - &ProtoStreamObjectWriter::RenderFieldMask; - (*renderers_)["type.googleapis.com/google.protobuf.Double"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Float"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Int64"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.UInt64"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Int32"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.UInt32"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Bool"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.String"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Bytes"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.DoubleValue"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.FloatValue"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Int64Value"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.UInt64Value"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Int32Value"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.UInt32Value"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.BoolValue"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.StringValue"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.BytesValue"] = - &ProtoStreamObjectWriter::RenderWrapperType; - (*renderers_)["type.googleapis.com/google.protobuf.Value"] = - &ProtoStreamObjectWriter::RenderStructValue; - ::google::protobuf::internal::OnShutdown(&DeleteRendererMap); -} - -void ProtoStreamObjectWriter::DeleteRendererMap() { - delete ProtoStreamObjectWriter::renderers_; - renderers_ = NULL; -} - -ProtoStreamObjectWriter::TypeRenderer* -ProtoStreamObjectWriter::FindTypeRenderer(const string& type_url) { - ::google::protobuf::GoogleOnceInit(&writer_renderers_init_, &InitRendererMap); - return FindOrNull(*renderers_, type_url); -} - -bool ProtoStreamObjectWriter::ValidMapKey(StringPiece unnormalized_name) { - if (current_ == NULL) return true; - - if (!current_->InsertMapKeyIfNotPresent(unnormalized_name)) { - listener()->InvalidName( - location(), unnormalized_name, - StrCat("Repeated map key: '", unnormalized_name, "' is already set.")); - return false; - } - - return true; -} - -void ProtoStreamObjectWriter::Push(StringPiece name, Item::ItemType item_type, - bool is_placeholder, bool is_list) { - is_list ? ProtoWriter::StartList(name) : ProtoWriter::StartObject(name); - - // invalid_depth == 0 means it is a successful StartObject or StartList. - if (invalid_depth() == 0) - current_.reset( - new Item(current_.release(), item_type, is_placeholder, is_list)); -} - -void ProtoStreamObjectWriter::Pop() { - // Pop all placeholder items sending StartObject or StartList events to - // ProtoWriter according to is_list value. - while (current_ != NULL && current_->is_placeholder()) { - PopOneElement(); - } - if (current_ != NULL) { - PopOneElement(); - } -} - -void ProtoStreamObjectWriter::PopOneElement() { - current_->is_list() ? ProtoWriter::EndList() : ProtoWriter::EndObject(); - current_.reset(current_->pop<Item>()); -} - -bool ProtoStreamObjectWriter::IsMap(const google::protobuf::Field& field) { - if (field.type_url().empty() || - field.kind() != google::protobuf::Field_Kind_TYPE_MESSAGE || - field.cardinality() != - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) { - return false; - } - const google::protobuf::Type* field_type = - typeinfo()->GetTypeByTypeUrl(field.type_url()); - - return google::protobuf::util::converter::IsMap(field, *field_type); -} - -bool ProtoStreamObjectWriter::IsAny(const google::protobuf::Field& field) { - return GetTypeWithoutUrl(field.type_url()) == kAnyType; -} - -bool ProtoStreamObjectWriter::IsStruct(const google::protobuf::Field& field) { - return GetTypeWithoutUrl(field.type_url()) == kStructType; -} - -bool ProtoStreamObjectWriter::IsStructValue( - const google::protobuf::Field& field) { - return GetTypeWithoutUrl(field.type_url()) == kStructValueType; -} - -bool ProtoStreamObjectWriter::IsStructListValue( - const google::protobuf::Field& field) { - return GetTypeWithoutUrl(field.type_url()) == kStructListValueType; -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h deleted file mode 100644 index 732971e1b7..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h +++ /dev/null @@ -1,405 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__ - -#include <deque> -#include <google/protobuf/stubs/hash.h> -#include <string> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/internal/datapiece.h> -#include <google/protobuf/util/internal/error_listener.h> -#include <google/protobuf/util/internal/proto_writer.h> -#include <google/protobuf/util/internal/structured_objectwriter.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/stubs/bytestream.h> - -namespace google { -namespace protobuf { -namespace io { -class CodedOutputStream; -} // namespace io -} // namespace protobuf - - -namespace protobuf { -class Type; -class Field; -} // namespace protobuf - - -namespace protobuf { -namespace util { -namespace converter { - -class ObjectLocationTracker; - -// An ObjectWriter that can write protobuf bytes directly from writer events. -// This class supports all special types like Struct and Map. It uses -// the ProtoWriter class to write raw proto bytes. -// -// It also supports streaming. -class LIBPROTOBUF_EXPORT ProtoStreamObjectWriter : public ProtoWriter { - public: - // Options that control ProtoStreamObjectWriter class's behavior. - struct Options { - // Treats integer inputs in google.protobuf.Struct as strings. Normally, - // integer values are returned in double field "number_value" of - // google.protobuf.Struct. However, this can cause precision loss for - // int64/uint64 inputs. This option is provided for cases that want to - // preserve integer precision. - bool struct_integers_as_strings; - - // Not treat unknown fields as an error. If there is an unknown fields, - // just ignore it and continue to process the rest. - bool ignore_unknown_fields; - - // If true, check if enum name in camel case or without underscore matches - // the field name. - bool use_lower_camel_for_enums; - - Options() - : struct_integers_as_strings(false), - ignore_unknown_fields(false), - use_lower_camel_for_enums(false) {} - - // Default instance of Options with all options set to defaults. - static const Options& Defaults() { - static Options defaults; - return defaults; - } - }; - -// Constructor. Does not take ownership of any parameter passed in. - ProtoStreamObjectWriter(TypeResolver* type_resolver, - const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener, - const ProtoStreamObjectWriter::Options& options = - ProtoStreamObjectWriter::Options::Defaults()); - virtual ~ProtoStreamObjectWriter(); - - // ObjectWriter methods. - virtual ProtoStreamObjectWriter* StartObject(StringPiece name); - virtual ProtoStreamObjectWriter* EndObject(); - virtual ProtoStreamObjectWriter* StartList(StringPiece name); - virtual ProtoStreamObjectWriter* EndList(); - - // Renders a DataPiece 'value' into a field whose wire type is determined - // from the given field 'name'. - virtual ProtoStreamObjectWriter* RenderDataPiece(StringPiece name, - const DataPiece& value); - - protected: - // Function that renders a well known type with modified behavior. - typedef util::Status (*TypeRenderer)(ProtoStreamObjectWriter*, - const DataPiece&); - - // Handles writing Anys out using nested object writers and the like. - class LIBPROTOBUF_EXPORT AnyWriter { - public: - explicit AnyWriter(ProtoStreamObjectWriter* parent); - ~AnyWriter(); - - // Passes a StartObject call through to the Any writer. - void StartObject(StringPiece name); - - // Passes an EndObject call through to the Any. Returns true if the any - // handled the EndObject call, false if the Any is now all done and is no - // longer needed. - bool EndObject(); - - // Passes a StartList call through to the Any writer. - void StartList(StringPiece name); - - // Passes an EndList call through to the Any writer. - void EndList(); - - // Renders a data piece on the any. - void RenderDataPiece(StringPiece name, const DataPiece& value); - - private: - // Before the "@type" field is encountered, we store all incoming data - // into this Event struct and replay them after we get the "@type" field. - class LIBPROTOBUF_EXPORT Event { - public: - enum Type { - START_OBJECT = 0, - END_OBJECT = 1, - START_LIST = 2, - END_LIST = 3, - RENDER_DATA_PIECE = 4, - }; - - // Constructor for END_OBJECT and END_LIST events. - explicit Event(Type type) : type_(type), value_(DataPiece::NullData()) {} - - // Constructor for START_OBJECT and START_LIST events. - explicit Event(Type type, StringPiece name) - : type_(type), - name_(name.ToString()), - value_(DataPiece::NullData()) {} - - // Constructor for RENDER_DATA_PIECE events. - explicit Event(StringPiece name, const DataPiece& value) - : type_(RENDER_DATA_PIECE), name_(name.ToString()), value_(value) { - DeepCopy(); - } - - Event(const Event& other) - : type_(other.type_), name_(other.name_), value_(other.value_) { - DeepCopy(); - } - - Event& operator=(const Event& other) { - type_ = other.type_; - name_ = other.name_; - value_ = other.value_; - DeepCopy(); - return *this; - } - - void Replay(AnyWriter* writer) const; - - private: - void DeepCopy(); - - Type type_; - string name_; - DataPiece value_; - string value_storage_; - }; - - // Handles starting up the any once we have a type. - void StartAny(const DataPiece& value); - - // Writes the Any out to the parent writer in its serialized form. - void WriteAny(); - - // The parent of this writer, needed for various bits such as type info and - // the listeners. - ProtoStreamObjectWriter* parent_; - - // The nested object writer, used to write events. - google::protobuf::scoped_ptr<ProtoStreamObjectWriter> ow_; - - // The type_url_ that this Any represents. - string type_url_; - - // Whether this any is invalid. This allows us to only report an invalid - // Any message a single time rather than every time we get a nested field. - bool invalid_; - - // The output data and wrapping ByteSink. - string data_; - strings::StringByteSink output_; - - // The depth within the Any, so we can track when we're done. - int depth_; - - // True if the type is a well-known type. Well-known types in Any - // has a special formating: - // { - // "@type": "type.googleapis.com/google.protobuf.XXX", - // "value": <JSON representation of the type>, - // } - bool is_well_known_type_; - TypeRenderer* well_known_type_render_; - - // Store data before the "@type" field. - std::vector<Event> uninterpreted_events_; - }; - - // Represents an item in a stack of items used to keep state between - // ObjectWrier events. - class LIBPROTOBUF_EXPORT Item : public BaseElement { - public: - // Indicates the type of item. - enum ItemType { - MESSAGE, // Simple message - MAP, // Proto3 map type - ANY, // Proto3 Any type - }; - - // Constructor for the root item. - Item(ProtoStreamObjectWriter* enclosing, ItemType item_type, - bool is_placeholder, bool is_list); - - // Constructor for a field of a message. - Item(Item* parent, ItemType item_type, bool is_placeholder, bool is_list); - - virtual ~Item() {} - - // These functions return true if the element type is corresponding to the - // type in function name. - bool IsMap() { return item_type_ == MAP; } - bool IsAny() { return item_type_ == ANY; } - - AnyWriter* any() const { return any_.get(); } - - virtual Item* parent() const { - return static_cast<Item*>(BaseElement::parent()); - } - - // Inserts map key into hash set if and only if the key did NOT already - // exist in hash set. - // The hash set (map_keys_) is ONLY used to keep track of map keys. - // Return true if insert successfully; returns false if the map key was - // already present. - bool InsertMapKeyIfNotPresent(StringPiece map_key); - - bool is_placeholder() const { return is_placeholder_; } - bool is_list() const { return is_list_; } - - private: - // Used for access to variables of the enclosing instance of - // ProtoStreamObjectWriter. - ProtoStreamObjectWriter* ow_; - - // A writer for Any objects, handles all Any-related nonsense. - google::protobuf::scoped_ptr<AnyWriter> any_; - - // The type of this element, see enum for permissible types. - ItemType item_type_; - - // Set of map keys already seen for the type_. Used to validate incoming - // messages so no map key appears more than once. - google::protobuf::scoped_ptr<hash_set<string> > map_keys_; - - // Conveys whether this Item is a placeholder or not. Placeholder items are - // pushed to stack to account for special types. - bool is_placeholder_; - - // Conveys whether this Item is a list or not. This is used to send - // StartList or EndList calls to underlying ObjectWriter. - bool is_list_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Item); - }; - - ProtoStreamObjectWriter(const TypeInfo* typeinfo, - const google::protobuf::Type& type, - strings::ByteSink* output, ErrorListener* listener); - - // Returns true if the field is a map. - inline bool IsMap(const google::protobuf::Field& field); - - // Returns true if the field is an any. - inline bool IsAny(const google::protobuf::Field& field); - - // Returns true if the field is google.protobuf.Struct. - inline bool IsStruct(const google::protobuf::Field& field); - - // Returns true if the field is google.protobuf.Value. - inline bool IsStructValue(const google::protobuf::Field& field); - - // Returns true if the field is google.protobuf.ListValue. - inline bool IsStructListValue(const google::protobuf::Field& field); - - // Renders google.protobuf.Value in struct.proto. It picks the right oneof - // type based on value's type. - static util::Status RenderStructValue(ProtoStreamObjectWriter* ow, - const DataPiece& value); - - // Renders google.protobuf.Timestamp value. - static util::Status RenderTimestamp(ProtoStreamObjectWriter* ow, - const DataPiece& value); - - // Renders google.protobuf.FieldMask value. - static util::Status RenderFieldMask(ProtoStreamObjectWriter* ow, - const DataPiece& value); - - // Renders google.protobuf.Duration value. - static util::Status RenderDuration(ProtoStreamObjectWriter* ow, - const DataPiece& value); - - // Renders wrapper message types for primitive types in - // google/protobuf/wrappers.proto. - static util::Status RenderWrapperType(ProtoStreamObjectWriter* ow, - const DataPiece& value); - - static void InitRendererMap(); - static void DeleteRendererMap(); - static TypeRenderer* FindTypeRenderer(const string& type_url); - - // Returns true if the map key for type_ is not duplicated key. - // If map key is duplicated key, this function returns false. - // Note that caller should make sure that the current proto element (current_) - // is of element type MAP or STRUCT_MAP. - // It also calls the appropriate error callback and unnormalzied_name is used - // for error string. - bool ValidMapKey(StringPiece unnormalized_name); - - // Pushes an item on to the stack. Also calls either StartObject or StartList - // on the underlying ObjectWriter depending on whether is_list is false or - // not. - // is_placeholder conveys whether the item is a placeholder item or not. - // Placeholder items are pushed when adding auxillary types' StartObject or - // StartList calls. - void Push(StringPiece name, Item::ItemType item_type, bool is_placeholder, - bool is_list); - - // Pops items from the stack. All placeholder items are popped until a - // non-placeholder item is found. - void Pop(); - - // Pops one element from the stack. Calls EndObject() or EndList() on the - // underlying ObjectWriter depending on the value of is_list_. - void PopOneElement(); - - private: - // Helper functions to create the map and find functions responsible for - // rendering well known types, keyed by type URL. - static hash_map<string, TypeRenderer>* renderers_; - - // Variables for describing the structure of the input tree: - // master_type_: descriptor for the whole protobuf message. - const google::protobuf::Type& master_type_; - - // The current element, variable for internal state processing. - google::protobuf::scoped_ptr<Item> current_; - - // Reference to the options that control this class's behavior. - const ProtoStreamObjectWriter::Options options_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc deleted file mode 100644 index a9b15e68a8..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc +++ /dev/null @@ -1,2771 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/protostream_objectwriter.h> - -#include <stddef.h> // For size_t - -#include <google/protobuf/field_mask.pb.h> -#include <google/protobuf/timestamp.pb.h> -#include <google/protobuf/wrappers.pb.h> -#include <google/protobuf/io/zero_copy_stream_impl_lite.h> -#include <google/protobuf/descriptor.pb.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/dynamic_message.h> -#include <google/protobuf/message.h> -#include <google/protobuf/util/internal/mock_error_listener.h> -#include <google/protobuf/util/internal/testdata/anys.pb.h> -#include <google/protobuf/util/internal/testdata/books.pb.h> -#include <google/protobuf/util/internal/testdata/field_mask.pb.h> -#include <google/protobuf/util/internal/testdata/maps.pb.h> -#include <google/protobuf/util/internal/testdata/oneofs.pb.h> -#include <google/protobuf/util/internal/testdata/proto3.pb.h> -#include <google/protobuf/util/internal/testdata/struct.pb.h> -#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h> -#include <google/protobuf/util/internal/testdata/wrappers.pb.h> -#include <google/protobuf/util/internal/type_info_test_helper.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/message_differencer.h> -#include <google/protobuf/stubs/bytestream.h> -#include <google/protobuf/stubs/strutil.h> -#include <gtest/gtest.h> - - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -using google::protobuf::testing::AnyM; -using google::protobuf::testing::AnyOut; -using google::protobuf::testing::Author; -using google::protobuf::testing::Book; -using google::protobuf::testing::FieldMaskTest; -using google::protobuf::testing::Int32Wrapper; -using google::protobuf::testing::MapIn; -using google::protobuf::testing::Primitive; -using google::protobuf::testing::Proto3Message; -using google::protobuf::testing::Publisher; -using google::protobuf::testing::StructType; -using google::protobuf::testing::TimestampDuration; -using google::protobuf::testing::ValueWrapper; -using google::protobuf::testing::oneofs::OneOfsRequest; -using google::protobuf::Descriptor; -using google::protobuf::DescriptorPool; -using google::protobuf::DynamicMessageFactory; -using google::protobuf::FileDescriptorProto; -using google::protobuf::Message; -using strings::GrowingArrayByteSink; -using ::testing::_; -using ::testing::Args; - - -namespace { -string GetTypeUrl(const Descriptor* descriptor) { - return string(kTypeServiceBaseUrl) + "/" + descriptor->full_name(); -} -} // namespace - -#if __cplusplus >= 201103L - using std::get; -#else - using std::tr1::get; -#endif - -class BaseProtoStreamObjectWriterTest - : public ::testing::TestWithParam<testing::TypeInfoSource> { - protected: - BaseProtoStreamObjectWriterTest() - : helper_(GetParam()), - listener_(), - output_(new GrowingArrayByteSink(1000)), - ow_() {} - - explicit BaseProtoStreamObjectWriterTest(const Descriptor* descriptor) - : helper_(GetParam()), - listener_(), - output_(new GrowingArrayByteSink(1000)), - ow_() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(descriptor); - ResetTypeInfo(descriptors); - } - - explicit BaseProtoStreamObjectWriterTest( - std::vector<const Descriptor*> descriptors) - : helper_(GetParam()), - listener_(), - output_(new GrowingArrayByteSink(1000)), - ow_() { - ResetTypeInfo(descriptors); - } - - void ResetTypeInfo(std::vector<const Descriptor*> descriptors) { - GOOGLE_CHECK(!descriptors.empty()) << "Must have at least one descriptor!"; - helper_.ResetTypeInfo(descriptors); - ow_.reset(helper_.NewProtoWriter(GetTypeUrl(descriptors[0]), output_.get(), - &listener_, options_)); - } - - void ResetTypeInfo(const Descriptor* descriptor) { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(descriptor); - ResetTypeInfo(descriptors); - } - - virtual ~BaseProtoStreamObjectWriterTest() {} - - void CheckOutput(const Message& expected, int expected_length) { - size_t nbytes; - google::protobuf::scoped_array<char> buffer(output_->GetBuffer(&nbytes)); - if (expected_length >= 0) { - EXPECT_EQ(expected_length, nbytes); - } - string str(buffer.get(), nbytes); - - std::stringbuf str_buf(str, std::ios_base::in); - std::istream istream(&str_buf); - google::protobuf::scoped_ptr<Message> message(expected.New()); - message->ParsePartialFromIstream(&istream); - - if (!MessageDifferencer::Equivalent(expected, *message)) { - EXPECT_EQ(expected.DebugString(), message->DebugString()); - } - } - - void CheckOutput(const Message& expected) { CheckOutput(expected, -1); } - - const google::protobuf::Type* GetType(const Descriptor* descriptor) { - return helper_.GetTypeInfo()->GetTypeByTypeUrl(GetTypeUrl(descriptor)); - } - - testing::TypeInfoTestHelper helper_; - MockErrorListener listener_; - google::protobuf::scoped_ptr<GrowingArrayByteSink> output_; - google::protobuf::scoped_ptr<ProtoStreamObjectWriter> ow_; - ProtoStreamObjectWriter::Options options_; -}; - -MATCHER_P(HasObjectLocation, expected, - "Verifies the expected object location") { - string actual = get<0>(arg).ToString(); - if (actual.compare(expected) == 0) return true; - *result_listener << "actual location is: " << actual; - return false; -} - -class ProtoStreamObjectWriterTest : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterTest() - : BaseProtoStreamObjectWriterTest(Book::descriptor()) {} - - void ResetProtoWriter() { - ResetTypeInfo(Book::descriptor()); - } - - virtual ~ProtoStreamObjectWriterTest() {} -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterTest, EmptyObject) { - Book empty; - ow_->StartObject("")->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, SimpleObject) { - string content("My content"); - - Book book; - book.set_title("My Title"); - book.set_length(222); - book.set_content(content); - - ow_->StartObject("") - ->RenderString("title", "My Title") - ->RenderInt32("length", 222) - ->RenderBytes("content", content) - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, SimpleMessage) { - Book book; - book.set_title("Some Book"); - book.set_length(102); - Publisher* publisher = book.mutable_publisher(); - publisher->set_name("My Publisher"); - Author* robert = book.mutable_author(); - robert->set_alive(true); - robert->set_name("robert"); - robert->add_pseudonym("bob"); - robert->add_pseudonym("bobby"); - robert->add_friend_()->set_name("john"); - - ow_->StartObject("") - ->RenderString("title", "Some Book") - ->RenderInt32("length", 102) - ->StartObject("publisher") - ->RenderString("name", "My Publisher") - ->EndObject() - ->StartObject("author") - ->RenderBool("alive", true) - ->RenderString("name", "robert") - ->StartList("pseudonym") - ->RenderString("", "bob") - ->RenderString("", "bobby") - ->EndList() - ->StartList("friend") - ->StartObject("") - ->RenderString("name", "john") - ->EndObject() - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, CustomJsonName) { - Book book; - Author* robert = book.mutable_author(); - robert->set_id(12345); - robert->set_name("robert"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderUint64("@id", 12345) - ->RenderString("name", "robert") - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, IntEnumValuesAreAccepted) { - Book book; - book.set_title("Some Book"); - book.set_type(google::protobuf::testing::Book_Type_KIDS); - Author* robert = book.mutable_author(); - robert->set_name("robert"); - - ow_->StartObject("") - ->RenderString("title", "Some Book") - ->RenderString("type", "2") - ->StartObject("author") - ->RenderString("name", "robert") - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, EnumValuesWithoutUnderscoreAreAccepted) { - Book book; - book.set_title("Some Book"); - book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE); - Author* robert = book.mutable_author(); - robert->set_name("robert"); - - options_.use_lower_camel_for_enums = true; - ResetProtoWriter(); - - ow_->StartObject("") - ->RenderString("title", "Some Book") - ->RenderString("type", "ACTIONANDADVENTURE") - ->StartObject("author") - ->RenderString("name", "robert") - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, EnumValuesInCamelCaseAreAccepted) { - Book book; - book.set_title("Some Book"); - book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE); - Author* robert = book.mutable_author(); - robert->set_name("robert"); - - options_.use_lower_camel_for_enums = true; - ResetProtoWriter(); - - ow_->StartObject("") - ->RenderString("title", "Some Book") - ->RenderString("type", "actionAndAdventure") - ->StartObject("author") - ->RenderString("name", "robert") - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, - EnumValuesInCamelCaseWithNameNotUppercaseAreAccepted) { - Book book; - book.set_title("Some Book"); - book.set_type(google::protobuf::testing::Book_Type_arts_and_photography); - Author* robert = book.mutable_author(); - robert->set_name("robert"); - - options_.use_lower_camel_for_enums = true; - ResetProtoWriter(); - - ow_->StartObject("") - ->RenderString("title", "Some Book") - ->RenderString("type", "artsAndPhotography") - ->StartObject("author") - ->RenderString("name", "robert") - ->EndObject() - ->EndObject(); - CheckOutput(book); -} - -TEST_P(ProtoStreamObjectWriterTest, PrimitiveFromStringConversion) { - Primitive full; - full.set_fix32(101); - full.set_u32(102); - full.set_i32(-103); - full.set_sf32(-104); - full.set_s32(-105); - full.set_fix64(40000000001L); - full.set_u64(40000000002L); - full.set_i64(-40000000003L); - full.set_sf64(-40000000004L); - full.set_s64(-40000000005L); - full.set_str("string1"); - full.set_bytes("Some Bytes"); - full.set_float_(3.14f); - full.set_double_(-4.05L); - full.set_bool_(true); - full.add_rep_fix32(201); - full.add_rep_u32(202); - full.add_rep_i32(-203); - full.add_rep_sf32(-204); - full.add_rep_s32(-205); - full.add_rep_fix64(80000000001L); - full.add_rep_u64(80000000002L); - full.add_rep_i64(-80000000003L); - full.add_rep_sf64(-80000000004L); - full.add_rep_s64(-80000000005L); - full.add_rep_str("string2"); - full.add_rep_bytes("More Bytes"); - full.add_rep_float(6.14f); - full.add_rep_double(-8.05L); - full.add_rep_bool(false); - - ResetTypeInfo(Primitive::descriptor()); - - ow_->StartObject("") - ->RenderString("fix32", "101") - ->RenderString("u32", "102") - ->RenderString("i32", "-103") - ->RenderString("sf32", "-104") - ->RenderString("s32", "-105") - ->RenderString("fix64", "40000000001") - ->RenderString("u64", "40000000002") - ->RenderString("i64", "-40000000003") - ->RenderString("sf64", "-40000000004") - ->RenderString("s64", "-40000000005") - ->RenderString("str", "string1") - ->RenderString("bytes", "U29tZSBCeXRlcw==") // "Some Bytes" - ->RenderString("float", "3.14") - ->RenderString("double", "-4.05") - ->RenderString("bool", "true") - ->StartList("rep_fix32") - ->RenderString("", "201") - ->EndList() - ->StartList("rep_u32") - ->RenderString("", "202") - ->EndList() - ->StartList("rep_i32") - ->RenderString("", "-203") - ->EndList() - ->StartList("rep_sf32") - ->RenderString("", "-204") - ->EndList() - ->StartList("rep_s32") - ->RenderString("", "-205") - ->EndList() - ->StartList("rep_fix64") - ->RenderString("", "80000000001") - ->EndList() - ->StartList("rep_u64") - ->RenderString("", "80000000002") - ->EndList() - ->StartList("rep_i64") - ->RenderString("", "-80000000003") - ->EndList() - ->StartList("rep_sf64") - ->RenderString("", "-80000000004") - ->EndList() - ->StartList("rep_s64") - ->RenderString("", "-80000000005") - ->EndList() - ->StartList("rep_str") - ->RenderString("", "string2") - ->EndList() - ->StartList("rep_bytes") - ->RenderString("", "TW9yZSBCeXRlcw==") // "More Bytes" - ->EndList() - ->StartList("rep_float") - ->RenderString("", "6.14") - ->EndList() - ->StartList("rep_double") - ->RenderString("", "-8.05") - ->EndList() - ->StartList("rep_bool") - ->RenderString("", "false") - ->EndList() - ->EndObject(); - CheckOutput(full); -} - -TEST_P(ProtoStreamObjectWriterTest, InfinityInputTest) { - Primitive full; - full.set_double_(std::numeric_limits<double>::infinity()); - full.set_float_(std::numeric_limits<float>::infinity()); - full.set_str("-Infinity"); - - ResetTypeInfo(Primitive::descriptor()); - - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"), - StringPiece("\"Infinity\""))) - .With(Args<0>(HasObjectLocation("i32"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"), - StringPiece("\"Infinity\""))) - .With(Args<0>(HasObjectLocation("u32"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"), - StringPiece("\"-Infinity\""))) - .With(Args<0>(HasObjectLocation("sf64"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_BOOL"), - StringPiece("\"Infinity\""))) - .With(Args<0>(HasObjectLocation("bool"))); - - ow_->StartObject("") - ->RenderString("double", "Infinity") - ->RenderString("float", "Infinity") - ->RenderString("i32", "Infinity") - ->RenderString("u32", "Infinity") - ->RenderString("sf64", "-Infinity") - ->RenderString("str", "-Infinity") - ->RenderString("bool", "Infinity") - ->EndObject(); - CheckOutput(full); -} - -TEST_P(ProtoStreamObjectWriterTest, NaNInputTest) { - Primitive full; - full.set_double_(std::numeric_limits<double>::quiet_NaN()); - full.set_float_(std::numeric_limits<float>::quiet_NaN()); - full.set_str("NaN"); - - ResetTypeInfo(Primitive::descriptor()); - - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"), - StringPiece("\"NaN\""))) - .With(Args<0>(HasObjectLocation("i32"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"), - StringPiece("\"NaN\""))) - .With(Args<0>(HasObjectLocation("u32"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"), - StringPiece("\"NaN\""))) - .With(Args<0>(HasObjectLocation("sf64"))); - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("TYPE_BOOL"), StringPiece("\"NaN\""))) - .With(Args<0>(HasObjectLocation("bool"))); - - ow_->StartObject("") - ->RenderString("double", "NaN") - ->RenderString("float", "NaN") - ->RenderString("i32", "NaN") - ->RenderString("u32", "NaN") - ->RenderString("sf64", "NaN") - ->RenderString("str", "NaN") - ->RenderString("bool", "NaN") - ->EndObject(); - - CheckOutput(full); -} - -TEST_P(ProtoStreamObjectWriterTest, ImplicitPrimitiveList) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("The Author"); - author->add_pseudonym("first"); - author->add_pseudonym("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "The Author") - ->RenderString("pseudonym", "first") - ->RenderString("pseudonym", "second") - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, - LastWriteWinsOnNonRepeatedPrimitiveFieldWithDuplicates) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "first") - ->RenderString("name", "second") - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, ExplicitPrimitiveList) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("The Author"); - author->add_pseudonym("first"); - author->add_pseudonym("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "The Author") - ->StartList("pseudonym") - ->RenderString("", "first") - ->RenderString("", "second") - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, NonRepeatedExplicitPrimitiveList) { - Book expected; - expected.set_allocated_author(new Author()); - - EXPECT_CALL( - listener_, - InvalidName( - _, StringPiece("name"), - StringPiece("Proto field is not repeating, cannot start list."))) - .With(Args<0>(HasObjectLocation("author"))); - ow_->StartObject("") - ->StartObject("author") - ->StartList("name") - ->RenderString("", "first") - ->RenderString("", "second") - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, ImplicitMessageList) { - Book expected; - Author* outer = expected.mutable_author(); - outer->set_name("outer"); - outer->set_alive(true); - Author* first = outer->add_friend_(); - first->set_name("first"); - Author* second = outer->add_friend_(); - second->set_name("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "outer") - ->RenderBool("alive", true) - ->StartObject("friend") - ->RenderString("name", "first") - ->EndObject() - ->StartObject("friend") - ->RenderString("name", "second") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, - LastWriteWinsOnNonRepeatedMessageFieldWithDuplicates) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("The Author"); - Publisher* publisher = expected.mutable_publisher(); - publisher->set_name("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "The Author") - ->EndObject() - ->StartObject("publisher") - ->RenderString("name", "first") - ->EndObject() - ->StartObject("publisher") - ->RenderString("name", "second") - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, ExplicitMessageList) { - Book expected; - Author* outer = expected.mutable_author(); - outer->set_name("outer"); - outer->set_alive(true); - Author* first = outer->add_friend_(); - first->set_name("first"); - Author* second = outer->add_friend_(); - second->set_name("second"); - - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "outer") - ->RenderBool("alive", true) - ->StartList("friend") - ->StartObject("") - ->RenderString("name", "first") - ->EndObject() - ->StartObject("") - ->RenderString("name", "second") - ->EndObject() - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, NonRepeatedExplicitMessageList) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("The Author"); - - EXPECT_CALL( - listener_, - InvalidName( - _, StringPiece("publisher"), - StringPiece("Proto field is not repeating, cannot start list."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "The Author") - ->EndObject() - ->StartList("publisher") - ->StartObject("") - ->RenderString("name", "first") - ->EndObject() - ->StartObject("") - ->RenderString("name", "second") - ->EndObject() - ->EndList() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownFieldAtRoot) { - Book empty; - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownFieldAtAuthorFriend) { - Book expected; - Author* paul = expected.mutable_author(); - paul->set_name("Paul"); - Author* mark = paul->add_friend_(); - mark->set_name("Mark"); - Author* john = paul->add_friend_(); - john->set_name("John"); - Author* luke = paul->add_friend_(); - luke->set_name("Luke"); - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("address"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation("author.friend[1]"))); - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "Paul") - ->StartList("friend") - ->StartObject("") - ->RenderString("name", "Mark") - ->EndObject() - ->StartObject("") - ->RenderString("name", "John") - ->RenderString("address", "Patmos") - ->EndObject() - ->StartObject("") - ->RenderString("name", "Luke") - ->EndObject() - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownObjectAtRoot) { - Book empty; - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownObjectAtAuthor) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("William"); - author->add_pseudonym("Bill"); - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("wife"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation("author"))); - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "William") - ->StartObject("wife") - ->RenderString("name", "Hilary") - ->EndObject() - ->RenderString("pseudonym", "Bill") - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownListAtRoot) { - Book empty; - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("")->StartList("unknown")->EndList()->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, UnknownListAtPublisher) { - Book expected; - expected.set_title("Brainwashing"); - Publisher* publisher = expected.mutable_publisher(); - publisher->set_name("propaganda"); - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("alliance"), - StringPiece("Cannot find field."))) - .With(Args<0>(HasObjectLocation("publisher"))); - ow_->StartObject("") - ->StartObject("publisher") - ->RenderString("name", "propaganda") - ->StartList("alliance") - ->EndList() - ->EndObject() - ->RenderString("title", "Brainwashing") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtRoot) { - Book empty; - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtAuthorFriend) { - Book expected; - Author* paul = expected.mutable_author(); - paul->set_name("Paul"); - Author* mark = paul->add_friend_(); - mark->set_name("Mark"); - Author* john = paul->add_friend_(); - john->set_name("John"); - Author* luke = paul->add_friend_(); - luke->set_name("Luke"); - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "Paul") - ->StartList("friend") - ->StartObject("") - ->RenderString("name", "Mark") - ->EndObject() - ->StartObject("") - ->RenderString("name", "John") - ->RenderString("address", "Patmos") - ->EndObject() - ->StartObject("") - ->RenderString("name", "Luke") - ->EndObject() - ->EndList() - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtRoot) { - Book empty; - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"), - StringPiece("Cannot find field."))) - .Times(0); - ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtAuthor) { - Book expected; - Author* author = expected.mutable_author(); - author->set_name("William"); - author->add_pseudonym("Bill"); - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("author") - ->RenderString("name", "William") - ->StartObject("wife") - ->RenderString("name", "Hilary") - ->EndObject() - ->RenderString("pseudonym", "Bill") - ->EndObject() - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtRoot) { - Book empty; - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("")->StartList("unknown")->EndList()->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtPublisher) { - Book expected; - expected.set_title("Brainwashing"); - Publisher* publisher = expected.mutable_publisher(); - publisher->set_name("propaganda"); - - options_.ignore_unknown_fields = true; - ResetProtoWriter(); - - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("publisher") - ->RenderString("name", "propaganda") - ->StartList("alliance") - ->EndList() - ->EndObject() - ->RenderString("title", "Brainwashing") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, AcceptUnknownEnumValue) { - ResetTypeInfo(Proto3Message::descriptor()); - - Proto3Message expected; - expected.set_enum_value(static_cast<Proto3Message::NestedEnum>(12345)); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->RenderInt32("enumValue", 12345) - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, MissingRequiredField) { - Book expected; - expected.set_title("My Title"); - expected.set_allocated_publisher(new Publisher()); - - EXPECT_CALL(listener_, MissingField(_, StringPiece("name"))) - .With(Args<0>(HasObjectLocation("publisher"))); - ow_->StartObject("") - ->StartObject("publisher") - ->EndObject() - ->RenderString("title", "My Title") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, InvalidFieldValueAtRoot) { - Book empty; - - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"), - StringPiece("\"garbage\""))) - .With(Args<0>(HasObjectLocation("length"))); - ow_->StartObject("")->RenderString("length", "garbage")->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, MultipleInvalidFieldValues) { - Book expected; - expected.set_title("My Title"); - - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"), - StringPiece("\"-400\""))) - .With(Args<0>(HasObjectLocation("length"))); - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT64"), - StringPiece("\"3.14\""))) - .With(Args<0>(HasObjectLocation("published"))); - ow_->StartObject("") - ->RenderString("length", "-400") - ->RenderString("published", "3.14") - ->RenderString("title", "My Title") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, UnnamedFieldAtRoot) { - Book empty; - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece(""), - StringPiece("Proto fields must have a name."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("")->RenderFloat("", 3.14)->EndObject(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, UnnamedFieldAtAuthor) { - Book expected; - expected.set_title("noname"); - expected.set_allocated_author(new Author()); - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece(""), - StringPiece("Proto fields must have a name."))) - .With(Args<0>(HasObjectLocation("author"))); - ow_->StartObject("") - ->StartObject("author") - ->RenderInt32("", 123) - ->EndObject() - ->RenderString("title", "noname") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, UnnamedListAtRoot) { - Book expected; - expected.set_title("noname"); - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece(""), - StringPiece("Proto fields must have a name."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("") - ->StartList("") - ->EndList() - ->RenderString("title", "noname") - ->EndObject(); - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterTest, RootNamedObject) { - Book expected; - expected.set_title("Annie"); - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece("oops"), - StringPiece("Root element should not be named."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("oops")->RenderString("title", "Annie")->EndObject(); - CheckOutput(expected, 7); -} - -TEST_P(ProtoStreamObjectWriterTest, RootNamedList) { - Book empty; - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece("oops"), - StringPiece("Root element should not be named."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartList("oops")->RenderString("", "item")->EndList(); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, RootUnnamedField) { - Book empty; - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece(""), - StringPiece("Root element must be a message."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->RenderBool("", true); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, RootNamedField) { - Book empty; - - EXPECT_CALL(listener_, - InvalidName(_, StringPiece("oops"), - StringPiece("Root element must be a message."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->RenderBool("oops", true); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, NullValue) { - Book empty; - - ow_->RenderNull(""); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, NullValueForMessageField) { - Book empty; - - ow_->RenderNull("author"); - CheckOutput(empty, 0); -} - -TEST_P(ProtoStreamObjectWriterTest, NullValueForPrimitiveField) { - Book empty; - - ow_->RenderNull("length"); - CheckOutput(empty, 0); -} - -class ProtoStreamObjectWriterTimestampDurationTest - : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterTimestampDurationTest() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(TimestampDuration::descriptor()); - descriptors.push_back(google::protobuf::Timestamp::descriptor()); - descriptors.push_back(google::protobuf::Duration::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterTimestampDurationTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, ParseTimestamp) { - TimestampDuration timestamp; - google::protobuf::Timestamp* ts = timestamp.mutable_ts(); - ts->set_seconds(1448249855); - ts->set_nanos(33155000); - - ow_->StartObject("") - ->RenderString("ts", "2015-11-23T03:37:35.033155Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - ParseTimestampYearNotZeroPadded) { - TimestampDuration timestamp; - google::protobuf::Timestamp* ts = timestamp.mutable_ts(); - ts->set_seconds(-61665654145); - ts->set_nanos(33155000); - - ow_->StartObject("") - ->RenderString("ts", "15-11-23T03:37:35.033155Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - ParseTimestampYearZeroPadded) { - TimestampDuration timestamp; - google::protobuf::Timestamp* ts = timestamp.mutable_ts(); - ts->set_seconds(-61665654145); - ts->set_nanos(33155000); - - ow_->StartObject("") - ->RenderString("ts", "0015-11-23T03:37:35.033155Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - ParseTimestampWithPositiveOffset) { - TimestampDuration timestamp; - google::protobuf::Timestamp* ts = timestamp.mutable_ts(); - ts->set_seconds(1448249855); - ts->set_nanos(33155000); - - ow_->StartObject("") - ->RenderString("ts", "2015-11-23T11:47:35.033155+08:10") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - ParseTimestampWithNegativeOffset) { - TimestampDuration timestamp; - google::protobuf::Timestamp* ts = timestamp.mutable_ts(); - ts->set_seconds(1448249855); - ts->set_nanos(33155000); - - ow_->StartObject("") - ->RenderString("ts", "2015-11-22T19:47:35.033155-07:50") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - TimestampWithInvalidOffset1) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2016-03-07T15:14:23+"))); - - ow_->StartObject("")->RenderString("ts", "2016-03-07T15:14:23+")->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - TimestampWithInvalidOffset2) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2016-03-07T15:14:23+08-10"))); - - ow_->StartObject("") - ->RenderString("ts", "2016-03-07T15:14:23+08-10") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - TimestampWithInvalidOffset3) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2016-03-07T15:14:23+24:10"))); - - ow_->StartObject("") - ->RenderString("ts", "2016-03-07T15:14:23+24:10") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - TimestampWithInvalidOffset4) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2016-03-07T15:14:23+04:60"))); - - ow_->StartObject("") - ->RenderString("ts", "2016-03-07T15:14:23+04:60") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError1) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: "))); - - ow_->StartObject("")->RenderString("ts", "")->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError2) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: Z"))); - - ow_->StartObject("")->RenderString("ts", "Z")->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError3) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "1970-01-01T00:00:00.ABZ"))); - - ow_->StartObject("") - ->RenderString("ts", "1970-01-01T00:00:00.ABZ") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError4) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "-8031-10-18T00:00:00.000Z"))); - - ow_->StartObject("") - ->RenderString("ts", "-8031-10-18T00:00:00.000Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError5) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2015-11-23T03:37:35.033155 Z"))); - - ow_->StartObject("") - // Whitespace in the Timestamp nanos is not allowed. - ->RenderString("ts", "2015-11-23T03:37:35.033155 Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError6) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2015-11-23T03:37:35.033155 1234Z"))); - - ow_->StartObject("") - // Whitespace in the Timestamp nanos is not allowed. - ->RenderString("ts", "2015-11-23T03:37:35.033155 1234Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError7) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "2015-11-23T03:37:35.033abc155Z"))); - - ow_->StartObject("") - // Non-numeric characters in the Timestamp nanos is not allowed. - ->RenderString("ts", "2015-11-23T03:37:35.033abc155Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError8) { - TimestampDuration timestamp; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece("Field 'ts', Invalid time format: " - "0-12-31T23:59:59.000Z"))); - - ow_->StartObject("") - ->RenderString("ts", "0-12-31T23:59:59.000Z") - ->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, ParseDuration) { - TimestampDuration duration; - google::protobuf::Duration* dur = duration.mutable_dur(); - dur->set_seconds(1448216930); - dur->set_nanos(132262000); - - ow_->StartObject("")->RenderString("dur", "1448216930.132262s")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError1) { - TimestampDuration duration; - - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece("Field 'dur', Illegal duration format; duration must " - "end with 's'"))); - - ow_->StartObject("")->RenderString("dur", "")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError2) { - TimestampDuration duration; - - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece("Field 'dur', Invalid duration format, failed to parse " - "seconds"))); - - ow_->StartObject("")->RenderString("dur", "s")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError3) { - TimestampDuration duration; - - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece("Field 'dur', Invalid duration format, failed to " - "parse nano seconds"))); - - ow_->StartObject("")->RenderString("dur", "123.DEFs")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError4) { - TimestampDuration duration; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece("Field 'dur', Duration value exceeds limits"))); - - ow_->StartObject("")->RenderString("dur", "315576000002s")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError5) { - TimestampDuration duration; - - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece("Field 'dur', Duration value exceeds limits"))); - - ow_->StartObject("")->RenderString("dur", "0.1000000001s")->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - MismatchedTimestampTypeInput) { - TimestampDuration timestamp; - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"), - StringPiece( - "Field 'ts', Invalid data type for timestamp, value is 1"))) - .With(Args<0>(HasObjectLocation("ts"))); - ow_->StartObject("")->RenderInt32("ts", 1)->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, - MismatchedDurationTypeInput) { - TimestampDuration duration; - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.Duration"), - StringPiece( - "Field 'dur', Invalid data type for duration, value is 1"))) - .With(Args<0>(HasObjectLocation("dur"))); - ow_->StartObject("")->RenderInt32("dur", 1)->EndObject(); - CheckOutput(duration); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, TimestampAcceptsNull) { - TimestampDuration timestamp; - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("ts")->EndObject(); - CheckOutput(timestamp); -} - -TEST_P(ProtoStreamObjectWriterTimestampDurationTest, DurationAcceptsNull) { - TimestampDuration duration; - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("dur")->EndObject(); - CheckOutput(duration); -} - -class ProtoStreamObjectWriterStructTest - : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterStructTest() { ResetProtoWriter(); } - - // Resets ProtoWriter with current set of options and other state. - void ResetProtoWriter() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(StructType::descriptor()); - descriptors.push_back(google::protobuf::Struct::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterStructTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -// TODO(skarvaje): Write tests for failure cases. -TEST_P(ProtoStreamObjectWriterStructTest, StructRenderSuccess) { - StructType struct_type; - google::protobuf::Struct* s = struct_type.mutable_object(); - s->mutable_fields()->operator[]("k1").set_number_value(123); - s->mutable_fields()->operator[]("k2").set_bool_value(true); - - ow_->StartObject("") - ->StartObject("object") - ->RenderDouble("k1", 123) - ->RenderBool("k2", true) - ->EndObject() - ->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, StructNullInputSuccess) { - StructType struct_type; - EXPECT_CALL(listener_, - InvalidName(_, StringPiece(""), - StringPiece("Proto fields must have a name."))) - .With(Args<0>(HasObjectLocation(""))); - ow_->StartObject("")->RenderNull("")->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, StructInvalidInputFailure) { - StructType struct_type; - EXPECT_CALL( - listener_, - InvalidValue(_, StringPiece("type.googleapis.com/google.protobuf.Struct"), - StringPiece("true"))) - .With(Args<0>(HasObjectLocation("object"))); - - ow_->StartObject("")->RenderBool("object", true)->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, StructAcceptsNull) { - StructType struct_type; - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - - ow_->StartObject("")->RenderNull("object")->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, StructValuePreservesNull) { - StructType struct_type; - (*struct_type.mutable_object()->mutable_fields())["key"].set_null_value( - google::protobuf::NULL_VALUE); - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - - ow_->StartObject("") - ->StartObject("object") - ->RenderNull("key") - ->EndObject() - ->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, SimpleRepeatedStructMapKeyTest) { - EXPECT_CALL( - listener_, - InvalidName(_, StringPiece("gBike"), - StringPiece("Repeated map key: 'gBike' is already set."))); - ow_->StartObject("") - ->StartObject("object") - ->RenderString("gBike", "v1") - ->RenderString("gBike", "v2") - ->EndObject() - ->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapListKeyTest) { - EXPECT_CALL( - listener_, - InvalidName(_, StringPiece("k1"), - StringPiece("Repeated map key: 'k1' is already set."))); - ow_->StartObject("") - ->StartObject("object") - ->RenderString("k1", "v1") - ->StartList("k1") - ->RenderString("", "v2") - ->EndList() - ->EndObject() - ->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapObjectKeyTest) { - EXPECT_CALL( - listener_, - InvalidName(_, StringPiece("k1"), - StringPiece("Repeated map key: 'k1' is already set."))); - ow_->StartObject("") - ->StartObject("object") - ->StartObject("k1") - ->RenderString("sub_k1", "v1") - ->EndObject() - ->StartObject("k1") - ->RenderString("sub_k2", "v2") - ->EndObject() - ->EndObject() - ->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterStructTest, OptionStructIntAsStringsTest) { - StructType struct_type; - google::protobuf::Struct* s = struct_type.mutable_object(); - s->mutable_fields()->operator[]("k1").set_number_value(123); - s->mutable_fields()->operator[]("k2").set_bool_value(true); - s->mutable_fields()->operator[]("k3").set_string_value("-222222222"); - s->mutable_fields()->operator[]("k4").set_string_value("33333333"); - - options_.struct_integers_as_strings = true; - ResetProtoWriter(); - - ow_->StartObject("") - ->StartObject("object") - ->RenderDouble("k1", 123) - ->RenderBool("k2", true) - ->RenderInt64("k3", -222222222) - ->RenderUint64("k4", 33333333) - ->EndObject() - ->EndObject(); - CheckOutput(struct_type); -} - -TEST_P(ProtoStreamObjectWriterStructTest, ValuePreservesNull) { - ValueWrapper value; - value.mutable_value()->set_null_value(google::protobuf::NULL_VALUE); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("value")->EndObject(); - CheckOutput(value); -} - -class ProtoStreamObjectWriterMapTest : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterMapTest() - : BaseProtoStreamObjectWriterTest(MapIn::descriptor()) {} -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterMapTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterMapTest, MapShouldNotAcceptList) { - MapIn mm; - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("Map"), - StringPiece("Cannot bind a list to map for field 'map_input'."))); - ow_->StartObject("") - ->StartList("map_input") - ->RenderString("a", "b") - ->EndList() - ->EndObject(); - CheckOutput(mm); -} - -TEST_P(ProtoStreamObjectWriterMapTest, RepeatedMapKeyTest) { - EXPECT_CALL( - listener_, - InvalidName(_, StringPiece("k1"), - StringPiece("Repeated map key: 'k1' is already set."))); - ow_->StartObject("") - ->RenderString("other", "test") - ->StartObject("map_input") - ->RenderString("k1", "v1") - ->RenderString("k1", "v2") - ->EndObject() - ->EndObject(); -} - -class ProtoStreamObjectWriterAnyTest : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterAnyTest() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(AnyOut::descriptor()); - descriptors.push_back(Book::descriptor()); - descriptors.push_back(google::protobuf::Any::descriptor()); - descriptors.push_back(google::protobuf::DoubleValue::descriptor()); - descriptors.push_back(google::protobuf::FieldMask::descriptor()); - descriptors.push_back(google::protobuf::Int32Value::descriptor()); - descriptors.push_back(google::protobuf::Struct::descriptor()); - descriptors.push_back(google::protobuf::Timestamp::descriptor()); - descriptors.push_back(google::protobuf::Value::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterAnyTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyRenderSuccess) { - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.DoubleValue"); - google::protobuf::DoubleValue d; - d.set_value(40.2); - any_type->set_value(d.SerializeAsString()); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.DoubleValue") - ->RenderDouble("value", 40.2) - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, RecursiveAny) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any nested_any; - nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM"); - - AnyM m; - m.set_foo("foovalue"); - nested_any.set_value(m.SerializeAsString()); - - any->set_value(nested_any.SerializeAsString()); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.AnyM") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(out, 107); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, DoubleRecursiveAny) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - any->set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any nested_any; - nested_any.set_type_url("type.googleapis.com/google.protobuf.Any"); - - ::google::protobuf::Any second_nested_any; - second_nested_any.set_type_url( - "type.googleapis.com/google.protobuf.testing.AnyM"); - - AnyM m; - m.set_foo("foovalue"); - second_nested_any.set_value(m.SerializeAsString()); - - nested_any.set_value(second_nested_any.SerializeAsString()); - any->set_value(nested_any.SerializeAsString()); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->StartObject("value") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.AnyM") - ->RenderString("foo", "foovalue") - ->EndObject() - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(out, 151); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEnd) { - Book book; - book.set_title("C++"); - book.set_length(1234); - book.set_content("Hello World!"); - - ::google::protobuf::Any any; - any.PackFrom(book); - - ::google::protobuf::Any outer_any; - outer_any.PackFrom(any); - - AnyOut out; - out.mutable_any()->PackFrom(outer_any); - - // Put the @type field at the end of each Any message. Parsers should - // be able to accept that. - ow_->StartObject("") - ->StartObject("any") - ->StartObject("value") - ->StartObject("value") - ->RenderString("title", "C++") - ->RenderInt32("length", 1234) - ->RenderBytes("content", "Hello World!") - ->RenderString("@type", - "type.googleapis.com/google.protobuf.testing.Book") - ->EndObject() - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->EndObject() - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// Same as TypeUrlAtEnd, but use temporary string values to make sure we don't -// mistakenly store StringPiece objects pointing to invalid memory. -TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEndWithTemporaryStrings) { - Book book; - book.set_title("C++"); - book.set_length(1234); - book.set_content("Hello World!"); - - ::google::protobuf::Any any; - any.PackFrom(book); - - ::google::protobuf::Any outer_any; - outer_any.PackFrom(any); - - AnyOut out; - out.mutable_any()->PackFrom(outer_any); - - string name, value; - // Put the @type field at the end of each Any message. Parsers should - // be able to accept that. - ow_->StartObject("")->StartObject("any"); - { - ow_->StartObject("value"); - { - ow_->StartObject("value"); - { - name = "title"; - value = "C++"; - ow_->RenderString(name, value); - name = "length"; - ow_->RenderInt32(name, 1234); - name = "content"; - value = "Hello World!"; - ow_->RenderBytes(name, value); - name = "@type"; - value = "type.googleapis.com/google.protobuf.testing.Book"; - ow_->RenderString(name, value); - } - ow_->EndObject(); - - name = "@type"; - value = "type.googleapis.com/google.protobuf.Any"; - ow_->RenderString(name, value); - } - ow_->EndObject(); - - name = "@type"; - value = "type.googleapis.com/google.protobuf.Any"; - ow_->RenderString(name, value); - } - ow_->EndObject()->EndObject(); - CheckOutput(out); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, EmptyAnyFromEmptyObject) { - AnyOut out; - out.mutable_any(); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - - ow_->StartObject("")->StartObject("any")->EndObject()->EndObject(); - - CheckOutput(out, 2); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails1) { - AnyOut any; - - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("Any"), - StringPiece("Missing @type for any field in " - "google.protobuf.testing.AnyOut"))); - - ow_->StartObject("") - ->StartObject("any") - ->StartObject("another") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails2) { - AnyOut any; - - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("Any"), - StringPiece("Missing @type for any field in " - "google.protobuf.testing.AnyOut"))); - - ow_->StartObject("") - ->StartObject("any") - ->StartList("another") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails3) { - AnyOut any; - - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("Any"), - StringPiece("Missing @type for any field in " - "google.protobuf.testing.AnyOut"))); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("value", "somevalue") - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithInvalidTypeUrlFails) { - AnyOut any; - - EXPECT_CALL(listener_, - InvalidValue( - _, StringPiece("Any"), - StringPiece("Invalid type URL, type URLs must be of the form " - "'type.googleapis.com/<typename>', got: " - "type.other.com/some.Type"))); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.other.com/some.Type") - ->RenderDouble("value", 40.2) - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithUnknownTypeFails) { - AnyOut any; - - EXPECT_CALL( - listener_, - InvalidValue(_, StringPiece("Any"), - StringPiece("Invalid type URL, unknown type: some.Type"))); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/some.Type") - ->RenderDouble("value", 40.2) - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyIncorrectInputTypeFails) { - AnyOut any; - - EXPECT_CALL( - listener_, - InvalidValue(_, StringPiece("type.googleapis.com/google.protobuf.Any"), - StringPiece("1"))); - ow_->StartObject("")->RenderInt32("any", 1)->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyAcceptsNull) { - AnyOut any; - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("any")->EndObject(); - CheckOutput(any); -} - -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypeErrorTest) { - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"), - StringPiece("Invalid time format: "))); - - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Timestamp"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Timestamp") - ->RenderString("value", "") - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "value": "abc" -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedPrimitiveValue) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - - ::google::protobuf::Value value; - value.set_string_value("abc"); - any->PackFrom(value); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->RenderString("value", "abc") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "value": { -// "foo": "abc" -// } -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedObjectValue) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - - ::google::protobuf::Value value; - (*value.mutable_struct_value()->mutable_fields())["foo"].set_string_value( - "abc"); - any->PackFrom(value); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->StartObject("value") - ->RenderString("foo", "abc") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "value": ["hello"], -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedArrayValue) { - AnyOut out; - ::google::protobuf::Any* any = out.mutable_any(); - - ::google::protobuf::Value value; - value.mutable_list_value()->add_values()->set_string_value("hello"); - any->PackFrom(value); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->StartList("value") - ->RenderString("", "hello") - ->EndList() - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "not_value": "" -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, - AnyWellKnownTypesNoValueFieldForPrimitive) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("Any"), - StringPiece("Expect a \"value\" field for well-known types."))); - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Value"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->RenderString("not_value", "") - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "not_value": {} -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesNoValueFieldForObject) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("Any"), - StringPiece("Expect a \"value\" field for well-known types."))); - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Value"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->StartObject("not_value") - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Value", -// "not_value": [], -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesNoValueFieldForArray) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("Any"), - StringPiece("Expect a \"value\" field for well-known types."))); - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Value"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Value") - ->StartList("not_value") - ->EndList() - ->EndObject() - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Struct", -// "value": "", -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForStruct) { - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"), - StringPiece("Expect a JSON object."))); - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Struct"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Struct") - ->RenderString("value", "") - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// Test the following case: -// -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Any", -// "value": "", -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForAny) { - EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"), - StringPiece("Expect a JSON object."))); - AnyOut any; - google::protobuf::Any* any_type = any.mutable_any(); - any_type->set_type_url("type.googleapis.com/google.protobuf.Any"); - - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->RenderString("value", "") - ->EndObject() - ->EndObject(); - CheckOutput(any); -} - -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Any", -// "value": null -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, AnyInAnyAcceptsNull) { - AnyOut out; - google::protobuf::Any empty; - out.mutable_any()->PackFrom(empty); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Any") - ->RenderNull("value") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Timestamp", -// "value": null -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, TimestampInAnyAcceptsNull) { - AnyOut out; - google::protobuf::Timestamp empty; - out.mutable_any()->PackFrom(empty); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Timestamp") - ->RenderNull("value") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": null -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, DurationInAnyAcceptsNull) { - AnyOut out; - google::protobuf::Duration empty; - out.mutable_any()->PackFrom(empty); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Duration") - ->RenderNull("value") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.FieldMask", -// "value": null -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, FieldMaskInAnyAcceptsNull) { - AnyOut out; - google::protobuf::FieldMask empty; - out.mutable_any()->PackFrom(empty); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.FieldMask") - ->RenderNull("value") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -// { -// "any": { -// "@type": "type.googleapis.com/google.protobuf.Int32Value", -// "value": null -// } -// } -TEST_P(ProtoStreamObjectWriterAnyTest, WrapperInAnyAcceptsNull) { - AnyOut out; - google::protobuf::Int32Value empty; - out.mutable_any()->PackFrom(empty); - - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("") - ->StartObject("any") - ->RenderString("@type", "type.googleapis.com/google.protobuf.Int32Value") - ->RenderNull("value") - ->EndObject() - ->EndObject(); - CheckOutput(out); -} - -class ProtoStreamObjectWriterFieldMaskTest - : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterFieldMaskTest() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(FieldMaskTest::descriptor()); - descriptors.push_back(google::protobuf::FieldMask::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterFieldMaskTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, SimpleFieldMaskTest) { - FieldMaskTest expected; - expected.set_id("1"); - expected.mutable_single_mask()->add_paths("path1"); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->RenderString("single_mask", "path1"); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MutipleMasksInCompactForm) { - FieldMaskTest expected; - expected.set_id("1"); - expected.mutable_single_mask()->add_paths("camel_case1"); - expected.mutable_single_mask()->add_paths("camel_case2"); - expected.mutable_single_mask()->add_paths("camel_case3"); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->RenderString("single_mask", "camelCase1,camelCase2,camelCase3"); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, RepeatedFieldMaskTest) { - FieldMaskTest expected; - expected.set_id("1"); - google::protobuf::FieldMask* mask = expected.add_repeated_mask(); - mask->add_paths("field1"); - mask->add_paths("field2"); - expected.add_repeated_mask()->add_paths("field3"); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->StartList("repeated_mask"); - ow_->RenderString("", "field1,field2"); - ow_->RenderString("", "field3"); - ow_->EndList(); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, EmptyFieldMaskTest) { - FieldMaskTest expected; - expected.set_id("1"); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->RenderString("single_mask", ""); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MaskUsingApiaryStyleShouldWork) { - FieldMaskTest expected; - expected.set_id("1"); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - // Case1 - ow_->RenderString("single_mask", - "outerField(camelCase1,camelCase2,camelCase3)"); - expected.mutable_single_mask()->add_paths("outer_field.camel_case1"); - expected.mutable_single_mask()->add_paths("outer_field.camel_case2"); - expected.mutable_single_mask()->add_paths("outer_field.camel_case3"); - - ow_->StartList("repeated_mask"); - - ow_->RenderString("", "a(field1,field2)"); - google::protobuf::FieldMask* mask = expected.add_repeated_mask(); - mask->add_paths("a.field1"); - mask->add_paths("a.field2"); - - ow_->RenderString("", "a(field3)"); - mask = expected.add_repeated_mask(); - mask->add_paths("a.field3"); - - ow_->RenderString("", "a()"); - expected.add_repeated_mask(); - - ow_->RenderString("", "a(,)"); - expected.add_repeated_mask(); - - ow_->RenderString("", "a(field1(field2(field3)))"); - mask = expected.add_repeated_mask(); - mask->add_paths("a.field1.field2.field3"); - - ow_->RenderString("", "a(field1(field2(field3,field4),field5),field6)"); - mask = expected.add_repeated_mask(); - mask->add_paths("a.field1.field2.field3"); - mask->add_paths("a.field1.field2.field4"); - mask->add_paths("a.field1.field5"); - mask->add_paths("a.field6"); - - ow_->RenderString("", "a(id,field1(id,field2(field3,field4),field5),field6)"); - mask = expected.add_repeated_mask(); - mask->add_paths("a.id"); - mask->add_paths("a.field1.id"); - mask->add_paths("a.field1.field2.field3"); - mask->add_paths("a.field1.field2.field4"); - mask->add_paths("a.field1.field5"); - mask->add_paths("a.field6"); - - ow_->RenderString("", "a(((field3,field4)))"); - mask = expected.add_repeated_mask(); - mask->add_paths("a.field3"); - mask->add_paths("a.field4"); - - ow_->EndList(); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MoreCloseThanOpenParentheses) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"), - StringPiece("Field 'single_mask', Invalid FieldMask 'a(b,c))'. " - "Cannot find matching '(' for all ')'."))); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->RenderString("single_mask", "a(b,c))"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MoreOpenThanCloseParentheses) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"), - StringPiece( - "Field 'single_mask', Invalid FieldMask 'a(((b,c)'. Cannot " - "find matching ')' for all '('."))); - - ow_->StartObject(""); - ow_->RenderString("id", "1"); - ow_->RenderString("single_mask", "a(((b,c)"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, PathWithMapKeyShouldWork) { - FieldMaskTest expected; - expected.mutable_single_mask()->add_paths("path.to.map[\"key1\"]"); - expected.mutable_single_mask()->add_paths( - "path.to.map[\"e\\\"[]][scape\\\"\"]"); - expected.mutable_single_mask()->add_paths("path.to.map[\"key2\"]"); - - ow_->StartObject(""); - ow_->RenderString("single_mask", - "path.to.map[\"key1\"],path.to.map[\"e\\\"[]][scape\\\"\"]," - "path.to.map[\"key2\"]"); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, - MapKeyMustBeAtTheEndOfAPathSegment) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"), - StringPiece("Field 'single_mask', Invalid FieldMask " - "'path.to.map[\"key1\"]a,path.to.map[\"key2\"]'. " - "Map keys should be at the end of a path segment."))); - - ow_->StartObject(""); - ow_->RenderString("single_mask", - "path.to.map[\"key1\"]a,path.to.map[\"key2\"]"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyMustEnd) { - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.FieldMask"), - StringPiece("Field 'single_mask', Invalid FieldMask " - "'path.to.map[\"key1\"'. Map keys should be " - "represented as [\"some_key\"]."))); - - ow_->StartObject(""); - ow_->RenderString("single_mask", "path.to.map[\"key1\""); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyMustBeEscapedCorrectly) { - EXPECT_CALL( - listener_, - InvalidValue(_, - StringPiece("type.googleapis.com/google.protobuf.FieldMask"), - StringPiece("Field 'single_mask', Invalid FieldMask " - "'path.to.map[\"ke\"y1\"]'. Map keys should be " - "represented as [\"some_key\"]."))); - - ow_->StartObject(""); - ow_->RenderString("single_mask", "path.to.map[\"ke\"y1\"]"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyCanContainAnyChars) { - FieldMaskTest expected; - expected.mutable_single_mask()->add_paths( - // \xE5\xAD\x99 is the UTF-8 byte sequence for chinese character 孙. - // We cannot embed non-ASCII characters in the code directly because - // some windows compilers will try to interpret them using the system's - // current encoding and end up with invalid UTF-8 byte sequence. - "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"]"); - expected.mutable_single_mask()->add_paths("path.to.map[\"key2\"]"); - - ow_->StartObject(""); - ow_->RenderString( - "single_mask", - "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"]," - "path.to.map[\"key2\"]"); - ow_->EndObject(); - - CheckOutput(expected); -} - -TEST_P(ProtoStreamObjectWriterFieldMaskTest, FieldMaskAcceptsNull) { - FieldMaskTest expected; - EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("single_mask")->EndObject(); - CheckOutput(expected); -} - -class ProtoStreamObjectWriterWrappersTest - : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterWrappersTest() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(Int32Wrapper::descriptor()); - descriptors.push_back(google::protobuf::Int32Value::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterWrappersTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterWrappersTest, WrapperAcceptsNull) { - Int32Wrapper wrapper; - EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0); - ow_->StartObject("")->RenderNull("int32")->EndObject(); - CheckOutput(wrapper); -} - -class ProtoStreamObjectWriterOneOfsTest - : public BaseProtoStreamObjectWriterTest { - protected: - ProtoStreamObjectWriterOneOfsTest() { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(OneOfsRequest::descriptor()); - descriptors.push_back(google::protobuf::Struct::descriptor()); - ResetTypeInfo(descriptors); - } -}; - -INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest, - ProtoStreamObjectWriterOneOfsTest, - ::testing::Values( - testing::USE_TYPE_RESOLVER)); - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForPrimitiveTypesTest) { - EXPECT_CALL( - listener_, - InvalidValue( - _, StringPiece("oneof"), - StringPiece( - "oneof field 'data' is already set. Cannot set 'intData'"))); - - ow_->StartObject(""); - ow_->RenderString("strData", "blah"); - ow_->RenderString("intData", "123"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForMessageTypesPrimitiveFirstTest) { - // Test for setting primitive oneof field first and then message field. - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'messageData'"))); - - // JSON: { "strData": "blah", "messageData": { "dataValue": 123 } } - ow_->StartObject(""); - ow_->RenderString("strData", "blah"); - ow_->StartObject("messageData"); - ow_->RenderInt32("dataValue", 123); - ow_->EndObject(); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForMessageTypesMessageFirstTest) { - // Test for setting message oneof field first and then primitive field. - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'strData'"))); - - // JSON: { "messageData": { "dataValue": 123 }, "strData": "blah" } - ow_->StartObject(""); - ow_->StartObject("messageData"); - ow_->RenderInt32("dataValue", 123); - ow_->EndObject(); - ow_->RenderString("strData", "blah"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForStructTypesPrimitiveFirstTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'structData'"))); - - // JSON: { "strData": "blah", "structData": { "a": "b" } } - ow_->StartObject(""); - ow_->RenderString("strData", "blah"); - ow_->StartObject("structData"); - ow_->RenderString("a", "b"); - ow_->EndObject(); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForStructTypesStructFirstTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'strData'"))); - - // JSON: { "structData": { "a": "b" }, "strData": "blah" } - ow_->StartObject(""); - ow_->StartObject("structData"); - ow_->RenderString("a", "b"); - ow_->EndObject(); - ow_->RenderString("strData", "blah"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForStructValueTypesTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'valueData'"))); - - // JSON: { "messageData": { "dataValue": 123 }, "valueData": { "a": "b" } } - ow_->StartObject(""); - ow_->StartObject("messageData"); - ow_->RenderInt32("dataValue", 123); - ow_->EndObject(); - ow_->StartObject("valueData"); - ow_->RenderString("a", "b"); - ow_->EndObject(); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForWellKnownTypesPrimitiveFirstTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'tsData'"))); - - // JSON: { "intData": 123, "tsData": "1970-01-02T01:00:00.000Z" } - ow_->StartObject(""); - ow_->RenderInt32("intData", 123); - ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z"); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForWellKnownTypesWktFirstTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'intData'"))); - - // JSON: { "tsData": "1970-01-02T01:00:00.000Z", "intData": 123 } - ow_->StartObject(""); - ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z"); - ow_->RenderInt32("intData", 123); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForWellKnownTypesAndMessageTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'messageData'"))); - - // JSON: { "tsData": "1970-01-02T01:00:00.000Z", - // "messageData": { "dataValue": 123 } } - ow_->StartObject(""); - ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z"); - ow_->StartObject("messageData"); - ow_->RenderInt32("dataValue", 123); - ow_->EndObject(); - ow_->EndObject(); -} - -TEST_P(ProtoStreamObjectWriterOneOfsTest, - MultipleOneofsFailForOneofWithinAnyTest) { - EXPECT_CALL(listener_, - InvalidValue(_, StringPiece("oneof"), - StringPiece("oneof field 'data' is already set. " - "Cannot set 'intData'"))); - - // JSON: - // { "anyData": - // { "@type": - // "type.googleapis.com/google.protobuf.testing.oneofs.OneOfsRequest", - // "strData": "blah", - // "intData": 123 - // } - // } - ow_->StartObject(""); - ow_->StartObject("anyData"); - ow_->RenderString( - "@type", - "type.googleapis.com/google.protobuf.testing.oneofs.OneOfsRequest"); - ow_->RenderString("strData", "blah"); - ow_->RenderInt32("intData", 123); - ow_->EndObject(); - ow_->EndObject(); -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h deleted file mode 100644 index 3f065d6b1c..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h +++ /dev/null @@ -1,118 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__ - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif - -#include <google/protobuf/stubs/casts.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/util/internal/object_writer.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -// An StructuredObjectWriter is an ObjectWriter for writing -// tree-structured data in a stream of events representing objects -// and collections. Implementation of this interface can be used to -// write an object stream to an in-memory structure, protobufs, -// JSON, XML, or any other output format desired. The ObjectSource -// interface is typically used as the source of an object stream. -// -// See JsonObjectWriter for a sample implementation of -// StructuredObjectWriter and its use. -// -// Derived classes could be thread-unsafe. -class LIBPROTOBUF_EXPORT StructuredObjectWriter : public ObjectWriter { - public: - virtual ~StructuredObjectWriter() {} - - protected: - // A base element class for subclasses to extend, makes tracking state easier. - // - // StructuredObjectWriter behaves as a visitor. BaseElement represents a node - // in the input tree. Implementation of StructuredObjectWriter should also - // extend BaseElement to keep track of the location in the input tree. - class LIBPROTOBUF_EXPORT BaseElement { - public: - // Takes ownership of the parent Element. - explicit BaseElement(BaseElement* parent) - : parent_(parent), level_(parent == NULL ? 0 : parent->level() + 1) {} - virtual ~BaseElement() {} - - // Releases ownership of the parent and returns a pointer to it. - template <typename ElementType> - ElementType* pop() { - return down_cast<ElementType*>(parent_.release()); - } - - // Returns true if this element is the root. - bool is_root() const { return parent_ == NULL; } - - // Returns the number of hops from this element to the root element. - int level() const { return level_; } - - protected: - // Returns pointer to parent element without releasing ownership. - virtual BaseElement* parent() const { return parent_.get(); } - - private: - // Pointer to the parent Element. - google::protobuf::scoped_ptr<BaseElement> parent_; - - // Number of hops to the root Element. - // The root Element has NULL parent_ and a level_ of 0. - const int level_; - - GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(BaseElement); - }; - - StructuredObjectWriter() {} - - // Returns the current element. Used for indentation and name overrides. - virtual BaseElement* element() = 0; - - private: - // Do not add any data members to this class. - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StructuredObjectWriter); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto deleted file mode 100644 index a9ebca3d43..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto +++ /dev/null @@ -1,108 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/any.proto"; -import "google/protobuf/struct.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/wrappers.proto"; - -// Top-level test cases proto used by MarshallingTest. See description -// at the top of the class MarshallingTest for details on how to write -// test cases. -message AnyTestCases { - AnyWrapper empty_any = 1; - AnyWrapper type_only_any = 2; - AnyWrapper wrapper_any = 3; - AnyWrapper any_with_timestamp_value = 4; - AnyWrapper any_with_duration_value = 5; - AnyWrapper any_with_struct_value = 6; - AnyWrapper recursive_any = 7; - AnyWrapper any_with_message_value = 8; - AnyWrapper any_with_nested_message = 9; - AnyWrapper any_with_message_with_wrapper_type = 10; - AnyWrapper any_with_message_with_timestamp = 11; - AnyWrapper any_with_message_containing_map = 12; - AnyWrapper any_with_message_containing_struct = 13; - AnyWrapper any_with_message_containing_repeated_message = 14; - AnyWrapper recursive_any_with_type_field_at_end = 15; - - google.protobuf.Any top_level_any = 50; - google.protobuf.Any top_level_any_with_type_field_at_end = 51; -} - -message AnyWrapper { - google.protobuf.Any any = 1; -} - -// Hack to make sure the types we put into the any are included in the types. -// Real solution is to add these types to the service config. -message Imports { - google.protobuf.DoubleValue dbl = 1; - google.protobuf.Struct struct = 2; - google.protobuf.Timestamp timestamp = 3; - google.protobuf.Duration duration = 4; - google.protobuf.Int32Value i32 = 5; - Data data = 100; -} - -message Data { - int32 attr = 1; - string str = 2; - repeated string msgs = 3; - Data nested_data = 4; - google.protobuf.Int32Value int_wrapper = 5; - google.protobuf.Timestamp time = 6; - map<string, string> map_data = 7; - google.protobuf.Struct struct_data = 8; - repeated Data repeated_data = 9; -} - -service AnyTestService { - rpc Call(AnyTestCases) returns (AnyTestCases); - rpc Call1(Imports) returns (Imports); -} - -message AnyIn { - string something = 1; - google.protobuf.Any any = 2; -} - -message AnyOut { - google.protobuf.Any any = 1; -} - -message AnyM { - string foo = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto deleted file mode 100644 index 9fe4f7aa8c..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto +++ /dev/null @@ -1,192 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Author: sven@google.com (Sven Mawson) -// -// Sample protos for testing. - -// Some of the older enums don't use CAPITALS_WITH_UNDERSCORES for testing. -// LINT: LEGACY_NAMES - -syntax = "proto2"; - -package google.protobuf.testing; - -// A book -message Book { - optional string title = 1; - optional Author author = 2; - optional uint32 length = 3; - optional int64 published = 4; - optional bytes content = 5; - - optional group Data = 6 { - optional uint32 year = 7; - optional string copyright = 8; - } - - message Label { - optional string key = 1; - optional string value = 2; - } - - optional Publisher publisher = 9; - repeated Label labels = 10; - - enum Type { - FICTION = 1; - KIDS = 2; - ACTION_AND_ADVENTURE = 3; - arts_and_photography = 4; - } - optional Type type = 11; - - extensions 200 to 499; -} - -// A publisher of a book, tests required fields. -message Publisher { - required string name = 1; -} - -// An author of a book -message Author { - optional uint64 id = 1 [json_name = "@id"]; - optional string name = 2; - repeated string pseudonym = 3; - optional bool alive = 4; - repeated Author friend = 5; -} - -// For testing resiliency of our protostream parser. -// Field numbers of Author are reused for something else. -message BadAuthor { - optional string id = 1; // non-length-delimited to length-delimited. - repeated uint64 name = 2; // string to repeated (both length-delimited). - optional string pseudonym = 3; // Repeated to optional. - repeated bool alive = 4 [packed=true]; // Optional to repeated. -} - -// All primitive types -message Primitive { - // 32 bit numbers: - optional fixed32 fix32 = 1; - optional uint32 u32 = 2; - optional int32 i32 = 3; - optional sfixed32 sf32 = 4; - optional sint32 s32 = 5; - - // 64 bit numbers: - optional fixed64 fix64 = 6; - optional uint64 u64 = 7; - optional int64 i64 = 8; - optional sfixed64 sf64 = 9; - optional sint64 s64 = 10; - - // The other stuff. - optional string str = 11; - optional bytes bytes = 12; - optional float float = 13; - optional double double = 14; - optional bool bool = 15; - - // repeated 32 bit numbers: - repeated fixed32 rep_fix32 = 16; - repeated uint32 rep_u32 = 17; - repeated int32 rep_i32 = 18; - repeated sfixed32 rep_sf32 = 19; - repeated sint32 rep_s32 = 20; - - // repeated 64 bit numbers: - repeated fixed64 rep_fix64 = 21; - repeated uint64 rep_u64 = 22; - repeated int64 rep_i64 = 23; - repeated sfixed64 rep_sf64 = 24; - repeated sint64 rep_s64 = 25; - - // repeated other stuff: - repeated string rep_str = 26; - repeated bytes rep_bytes = 27; - repeated float rep_float = 28; - repeated double rep_double = 29; - repeated bool rep_bool = 30; -} - -// Test packed versions of all repeated primitives. -// The field numbers should match their non-packed version in Primitive message. -message PackedPrimitive { - // repeated 32 bit numbers: - repeated fixed32 rep_fix32 = 16 [packed=true]; - repeated uint32 rep_u32 = 17 [packed=true]; - repeated int32 rep_i32 = 18 [packed=true]; - repeated sfixed32 rep_sf32 = 19 [packed=true]; - repeated sint32 rep_s32 = 20 [packed=true]; - - // repeated 64 bit numbers: - repeated fixed64 rep_fix64 = 21 [packed=true]; - repeated uint64 rep_u64 = 22 [packed=true]; - repeated int64 rep_i64 = 23 [packed=true]; - repeated sfixed64 rep_sf64 = 24 [packed=true]; - repeated sint64 rep_s64 = 25 [packed=true]; - - // repeated other stuff: - repeated float rep_float = 28 [packed=true]; - repeated double rep_double = 29 [packed=true]; - repeated bool rep_bool = 30 [packed=true]; -} - -// Test extensions. -extend Book { - repeated Author more_author = 201; -} - -// Test nested extensions. -message NestedBook { - extend Book { - optional NestedBook another_book = 301; - } - // Recurse - optional Book book = 1; -} - -// For testing resiliency of our protostream parser. -// Field number of NestedBook is reused for something else. -message BadNestedBook { - repeated uint32 book = 1 [packed=true]; // Packed to optional message. -} - -// A recursively defined message. -message Cyclic { - optional int32 m_int = 1; - optional string m_str = 2; - optional Book m_book = 3; - repeated Author m_author = 5; - optional Cyclic m_cyclic = 4; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto deleted file mode 100644 index cccc741c2d..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto +++ /dev/null @@ -1,170 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/any.proto"; -import "google/protobuf/struct.proto"; -import "google/protobuf/wrappers.proto"; - -message DefaultValueTestCases { - DoubleMessage empty_double = 1; - DoubleMessage double_with_default_value = 2; - DoubleMessage double_with_nondefault_value = 3; - DoubleMessage repeated_double = 4; - DoubleMessage nested_message = 5; - DoubleMessage repeated_nested_message = 6; - DoubleMessage double_message_with_oneof = 7; - StructMessage empty_struct = 201; - StructMessage empty_struct2 = 202; - StructMessage struct_with_null_value = 203; - StructMessage struct_with_values = 204; - StructMessage struct_with_nested_struct = 205; - StructMessage struct_with_nested_list = 206; - StructMessage struct_with_list_of_nulls = 207; - StructMessage struct_with_list_of_lists = 208; - StructMessage struct_with_list_of_structs = 209; - google.protobuf.Struct top_level_struct = 210; - ValueMessage value_wrapper_simple = 212; - ValueMessage value_wrapper_with_struct = 213; - ValueMessage value_wrapper_with_list = 214; - ListValueMessage list_value_wrapper = 215; - google.protobuf.Value top_level_value_simple = 216; - google.protobuf.Value top_level_value_with_struct = 217; - google.protobuf.Value top_level_value_with_list = 218; - google.protobuf.ListValue top_level_listvalue = 219; - AnyMessage empty_any = 301; - AnyMessage type_only_any = 302; - AnyMessage recursive_any = 303; - AnyMessage any_with_message_value = 304; - AnyMessage any_with_nested_message = 305; - AnyMessage any_with_message_containing_map = 306; - AnyMessage any_with_message_containing_struct = 307; - google.protobuf.Any top_level_any = 308; - StringtoIntMap empty_map = 401; - StringtoIntMap string_to_int = 402; - IntToStringMap int_to_string = 403; - MixedMap mixed1 = 404; - MixedMap2 mixed2 = 405; - MixedMap2 empty_mixed2 = 406; - MessageMap map_of_objects = 407; - MixedMap mixed_empty = 408; - MessageMap message_map_empty = 409; - DoubleValueMessage double_value = 501; - DoubleValueMessage double_value_default = 502; -} - -message DoubleMessage { - double double_value = 1; - repeated double repeated_double = 2; - DoubleMessage nested_message = 3; - repeated DoubleMessage repeated_nested_message = 4; - google.protobuf.DoubleValue double_wrapper = 100; - oneof value { - string str_value = 112; - int64 num_value = 113; - } -} - -message StructMessage { - google.protobuf.Struct struct = 1; -} - -message ValueMessage { - google.protobuf.Value value = 1; -} - -message ListValueMessage { - google.protobuf.ListValue shopping_list = 1; -} -message RequestMessage { - string content = 1; -} - -// A test service. -service DefaultValueTestService { - // A test method. - rpc Call(RequestMessage) returns (DefaultValueTestCases); -} - -message AnyMessage { - google.protobuf.Any any = 1; - AnyData data = 2; -} - -message AnyData { - int32 attr = 1; - string str = 2; - repeated string msgs = 3; - AnyData nested_data = 4; - map<string, string> map_data = 7; - google.protobuf.Struct struct_data = 8; - repeated AnyData repeated_data = 9; -} - -message StringtoIntMap { - map<string, int32> map = 1; -} - -message IntToStringMap { - map<int32, string> map = 1; -} - -message MixedMap { - string msg = 1; - map<string, float> map = 2; - int32 int_value = 3; -} - -message MixedMap2 { - enum E { - E0 = 0; - E1 = 1; - E2 = 2; - E3 = 3; - } - map<int32, bool> map = 1; - E ee = 2; - string msg = 4; -} - -message MessageMap { - message M { - int32 inner_int = 1; - string inner_text = 2; - } - map<string, M> map = 1; -} - -message DoubleValueMessage { - google.protobuf.DoubleValue double = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto deleted file mode 100644 index 932883410e..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto +++ /dev/null @@ -1,53 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -message DefaultValueTest { - double double_value = 1; - repeated double repeated_double = 2; - float float_value = 3; - int64 int64_value = 5; - uint64 uint64_value = 7; - int32 int32_value = 9; - uint32 uint32_value = 11; - bool bool_value = 13; - string string_value = 15; - bytes bytes_value = 17 [ctype = CORD]; - - enum EnumDefault { - ENUM_FIRST = 0; - ENUM_SECOND = 1; - ENUM_THIRD = 2; - } - EnumDefault enum_value = 18; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto deleted file mode 100644 index e8b2bc5f2e..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto +++ /dev/null @@ -1,71 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/field_mask.proto"; - -message NestedFieldMask { - string data = 1; - google.protobuf.FieldMask single_mask = 2; - repeated google.protobuf.FieldMask repeated_mask = 3; -} - -message FieldMaskTest { - string id = 1; - google.protobuf.FieldMask single_mask = 2; - repeated google.protobuf.FieldMask repeated_mask = 3; - repeated NestedFieldMask nested_mask = 4; -} - -message FieldMaskTestCases { - FieldMaskWrapper single_mask = 1; - FieldMaskWrapper multiple_mask = 2; - FieldMaskWrapper snake_camel = 3; - FieldMaskWrapper empty_field = 4; - FieldMaskWrapper apiary_format1 = 5; - FieldMaskWrapper apiary_format2 = 6; - FieldMaskWrapper apiary_format3 = 7; - FieldMaskWrapper map_key1 = 8; - FieldMaskWrapper map_key2 = 9; - FieldMaskWrapper map_key3 = 10; - FieldMaskWrapper map_key4 = 11; - FieldMaskWrapper map_key5 = 12; -} - -message FieldMaskWrapper { - google.protobuf.FieldMask mask = 1; -} - -service FieldMaskTestService { - rpc Call(FieldMaskTestCases) returns (FieldMaskTestCases); -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto deleted file mode 100644 index 0f381b320b..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto +++ /dev/null @@ -1,146 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -// Top-level test cases proto used by MarshallingTest. See description -// at the top of the class MarshallingTest for details on how to write -// test cases. -message MapsTestCases { - EmptyMap empty_map = 1; - StringtoInt string_to_int = 2; - IntToString int_to_string = 3; - Mixed1 mixed1 = 4; - Mixed2 mixed2 = 5; - MapOfObjects map_of_objects = 6; - - // Empty key tests - StringtoInt empty_key_string_to_int1 = 7; - StringtoInt empty_key_string_to_int2 = 8; - StringtoInt empty_key_string_to_int3 = 9; - BoolToString empty_key_bool_to_string = 10; - IntToString empty_key_int_to_string = 11; - Mixed1 empty_key_mixed = 12; - MapOfObjects empty_key_map_objects = 13; -} - -message EmptyMap { - map<int32, int32> map = 1; -} - -message StringtoInt { - map<string, int32> map = 1; -} - -message IntToString { - map<int32, string> map = 1; -} - -message BoolToString { - map<bool, string> map = 1; -} - -message Mixed1 { - string msg = 1; - map<string, float> map = 2; -} - -message Mixed2 { - enum E { - E0 = 0; - E1 = 1; - E2 = 2; - E3 = 3; - } - map<int32, bool> map = 1; - E ee = 2; -} - -message MapOfObjects { - message M { - string inner_text = 1; - } - map<string, M> map = 1; -} - -message DummyRequest { -} - -service MapsTestService { - rpc Call(DummyRequest) returns (MapsTestCases); -} - -message MapIn { - string other = 1; - repeated string things = 2; - map<string, string> map_input = 3; -} - -message MapOut { - map<string, MapM> map1 = 1; - map<string, MapOut> map2 = 2; - map<int32, string> map3 = 3; - map<bool, string> map4 = 5; - string bar = 4; -} - -// A message with exactly the same wire representation as MapOut, but using -// repeated message fields instead of map fields. We use this message to test -// the wire-format compatibility of the JSON transcoder (e.g., whether it -// handles missing keys correctly). -message MapOutWireFormat { - message Map1Entry { - string key = 1; - MapM value = 2; - } - repeated Map1Entry map1 = 1; - message Map2Entry { - string key = 1; - MapOut value = 2; - } - repeated Map2Entry map2 = 2; - message Map3Entry { - int32 key = 1; - string value = 2; - } - repeated Map3Entry map3 = 3; - message Map4Entry { - bool key = 1; - string value = 2; - } - repeated Map4Entry map4 = 5; - string bar = 4; -} - -message MapM { - string foo = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto deleted file mode 100644 index c37da08316..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto +++ /dev/null @@ -1,77 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Proto to test proto3 oneofs. -syntax = "proto3"; - -import "google/protobuf/any.proto"; -import "google/protobuf/struct.proto"; -import "google/protobuf/timestamp.proto"; - -package google.protobuf.testing.oneofs; - -message OneOfsRequest { - string value = 1; - oneof data { - string str_data = 2; - int32 int_data = 3; - // Simple message - Data message_data = 4; - MoreData more_data = 5; - // Well known types - google.protobuf.Struct struct_data = 6; - google.protobuf.Value value_data = 7; - google.protobuf.ListValue list_value_data = 8; - google.protobuf.Timestamp ts_data = 9; - } - google.protobuf.Any any_data = 19; -} - -message RequestWithSimpleOneof { - string value = 1; - oneof data { - string str_data = 2; - int32 int_data = 3; - Data message_data = 4; - MoreData more_data = 5; - } -} - -message Data { - int32 data_value = 1; -} - -message MoreData { - string str_value = 1; -} - -message Response { - string value = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto deleted file mode 100644 index c013cee31e..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto +++ /dev/null @@ -1,42 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -message Proto3Message { - enum NestedEnum { - FOO = 0; - BAR = 1; - BAZ = 2; - } - NestedEnum enum_value = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto deleted file mode 100644 index 7b1cc1b954..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto +++ /dev/null @@ -1,117 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/struct.proto"; - -message StructTestCases { - StructWrapper empty_value = 1; - StructWrapper empty_value2 = 2; - StructWrapper null_value = 3; - StructWrapper simple_struct = 4; - StructWrapper longer_struct = 5; - StructWrapper struct_with_nested_struct = 6; - StructWrapper struct_with_nested_list = 7; - StructWrapper struct_with_list_of_nulls = 8; - StructWrapper struct_with_list_of_lists = 9; - StructWrapper struct_with_list_of_structs = 10; - StructWrapper struct_with_empty_list = 11; - StructWrapper struct_with_list_with_empty_struct = 12; - google.protobuf.Struct top_level_struct = 13; - google.protobuf.Struct top_level_struct_with_empty_list = 14; - google.protobuf.Struct top_level_struct_with_list_with_empty_struct = 15; - ValueWrapper value_wrapper_simple = 16; - ValueWrapper value_wrapper_with_struct = 17; - ValueWrapper value_wrapper_with_list = 18; - ValueWrapper value_wrapper_with_empty_list = 19; - ValueWrapper value_wrapper_with_list_with_empty_struct = 20; - ListValueWrapper list_value_wrapper = 21; - ListValueWrapper list_value_wrapper_with_empty_list = 22; - ListValueWrapper list_value_wrapper_with_list_with_empty_struct = 23; - google.protobuf.Value top_level_value_simple = 24; - google.protobuf.Value top_level_value_with_struct = 25; - google.protobuf.Value top_level_value_with_list = 26; - google.protobuf.Value top_level_value_with_empty_list = 27; - google.protobuf.Value top_level_value_with_list_with_empty_struct = 28; - google.protobuf.ListValue top_level_listvalue = 29; - google.protobuf.ListValue top_level_empty_listvalue = 30; - google.protobuf.ListValue top_level_listvalue_with_empty_struct = 31; - RepeatedValueWrapper repeated_value = 32; - RepeatedValueWrapper repeated_value_nested_list = 33; - RepeatedValueWrapper repeated_value_nested_list2 = 34; - RepeatedValueWrapper repeated_value_nested_list3 = 35; - RepeatedListValueWrapper repeated_listvalue = 36; - MapOfStruct map_of_struct = 37; - MapOfStruct map_of_struct_value = 38; - MapOfStruct map_of_listvalue = 39; -} - -message StructWrapper { - google.protobuf.Struct struct = 1; -} - -message ValueWrapper { - google.protobuf.Value value = 1; -} - -message RepeatedValueWrapper { - repeated google.protobuf.Value values = 1; -} - -message ListValueWrapper { - google.protobuf.ListValue shopping_list = 1; -} - -message RepeatedListValueWrapper { - repeated google.protobuf.ListValue dimensions = 1; -} - -message MapOfStruct { - map<string, google.protobuf.Struct> struct_map = 1; - map<string, google.protobuf.Value> value_map = 2; - map<string, google.protobuf.ListValue> listvalue_map = 3; -} - -// Hack to test return types with Struct as top-level message. Struct typers -// cannot be directly used in API requests. Hence using Dummy as request type. -message Dummy { - string text = 1; -} - -service StructTestService { - rpc Call(Dummy) returns (StructTestCases); -} - -message StructType { - google.protobuf.Struct object = 1; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto deleted file mode 100644 index b74484ce58..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto +++ /dev/null @@ -1,80 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/timestamp.proto"; -import "google/protobuf/duration.proto"; - -message TimestampDurationTestCases { - // Timestamp tests - TimeStampType epoch = 1; - TimeStampType epoch2 = 2; - TimeStampType mintime = 3; - TimeStampType maxtime = 4; - TimeStampType timeval1 = 5; - TimeStampType timeval2 = 6; - TimeStampType timeval3 = 7; - TimeStampType timeval4 = 8; - TimeStampType timeval5 = 9; - TimeStampType timeval6 = 10; - TimeStampType timeval7 = 11; - google.protobuf.Timestamp timeval8 = 12; - - // Duration tests - DurationType zero_duration = 101; - DurationType min_duration = 102; - DurationType max_duration = 103; - DurationType duration1 = 104; - DurationType duration2 = 105; - DurationType duration3 = 106; - DurationType duration4 = 107; - google.protobuf.Duration duration5 = 108; -} - -message TimeStampType { - google.protobuf.Timestamp timestamp = 1; -} - -message DurationType { - google.protobuf.Duration duration = 1; -} - -service TimestampDurationTestService { - rpc Call(TimestampDurationTestCases) returns (TimestampDurationTestCases); -} - -message TimestampDuration { - google.protobuf.Timestamp ts = 1; - google.protobuf.Duration dur = 2; - repeated google.protobuf.Timestamp rep_ts = 3; -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto deleted file mode 100644 index eabc99f245..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto +++ /dev/null @@ -1,100 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf.testing; - -import "google/protobuf/wrappers.proto"; - -// Top-level test cases proto used by MarshallingTest. See description -// at the top of the class MarshallingTest for details on how to write -// test cases. -message WrappersTestCases { - DoubleWrapper double_wrapper = 1; - FloatWrapper float_wrapper = 2; - Int64Wrapper int64_wrapper = 3; - UInt64Wrapper uint64_wrapper = 4; - Int32Wrapper int32_wrapper = 5; - UInt32Wrapper uint32_wrapper = 6; - BoolWrapper bool_wrapper = 7; - StringWrapper string_wrapper = 8; - BytesWrapper bytes_wrapper = 9; - - DoubleWrapper double_wrapper_default = 10; - FloatWrapper float_wrapper_default = 11; - Int64Wrapper int64_wrapper_default = 12; - UInt64Wrapper uint64_wrapper_default = 13; - Int32Wrapper int32_wrapper_default = 14; - UInt32Wrapper uint32_wrapper_default = 15; - BoolWrapper bool_wrapper_default = 16; - StringWrapper string_wrapper_default = 17; - BytesWrapper bytes_wrapper_default = 18; -} - -message DoubleWrapper { - google.protobuf.DoubleValue double = 1; -} - -message FloatWrapper { - google.protobuf.FloatValue float = 1; -} - -message Int64Wrapper { - google.protobuf.Int64Value int64 = 1; -} - -message UInt64Wrapper { - google.protobuf.UInt64Value uint64 = 1; -} - -message Int32Wrapper { - google.protobuf.Int32Value int32 = 1; -} - -message UInt32Wrapper { - google.protobuf.UInt32Value uint32 = 1; -} - -message BoolWrapper { - google.protobuf.BoolValue bool = 1; -} - -message StringWrapper { - google.protobuf.StringValue string = 1; -} - -message BytesWrapper { - google.protobuf.BytesValue bytes = 1; -} - -service WrappersTestService { - rpc Call(WrappersTestCases) returns (WrappersTestCases); -} diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc deleted file mode 100644 index 17d5847555..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc +++ /dev/null @@ -1,173 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/type_info.h> - -#include <map> -#include <set> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/type.pb.h> -#include <google/protobuf/util/internal/utility.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/map_util.h> -#include <google/protobuf/stubs/status.h> -#include <google/protobuf/stubs/statusor.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -namespace { -// A TypeInfo that looks up information provided by a TypeResolver. -class TypeInfoForTypeResolver : public TypeInfo { - public: - explicit TypeInfoForTypeResolver(TypeResolver* type_resolver) - : type_resolver_(type_resolver) {} - - virtual ~TypeInfoForTypeResolver() { - DeleteCachedTypes(&cached_types_); - DeleteCachedTypes(&cached_enums_); - } - - virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl( - StringPiece type_url) const { - std::map<StringPiece, StatusOrType>::iterator it = - cached_types_.find(type_url); - if (it != cached_types_.end()) { - return it->second; - } - // Stores the string value so it can be referenced using StringPiece in the - // cached_types_ map. - const string& string_type_url = - *string_storage_.insert(type_url.ToString()).first; - google::protobuf::scoped_ptr<google::protobuf::Type> type(new google::protobuf::Type()); - util::Status status = - type_resolver_->ResolveMessageType(string_type_url, type.get()); - StatusOrType result = - status.ok() ? StatusOrType(type.release()) : StatusOrType(status); - cached_types_[string_type_url] = result; - return result; - } - - virtual const google::protobuf::Type* GetTypeByTypeUrl( - StringPiece type_url) const { - StatusOrType result = ResolveTypeUrl(type_url); - return result.ok() ? result.ValueOrDie() : NULL; - } - - virtual const google::protobuf::Enum* GetEnumByTypeUrl( - StringPiece type_url) const { - std::map<StringPiece, StatusOrEnum>::iterator it = - cached_enums_.find(type_url); - if (it != cached_enums_.end()) { - return it->second.ok() ? it->second.ValueOrDie() : NULL; - } - // Stores the string value so it can be referenced using StringPiece in the - // cached_enums_ map. - const string& string_type_url = - *string_storage_.insert(type_url.ToString()).first; - google::protobuf::scoped_ptr<google::protobuf::Enum> enum_type( - new google::protobuf::Enum()); - util::Status status = - type_resolver_->ResolveEnumType(string_type_url, enum_type.get()); - StatusOrEnum result = - status.ok() ? StatusOrEnum(enum_type.release()) : StatusOrEnum(status); - cached_enums_[string_type_url] = result; - return result.ok() ? result.ValueOrDie() : NULL; - } - - virtual const google::protobuf::Field* FindField( - const google::protobuf::Type* type, StringPiece camel_case_name) const { - if (indexed_types_.find(type) == indexed_types_.end()) { - PopulateNameLookupTable(type); - indexed_types_.insert(type); - } - StringPiece name = - FindWithDefault(camel_case_name_table_, camel_case_name, StringPiece()); - if (name.empty()) { - // Didn't find a mapping. Use whatever provided. - name = camel_case_name; - } - return FindFieldInTypeOrNull(type, name); - } - - private: - typedef util::StatusOr<const google::protobuf::Type*> StatusOrType; - typedef util::StatusOr<const google::protobuf::Enum*> StatusOrEnum; - - template <typename T> - static void DeleteCachedTypes(std::map<StringPiece, T>* cached_types) { - for (typename std::map<StringPiece, T>::iterator it = cached_types->begin(); - it != cached_types->end(); ++it) { - if (it->second.ok()) { - delete it->second.ValueOrDie(); - } - } - } - - void PopulateNameLookupTable(const google::protobuf::Type* type) const { - for (int i = 0; i < type->fields_size(); ++i) { - const google::protobuf::Field& field = type->fields(i); - StringPiece name = field.name(); - StringPiece camel_case_name = field.json_name(); - const StringPiece* existing = InsertOrReturnExisting( - &camel_case_name_table_, camel_case_name, name); - if (existing && *existing != name) { - GOOGLE_LOG(WARNING) << "Field '" << name << "' and '" << *existing - << "' map to the same camel case name '" << camel_case_name - << "'."; - } - } - } - - TypeResolver* type_resolver_; - - // Stores string values that will be referenced by StringPieces in - // cached_types_, cached_enums_ and camel_case_name_table_. - mutable std::set<string> string_storage_; - - mutable std::map<StringPiece, StatusOrType> cached_types_; - mutable std::map<StringPiece, StatusOrEnum> cached_enums_; - - mutable std::set<const google::protobuf::Type*> indexed_types_; - mutable std::map<StringPiece, StringPiece> camel_case_name_table_; -}; -} // namespace - -TypeInfo* TypeInfo::NewTypeInfo(TypeResolver* type_resolver) { - return new TypeInfoForTypeResolver(type_resolver); -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h deleted file mode 100644 index d81331763a..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h +++ /dev/null @@ -1,92 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__ - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/type.pb.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/status.h> -#include <google/protobuf/stubs/statusor.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { -// Internal helper class for type resolving. Note that this class is not -// thread-safe and should only be accessed in one thread. -class LIBPROTOBUF_EXPORT TypeInfo { - public: - TypeInfo() {} - virtual ~TypeInfo() {} - - // Resolves a type url into a Type. If the type url is invalid, returns - // INVALID_ARGUMENT error status. If the type url is valid but the - // corresponding type cannot be found, returns a NOT_FOUND error status. - // - // This TypeInfo class retains the ownership of the returned pointer. - virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl( - StringPiece type_url) const = 0; - - // Resolves a type url into a Type. Like ResolveTypeUrl() but returns - // NULL if the type url is invalid or the type cannot be found. - // - // This TypeInfo class retains the ownership of the returned pointer. - virtual const google::protobuf::Type* GetTypeByTypeUrl( - StringPiece type_url) const = 0; - - // Resolves a type url for an enum. Returns NULL if the type url is - // invalid or the type cannot be found. - // - // This TypeInfo class retains the ownership of the returned pointer. - virtual const google::protobuf::Enum* GetEnumByTypeUrl( - StringPiece type_url) const = 0; - - // Looks up a field in the specified type given a CamelCase name. - virtual const google::protobuf::Field* FindField( - const google::protobuf::Type* type, - StringPiece camel_case_name) const = 0; - - // Creates a TypeInfo object that looks up type information from a - // TypeResolver. Caller takes ownership of the returned pointer. - static TypeInfo* NewTypeInfo(TypeResolver* type_resolver); - - private: - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeInfo); -}; - -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc deleted file mode 100644 index 737ba9e475..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc +++ /dev/null @@ -1,134 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/type_info_test_helper.h> - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <vector> - -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/default_value_objectwriter.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/util/internal/protostream_objectsource.h> -#include <google/protobuf/util/internal/protostream_objectwriter.h> -#include <google/protobuf/util/type_resolver.h> -#include <google/protobuf/util/type_resolver_util.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { -namespace testing { - - -void TypeInfoTestHelper::ResetTypeInfo( - const std::vector<const Descriptor*>& descriptors) { - switch (type_) { - case USE_TYPE_RESOLVER: { - const DescriptorPool* pool = descriptors[0]->file()->pool(); - for (int i = 1; i < descriptors.size(); ++i) { - GOOGLE_CHECK(pool == descriptors[i]->file()->pool()) - << "Descriptors from different pools are not supported."; - } - type_resolver_.reset( - NewTypeResolverForDescriptorPool(kTypeServiceBaseUrl, pool)); - typeinfo_.reset(TypeInfo::NewTypeInfo(type_resolver_.get())); - return; - } - } - GOOGLE_LOG(FATAL) << "Can not reach here."; -} - -void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor) { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(descriptor); - ResetTypeInfo(descriptors); -} - -void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor1, - const Descriptor* descriptor2) { - std::vector<const Descriptor*> descriptors; - descriptors.push_back(descriptor1); - descriptors.push_back(descriptor2); - ResetTypeInfo(descriptors); -} - -TypeInfo* TypeInfoTestHelper::GetTypeInfo() { return typeinfo_.get(); } - -ProtoStreamObjectSource* TypeInfoTestHelper::NewProtoSource( - io::CodedInputStream* coded_input, const string& type_url) { - const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url); - switch (type_) { - case USE_TYPE_RESOLVER: { - return new ProtoStreamObjectSource(coded_input, type_resolver_.get(), - *type); - } - } - GOOGLE_LOG(FATAL) << "Can not reach here."; - return NULL; -} - -ProtoStreamObjectWriter* TypeInfoTestHelper::NewProtoWriter( - const string& type_url, strings::ByteSink* output, ErrorListener* listener, - const ProtoStreamObjectWriter::Options& options) { - const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url); - switch (type_) { - case USE_TYPE_RESOLVER: { - return new ProtoStreamObjectWriter(type_resolver_.get(), *type, output, - listener, options); - } - } - GOOGLE_LOG(FATAL) << "Can not reach here."; - return NULL; -} - -DefaultValueObjectWriter* TypeInfoTestHelper::NewDefaultValueWriter( - const string& type_url, ObjectWriter* writer) { - const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url); - switch (type_) { - case USE_TYPE_RESOLVER: { - return new DefaultValueObjectWriter(type_resolver_.get(), *type, writer); - } - } - GOOGLE_LOG(FATAL) << "Can not reach here."; - return NULL; -} - -} // namespace testing -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h deleted file mode 100644 index 1a1967156b..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h +++ /dev/null @@ -1,98 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__ - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <vector> - -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/default_value_objectwriter.h> -#include <google/protobuf/util/internal/type_info.h> -#include <google/protobuf/util/internal/protostream_objectsource.h> -#include <google/protobuf/util/internal/protostream_objectwriter.h> -#include <google/protobuf/util/type_resolver.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { -namespace testing { - -enum TypeInfoSource { - USE_TYPE_RESOLVER, -}; - -// In the unit-tests we want to test two scenarios: one with type info from -// ServiceTypeInfo, the other with type info from TypeResolver. This class -// wraps the detail of where the type info is from and provides the same -// interface so the same unit-test code can test both scenarios. -class TypeInfoTestHelper { - public: - explicit TypeInfoTestHelper(TypeInfoSource type) : type_(type) {} - - // Creates a TypeInfo object for the given set of descriptors. - void ResetTypeInfo(const std::vector<const Descriptor*>& descriptors); - - // Convinent overloads. - void ResetTypeInfo(const Descriptor* descriptor); - void ResetTypeInfo(const Descriptor* descriptor1, - const Descriptor* descriptor2); - - // Returns the TypeInfo created after ResetTypeInfo. - TypeInfo* GetTypeInfo(); - - ProtoStreamObjectSource* NewProtoSource(io::CodedInputStream* coded_input, - const string& type_url); - - ProtoStreamObjectWriter* NewProtoWriter( - const string& type_url, strings::ByteSink* output, - ErrorListener* listener, const ProtoStreamObjectWriter::Options& options); - - DefaultValueObjectWriter* NewDefaultValueWriter(const string& type_url, - ObjectWriter* writer); - - private: - TypeInfoSource type_; - google::protobuf::scoped_ptr<TypeInfo> typeinfo_; - google::protobuf::scoped_ptr<TypeResolver> type_resolver_; -}; -} // namespace testing -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__ diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc deleted file mode 100644 index 6daf24eb56..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc +++ /dev/null @@ -1,416 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include <google/protobuf/util/internal/utility.h> - -#include <algorithm> - -#include <google/protobuf/stubs/callback.h> -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/wrappers.pb.h> -#include <google/protobuf/descriptor.pb.h> -#include <google/protobuf/descriptor.h> -#include <google/protobuf/util/internal/constants.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/map_util.h> -#include <google/protobuf/stubs/mathlimits.h> - -namespace google { -namespace protobuf { -namespace util { -namespace converter { - -namespace { -const StringPiece SkipWhiteSpace(StringPiece str) { - StringPiece::size_type i; - for (i = 0; i < str.size() && isspace(str[i]); ++i) { - } - GOOGLE_DCHECK(i == str.size() || !isspace(str[i])); - return str.substr(i); -} -} // namespace - -bool GetBoolOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, bool default_value) { - const google::protobuf::Option* opt = FindOptionOrNull(options, option_name); - if (opt == NULL) { - return default_value; - } - return GetBoolFromAny(opt->value()); -} - -int64 GetInt64OptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, int64 default_value) { - const google::protobuf::Option* opt = FindOptionOrNull(options, option_name); - if (opt == NULL) { - return default_value; - } - return GetInt64FromAny(opt->value()); -} - -double GetDoubleOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, double default_value) { - const google::protobuf::Option* opt = FindOptionOrNull(options, option_name); - if (opt == NULL) { - return default_value; - } - return GetDoubleFromAny(opt->value()); -} - -string GetStringOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, const string& default_value) { - const google::protobuf::Option* opt = FindOptionOrNull(options, option_name); - if (opt == NULL) { - return default_value; - } - return GetStringFromAny(opt->value()); -} - -template <typename T> -void ParseFromAny(const string& data, T* result) { - result->ParseFromString(data); -} - -// Returns a boolean value contained in Any type. -// TODO(skarvaje): Add type checking & error messages here. -bool GetBoolFromAny(const google::protobuf::Any& any) { - google::protobuf::BoolValue b; - ParseFromAny(any.value(), &b); - return b.value(); -} - -int64 GetInt64FromAny(const google::protobuf::Any& any) { - google::protobuf::Int64Value i; - ParseFromAny(any.value(), &i); - return i.value(); -} - -double GetDoubleFromAny(const google::protobuf::Any& any) { - google::protobuf::DoubleValue i; - ParseFromAny(any.value(), &i); - return i.value(); -} - -string GetStringFromAny(const google::protobuf::Any& any) { - google::protobuf::StringValue s; - ParseFromAny(any.value(), &s); - return s.value(); -} - -const StringPiece GetTypeWithoutUrl(StringPiece type_url) { - if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') { - return type_url.substr(kTypeUrlSize + 1); - } else { - size_t idx = type_url.rfind('/'); - return type_url.substr(idx + 1); - } -} - -const string GetFullTypeWithUrl(StringPiece simple_type) { - return StrCat(kTypeServiceBaseUrl, "/", simple_type); -} - -const google::protobuf::Option* FindOptionOrNull( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name) { - for (int i = 0; i < options.size(); ++i) { - const google::protobuf::Option& opt = options.Get(i); - if (opt.name() == option_name) { - return &opt; - } - } - return NULL; -} - -const google::protobuf::Field* FindFieldInTypeOrNull( - const google::protobuf::Type* type, StringPiece field_name) { - if (type != NULL) { - for (int i = 0; i < type->fields_size(); ++i) { - const google::protobuf::Field& field = type->fields(i); - if (field.name() == field_name) { - return &field; - } - } - } - return NULL; -} - -const google::protobuf::Field* FindJsonFieldInTypeOrNull( - const google::protobuf::Type* type, StringPiece json_name) { - if (type != NULL) { - for (int i = 0; i < type->fields_size(); ++i) { - const google::protobuf::Field& field = type->fields(i); - if (field.json_name() == json_name) { - return &field; - } - } - } - return NULL; -} - -const google::protobuf::Field* FindFieldInTypeByNumberOrNull( - const google::protobuf::Type* type, int32 number) { - if (type != NULL) { - for (int i = 0; i < type->fields_size(); ++i) { - const google::protobuf::Field& field = type->fields(i); - if (field.number() == number) { - return &field; - } - } - } - return NULL; -} - -const google::protobuf::EnumValue* FindEnumValueByNameOrNull( - const google::protobuf::Enum* enum_type, StringPiece enum_name) { - if (enum_type != NULL) { - for (int i = 0; i < enum_type->enumvalue_size(); ++i) { - const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); - if (enum_value.name() == enum_name) { - return &enum_value; - } - } - } - return NULL; -} - -const google::protobuf::EnumValue* FindEnumValueByNumberOrNull( - const google::protobuf::Enum* enum_type, int32 value) { - if (enum_type != NULL) { - for (int i = 0; i < enum_type->enumvalue_size(); ++i) { - const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); - if (enum_value.number() == value) { - return &enum_value; - } - } - } - return NULL; -} - -const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull( - const google::protobuf::Enum* enum_type, StringPiece enum_name) { - if (enum_type != NULL) { - for (int i = 0; i < enum_type->enumvalue_size(); ++i) { - const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); - string enum_name_without_underscore = enum_value.name(); - - // Remove underscore from the name. - enum_name_without_underscore.erase( - std::remove(enum_name_without_underscore.begin(), - enum_name_without_underscore.end(), '_'), - enum_name_without_underscore.end()); - // Make the name uppercase. - for (string::iterator it = enum_name_without_underscore.begin(); - it != enum_name_without_underscore.end(); ++it) { - *it = ascii_toupper(*it); - } - - if (enum_name_without_underscore == enum_name) { - return &enum_value; - } - } - } - return NULL; -} - -string ToCamelCase(const StringPiece input) { - bool capitalize_next = false; - bool was_cap = true; - bool is_cap = false; - bool first_word = true; - string result; - result.reserve(input.size()); - - for (size_t i = 0; i < input.size(); ++i, was_cap = is_cap) { - is_cap = ascii_isupper(input[i]); - if (input[i] == '_') { - capitalize_next = true; - if (!result.empty()) first_word = false; - continue; - } else if (first_word) { - // Consider when the current character B is capitalized, - // first word ends when: - // 1) following a lowercase: "...aB..." - // 2) followed by a lowercase: "...ABc..." - if (!result.empty() && is_cap && - (!was_cap || (i + 1 < input.size() && ascii_islower(input[i + 1])))) { - first_word = false; - result.push_back(input[i]); - } else { - result.push_back(ascii_tolower(input[i])); - continue; - } - } else if (capitalize_next) { - capitalize_next = false; - if (ascii_islower(input[i])) { - result.push_back(ascii_toupper(input[i])); - continue; - } else { - result.push_back(input[i]); - continue; - } - } else { - result.push_back(ascii_tolower(input[i])); - } - } - return result; -} - -string ToSnakeCase(StringPiece input) { - bool was_not_underscore = false; // Initialize to false for case 1 (below) - bool was_not_cap = false; - string result; - result.reserve(input.size() << 1); - - for (size_t i = 0; i < input.size(); ++i) { - if (ascii_isupper(input[i])) { - // Consider when the current character B is capitalized: - // 1) At beginning of input: "B..." => "b..." - // (e.g. "Biscuit" => "biscuit") - // 2) Following a lowercase: "...aB..." => "...a_b..." - // (e.g. "gBike" => "g_bike") - // 3) At the end of input: "...AB" => "...ab" - // (e.g. "GoogleLAB" => "google_lab") - // 4) Followed by a lowercase: "...ABc..." => "...a_bc..." - // (e.g. "GBike" => "g_bike") - if (was_not_underscore && // case 1 out - (was_not_cap || // case 2 in, case 3 out - (i + 1 < input.size() && // case 3 out - ascii_islower(input[i + 1])))) { // case 4 in - // We add an underscore for case 2 and case 4. - result.push_back('_'); - } - result.push_back(ascii_tolower(input[i])); - was_not_underscore = true; - was_not_cap = false; - } else { - result.push_back(input[i]); - was_not_underscore = input[i] != '_'; - was_not_cap = true; - } - } - return result; -} - -std::set<string>* well_known_types_ = NULL; -GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_); -const char* well_known_types_name_array_[] = { - "google.protobuf.Timestamp", "google.protobuf.Duration", - "google.protobuf.DoubleValue", "google.protobuf.FloatValue", - "google.protobuf.Int64Value", "google.protobuf.UInt64Value", - "google.protobuf.Int32Value", "google.protobuf.UInt32Value", - "google.protobuf.BoolValue", "google.protobuf.StringValue", - "google.protobuf.BytesValue", "google.protobuf.FieldMask"}; - -void DeleteWellKnownTypes() { delete well_known_types_; } - -void InitWellKnownTypes() { - well_known_types_ = new std::set<string>; - for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) { - well_known_types_->insert(well_known_types_name_array_[i]); - } - google::protobuf::internal::OnShutdown(&DeleteWellKnownTypes); -} - -bool IsWellKnownType(const string& type_name) { - InitWellKnownTypes(); - return ContainsKey(*well_known_types_, type_name); -} - -bool IsValidBoolString(const string& bool_string) { - return bool_string == "true" || bool_string == "false" || - bool_string == "1" || bool_string == "0"; -} - -bool IsMap(const google::protobuf::Field& field, - const google::protobuf::Type& type) { - return field.cardinality() == - google::protobuf::Field_Cardinality_CARDINALITY_REPEATED && - (GetBoolOptionOrDefault(type.options(), "map_entry", false) || - GetBoolOptionOrDefault(type.options(), - "google.protobuf.MessageOptions.map_entry", false) || - GetBoolOptionOrDefault(type.options(), - "google.protobuf.MessageOptions.map_entry", - false)); -} - -bool IsMessageSetWireFormat(const google::protobuf::Type& type) { - return GetBoolOptionOrDefault(type.options(), "message_set_wire_format", - false) || - GetBoolOptionOrDefault(type.options(), - "google.protobuf.MessageOptions.message_set_wire_format", - false) || - GetBoolOptionOrDefault( - type.options(), - "google.protobuf.MessageOptions.message_set_wire_format", false); -} - -string DoubleAsString(double value) { - if (MathLimits<double>::IsPosInf(value)) return "Infinity"; - if (MathLimits<double>::IsNegInf(value)) return "-Infinity"; - if (MathLimits<double>::IsNaN(value)) return "NaN"; - - return SimpleDtoa(value); -} - -string FloatAsString(float value) { - if (MathLimits<float>::IsFinite(value)) return SimpleFtoa(value); - return DoubleAsString(value); -} - -bool SafeStrToFloat(StringPiece str, float* value) { - double double_value; - if (!safe_strtod(str, &double_value)) { - return false; - } - - if (MathLimits<double>::IsInf(double_value) || - MathLimits<double>::IsNaN(double_value)) - return false; - - // Fail if the value is not representable in float. - if (double_value > std::numeric_limits<float>::max() || - double_value < -std::numeric_limits<float>::max()) { - return false; - } - - *value = static_cast<float>(double_value); - return true; -} - -} // namespace converter -} // namespace util -} // namespace protobuf -} // namespace google diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h deleted file mode 100644 index 667e660c58..0000000000 --- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h +++ /dev/null @@ -1,208 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__ -#define GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__ - -#include <memory> -#ifndef _SHARED_PTR_H -#include <google/protobuf/stubs/shared_ptr.h> -#endif -#include <string> -#include <utility> - -#include <google/protobuf/stubs/common.h> -#include <google/protobuf/stubs/logging.h> -#include <google/protobuf/type.pb.h> -#include <google/protobuf/repeated_field.h> -#include <google/protobuf/stubs/stringpiece.h> -#include <google/protobuf/stubs/strutil.h> -#include <google/protobuf/stubs/status.h> -#include <google/protobuf/stubs/statusor.h> - - -namespace google { -namespace protobuf { -class Method; -class Any; -class Bool; -class Option; -class Field; -class Type; -class Enum; -class EnumValue; -} // namespace protobuf - - -namespace protobuf { -namespace util { -namespace converter { - -// Size of "type.googleapis.com" -static const int64 kTypeUrlSize = 19; - -// Finds the tech option identified by option_name. Parses the boolean value and -// returns it. -// When the option with the given name is not found, default_value is returned. -LIBPROTOBUF_EXPORT bool GetBoolOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, bool default_value); - -// Returns int64 option value. If the option isn't found, returns the -// default_value. -LIBPROTOBUF_EXPORT int64 GetInt64OptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, int64 default_value); - -// Returns double option value. If the option isn't found, returns the -// default_value. -LIBPROTOBUF_EXPORT double GetDoubleOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, double default_value); - -// Returns string option value. If the option isn't found, returns the -// default_value. -LIBPROTOBUF_EXPORT string GetStringOptionOrDefault( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name, const string& default_value); - -// Returns a boolean value contained in Any type. -// TODO(skarvaje): Make these utilities dealing with Any types more generic, -// add more error checking and move to a more public/sharable location so others -// can use. -LIBPROTOBUF_EXPORT bool GetBoolFromAny(const google::protobuf::Any& any); - -// Returns int64 value contained in Any type. -LIBPROTOBUF_EXPORT int64 GetInt64FromAny(const google::protobuf::Any& any); - -// Returns double value contained in Any type. -LIBPROTOBUF_EXPORT double GetDoubleFromAny(const google::protobuf::Any& any); - -// Returns string value contained in Any type. -LIBPROTOBUF_EXPORT string GetStringFromAny(const google::protobuf::Any& any); - -// Returns the type string without the url prefix. e.g.: If the passed type is -// 'type.googleapis.com/tech.type.Bool', the returned value is 'tech.type.Bool'. -LIBPROTOBUF_EXPORT const StringPiece GetTypeWithoutUrl(StringPiece type_url); - -// Returns the simple_type with the base type url (kTypeServiceBaseUrl) -// prefixed. -// -// E.g: -// GetFullTypeWithUrl("google.protobuf.Timestamp") returns the string -// "type.googleapis.com/google.protobuf.Timestamp". -LIBPROTOBUF_EXPORT const string GetFullTypeWithUrl(StringPiece simple_type); - -// Finds and returns option identified by name and option_name within the -// provided map. Returns NULL if none found. -const google::protobuf::Option* FindOptionOrNull( - const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, - const string& option_name); - -// Finds and returns the field identified by field_name in the passed tech Type -// object. Returns NULL if none found. -const google::protobuf::Field* FindFieldInTypeOrNull( - const google::protobuf::Type* type, StringPiece field_name); - -// Similar to FindFieldInTypeOrNull, but this looks up fields with given -// json_name. -const google::protobuf::Field* FindJsonFieldInTypeOrNull( - const google::protobuf::Type* type, StringPiece json_name); - -// Similar to FindFieldInTypeOrNull, but this looks up fields by number. -const google::protobuf::Field* FindFieldInTypeByNumberOrNull( - const google::protobuf::Type* type, int32 number); - -// Finds and returns the EnumValue identified by enum_name in the passed tech -// Enum object. Returns NULL if none found. -const google::protobuf::EnumValue* FindEnumValueByNameOrNull( - const google::protobuf::Enum* enum_type, StringPiece enum_name); - -// Finds and returns the EnumValue identified by value in the passed tech -// Enum object. Returns NULL if none found. -const google::protobuf::EnumValue* FindEnumValueByNumberOrNull( - const google::protobuf::Enum* enum_type, int32 value); - -// Finds and returns the EnumValue identified by enum_name without underscore in -// the passed tech Enum object. Returns NULL if none found. -// For Ex. if enum_name is ACTIONANDADVENTURE it can get accepted if -// EnumValue's name is action_and_adventure or ACTION_AND_ADVENTURE. -const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull( - const google::protobuf::Enum* enum_type, StringPiece enum_name); - -// Converts input to camel-case and returns it. -LIBPROTOBUF_EXPORT string ToCamelCase(const StringPiece input); - -// Converts input to snake_case and returns it. -LIBPROTOBUF_EXPORT string ToSnakeCase(StringPiece input); - -// Returns true if type_name represents a well-known type. -LIBPROTOBUF_EXPORT bool IsWellKnownType(const string& type_name); - -// Returns true if 'bool_string' represents a valid boolean value. Only "true", -// "false", "0" and "1" are allowed. -LIBPROTOBUF_EXPORT bool IsValidBoolString(const string& bool_string); - -// Returns true if "field" is a protobuf map field based on its type. -LIBPROTOBUF_EXPORT bool IsMap(const google::protobuf::Field& field, - const google::protobuf::Type& type); - -// Returns true if the given type has special MessageSet wire format. -bool IsMessageSetWireFormat(const google::protobuf::Type& type); - -// Infinity/NaN-aware conversion to string. -LIBPROTOBUF_EXPORT string DoubleAsString(double value); -LIBPROTOBUF_EXPORT string FloatAsString(float value); - -// Convert from int32, int64, uint32, uint64, double or float to string. -template <typename T> -string ValueAsString(T value) { - return SimpleItoa(value); -} - -template <> -inline string ValueAsString(float value) { - return FloatAsString(value); -} - -template <> -inline string ValueAsString(double value) { - return DoubleAsString(value); -} - -// Converts a string to float. Unlike safe_strtof, conversion will fail if the -// value fits into double but not float (e.g., DBL_MAX). -LIBPROTOBUF_EXPORT bool SafeStrToFloat(StringPiece str, float* value); -} // namespace converter -} // namespace util -} // namespace protobuf - -} // namespace google -#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__ |