diff options
Diffstat (limited to 'conformance')
-rw-r--r-- | conformance/Makefile.am | 7 | ||||
-rwxr-xr-x | conformance/conformance_ruby.rb | 111 | ||||
-rw-r--r-- | conformance/conformance_test.h | 2 | ||||
-rw-r--r-- | conformance/conformance_test_runner.cc | 8 | ||||
-rw-r--r-- | conformance/failure_list_ruby.txt | 17 |
5 files changed, 140 insertions, 5 deletions
diff --git a/conformance/Makefile.am b/conformance/Makefile.am index cccbac9e..97251715 100644 --- a/conformance/Makefile.am +++ b/conformance/Makefile.am @@ -22,7 +22,7 @@ conformance_cpp_CPPFLAGS = -I$(top_srcdir)/src if USE_EXTERNAL_PROTOC protoc_middleman: $(protoc_inputs) - $(PROTOC) -I$(srcdir) --cpp_out=. --java_out=. $^ + $(PROTOC) -I$(srcdir) --cpp_out=. --java_out=. --ruby_out=. $^ touch protoc_middleman else @@ -31,7 +31,7 @@ else # relative to srcdir, which may not be the same as the current directory when # building out-of-tree. protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(protoc_inputs) - oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd --java_out=$$oldpwd $(protoc_inputs) ) + oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd $(protoc_inputs) ) touch protoc_middleman endif @@ -61,3 +61,6 @@ test_cpp: protoc_middleman conformance-test-runner conformance-cpp test_java: protoc_middleman conformance-test-runner conformance-java ./conformance-test-runner ./conformance-java + +test_ruby: protoc_middleman conformance-test-runner + RUBYLIB=../ruby/lib:. ./conformance-test-runner --failure_list failure_list_ruby.txt ./conformance_ruby.rb diff --git a/conformance/conformance_ruby.rb b/conformance/conformance_ruby.rb new file mode 100755 index 00000000..e7bd4ed5 --- /dev/null +++ b/conformance/conformance_ruby.rb @@ -0,0 +1,111 @@ +#!/usr/bin/env ruby +# +# 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. + +require 'conformance' + +test_count = 0; +verbose = false; + +def do_test(request) + test_message = Conformance::TestAllTypes.new + response = Conformance::ConformanceResponse.new + + begin + case request.payload + when :protobuf_payload + begin + test_message = Conformance::TestAllTypes.decode(request.protobuf_payload) + rescue Google::Protobuf::ParseError => err + response.parse_error = err.message.encode("utf-8") + return response + end + + when :json_payload + test_message = Conformance::TestAllTypes.decode_json(request.json_payload) + + when nil + raise "Request didn't have payload."; + end + + case request.requested_output_format + when :UNSPECIFIED + raise "Unspecified output format" + + when :PROTOBUF + response.protobuf_payload = Conformance::TestAllTypes.encode(test_message) + + when :JSON + response.json_payload = Conformance::TestAllTypes.encode_json(test_message) + end + rescue Exception => err + response.runtime_error = err.message.encode("utf-8") + err.backtrace.join("\n") + end + + return response +end + +def do_test_io + length_bytes = STDIN.read(4) + return false if length_bytes.nil? + + length = length_bytes.unpack("V").first + serialized_request = STDIN.read(length) + if serialized_request.nil? or serialized_request.length != length + raise "I/O error" + end + + request = Conformance::ConformanceRequest.decode(serialized_request) + + response = do_test(request) + + serialized_response = Conformance::ConformanceResponse.encode(response) + STDOUT.write([serialized_response.length].pack("V")) + STDOUT.write(serialized_response) + STDOUT.flush + + #if verbose + # fprintf(stderr, "conformance-cpp: request=%s, response=%s\n", + # request.ShortDebugString().c_str(), + # response.ShortDebugString().c_str()); + + #test_count++; + + return true; +end + +while true + if not do_test_io() + STDERR.puts("conformance-cpp: received EOF from test runner " + + "after #{test_count} tests, exiting") + exit 0 + end +end diff --git a/conformance/conformance_test.h b/conformance/conformance_test.h index cadda828..9e6cdaee 100644 --- a/conformance/conformance_test.h +++ b/conformance/conformance_test.h @@ -85,6 +85,8 @@ class ConformanceTestSuite { public: ConformanceTestSuite() : verbose_(false) {} + void SetVerbose(bool verbose) { verbose_ = verbose; } + // Sets the list of tests that are expected to fail when RunSuite() is called. // RunSuite() will fail unless the set of failing tests is exactly the same // as this list. diff --git a/conformance/conformance_test_runner.cc b/conformance/conformance_test_runner.cc index b56e19cf..780e1c44 100644 --- a/conformance/conformance_test_runner.cc +++ b/conformance/conformance_test_runner.cc @@ -219,12 +219,16 @@ void ParseFailureList(const char *filename, vector<string>* failure_list) { int main(int argc, char *argv[]) { int arg = 1; char *program; - vector<string> failure_list; + google::protobuf::ConformanceTestSuite suite; for (int arg = 1; arg < argc; ++arg) { if (strcmp(argv[arg], "--failure_list") == 0) { if (++arg == argc) UsageError(); + vector<string> failure_list; ParseFailureList(argv[arg], &failure_list); + suite.SetFailureList(failure_list); + } else if (strcmp(argv[arg], "--verbose") == 0) { + suite.SetVerbose(true); } else if (argv[arg][0] == '-') { fprintf(stderr, "Unknown option: %s\n", argv[arg]); UsageError(); @@ -238,8 +242,6 @@ int main(int argc, char *argv[]) { } ForkPipeRunner runner(program); - google::protobuf::ConformanceTestSuite suite; - suite.SetFailureList(failure_list); std::string output; bool ok = suite.RunSuite(&runner, &output); diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt new file mode 100644 index 00000000..35d1ff91 --- /dev/null +++ b/conformance/failure_list_ruby.txt @@ -0,0 +1,17 @@ +JsonInput.HelloWorld.JsonOutput +JsonInput.HelloWorld.ProtobufOutput +ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE +ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32 +ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64 +ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT +ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32 +ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64 +ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES +ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE +ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING +ProtobufInput.PrematureEofInsideUnknownValue.DOUBLE +ProtobufInput.PrematureEofInsideUnknownValue.FIXED32 +ProtobufInput.PrematureEofInsideUnknownValue.FIXED64 +ProtobufInput.PrematureEofInsideUnknownValue.FLOAT +ProtobufInput.PrematureEofInsideUnknownValue.SFIXED32 +ProtobufInput.PrematureEofInsideUnknownValue.SFIXED64 |