|
@@ -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;
|
|
|
- }
|
|
|
-
|
|
|
- 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);
|
|
|
+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 += "/..";
|
|
|
}
|
|
|
-};
|
|
|
+ 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
|