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