Fix golden-file Ruby test to work with out-of-tree builds.

This commit is contained in:
Chris Fallin 2015-01-14 16:45:47 -08:00
parent 3f3820d8f8
commit b0670ddae7
2 changed files with 41 additions and 34 deletions

View File

@ -245,6 +245,7 @@ ruby_EXTRA_DIST= \
ruby/ext/google/protobuf_c/defs.c \
ruby/ext/google/protobuf_c/encode_decode.c \
ruby/ext/google/protobuf_c/extconf.rb \
ruby/ext/google/protobuf_c/map.c \
ruby/ext/google/protobuf_c/message.c \
ruby/ext/google/protobuf_c/protobuf.c \
ruby/ext/google/protobuf_c/protobuf.h \
@ -255,7 +256,10 @@ ruby_EXTRA_DIST= \
ruby/google-protobuf.gemspec \
ruby/lib/google/protobuf.rb \
ruby/tests/basic.rb \
ruby/tests/stress.rb
ruby/tests/stress.rb \
ruby/tests/generated_code.proto \
ruby/tests/generated_code.rb \
ruby/tests/generated_code_test.rb
all_EXTRA_DIST=$(java_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST)

View File

@ -42,33 +42,22 @@
namespace google {
namespace protobuf {
namespace compiler {
namespace python {
namespace ruby {
namespace {
class TestGenerator : public CodeGenerator {
public:
TestGenerator() {}
~TestGenerator() {}
virtual bool Generate(const FileDescriptor* file,
const string& parameter,
GeneratorContext* context,
string* error) const {
TryInsert("test_pb2.py", "imports", context);
TryInsert("test_pb2.py", "module_scope", context);
TryInsert("test_pb2.py", "class_scope:foo.Bar", context);
TryInsert("test_pb2.py", "class_scope:foo.Bar.Baz", context);
return true;
string FindRubyTestDir() {
// Inspired by TestSourceDir() in src/google/protobuf/testing/googletest.cc.
string prefix = ".";
while (!File::Exists(prefix + "/ruby/tests")) {
if (!File::Exists(prefix)) {
GOOGLE_LOG(FATAL)
<< "Could not find Ruby test directory. Please run tests from "
"somewhere within the protobuf source package.";
}
prefix += "/..";
}
void TryInsert(const string& filename, const string& insertion_point,
GeneratorContext* context) const {
google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(
context->OpenForInsert(filename, insertion_point));
io::Printer printer(output.get(), '$');
printer.Print("// inserted $name$\n", "name", insertion_point);
}
};
return prefix + "/ruby/tests";
}
// This test is a simple golden-file test over the output of the Ruby code
// generator. When we make changes to the Ruby extension and alter the Ruby code
@ -78,39 +67,53 @@ class TestGenerator : public CodeGenerator {
// extensions to the point where we can do this test in a more automated way.
TEST(RubyGeneratorTest, GeneratorTest) {
string ruby_tests = FindRubyTestDir();
google::protobuf::compiler::CommandLineInterface cli;
cli.SetInputsAreProtoPathRelative(true);
ruby::Generator ruby_generator;
cli.RegisterGenerator("--ruby_out", &ruby_generator, "");
string path_arg = "-I" + TestSourceDir() + "/ruby/tests";
// Copy generated_code.proto to the temporary test directory.
string test_input;
GOOGLE_CHECK_OK(File::GetContents(
ruby_tests + "/generated_code.proto",
&test_input,
true));
GOOGLE_CHECK_OK(File::SetContents(
TestTempDir() + "/generated_code.proto",
test_input,
true));
// Invoke the proto compiler (we will be inside TestTempDir() at this point).
string ruby_out = "--ruby_out=" + TestTempDir();
string proto_path = "--proto_path=" + TestTempDir();
const char* argv[] = {
"protoc",
path_arg.c_str(),
ruby_out.c_str(),
proto_path.c_str(),
"generated_code.proto",
};
EXPECT_EQ(0, cli.Run(4, argv));
// Load the generated output and compare to the expected result.
string output;
GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/generated_code.rb",
&output,
true));
GOOGLE_CHECK_OK(File::GetContents(
TestTempDir() + "/generated_code.rb",
&output,
true));
string expected_output;
GOOGLE_CHECK_OK(File::GetContents(
TestSourceDir() + "/ruby/tests/generated_code.rb",
ruby_tests + "/generated_code.rb",
&expected_output,
true));
EXPECT_EQ(expected_output, output);
}
} // namespace
} // namespace python
} // namespace ruby
} // namespace compiler
} // namespace protobuf
} // namespace google