blob: e890b9d9a0da0a83980d2043c1023dafa69f640a [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.Examples
{
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using NUnit.Framework;
/// <summary>
/// Tests project files.
/// </summary>
public class ProjectFilesTest
{
/** */
private const string WorkspaceFolder = "${workspaceFolder}";
/** */
private static readonly Example[] Examples = Example.AllExamples;
/** */
private static readonly string ExamplesSlnText = File.ReadAllText(ExamplePaths.SlnFile);
/** */
private static readonly string LaunchJsonText = File.ReadAllText(ExamplePaths.LaunchJsonFile);
/** */
private static readonly string TargetFramework = ExamplePaths.GetTargetFramework(ExamplePaths.SharedProjFile);
/** */
private static readonly string[] ThickOnlyExamples = {
"NearCache", "DataStreamer", "MultiTieredCache", "QueryFullText", "Store", "EntryProcessor",
"TransactionDeadlockDetection", "Func", "PeerAssemblyLoading", "Task", "AtomicLong",
"AtomicReference", "AtomicSequence", "ClientReconnect", "Events", "Lifecycle", "Messaging"
};
/// <summary>
/// Checks csproj files.
/// </summary>
[Test, TestCaseSource(nameof(Examples))]
public void TestCsprojFiles(Example example)
{
Assert.IsTrue(File.Exists(example.ProjectFile), $"File.Exists({example.ProjectFile})");
var text = File.ReadAllText(example.ProjectFile);
StringAssert.Contains("<OutputType>Exe</OutputType>", text);
StringAssert.Contains($"<TargetFramework>{TargetFramework}</TargetFramework>", text);
StringAssert.Contains("<ProjectReference Include=\"..\\..\\..\\Shared\\Shared.csproj", text);
StringAssert.Contains($"{example.Name}.csproj", ExamplesSlnText);
StringAssert.Contains($"{example.Name}.dll", LaunchJsonText);
StringAssert.DoesNotContain("TODO", example.SourceCode);
StringAssert.DoesNotContain("STAThread", example.SourceCode);
StringAssert.Contains("public static class Program", example.SourceCode);
StringAssert.Contains("public static void Main()", example.SourceCode);
var expectedRootNamespace = example.ProjectFile
.Replace(ExamplePaths.SourcesPath, string.Empty)
.Replace(Path.DirectorySeparatorChar, '.')
.Replace("." + Path.GetFileName(example.ProjectFile), string.Empty);
StringAssert.Contains($"<RootNamespace>Apache.Ignite.Examples{expectedRootNamespace}</RootNamespace>", text);
if (!example.IsThin && !ThickOnlyExamples.Contains(example.Name))
{
var thinCounterpart = example.Name + "Thin";
Assert.IsTrue(
Examples.Any(e => e.Name == thinCounterpart),
$"Missing thin client example: {thinCounterpart}");
}
}
/// <summary>
/// Checks VS Code files.
/// </summary>
[Test]
public void TestVsCodeFiles()
{
var tasksText = File.ReadAllText(ExamplePaths.TasksJsonFile);
StringAssert.Contains(Path.GetFileName(ExamplePaths.SlnFile), tasksText);
var configsCount = Regex.Matches(LaunchJsonText, "\"name\":").Count;
var expectedCount = Example.AllExamples.Length + 1; // +1 for ServerNode project
Assert.AreEqual(expectedCount, configsCount);
}
/// <summary>
/// Updates launch.json with all examples.
/// <para />
/// Run this test to update the file when necessary.
/// This test is not won't be run automatically because of <see cref="ExplicitAttribute"/>.
/// </summary>
[Test]
[Explicit]
public void UpdateLaunchJson()
{
var launch = new Launch
{
Configurations = Example.AllProjects.Select(e => new LaunchConfig
{
Name = e.Name,
Program = e.AssemblyFile.Replace(ExamplePaths.SourcesPath, WorkspaceFolder),
Cwd = Path.GetDirectoryName(e.ProjectFile).Replace(ExamplePaths.SourcesPath, WorkspaceFolder)
}).ToArray()
};
var json = JsonConvert.SerializeObject(launch, Formatting.Indented, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
File.WriteAllText(ExamplePaths.LaunchJsonFile, json);
}
// ReSharper disable UnusedMember.Local
// ReSharper disable UnusedAutoPropertyAccessor.Local
/** launch.json */
private class Launch
{
/** */
public string Version { get; set; } = "0.2.0";
/** */
public LaunchConfig[] Configurations { get; set; }
}
/** launch.json configuration */
private class LaunchConfig
{
/** */
public string Name { get; set; }
/** */
public string Type { get; set; } = "coreclr";
/** */
public string Request { get; set; } = "launch";
/** */
public string PreLaunchTask { get; set; } = "build";
/** */
public string Program { get; set; } = string.Empty;
/** */
public string[] Args { get; set; } = Array.Empty<string>();
/** */
public string Cwd { get; set; } = "${workspaceFolder}/Thin/Cache/PutGet";
/** */
public string Console { get; set; } = "externalTerminal"; // Or "integratedTerminal"
/** */
public bool StopAtEntry { get; set; }
}
}
}