2017-12-29 22 views
0

Ich bin neu in scalapb und protobuf.Unbekannte Felder in proto von scalapb erzeugt

Ich versuche, Unit-Test für meine scalapb der Generatoren zu schaffen. Ich habe Proto-Dateien erstellt und versuche, sie in Tests zu verwenden.

ich diese Proto-Datei haben:

syntax = "proto3"; 

package hellogrpc.calc; 

import "google/api/annotations.proto"; 

option (scalapb.options) = { 
    flat_package: true 
}; 

service CalcService { 

    rpc CalcSum (SumRequest) returns (CalcResponse) { 
     option (google.api.http) = { 
      post: "/calcService/sum" 
      body: "*" 
     }; 
    } 

} 

Es gibt Verfahren CalcSum die

kommentiert wird und proto-Datei generiert entsprechen:

// Generated by the Scala Plugin for the Protocol Buffer Compiler. 
// Do not edit! 
// 
// Protofile syntax: PROTO3 

package hellogrpc.calc 



object CalcServiceProto extends _root_.com.trueaccord.scalapb.GeneratedFileObject { 
    lazy val dependencies: Seq[_root_.com.trueaccord.scalapb.GeneratedFileObject] = Seq(
    com.trueaccord.scalapb.scalapb.ScalapbProto, 
    com.google.api.annotations.AnnotationsProto 
) 
    lazy val messagesCompanions: Seq[_root_.com.trueaccord.scalapb.GeneratedMessageCompanion[_]] = Seq(
    hellogrpc.calc.SumRequest, 
    hellogrpc.calc.CalcResponse 
) 
    private lazy val ProtoBytes: Array[Byte] = 
     com.trueaccord.scalapb.Encoding.fromBase64(scala.collection.Seq(
    """ChtoZWxsb2dycGMvQ2FsY1NlcnZpY2UucHJvdG8SDmhlbGxvZ3JwYy5jYWxjGhVzY2FsYXBiL3NjYWxhcGIucHJvdG8aHGdvb 
    2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8iKAoKU3VtUmVxdWVzdBIMCgFhGAEgASgFUgFhEgwKAWIYAiABKAVSAWIiJgoMQ2FsY 
    1Jlc3BvbnNlEhYKBnJlc3VsdBgBIAEoBVIGcmVzdWx0Mm8KC0NhbGNTZXJ2aWNlEmAKB0NhbGNTdW0SGi5oZWxsb2dycGMuY2FsY 
    y5TdW1SZXF1ZXN0GhwuaGVsbG9ncnBjLmNhbGMuQ2FsY1Jlc3BvbnNlIhuC0+STAhUiEC9jYWxjU2VydmljZS9zdW06ASpCBeI/A 
    hABYgZwcm90bzM=""" 
    ).mkString) 
    lazy val scalaDescriptor: _root_.scalapb.descriptors.FileDescriptor = { 
    val scalaProto = com.google.protobuf.descriptor.FileDescriptorProto.parseFrom(ProtoBytes) 
    _root_.scalapb.descriptors.FileDescriptor.buildFrom(scalaProto, dependencies.map(_.scalaDescriptor)) 
    } 
    lazy val javaDescriptor: com.google.protobuf.Descriptors.FileDescriptor = { 
    val javaProto = com.google.protobuf.DescriptorProtos.FileDescriptorProto.parseFrom(ProtoBytes) 
    com.google.protobuf.Descriptors.FileDescriptor.buildFrom(javaProto, Array(
     com.trueaccord.scalapb.scalapb.ScalapbProto.javaDescriptor, 
     com.google.api.annotations.AnnotationsProto.javaDescriptor 
    )) 
    } 
    @deprecated("Use javaDescriptor instead. In a future version this will refer to scalaDescriptor.", "ScalaPB 0.5.47") 
    def de 
```scriptor: com.google.protobuf.Descriptors.FileDescriptor = javaDescriptor 
} 

ich inspizieren CalcServiceProto.javaDescriptor in intellj Idee:

enter image description here

Methodenbeschreiber hat diese Proto-Definition:

name: "CalcSum" 
input_type: ".hellogrpc.calc.SumRequest" 
output_type: ".hellogrpc.calc.CalcResponse" 
options { 
    72295728: "\"\020/calcService/sum:\001*" 
} 

Aber Generator funktioniert gut! Ich debuggen Generator, ein- und Haltepunkt für Generator und Verfahren CalcSum hat diese Proto-Definition:

name: "CalcSum" 
input_type: ".hellogrpc.calc.SumRequest" 
output_type: ".hellogrpc.calc.CalcResponse" 
options { 
    [google.api.http] { 
    post: "/calcService/sum" 
    body: "*" 
    } 
} 

Vielleicht funktioniert das anders, weil ich nicht Erweiterungen registrieren wie Generator tun.

Jede Art und Weise i Dieser Test soll übergeben werden:

val s = CalcServiceProto.javaDescriptor.getServices.get(0) 

    val m = s.getMethods.get(0) 

    m.getOptions.getExtension(AnnotationsProto.http).getPost shouldBe "/calcService/sum" 

Antwort

1

Wenn Sie Java-Erweiterungen müssen verfügbar Sie sein müssen Sie Ihren Code mit Java Konvertierungen aktiviert erzeugen. Dadurch wird JavaDescriptor auf die offizielle Java-Implementierung angewiesen und Ihr Test wird bestanden.

Wenn Java-Konvertierungen deaktiviert sind, analysiert ScalaPB den Deskriptor, kann jedoch nicht garantieren, dass die Java-Erweiterungen sogar kompiliert werden, sodass sie nicht registriert werden.

Was Ich mag würde haben, ist, dass die Scala-Deskriptoren in diesem Fall funktionieren würde, aber sie sind noch nicht Dienste und Methoden zu unterstützen. Ich habe https://github.com/scalapb/ScalaPB/issues/382 abgelegt, um den Fortschritt zu verfolgen.

In der Zwischenzeit, wie ich oben geschrieben habe, können Sie Java-Konvertierungen können ScalaPB zwingen Sie die Java-Descriptor zu liefern. In Ihrem build.sbt, haben:

+0

Ich habe Java-Konvertierungen aktiviert, wie Sie sagten, jetzt funktioniert es! Vielen Dank –

Verwandte Themen