Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
f8808fb6
Commit
f8808fb6
authored
Apr 08, 2015
by
Feng Xiao
Browse files
Options
Browse Files
Download
Plain Diff
Merge gerrit/master and github/master.
parents
4990875f
35a1cc7a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
476 additions
and
2 deletions
+476
-2
Makefile.am
Makefile.am
+5
-1
configure.ac
configure.ac
+1
-1
Makefile.am
conformance/Makefile.am
+50
-0
README.md
conformance/README.md
+45
-0
conformance.proto
conformance/conformance.proto
+219
-0
conformance_cpp.cc
conformance/conformance_cpp.cc
+156
-0
conformance_test.cc
conformance/conformance_test.cc
+0
-0
No files found.
Makefile.am
View file @
f8808fb6
...
...
@@ -9,7 +9,7 @@ AUTOMAKE_OPTIONS = foreign
SUBDIRS
=
.
src
# Always include gtest in distributions.
DIST_SUBDIRS
=
$(subdirs)
src
DIST_SUBDIRS
=
$(subdirs)
src
conformance
# Build gtest before we build protobuf tests. We don't add gtest to SUBDIRS
# because then "make check" would also build and run all of gtest's own tests,
...
...
@@ -30,6 +30,10 @@ clean-local:
@
if
test
-e
gtest/Makefile
;
then
\
echo
"Making clean in gtest"
;
\
cd
gtest
&&
$(MAKE)
$(AM_MAKEFLAGS)
clean
;
\
fi
;
\
if
test
-e
conformance/Makefile
;
then
\
echo
"Making clean in conformance"
;
\
cd
conformance
&&
$(MAKE)
$(AM_MAKEFLAGS)
clean
;
\
fi
pkgconfigdir
=
$(libdir)
/pkgconfig
...
...
configure.ac
View file @
f8808fb6
...
...
@@ -164,5 +164,5 @@ export CFLAGS
export CXXFLAGS
AC_CONFIG_SUBDIRS([gtest])
AC_CONFIG_FILES([Makefile src/Makefile protobuf.pc protobuf-lite.pc])
AC_CONFIG_FILES([Makefile src/Makefile
conformance/Makefile
protobuf.pc protobuf-lite.pc])
AC_OUTPUT
conformance/Makefile.am
0 → 100644
View file @
f8808fb6
## Process this file with automake to produce Makefile.in
protoc_inputs
=
\
conformance.proto
protoc_outputs
=
\
conformance.pb.cc
\
conformance.pb.h
bin_PROGRAMS
=
conformance-test conformance-cpp
conformance_test_LDADD
=
$(top_srcdir)
/src/libprotobuf.la
conformance_test_SOURCES
=
conformance_test.cc
nodist_conformance_test_SOURCES
=
conformance.pb.cc
conformance_test_CPPFLAGS
=
-I
$(top_srcdir)
/src
conformance_cpp_LDADD
=
$(top_srcdir)
/src/libprotobuf.la
conformance_cpp_SOURCES
=
conformance_cpp.cc
nodist_conformance_cpp_SOURCES
=
conformance.pb.cc
conformance_cpp_CPPFLAGS
=
-I
$(top_srcdir)
/src
if
USE_EXTERNAL_PROTOC
unittest_proto_middleman
:
$(protoc_inputs)
$(PROTOC)
-I
$(srcdir)
--cpp_out
=
.
$^
touch
unittest_proto_middleman
else
# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
# relative to srcdir, which may not be the same as the current directory when
# building out-of-tree.
unittest_proto_middleman
:
$(top_srcdir)/src/protoc$(EXEEXT) $(protoc_inputs)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
--cpp_out
=
$$
oldpwd
$(protoc_inputs)
)
touch
unittest_proto_middleman
endif
$(protoc_outputs)
:
unittest_proto_middleman
BUILT_SOURCES
=
$(protoc_outputs)
CLEANFILES
=
$(protoc_outputs)
unittest_proto_middleman
MAINTAINERCLEANFILES
=
\
Makefile.in
# Targets for actually running tests.
test_cpp
:
unittest_proto_middleman conformance-test conformance-cpp
./conformance-test ./conformance-cpp
conformance/README.md
0 → 100644
View file @
f8808fb6
Protocol Buffers - Google's data interchange format
===================================================
[
![Build Status
](
https://travis-ci.org/google/protobuf.svg?branch=master
)
](https://travis-ci.org/google/protobuf)
Copyright 2008 Google Inc.
This directory contains conformance tests for testing completeness and
correctness of Protocol Buffers implementations. These tests are designed
to be easy to run against any Protocol Buffers implementation.
This directory contains the tester process
`conformance-test`
, which
contains all of the tests themselves. Then separate programs written
in whatever language you want to test communicate with the tester
program over a pipe.
Before running any of these tests, make sure you run
`make`
in the base
directory to build
`protoc`
, since all the tests depend on it.
$ make
Then to run the tests against the C++ implementation, run:
$ cd conformance && make test_cpp
More tests and languages will be added soon!
Testing other Protocol Buffer implementations
---------------------------------------------
To run these tests against a new Protocol Buffers implementation, write a
program in your language that uses the protobuf implementation you want
to test. This program should implement the testing protocol defined in
[
conformance.proto
](
https://github.com/google/protobuf/blob/master/conformance/conformance.proto
)
.
This is designed to be as easy as possible: the C++ version is only
150 lines and is a good example for what this program should look like
(see
[
conformance_cpp.cc
](
https://github.com/google/protobuf/blob/master/conformance/conformance_cpp.cc
)
).
The program only needs to be able to read from stdin and write to stdout.
Portability
-----------
Note that the test runner currently does not work on Windows. Patches
to fix this are welcome! (But please get in touch first to settle on
a general implementation strategy).
conformance/conformance.proto
0 → 100644
View file @
f8808fb6
// 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
conformance
;
// This defines the conformance testing protocol. This protocol exists between
// the conformance tester process (the "tester") and the process whose protobuf
// implemention is being tested (the "testee"). The tester forks the testee and
// communicates with it over its stdin/stdout:
//
// +--------+ pipe +----------+
// | tester | <------> | testee |
// | | | |
// | C++ | | any lang |
// +--------+ +----------+
//
// The tester contains all of the test cases and their expected output.
// The testee is a simple program written in the target language that reads
// each test case and attempts to produce acceptable output for it.
//
// Every test consists of a ConformanceRequest/ConformanceResponse
// request/reply pair. The protocol on the pipe is simply:
//
// 1. tester sends 4-byte length N
// 2. tester sends N bytes representing a ConformanceRequest proto
// 3. testee sends 4-byte length M
// 4. testee sends M bytes representing a ConformanceResponse proto
// Represents a single test case's input. The testee should:
//
// 1. parse this proto (which should always succeed)
// 2. parse the protobuf or JSON payload in "payload" (which may fail)
// 3. if the parse succeeded, serialize the message in the requested format.
message
ConformanceRequest
{
// The payload (whether protobuf of JSON) is always for a TestAllTypes proto
// (see below).
oneof
payload
{
bytes
protobuf_payload
=
1
;
string
json_payload
=
2
;
}
enum
RequestedOutput
{
UNSPECIFIED
=
0
;
PROTOBUF
=
1
;
JSON
=
2
;
}
// Which format should the testee serialize its message to?
optional
RequestedOutput
requested_output
=
3
;
}
// Represents a single test case's output.
message
ConformanceResponse
{
oneof
result
{
// This string should be set to indicate parsing failed. The string can
// provide more information about the parse error if it is available.
//
// Setting this string does not necessarily mean the testee failed the
// test. Some of the test cases are intentionally invalid input.
string
parse_error
=
1
;
// This should be set if some other error occurred. This will always
// indicate that the test failed. The string can provide more information
// about the failure.
string
runtime_error
=
2
;
// If the input was successfully parsed and the requested output was
// protobuf, serialize it to protobuf and set it in this field.
bytes
protobuf_payload
=
3
;
// If the input was successfully parsed and the requested output was JSON,
// serialize to JSON and set it in this field.
string
json_payload
=
4
;
}
}
// This proto includes every type of field in both singular and repeated
// forms.
message
TestAllTypes
{
message
NestedMessage
{
optional
int32
a
=
1
;
optional
TestAllTypes
corecursive
=
2
;
}
enum
NestedEnum
{
FOO
=
0
;
BAR
=
1
;
BAZ
=
2
;
NEG
=
-
1
;
// Intentionally negative.
}
// Singular
optional
int32
optional_int32
=
1
;
optional
int64
optional_int64
=
2
;
optional
uint32
optional_uint32
=
3
;
optional
uint64
optional_uint64
=
4
;
optional
sint32
optional_sint32
=
5
;
optional
sint64
optional_sint64
=
6
;
optional
fixed32
optional_fixed32
=
7
;
optional
fixed64
optional_fixed64
=
8
;
optional
sfixed32
optional_sfixed32
=
9
;
optional
sfixed64
optional_sfixed64
=
10
;
optional
float
optional_float
=
11
;
optional
double
optional_double
=
12
;
optional
bool
optional_bool
=
13
;
optional
string
optional_string
=
14
;
optional
bytes
optional_bytes
=
15
;
optional
group
OptionalGroup
=
16
{
optional
int32
a
=
17
;
}
optional
NestedMessage
optional_nested_message
=
18
;
optional
ForeignMessage
optional_foreign_message
=
19
;
optional
NestedEnum
optional_nested_enum
=
21
;
optional
ForeignEnum
optional_foreign_enum
=
22
;
optional
string
optional_string_piece
=
24
[
ctype
=
STRING_PIECE
];
optional
string
optional_cord
=
25
[
ctype
=
CORD
];
optional
TestAllTypes
recursive_message
=
27
;
// Repeated
repeated
int32
repeated_int32
=
31
;
repeated
int64
repeated_int64
=
32
;
repeated
uint32
repeated_uint32
=
33
;
repeated
uint64
repeated_uint64
=
34
;
repeated
sint32
repeated_sint32
=
35
;
repeated
sint64
repeated_sint64
=
36
;
repeated
fixed32
repeated_fixed32
=
37
;
repeated
fixed64
repeated_fixed64
=
38
;
repeated
sfixed32
repeated_sfixed32
=
39
;
repeated
sfixed64
repeated_sfixed64
=
40
;
repeated
float
repeated_float
=
41
;
repeated
double
repeated_double
=
42
;
repeated
bool
repeated_bool
=
43
;
repeated
string
repeated_string
=
44
;
repeated
bytes
repeated_bytes
=
45
;
repeated
group
RepeatedGroup
=
46
{
optional
int32
a
=
47
;
}
repeated
NestedMessage
repeated_nested_message
=
48
;
repeated
ForeignMessage
repeated_foreign_message
=
49
;
repeated
NestedEnum
repeated_nested_enum
=
51
;
repeated
ForeignEnum
repeated_foreign_enum
=
52
;
repeated
string
repeated_string_piece
=
54
[
ctype
=
STRING_PIECE
];
repeated
string
repeated_cord
=
55
[
ctype
=
CORD
];
// Map
map
<
int32
,
int32
>
map_int32_int32
=
56
;
map
<
int64
,
int64
>
map_int64_int64
=
57
;
map
<
uint32
,
uint32
>
map_uint32_uint32
=
58
;
map
<
uint64
,
uint64
>
map_uint64_uint64
=
59
;
map
<
sint32
,
sint32
>
map_sint32_sint32
=
60
;
map
<
sint64
,
sint64
>
map_sint64_sint64
=
61
;
map
<
fixed32
,
fixed32
>
map_fixed32_fixed32
=
62
;
map
<
fixed64
,
fixed64
>
map_fixed64_fixed64
=
63
;
map
<
sfixed32
,
sfixed32
>
map_sfixed32_sfixed32
=
64
;
map
<
sfixed64
,
sfixed64
>
map_sfixed64_sfixed64
=
65
;
map
<
int32
,
float
>
map_int32_float
=
66
;
map
<
int32
,
double
>
map_int32_double
=
67
;
map
<
bool
,
bool
>
map_bool_bool
=
68
;
map
<
string
,
string
>
map_string_string
=
69
;
map
<
string
,
bytes
>
map_string_bytes
=
70
;
map
<
string
,
NestedMessage
>
map_string_nested_message
=
71
;
map
<
string
,
ForeignMessage
>
map_string_foreign_message
=
72
;
map
<
string
,
NestedEnum
>
map_string_nested_enum
=
73
;
map
<
string
,
ForeignEnum
>
map_string_foreign_enum
=
74
;
oneof
oneof_field
{
uint32
oneof_uint32
=
111
;
NestedMessage
oneof_nested_message
=
112
;
string
oneof_string
=
113
;
bytes
oneof_bytes
=
114
;
}
}
message
ForeignMessage
{
optional
int32
c
=
1
;
}
enum
ForeignEnum
{
FOREIGN_FOO
=
0
;
FOREIGN_BAR
=
1
;
FOREIGN_BAZ
=
2
;
}
conformance/conformance_cpp.cc
0 → 100644
View file @
f8808fb6
// 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 <errno.h>
#include <stdarg.h>
#include <unistd.h>
#include "conformance.pb.h"
using
std
::
string
;
using
conformance
::
ConformanceRequest
;
using
conformance
::
ConformanceResponse
;
using
conformance
::
TestAllTypes
;
int
test_count
=
0
;
bool
verbose
=
false
;
bool
CheckedRead
(
int
fd
,
void
*
buf
,
size_t
len
)
{
size_t
ofs
=
0
;
while
(
len
>
0
)
{
ssize_t
bytes_read
=
read
(
fd
,
(
char
*
)
buf
+
ofs
,
len
);
if
(
bytes_read
==
0
)
return
false
;
if
(
bytes_read
<
0
)
{
GOOGLE_LOG
(
FATAL
)
<<
"Error reading from test runner: "
<<
strerror
(
errno
);
}
len
-=
bytes_read
;
ofs
+=
bytes_read
;
}
return
true
;
}
void
CheckedWrite
(
int
fd
,
const
void
*
buf
,
size_t
len
)
{
if
(
write
(
fd
,
buf
,
len
)
!=
len
)
{
GOOGLE_LOG
(
FATAL
)
<<
"Error writing to test runner: "
<<
strerror
(
errno
);
}
}
void
DoTest
(
const
ConformanceRequest
&
request
,
ConformanceResponse
*
response
)
{
TestAllTypes
test_message
;
switch
(
request
.
payload_case
())
{
case
ConformanceRequest
:
:
kProtobufPayload
:
if
(
!
test_message
.
ParseFromString
(
request
.
protobuf_payload
()))
{
// Getting parse details would involve something like:
// http://stackoverflow.com/questions/22121922/how-can-i-get-more-details-about-errors-generated-during-protobuf-parsing-c
response
->
set_parse_error
(
"Parse error (no more details available)."
);
return
;
}
break
;
case
ConformanceRequest
:
:
kJsonPayload
:
response
->
set_runtime_error
(
"JSON input is not yet supported."
);
break
;
case
ConformanceRequest
:
:
PAYLOAD_NOT_SET
:
GOOGLE_LOG
(
FATAL
)
<<
"Request didn't have payload."
;
break
;
}
switch
(
request
.
requested_output
())
{
case
ConformanceRequest
:
:
UNSPECIFIED
:
GOOGLE_LOG
(
FATAL
)
<<
"Unspecified output format"
;
break
;
case
ConformanceRequest
:
:
PROTOBUF
:
test_message
.
SerializeToString
(
response
->
mutable_protobuf_payload
());
break
;
case
ConformanceRequest
:
:
JSON
:
response
->
set_runtime_error
(
"JSON output is not yet supported."
);
break
;
}
}
bool
DoTestIo
()
{
string
serialized_input
;
string
serialized_output
;
ConformanceRequest
request
;
ConformanceResponse
response
;
uint32_t
bytes
;
if
(
!
CheckedRead
(
STDIN_FILENO
,
&
bytes
,
sizeof
(
uint32_t
)))
{
// EOF.
return
false
;
}
serialized_input
.
resize
(
bytes
);
if
(
!
CheckedRead
(
STDIN_FILENO
,
(
char
*
)
serialized_input
.
c_str
(),
bytes
))
{
GOOGLE_LOG
(
ERROR
)
<<
"Unexpected EOF on stdin. "
<<
strerror
(
errno
);
}
if
(
!
request
.
ParseFromString
(
serialized_input
))
{
GOOGLE_LOG
(
FATAL
)
<<
"Parse of ConformanceRequest proto failed."
;
return
false
;
}
DoTest
(
request
,
&
response
);
response
.
SerializeToString
(
&
serialized_output
);
bytes
=
serialized_output
.
size
();
CheckedWrite
(
STDOUT_FILENO
,
&
bytes
,
sizeof
(
uint32_t
));
CheckedWrite
(
STDOUT_FILENO
,
serialized_output
.
c_str
(),
bytes
);
if
(
verbose
)
{
fprintf
(
stderr
,
"conformance-cpp: request=%s, response=%s
\n
"
,
request
.
ShortDebugString
().
c_str
(),
response
.
ShortDebugString
().
c_str
());
}
test_count
++
;
return
true
;
}
int
main
()
{
while
(
1
)
{
if
(
!
DoTestIo
())
{
fprintf
(
stderr
,
"conformance-cpp: received EOF from test runner "
"after %d tests, exiting
\n
"
,
test_count
);
return
0
;
}
}
}
conformance/conformance_test.cc
0 → 100644
View file @
f8808fb6
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment