Skip to content

Commit

Permalink
Fix for when proto package name contains dot(s) (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH authored Mar 6, 2024
1 parent ca3a2ec commit 3a20201
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 22 deletions.
25 changes: 10 additions & 15 deletions src/ProtoBufJsonConverter/Extensions/FileDescriptorSetExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,19 @@ internal static class FileDescriptorSetExtensions
{
internal static string GetInputTypeFromMessageType(this FileDescriptorSet set, string messageType)
{
var parts = messageType.Split('.');

string packageName;
string typeName;
switch (parts.Length)
{
case 2:
packageName = parts[0];
typeName = parts[1];
break;

case 1:
packageName = string.Empty;
typeName = parts[0];
break;

default:
throw new ArgumentException($"The type '{messageType}' is not valid.");
var lastDotIndex = messageType.LastIndexOf('.');
if (lastDotIndex == -1)
{
packageName = string.Empty;
typeName = messageType;
}
else
{
packageName = messageType.Substring(0, lastDotIndex);
typeName = messageType.Substring(lastDotIndex + 1);
}

var fileDescriptorProto = set.Files.FirstOrDefault(f => f.Package == packageName);
Expand Down
2 changes: 1 addition & 1 deletion src/ProtoBufJsonConverter/ProtoBufJsonConverter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<Version>0.2.0</Version>
<TargetFrameworks>net462;netstandard2.0;netstandard2.1;net6.0</TargetFrameworks>
<TargetFrameworks>net462;netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
Expand Down
77 changes: 71 additions & 6 deletions test/ProtoBufJsonConverterTests/ConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,25 @@ namespace ProtoBufJsonConverterTests;

public class ConverterTests
{
private const string ProtoDefinitionNoPackage = @"
syntax = ""proto3"";
service Greeter
{
rpc SayHello (HelloRequest) returns(HelloReply);
}
message HelloRequest
{
string name = 1;
}
message HelloReply
{
string message = 1;
}
";

private const string ProtoDefinition = @"
syntax = ""proto3"";
Expand All @@ -21,6 +40,48 @@ message HelloRequest
string name = 1;
}
message HelloReply
{
string message = 1;
}
";

private const string ProtoDefinitionWithDotInPackage = @"
syntax = ""proto3"";
package greet.foo;
service Greeter
{
rpc SayHello (HelloRequest) returns(HelloReply);
}
message HelloRequest
{
string name = 1;
}
message HelloReply
{
string message = 1;
}
";

private const string ProtoDefinitionWithDotsInPackage = @"
syntax = ""proto3"";
package greet.foo.bar;
service Greeter
{
rpc SayHello (HelloRequest) returns(HelloReply);
}
message HelloRequest
{
string name = 1;
}
message HelloReply
{
string message = 1;
Expand All @@ -35,16 +96,20 @@ public ConverterTests()
}

[Theory]
[InlineData("AAAAAAYKBHN0ZWY=")]
[InlineData("CgRzdGVm")]
public async Task ConvertAsync_ConvertToJsonRequest_SkipGrpcHeader_IsTrue(string data)
[InlineData("AAAAAAYKBHN0ZWY=", ProtoDefinitionNoPackage, "HelloRequest")]
[InlineData("CgRzdGVm", ProtoDefinitionNoPackage, "HelloRequest")]
[InlineData("AAAAAAYKBHN0ZWY=", ProtoDefinition, "greet.HelloRequest")]
[InlineData("CgRzdGVm", ProtoDefinition, "greet.HelloRequest")]
[InlineData("AAAAAAYKBHN0ZWY=", ProtoDefinitionWithDotInPackage, "greet.foo.HelloRequest")]
[InlineData("CgRzdGVm", ProtoDefinitionWithDotInPackage, "greet.foo.HelloRequest")]
[InlineData("AAAAAAYKBHN0ZWY=", ProtoDefinitionWithDotsInPackage, "greet.foo.bar.HelloRequest")]
[InlineData("CgRzdGVm", ProtoDefinitionWithDotsInPackage, "greet.foo.bar.HelloRequest")]
public async Task ConvertAsync_ConvertToJsonRequest_SkipGrpcHeader_IsTrue(string data, string protoDefinition, string messageType)
{
// Arrange
const string messageType = "greet.HelloRequest";

var bytes = Convert.FromBase64String(data);

var request = new ConvertToJsonRequest(ProtoDefinition, messageType, bytes);
var request = new ConvertToJsonRequest(protoDefinition, messageType, bytes);

// Act
var json = await _sut.ConvertAsync(request).ConfigureAwait(false);
Expand Down

0 comments on commit 3a20201

Please sign in to comment.