xref: /aosp_15_r20/external/grpc-grpc/src/csharp/Grpc.Tools.Tests/ProtoCompileBasicTest.cs (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker #region Copyright notice and license
2*cc02d7e2SAndroid Build Coastguard Worker 
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2018 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker 
17*cc02d7e2SAndroid Build Coastguard Worker #endregion
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker using System.Collections.Generic;
20*cc02d7e2SAndroid Build Coastguard Worker using System.Linq;
21*cc02d7e2SAndroid Build Coastguard Worker using System.Reflection;  // UWYU: Object.GetType() extension.
22*cc02d7e2SAndroid Build Coastguard Worker using Microsoft.Build.Framework;
23*cc02d7e2SAndroid Build Coastguard Worker using Moq;
24*cc02d7e2SAndroid Build Coastguard Worker using NUnit.Framework;
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker namespace Grpc.Tools.Tests
27*cc02d7e2SAndroid Build Coastguard Worker {
28*cc02d7e2SAndroid Build Coastguard Worker     public class ProtoCompileBasicTest
29*cc02d7e2SAndroid Build Coastguard Worker     {
30*cc02d7e2SAndroid Build Coastguard Worker         // Mock task class that stops right before invoking protoc.
31*cc02d7e2SAndroid Build Coastguard Worker         public class ProtoCompileTestable : ProtoCompile
32*cc02d7e2SAndroid Build Coastguard Worker         {
33*cc02d7e2SAndroid Build Coastguard Worker             public string LastPathToTool { get; private set; }
34*cc02d7e2SAndroid Build Coastguard Worker             public string[] LastResponseFile { get; private set; }
35*cc02d7e2SAndroid Build Coastguard Worker             public List<string> StdErrMessages { get; } = new List<string>();
36*cc02d7e2SAndroid Build Coastguard Worker 
ExecuteTool(string pathToTool, string response, string commandLine)37*cc02d7e2SAndroid Build Coastguard Worker             protected override int ExecuteTool(string pathToTool,
38*cc02d7e2SAndroid Build Coastguard Worker                                                string response,
39*cc02d7e2SAndroid Build Coastguard Worker                                                string commandLine)
40*cc02d7e2SAndroid Build Coastguard Worker             {
41*cc02d7e2SAndroid Build Coastguard Worker                 // We should never be using command line commands.
42*cc02d7e2SAndroid Build Coastguard Worker                 Assert.That(commandLine, Is.Null | Is.Empty);
43*cc02d7e2SAndroid Build Coastguard Worker 
44*cc02d7e2SAndroid Build Coastguard Worker                 // Must receive a path to tool
45*cc02d7e2SAndroid Build Coastguard Worker                 Assert.That(pathToTool, Is.Not.Null & Is.Not.Empty);
46*cc02d7e2SAndroid Build Coastguard Worker                 Assert.That(response, Is.Not.Null & Does.EndWith("\n"));
47*cc02d7e2SAndroid Build Coastguard Worker 
48*cc02d7e2SAndroid Build Coastguard Worker                 LastPathToTool = pathToTool;
49*cc02d7e2SAndroid Build Coastguard Worker                 LastResponseFile = response.Remove(response.Length - 1).Split('\n');
50*cc02d7e2SAndroid Build Coastguard Worker 
51*cc02d7e2SAndroid Build Coastguard Worker                 foreach (string message in StdErrMessages)
52*cc02d7e2SAndroid Build Coastguard Worker                 {
53*cc02d7e2SAndroid Build Coastguard Worker                     LogEventsFromTextOutput(message, MessageImportance.High);
54*cc02d7e2SAndroid Build Coastguard Worker                 }
55*cc02d7e2SAndroid Build Coastguard Worker 
56*cc02d7e2SAndroid Build Coastguard Worker                 // Do not run the tool, but pretend it ran successfully.
57*cc02d7e2SAndroid Build Coastguard Worker                 return StdErrMessages.Any() ? -1 : 0;
58*cc02d7e2SAndroid Build Coastguard Worker             }
59*cc02d7e2SAndroid Build Coastguard Worker         };
60*cc02d7e2SAndroid Build Coastguard Worker 
61*cc02d7e2SAndroid Build Coastguard Worker         protected Mock<IBuildEngine> _mockEngine;
62*cc02d7e2SAndroid Build Coastguard Worker         protected ProtoCompileTestable _task;
63*cc02d7e2SAndroid Build Coastguard Worker 
64*cc02d7e2SAndroid Build Coastguard Worker         [SetUp]
SetUp()65*cc02d7e2SAndroid Build Coastguard Worker         public void SetUp()
66*cc02d7e2SAndroid Build Coastguard Worker         {
67*cc02d7e2SAndroid Build Coastguard Worker             _mockEngine = new Mock<IBuildEngine>();
68*cc02d7e2SAndroid Build Coastguard Worker             _task = new ProtoCompileTestable {
69*cc02d7e2SAndroid Build Coastguard Worker                 BuildEngine = _mockEngine.Object
70*cc02d7e2SAndroid Build Coastguard Worker             };
71*cc02d7e2SAndroid Build Coastguard Worker         }
72*cc02d7e2SAndroid Build Coastguard Worker 
73*cc02d7e2SAndroid Build Coastguard Worker         [TestCase("Protobuf")]
74*cc02d7e2SAndroid Build Coastguard Worker         [TestCase("Generator")]
75*cc02d7e2SAndroid Build Coastguard Worker         [TestCase("OutputDir")]
76*cc02d7e2SAndroid Build Coastguard Worker         [Description("We trust MSBuild to initialize these properties.")]
RequiredAttributePresentOnProperty(string prop)77*cc02d7e2SAndroid Build Coastguard Worker         public void RequiredAttributePresentOnProperty(string prop)
78*cc02d7e2SAndroid Build Coastguard Worker         {
79*cc02d7e2SAndroid Build Coastguard Worker             var pinfo = _task.GetType()?.GetProperty(prop);
80*cc02d7e2SAndroid Build Coastguard Worker             Assert.NotNull(pinfo);
81*cc02d7e2SAndroid Build Coastguard Worker             Assert.That(pinfo, Has.Attribute<RequiredAttribute>());
82*cc02d7e2SAndroid Build Coastguard Worker         }
83*cc02d7e2SAndroid Build Coastguard Worker     };
84*cc02d7e2SAndroid Build Coastguard Worker }
85