forked from protocolbuffers/protobuf
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added first version of conformance tests.
Change-Id: Ib75664194491643f8e4f1503a2ed942a2d1e1655
- Loading branch information
Showing
7 changed files
with
871 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
## 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
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). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
// 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; | ||
} |
Oops, something went wrong.