parent
fbabf987e6
commit
7c14dc837b
15 changed files with 37 additions and 348 deletions
@ -1,59 +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_PROTO_CAST_H__ |
|
||||||
#define GOOGLE_PROTOBUF_UTIL_PROTO_CAST_H__ |
|
||||||
|
|
||||||
#include <string> |
|
||||||
|
|
||||||
#include <google/protobuf/stubs/logging.h> |
|
||||||
#include <google/protobuf/stubs/common.h> |
|
||||||
|
|
||||||
// proto_cast<> is used to simulate over-the-wire conversion of one
|
|
||||||
// proto message into another. This is primarily useful for unit tests
|
|
||||||
// which validate the version-compatibility semantics of protobufs.
|
|
||||||
// Usage is similar to C++-style typecasts:
|
|
||||||
//
|
|
||||||
// OldMessage old_message = /*...*/;
|
|
||||||
// NewMessage new_message = proto_cast<NewMessage>(old_message);
|
|
||||||
namespace google { |
|
||||||
template<typename NewProto, |
|
||||||
typename OldProto> |
|
||||||
NewProto proto_cast(const OldProto& old_proto) { |
|
||||||
string wire_format; |
|
||||||
GOOGLE_CHECK(old_proto.SerializeToString(&wire_format)); |
|
||||||
|
|
||||||
NewProto new_proto; |
|
||||||
GOOGLE_CHECK(new_proto.ParseFromString(wire_format)); |
|
||||||
return new_proto; |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace google
|
|
||||||
#endif // GOOGLE_PROTOBUF_UTIL_PROTO_CAST_H__
|
|
@ -1,60 +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/proto_cast.h> |
|
||||||
|
|
||||||
#include <google/protobuf/util/unknown_enum_test.pb.h> |
|
||||||
#include <gtest/gtest.h> |
|
||||||
#include <gmock/gmock.h> |
|
||||||
|
|
||||||
namespace google { |
|
||||||
using google::protobuf::util::UpRevision; |
|
||||||
using google::protobuf::util::DownRevision; |
|
||||||
|
|
||||||
namespace { |
|
||||||
|
|
||||||
TEST(ProtoCastTest, V2KnownValue) { |
|
||||||
UpRevision sender; |
|
||||||
sender.set_value(UpRevision::NONDEFAULT_VALUE); |
|
||||||
|
|
||||||
DownRevision receiver = proto_cast<DownRevision>(sender); |
|
||||||
ASSERT_EQ(DownRevision::NONDEFAULT_VALUE, receiver.value()); |
|
||||||
} |
|
||||||
|
|
||||||
TEST(ProtoCastTest, V2UnknownValue) { |
|
||||||
UpRevision sender; |
|
||||||
sender.set_value(UpRevision::NEW_VALUE); |
|
||||||
|
|
||||||
DownRevision receiver = proto_cast<DownRevision>(sender); |
|
||||||
ASSERT_EQ(DownRevision::DEFAULT_VALUE, receiver.value()); |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace
|
|
||||||
} // namespace google
|
|
@ -1,154 +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_UNKNOWN_ENUM_IMPL_H__ |
|
||||||
#define GOOGLE_PROTOBUF_UTIL_UNKNOWN_ENUM_IMPL_H__ |
|
||||||
|
|
||||||
#include <stdlib.h> |
|
||||||
|
|
||||||
#include <google/protobuf/stubs/common.h> |
|
||||||
#include <google/protobuf/bridge/compatibility_mode_support.h> |
|
||||||
|
|
||||||
namespace google { |
|
||||||
namespace protobuf { |
|
||||||
|
|
||||||
// google/protobuf/message.h
|
|
||||||
class Message; |
|
||||||
|
|
||||||
namespace util { |
|
||||||
|
|
||||||
// NOTE: You should not call these functions directly. Instead use either
|
|
||||||
// HAS_UNKNOWN_ENUM() or GET_UNKNOWN_ENUM(), defined in the public header.
|
|
||||||
// The macro-versions operate in a type-safe manner and behave appropriately
|
|
||||||
// for the proto version of the message, whereas these versions assume a
|
|
||||||
// specific proto version and allow the caller to pass in any arbitrary integer
|
|
||||||
// value as a field number.
|
|
||||||
//
|
|
||||||
// Returns whether the message has unrecognized the enum value for a given
|
|
||||||
// field. It also stores the value into the unknown_value parameter if the
|
|
||||||
// function returns true and the pointer is not NULL.
|
|
||||||
//
|
|
||||||
// In proto2, invalid enum values will be treated as unknown fields. This
|
|
||||||
// function checks that case.
|
|
||||||
bool HasUnknownEnum(const Message& message, int32 field_number, |
|
||||||
int32* unknown_value = NULL); |
|
||||||
// Same as above, but returns all unknown enums.
|
|
||||||
bool GetRepeatedEnumUnknowns(const Message& message, int32 field_number, |
|
||||||
vector<int32>* unknown_values = NULL); |
|
||||||
// In proto1, invalue enum values are stored in the same way as valid enum
|
|
||||||
// values.
|
|
||||||
// TODO(karner): Delete this once the migration to proto2 is complete.
|
|
||||||
bool HasUnknownEnumProto1(const Message& message, int32 field_number, |
|
||||||
int32* unknown_value); |
|
||||||
// Same as above, but returns all unknown enums.
|
|
||||||
bool GetRepeatedEnumUnknownsProto1(const Message& message, int32 field_number, |
|
||||||
vector<int32>* unknown_values); |
|
||||||
// Invokes the appropriate version based on whether the message is proto1
|
|
||||||
// or proto2.
|
|
||||||
template <typename T> |
|
||||||
bool HasUnknownEnum_Template(const T& message, int32 field_number, |
|
||||||
int32* unknown_value = NULL) { |
|
||||||
if (internal::is_base_of<bridge::internal::Proto1CompatibleMessage, T>::value || |
|
||||||
!internal::is_base_of<ProtocolMessage, T>::value) { |
|
||||||
return HasUnknownEnum(message, field_number, unknown_value); |
|
||||||
} else { |
|
||||||
return HasUnknownEnumProto1(message, field_number, unknown_value); |
|
||||||
} |
|
||||||
} |
|
||||||
// Invokes the appropriate version based on whether the message is proto1
|
|
||||||
// or proto2.
|
|
||||||
template <typename T> |
|
||||||
bool GetRepeatedEnumUnknowns_Template( |
|
||||||
const T& message, int32 field_number, |
|
||||||
vector<int32>* unknown_values = NULL) { |
|
||||||
if (internal::is_base_of<bridge::internal::Proto1CompatibleMessage, T>::value || |
|
||||||
!internal::is_base_of<ProtocolMessage, T>::value) { |
|
||||||
return GetRepeatedEnumUnknowns(message, field_number, unknown_values); |
|
||||||
} else { |
|
||||||
return GetRepeatedEnumUnknownsProto1(message, field_number, |
|
||||||
unknown_values); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// NOTE: You should not call these functions directly. Instead use
|
|
||||||
// CLEAR_UNKNOWN_ENUM(), defined in the public header. The macro-versions
|
|
||||||
// operate in a type-safe manner and behave appropriately for the proto
|
|
||||||
// version of the message, whereas these versions assume a specific proto
|
|
||||||
// version and allow the caller to pass in any arbitrary integer value as a
|
|
||||||
// field number.
|
|
||||||
//
|
|
||||||
// Clears the unknown entries of the given field of the message.
|
|
||||||
void ClearUnknownEnum(Message* message, int32 field_number); |
|
||||||
// In proto1, clears the field if the value is out of range.
|
|
||||||
// TODO(karner): Delete this or make it proto2-only once the migration
|
|
||||||
// to proto2 is complete.
|
|
||||||
void ClearUnknownEnumProto1(Message* message, int32 field_number); |
|
||||||
template <typename T> |
|
||||||
void ClearUnknownEnum_Template(T* message, int32 field_number) { |
|
||||||
if (internal::is_base_of<bridge::internal::Proto1CompatibleMessage, T>::value || |
|
||||||
!internal::is_base_of<ProtocolMessage, T>::value) { |
|
||||||
ClearUnknownEnum(message, field_number); |
|
||||||
} else { |
|
||||||
ClearUnknownEnumProto1(message, field_number); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// NOTE: You should not call these functions directly. Instead use
|
|
||||||
// SET_UNKNOWN_ENUM(), defined in the public header. The macro-versions
|
|
||||||
// operate in a type-safe manner and behave appropriately for the proto
|
|
||||||
// version of the message, whereas these versions assume a specific proto
|
|
||||||
// version and allow the caller to pass in any arbitrary integer value as a
|
|
||||||
// field number.
|
|
||||||
//
|
|
||||||
// Sets the given value in the unknown fields of the message.
|
|
||||||
void SetUnknownEnum(Message* message, int32 field_number, int32 unknown_value); |
|
||||||
// In proto1, invalue enum values are stored in the same way as valid enum
|
|
||||||
// values.
|
|
||||||
// TODO(karner): Delete this once the migration to proto2 is complete.
|
|
||||||
void SetUnknownEnumProto1(Message* message, int32 field_number, |
|
||||||
int32 unknown_value); |
|
||||||
// Invokes the appropriate version based on whether the message is proto1
|
|
||||||
// or proto2.
|
|
||||||
template <typename T> |
|
||||||
void SetUnknownEnum_Template(T* message, int32 field_number, |
|
||||||
int32 unknown_value) { |
|
||||||
if (internal::is_base_of<bridge::internal::Proto1CompatibleMessage, T>::value || |
|
||||||
!internal::is_base_of<ProtocolMessage, T>::value) { |
|
||||||
SetUnknownEnum(message, field_number, unknown_value); |
|
||||||
} else { |
|
||||||
SetUnknownEnumProto1(message, field_number, unknown_value); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace util
|
|
||||||
} // namespace protobuf
|
|
||||||
|
|
||||||
} // namespace google
|
|
||||||
#endif // GOOGLE_PROTOBUF_UTIL_UNKNOWN_ENUM_IMPL_H__
|
|
@ -1,62 +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. |
|
||||||
|
|
||||||
// Definitions of protos for testing cross-version compatibility. The |
|
||||||
// UpRevision message acts as if it were a newer version of the DownRevision |
|
||||||
// message. That is, UpRevision shares all the same fields as DownRevision, |
|
||||||
// but UpRevision can add fields and add enum values. |
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package google.protobuf.util; |
|
||||||
|
|
||||||
option csharp_namespace = "Google.ProtocolBuffers.TestProtos"; |
|
||||||
|
|
||||||
message DownRevision { |
|
||||||
enum Enum { |
|
||||||
DEFAULT_VALUE = 2; |
|
||||||
NONDEFAULT_VALUE = 3; |
|
||||||
} |
|
||||||
|
|
||||||
optional Enum value = 1 [default = DEFAULT_VALUE]; |
|
||||||
repeated Enum values = 2; |
|
||||||
} |
|
||||||
|
|
||||||
message UpRevision { |
|
||||||
enum Enum { |
|
||||||
DEFAULT_VALUE = 2; |
|
||||||
NONDEFAULT_VALUE = 3; |
|
||||||
NEW_VALUE = 4; |
|
||||||
NEW_VALUE_2 = 5; |
|
||||||
NEW_VALUE_3 = 6; |
|
||||||
} |
|
||||||
|
|
||||||
optional Enum value = 1 [default = DEFAULT_VALUE]; |
|
||||||
repeated Enum values = 2; |
|
||||||
} |
|
Loading…
Reference in new issue