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 8a4a95be9f..ac84d3d86f 100644 --- a/src/ProtoGen/ServiceGenerator.cs +++ b/src/ProtoGen/ServiceGenerator.cs @@ -76,7 +76,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("}"); @@ -92,7 +92,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,"); @@ -174,7 +174,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));