blob: 159b495e0ae2cb55a08fcd99608b85ec24d0f162 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
namespace Apache.Ignite.Core.Tests
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using NUnit.Framework;
/// <summary>
/// Verifies source files.
/// </summary>
public class ProjectFilesTest
{
/// <summary>
/// Tests that target framework is set correctly.
/// </summary>
[Test]
public void TestCsprojTargetFramework()
{
var projFiles = TestUtils.GetDotNetSourceDir()
.GetFiles("*.csproj", SearchOption.AllDirectories)
.Where(x => !x.FullName.ToLower().Contains("dotnetcore") &&
!x.FullName.Contains("Benchmark") &&
!x.FullName.Contains("templates") &&
!x.FullName.Contains("examples"))
.ToArray();
Assert.GreaterOrEqual(projFiles.Length, 7);
CheckFiles(
projFiles,
x => !x.Contains("<TargetFramework>net461</TargetFramework>") && !x.Contains("<TargetFramework>netstandard2.0</TargetFramework>"),
"Invalid csproj files: ");
}
/// <summary>
/// Tests that release build settings are correct: XML docs are generated.
/// </summary>
[Test]
public void TestCsprojReleaseDocs()
{
CheckFiles(GetReleaseCsprojFiles(), x => !x.Contains("GenerateDocumentationFile"), "Missing XML doc: ");
}
/// <summary>
/// Tests that release build settings are correct: there are no DEBUG/TRACE constants.
/// </summary>
[Test]
public void TestCsprojBuildSettings()
{
CheckFiles(GetReleaseCsprojFiles(), x => GetReleaseSection(x).Contains("DefineConstants"),
"Invalid constants in release mode: ");
}
/// <summary>
/// Tests that there are no public types in Apache.Ignite.Core.Impl namespace.
/// </summary>
[Test]
public void TestImplNamespaceHasNoPublicTypes()
{
var excluded = new[]
{
"ProjectFilesTest.cs",
"CopyOnWriteConcurrentDictionary.cs",
"IgniteArgumentCheck.cs",
"DelegateConverter.cs",
"IgniteHome.cs",
"TypeCaster.cs",
"FutureType.cs",
"CollectionExtensions.cs",
"IQueryEntityInternal.cs",
"ICacheInternal.cs",
"CacheEntry.cs",
"HandleRegistry.cs",
"BinaryObjectHeader.cs"
};
var csFiles = TestUtils.GetDotNetSourceDir().GetFiles("*.cs", SearchOption.AllDirectories);
foreach (var csFile in csFiles)
{
if (excluded.Contains(csFile.Name))
{
continue;
}
var text = File.ReadAllText(csFile.FullName);
if (!text.Contains("namespace Apache.Ignite.Core.Impl"))
{
continue;
}
StringAssert.DoesNotContain("public class", text, csFile.FullName);
StringAssert.DoesNotContain("public static class", text, csFile.FullName);
StringAssert.DoesNotContain("public interface", text, csFile.FullName);
StringAssert.DoesNotContain("public enum", text, csFile.FullName);
StringAssert.DoesNotContain("public struct", text, csFile.FullName);
}
}
/// <summary>
/// Gets the csproj files that go to the release binary package.
/// </summary>
private static IEnumerable<FileInfo> GetReleaseCsprojFiles()
{
return TestUtils.GetDotNetSourceDir().GetFiles("*.csproj", SearchOption.AllDirectories)
.Where(x => x.Name != "Apache.Ignite.csproj" &&
!x.Name.Contains("Test") &&
!x.Name.Contains(".Schema") &&
!x.FullName.Contains("examples") &&
!x.FullName.Contains("templates") &&
!x.Name.Contains("DotNetCore") &&
!x.Name.Contains("Benchmark"));
}
/// <summary>
/// Gets the release section.
/// </summary>
private static string GetReleaseSection(string csproj)
{
return Regex.Match(csproj, @"<PropertyGroup[^>]*Release\|AnyCPU(.*?)<\/PropertyGroup>",
RegexOptions.Singleline).Value;
}
/// <summary>
/// Tests that there are no non-ASCII chars.
/// </summary>
[Test]
public void TestAsciiChars()
{
var allowedFiles = new[]
{
"BinaryStringTest.cs",
"BinarySelfTest.cs",
"CacheDmlQueriesTest.cs",
"CacheTest.cs",
"PartitionAwarenessTest.cs"
};
var srcFiles = TestUtils.GetDotNetSourceDir()
.GetFiles("*.cs", SearchOption.AllDirectories)
.Where(x => !allowedFiles.Contains(x.Name));
CheckFiles(srcFiles, x => x.Any(ch => ch > 255), "Files with non-ASCII chars: ");
}
/// <summary>
/// Checks the files.
/// </summary>
private static void CheckFiles(IEnumerable<FileInfo> files, Func<string, bool> isInvalid, string errorText)
{
var invalidFiles = files.Where(x => isInvalid(File.ReadAllText(x.FullName))).ToArray();
Assert.AreEqual(0, invalidFiles.Length,
errorText + string.Join("\n ", invalidFiles.Select(x => x.FullName)));
}
}
}