1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 #include <google/protobuf/util/internal/default_value_objectwriter.h>
32 #include <google/protobuf/util/internal/expecting_objectwriter.h>
33 #include <google/protobuf/util/internal/testdata/default_value_test.pb.h>
34 #include <google/protobuf/util/internal/type_info_test_helper.h>
35 #include <google/protobuf/util/internal/constants.h>
36 #include <gtest/gtest.h>
37
38 namespace google {
39 namespace protobuf {
40 namespace util {
41 namespace converter {
42 namespace testing {
43
44 using google::protobuf::testing::DefaultValueTest;
45
46 // Base class for setting up required state for running default values tests on
47 // different descriptors.
48 class BaseDefaultValueObjectWriterTest
49 : public ::testing::TestWithParam<testing::TypeInfoSource> {
50 protected:
BaseDefaultValueObjectWriterTest(const Descriptor * descriptor)51 explicit BaseDefaultValueObjectWriterTest(const Descriptor* descriptor)
52 : helper_(GetParam()), mock_(), expects_(&mock_) {
53 helper_.ResetTypeInfo(descriptor);
54 testing_.reset(helper_.NewDefaultValueWriter(
55 string(kTypeServiceBaseUrl) + "/" + descriptor->full_name(), &mock_));
56 }
57
~BaseDefaultValueObjectWriterTest()58 virtual ~BaseDefaultValueObjectWriterTest() {}
59
60 TypeInfoTestHelper helper_;
61 MockObjectWriter mock_;
62 ExpectingObjectWriter expects_;
63 google::protobuf::scoped_ptr<DefaultValueObjectWriter> testing_;
64 };
65
66 // Tests to cover some basic DefaultValueObjectWriter use cases. More tests are
67 // in the marshalling_test.cc and translator_integration_test.cc.
68 class DefaultValueObjectWriterTest : public BaseDefaultValueObjectWriterTest {
69 protected:
DefaultValueObjectWriterTest()70 DefaultValueObjectWriterTest()
71 : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) {}
~DefaultValueObjectWriterTest()72 virtual ~DefaultValueObjectWriterTest() {}
73 };
74
75 INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
76 DefaultValueObjectWriterTest,
77 ::testing::Values(
78 testing::USE_TYPE_RESOLVER));
79
TEST_P(DefaultValueObjectWriterTest,Empty)80 TEST_P(DefaultValueObjectWriterTest, Empty) {
81 // Set expectation
82 expects_.StartObject("")
83 ->RenderDouble("doubleValue", 0.0)
84 ->StartList("repeatedDouble")
85 ->EndList()
86 ->RenderFloat("floatValue", 0.0)
87 ->RenderInt64("int64Value", 0)
88 ->RenderUint64("uint64Value", 0)
89 ->RenderInt32("int32Value", 0)
90 ->RenderUint32("uint32Value", 0)
91 ->RenderBool("boolValue", false)
92 ->RenderString("stringValue", "")
93 ->RenderBytes("bytesValue", "")
94 ->RenderString("enumValue", "ENUM_FIRST")
95 ->EndObject();
96
97 // Actual testing
98 testing_->StartObject("")->EndObject();
99 }
100
TEST_P(DefaultValueObjectWriterTest,NonDefaultDouble)101 TEST_P(DefaultValueObjectWriterTest, NonDefaultDouble) {
102 // Set expectation
103 expects_.StartObject("")
104 ->RenderDouble("doubleValue", 1.0)
105 ->StartList("repeatedDouble")
106 ->EndList()
107 ->RenderFloat("floatValue", 0.0)
108 ->RenderInt64("int64Value", 0)
109 ->RenderUint64("uint64Value", 0)
110 ->RenderInt32("int32Value", 0)
111 ->RenderUint32("uint32Value", 0)
112 ->RenderBool("boolValue", false)
113 ->RenderString("stringValue", "")
114 ->RenderString("enumValue", "ENUM_FIRST")
115 ->EndObject();
116
117 // Actual testing
118 testing_->StartObject("")->RenderDouble("doubleValue", 1.0)->EndObject();
119 }
120
TEST_P(DefaultValueObjectWriterTest,ShouldRetainUnknownField)121 TEST_P(DefaultValueObjectWriterTest, ShouldRetainUnknownField) {
122 // Set expectation
123 expects_.StartObject("")
124 ->RenderDouble("doubleValue", 1.0)
125 ->StartList("repeatedDouble")
126 ->EndList()
127 ->RenderFloat("floatValue", 0.0)
128 ->RenderInt64("int64Value", 0)
129 ->RenderUint64("uint64Value", 0)
130 ->RenderInt32("int32Value", 0)
131 ->RenderUint32("uint32Value", 0)
132 ->RenderBool("boolValue", false)
133 ->RenderString("stringValue", "")
134 ->RenderString("unknown", "abc")
135 ->StartObject("unknownObject")
136 ->RenderString("unknown", "def")
137 ->EndObject()
138 ->RenderString("enumValue", "ENUM_FIRST")
139 ->EndObject();
140
141 // Actual testing
142 testing_->StartObject("")
143 ->RenderDouble("doubleValue", 1.0)
144 ->RenderString("unknown", "abc")
145 ->StartObject("unknownObject")
146 ->RenderString("unknown", "def")
147 ->EndObject()
148 ->EndObject();
149 }
150
151
152 } // namespace testing
153 } // namespace converter
154 } // namespace util
155 } // namespace protobuf
156 } // namespace google
157