blob: 24437a77d8e64d245a8263b69f1f641c9d3859f5 [file] [log] [blame]
#region Copyright notice and license
// Copyright 2018 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using NUnit.Framework;
namespace Grpc.Tools.Tests
{
public class DepFileUtilTest
{
[Test]
public void HashString64Hex_IsSane()
{
string hashFoo1 = DepFileUtil.HashString64Hex("foo");
string hashEmpty = DepFileUtil.HashString64Hex("");
string hashFoo2 = DepFileUtil.HashString64Hex("foo");
StringAssert.IsMatch("^[a-f0-9]{16}$", hashFoo1);
Assert.AreEqual(hashFoo1, hashFoo2);
Assert.AreNotEqual(hashFoo1, hashEmpty);
}
[Test]
public void GetDepFilenameForProto_IsSane()
{
StringAssert.IsMatch(@"^out[\\/][a-f0-9]{16}_foo.protodep$",
DepFileUtil.GetDepFilenameForProto("out", "foo.proto"));
StringAssert.IsMatch(@"^[a-f0-9]{16}_foo.protodep$",
DepFileUtil.GetDepFilenameForProto("", "foo.proto"));
}
[Test]
public void GetDepFilenameForProto_HashesDir()
{
string PickHash(string fname) =>
DepFileUtil.GetDepFilenameForProto("", fname).Substring(0, 16);
string same1 = PickHash("dir1/dir2/foo.proto");
string same2 = PickHash("dir1/dir2/proto.foo");
string same3 = PickHash("dir1/dir2/proto");
string same4 = PickHash("dir1/dir2/.proto");
string unsame1 = PickHash("dir2/foo.proto");
string unsame2 = PickHash("/dir2/foo.proto");
Assert.AreEqual(same1, same2);
Assert.AreEqual(same1, same3);
Assert.AreEqual(same1, same4);
Assert.AreNotEqual(same1, unsame1);
Assert.AreNotEqual(unsame1, unsame2);
}
[Test]
public void GetOutputDirWithHash_IsSane()
{
StringAssert.IsMatch(@"^out[\\/][a-f0-9]{16}$",
DepFileUtil.GetOutputDirWithHash("out", "foo.proto"));
StringAssert.IsMatch(@"^[a-f0-9]{16}$",
DepFileUtil.GetOutputDirWithHash("", "foo.proto"));
}
[Test]
public void GetOutputDirWithHash_HashesDir()
{
string PickHash(string fname) => DepFileUtil.GetOutputDirWithHash("", fname);
string same1 = PickHash("dir1/dir2/foo.proto");
string same2 = PickHash("dir1/dir2/proto.foo");
string same3 = PickHash("dir1/dir2/proto");
string same4 = PickHash("dir1/dir2/.proto");
string unsame1 = PickHash("dir2/foo.proto");
string unsame2 = PickHash("/dir2/foo.proto");
Assert.AreEqual(same1, same2);
Assert.AreEqual(same1, same3);
Assert.AreEqual(same1, same4);
Assert.AreNotEqual(same1, unsame1);
Assert.AreNotEqual(unsame1, unsame2);
}
//////////////////////////////////////////////////////////////////////////
// Full file reading tests
// Generated by protoc on Windows. Slashes vary.
const string depFile1 =
@"C:\projects\foo\src\./foo.grpc.pb.cc \
C:\projects\foo\src\./foo.grpc.pb.h \
C:\projects\foo\src\./foo.pb.cc \
C:\projects\foo\src\./foo.pb.h: C:/usr/include/google/protobuf/wrappers.proto\
C:/usr/include/google/protobuf/any.proto\
C:/usr/include/google/protobuf/source_context.proto\
C:/usr/include/google/protobuf/type.proto\
foo.proto";
// This has a nasty output directory with a space.
const string depFile2 =
@"obj\Release x64\net45\/Foo.cs \
obj\Release x64\net45\/FooGrpc.cs: C:/usr/include/google/protobuf/wrappers.proto\
C:/projects/foo/src//foo.proto";
[Test]
public void ReadDependencyInput_FullFile1()
{
string[] deps = ReadDependencyInputFromFileData(depFile1, "foo.proto");
Assert.NotNull(deps);
Assert.That(deps, Has.Length.InRange(4, 5)); // foo.proto may or may not be listed.
Assert.That(deps, Has.One.EndsWith("wrappers.proto"));
Assert.That(deps, Has.One.EndsWith("type.proto"));
Assert.That(deps, Has.None.StartWith(" "));
}
[Test]
public void ReadDependencyInput_FullFile2()
{
string[] deps = ReadDependencyInputFromFileData(depFile2, "C:/projects/foo/src/foo.proto");
Assert.NotNull(deps);
Assert.That(deps, Has.Length.InRange(1, 2));
Assert.That(deps, Has.One.EndsWith("wrappers.proto"));
Assert.That(deps, Has.None.StartWith(" "));
}
[Test]
public void ReadDependencyInput_FullFileUnparsable()
{
string[] deps = ReadDependencyInputFromFileData("a:/foo.proto", "/foo.proto");
Assert.NotNull(deps);
Assert.Zero(deps.Length);
}
private string[] ReadDependencyInputFromFileData(string fileData, string protoName)
{
string randomTempDir = Path.GetTempPath() + '/' + Path.GetRandomFileName();
Directory.CreateDirectory(randomTempDir);
string tempfile = DepFileUtil.GetDepFilenameForProto(randomTempDir, protoName);
try
{
File.WriteAllText(tempfile, fileData);
var mockEng = new Moq.Mock<IBuildEngine>();
var log = new TaskLoggingHelper(mockEng.Object, "x");
return DepFileUtil.ReadDependencyInputs(randomTempDir, protoName, log);
}
finally
{
try
{
File.Delete(tempfile);
}
catch { }
}
}
};
}