62e8f54f71
The repo has consumed packaged gRPC clients (LocalDb.Replication, HistorianGateway.Client) but never compiled a proto locally. This adds the Grpc.Tools toolchain to Commons and a deployment_artifact.proto with a single server-streaming Fetch(deployment_id) -> stream ArtifactChunk RPC, generating both the server base and the client stub (GrpcServices="Both") so central (Host/AdminUI) and the node (Runtime) share one reference. A compile-touch test pins the codegen: it stops compiling if generation regresses. Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW
39 lines
1.3 KiB
C#
39 lines
1.3 KiB
C#
using Shouldly;
|
|
using Xunit;
|
|
using ZB.MOM.WW.OtOpcUa.Commons.Protos.DeploymentArtifact.V1;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Commons.Tests;
|
|
|
|
/// <summary>
|
|
/// A compile-touch test: it exists so that the repo's first locally-compiled proto
|
|
/// (<c>deployment_artifact.proto</c>) is proven to generate both the client stub and the server
|
|
/// base and the message types. If Grpc.Tools codegen regresses, this file stops compiling —
|
|
/// which, under TreatWarningsAsErrors, breaks the build loudly rather than silently.
|
|
/// </summary>
|
|
public class DeploymentArtifactProtoTests
|
|
{
|
|
[Fact]
|
|
public void The_request_message_carries_the_deployment_id()
|
|
{
|
|
var request = new FetchRequest { DeploymentId = "abc" };
|
|
|
|
request.DeploymentId.ShouldBe("abc");
|
|
}
|
|
|
|
[Fact]
|
|
public void The_chunk_message_carries_bytes()
|
|
{
|
|
var chunk = new ArtifactChunk { Data = Google.Protobuf.ByteString.CopyFromUtf8("x") };
|
|
|
|
chunk.Data.Length.ShouldBe(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void The_service_base_and_client_types_generate()
|
|
{
|
|
// Referencing these types is the whole assertion — GrpcServices="Both" must emit both.
|
|
typeof(DeploymentArtifactService.DeploymentArtifactServiceBase).ShouldNotBeNull();
|
|
typeof(DeploymentArtifactService.DeploymentArtifactServiceClient).ShouldNotBeNull();
|
|
}
|
|
}
|