From d4b3859b34d5422b53075179f0c9150ff70609b0 Mon Sep 17 00:00:00 2001 From: Nathan Brown Date: Tue, 2 Aug 2011 18:04:54 -0700 Subject: [PATCH] Added tests for service generation and corrected internal access level error in service definition. --- src/ProtoGen.Test/TestPreprocessing.cs | 86 ++++++++++++++++++++++++++ src/ProtoGen/ServiceGenerator.cs | 7 ++- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/src/ProtoGen.Test/TestPreprocessing.cs b/src/ProtoGen.Test/TestPreprocessing.cs index af1d22ab97..4a57b3b5f8 100644 --- a/src/ProtoGen.Test/TestPreprocessing.cs +++ b/src/ProtoGen.Test/TestPreprocessing.cs @@ -673,5 +673,91 @@ message MyMessageList { a.GetType("nunit.simple.Proto.MyMessageList", true, true); } } + + [Test] + public void TestProtoFileWithService() + { + string test = new StackFrame(false).GetMethod().Name; + Setup(); + using (TempFile source = TempFile.Attach(test + ".cs")) + using (ProtoFile proto = new ProtoFile(test + ".proto", +@" +import ""google/protobuf/csharp_options.proto""; +option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; + +package nunit.simple; +// Test a very simple message. +message MyMessage { + optional string name = 1; +} +// test a very simple service. +service TestService { + rpc Execute (MyMessage) returns (MyMessage); +}")) + { + CopyInGoogleProtoFiles(); + + RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false"); + Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); + + Assembly a = RunCsc(0, source.TempPath); + //assert that the service type is in the expected namespace + Type t1 = a.GetType("nunit.simple.TestService", true, true); + Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); + Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); + //assert that the Stub subclass type is in the expected namespace + Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); + Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); + Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); + } + } + + [Test] + public void TestProtoFileWithServiceInternal() + { + string test = new StackFrame(false).GetMethod().Name; + Setup(); + using (TempFile source = TempFile.Attach(test + ".cs")) + using (ProtoFile proto = new ProtoFile(test + ".proto", +@" +import ""google/protobuf/csharp_options.proto""; +option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; + +package nunit.simple; +// Test a very simple message. +message MyMessage { + optional string name = 1; +} +// test a very simple service. +service TestService { + rpc Execute (MyMessage) returns (MyMessage); +}")) + { + CopyInGoogleProtoFiles(); + + RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false", "-public_classes=false"); + Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); + + Assembly a = RunCsc(0, source.TempPath); + //assert that the service type is in the expected namespace + Type t1 = a.GetType("nunit.simple.TestService", true, true); + Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); + Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); + //assert that the Stub subclass type is in the expected namespace + Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); + Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); + Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); + } + } + + private static void CopyInGoogleProtoFiles() + { + string google = Path.Combine(TempPath, "google\\protobuf"); + Directory.CreateDirectory(google); + foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) + { + File.Copy(file, Path.Combine(google, Path.GetFileName(file))); + } + } } } \ No newline at end of file diff --git a/src/ProtoGen/ServiceGenerator.cs b/src/ProtoGen/ServiceGenerator.cs index 2c3e616778..427fb372c4 100644 --- a/src/ProtoGen/ServiceGenerator.cs +++ b/src/ProtoGen/ServiceGenerator.cs @@ -75,7 +75,7 @@ namespace Google.ProtocolBuffers.ProtoGen DescriptorUtil.GetQualifiedUmbrellaClassName(Descriptor.File.CSharpOptions), Descriptor.Index); writer.WriteLine("}"); - writer.WriteLine("{0} pbd::ServiceDescriptor DescriptorForType {{", ClassAccessLevel); + writer.WriteLine("public pbd::ServiceDescriptor DescriptorForType {"); writer.WriteLine(" get { return Descriptor; }"); writer.WriteLine("}"); @@ -91,7 +91,7 @@ namespace Google.ProtocolBuffers.ProtoGen private void GenerateCallMethod(TextGenerator writer) { writer.WriteLine(); - writer.WriteLine("public void CallMethod(", ClassAccessLevel); + writer.WriteLine("public void CallMethod("); writer.WriteLine(" pbd::MethodDescriptor method,"); writer.WriteLine(" pb::IRpcController controller,"); writer.WriteLine(" pb::IMessage request,"); @@ -172,7 +172,8 @@ namespace Google.ProtocolBuffers.ProtoGen foreach (MethodDescriptor method in Descriptor.Methods) { writer.WriteLine(); - writer.WriteLine("public override void {0}(", NameHelpers.UnderscoresToPascalCase(method.Name)); + writer.WriteLine("{0} override void {1}(", ClassAccessLevel, + NameHelpers.UnderscoresToPascalCase(method.Name)); writer.WriteLine(" pb::IRpcController controller,"); writer.WriteLine(" {0} request,", GetClassName(method.InputType)); writer.WriteLine(" global::System.Action<{0}> done) {{", GetClassName(method.OutputType));