Skip to content
This repository was archived by the owner on Jun 1, 2024. It is now read-only.

Commit 81ad889

Browse files
committed
Started on new integration tests project
1 parent ebd06c4 commit 81ad889

20 files changed

+391
-359
lines changed

.editorconfig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ root=true
22

33
[*]
44
indent_style = space
5-
indent_size = 4
5+
indent_size = 4
6+
7+
[*.csproj]
8+
indent_size = 2
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Elastic.Managed.Ephemeral;
2+
using Elastic.Managed.Ephemeral.Plugins;
3+
using Elastic.Xunit;
4+
using Nest;
5+
6+
namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap
7+
{
8+
public abstract class ClientTestClusterBase : XunitClusterBase<ClientTestClusterConfiguration>
9+
{
10+
protected ClientTestClusterBase(ClientTestClusterConfiguration configuration) : base(configuration) { }
11+
12+
public IElasticClient Client => this.GetOrAddClient(s => ConnectionSettings(s));
13+
14+
protected virtual ConnectionSettings ConnectionSettings(ConnectionSettings s) => s;
15+
}
16+
17+
public class ClientTestClusterConfiguration : XunitClusterConfiguration
18+
{
19+
public ClientTestClusterConfiguration(
20+
string elasticsearchVersion,
21+
ClusterFeatures features = ClusterFeatures.None,
22+
int numberOfNodes = 1,
23+
params ElasticsearchPlugin[] plugins
24+
)
25+
: base(elasticsearchVersion, features, new ElasticsearchPlugins(plugins), numberOfNodes)
26+
{
27+
HttpFiddlerAware = true;
28+
CacheEsHomeInstallation = true;
29+
30+
Add(AttributeKey("testingcluster"), "true");
31+
32+
Add($"script.max_compilations_per_minute", "10000", "<6.0.0-rc1");
33+
Add($"script.max_compilations_rate", "10000/1m", ">=6.0.0-rc1");
34+
35+
Add($"script.inline", "true", "<5.5.0");
36+
Add($"script.stored", "true", ">5.0.0-alpha1 <5.5.0");
37+
Add($"script.indexed", "true", "<5.0.0-alpha1");
38+
Add($"script.allowed_types", "inline,stored", ">=5.5.0");
39+
}
40+
}
41+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Diagnostics;
3+
using System.Linq;
4+
using System.Security.Cryptography.X509Certificates;
5+
using Elastic.Managed.Ephemeral;
6+
using Elastic.Xunit;
7+
using Elasticsearch.Net;
8+
using Nest;
9+
10+
namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap
11+
{
12+
public static class EphemeralClusterExtensions
13+
{
14+
private static readonly bool RunningMitmProxy = Process.GetProcessesByName("mitmproxy").Any();
15+
private static readonly bool RunningFiddler = Process.GetProcessesByName("fiddler").Any();
16+
private static string LocalOrProxyHost => RunningFiddler || RunningMitmProxy ? "ipv4.fiddler" : "localhost";
17+
18+
public static ConnectionSettings CreateConnectionSettings<TConfig>(this IEphemeralCluster<TConfig> cluster)
19+
where TConfig : EphemeralClusterConfiguration
20+
{
21+
var clusterNodes = cluster.NodesUris(LocalOrProxyHost);
22+
return new ConnectionSettings(new StaticConnectionPool(clusterNodes));
23+
}
24+
25+
public static IElasticClient GetOrAddClient<TConfig>(
26+
this IEphemeralCluster<TConfig> cluster,
27+
Func<ConnectionSettings, ConnectionSettings> modifySettings = null
28+
)
29+
where TConfig : EphemeralClusterConfiguration
30+
{
31+
modifySettings = modifySettings ?? (s => s);
32+
return cluster.GetOrAddClient(c =>
33+
{
34+
var settings = modifySettings(cluster.CreateConnectionSettings());
35+
36+
var current = (IConnectionConfigurationValues)settings;
37+
var notAlreadyAuthenticated = current.BasicAuthenticationCredentials == null && current.ClientCertificates == null;
38+
var noCertValidation = current.ServerCertificateValidationCallback == null;
39+
40+
if (cluster.ClusterConfiguration.EnableSecurity && notAlreadyAuthenticated)
41+
settings = settings.BasicAuthentication(ClusterAuthentication.Admin.Username, ClusterAuthentication.Admin.Password);
42+
if (cluster.ClusterConfiguration.EnableSsl && noCertValidation)
43+
{
44+
//todo use CA callback instead of allow all
45+
// ReSharper disable once UnusedVariable
46+
var ca = new X509Certificate2(cluster.ClusterConfiguration.FileSystem.CaCertificate);
47+
settings = settings.ServerCertificateValidationCallback(CertificateValidations.AllowAll);
48+
}
49+
var client = new ElasticClient(settings);
50+
return client;
51+
});
52+
}
53+
}
54+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
using System;
2+
using System.Collections.Concurrent;
3+
using System.Collections.Generic;
4+
using System.Diagnostics;
5+
using System.Linq;
6+
using System.Text;
7+
using Elastic.Xunit;
8+
9+
namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap
10+
{
11+
/// <summary> Feeding TestClient.Configuration options to the runner</summary>
12+
public class SerilogSinkElasticsearchXunitRunOptions : ElasticXunitRunOptions
13+
{
14+
public SerilogSinkElasticsearchXunitRunOptions()
15+
{
16+
RunIntegrationTests = true;
17+
RunUnitTests = false;
18+
ClusterFilter = null;
19+
TestFilter = null;
20+
IntegrationTestsMayUseAlreadyRunningNode = false;
21+
}
22+
23+
public override void OnBeforeTestsRun() { }
24+
25+
public override void OnTestsFinished(Dictionary<string, Stopwatch> clusterTotals, ConcurrentBag<Tuple<string, string>> failedCollections)
26+
{
27+
Console.Out.Flush();
28+
DumpClusterTotals(clusterTotals);
29+
DumpFailedCollections(failedCollections);
30+
}
31+
32+
private static void DumpClusterTotals(Dictionary<string, Stopwatch> clusterTotals)
33+
{
34+
Console.WriteLine("--------");
35+
Console.WriteLine("Individual cluster running times:");
36+
foreach (var kv in clusterTotals) Console.WriteLine($"- {kv.Key}: {kv.Value.Elapsed}");
37+
Console.WriteLine("--------");
38+
}
39+
40+
private static void DumpFailedCollections(ConcurrentBag<Tuple<string, string>> failedCollections)
41+
{
42+
if (failedCollections.Count <= 0) return;
43+
44+
Console.ForegroundColor = ConsoleColor.Red;
45+
Console.WriteLine("Failed collections:");
46+
foreach (var t in failedCollections.OrderBy(p => p.Item1).ThenBy(t => t.Item2))
47+
48+
{
49+
var cluster = t.Item1;
50+
Console.WriteLine($" - {cluster}: {t.Item2}");
51+
}
52+
DumpReproduceFilters(failedCollections);
53+
Console.ResetColor();
54+
}
55+
56+
private static void DumpReproduceFilters(ConcurrentBag<Tuple<string, string>> failedCollections)
57+
{
58+
Console.ForegroundColor = ConsoleColor.Yellow;
59+
Console.WriteLine("---Reproduce: -----");
60+
var reproduceLine = ReproduceCommandLine(failedCollections);
61+
Console.WriteLine(reproduceLine);
62+
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TEAMCITY_VERSION")))
63+
Console.WriteLine($"##teamcity[buildProblem description='{reproduceLine}']");
64+
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TF_BUILD")))
65+
{
66+
var count = failedCollections.Count;
67+
Console.WriteLine($"##vso[task.logissue type=error;]{count} test failures");
68+
Console.WriteLine($"##vso[task.logissue type=error;]{reproduceLine}");
69+
}
70+
Console.WriteLine("--------");
71+
}
72+
73+
private static string ReproduceCommandLine(ConcurrentBag<Tuple<string, string>> failedCollections)
74+
{
75+
var sb = new StringBuilder("build.bat ");
76+
77+
if (failedCollections.Count > 0)
78+
{
79+
var clusters = string.Join(",", failedCollections
80+
.Select(c => c.Item1.ToLowerInvariant())
81+
.Distinct());
82+
sb.Append(" \"");
83+
sb.Append(clusters);
84+
sb.Append("\"");
85+
}
86+
87+
if ((failedCollections.Count < 30) && failedCollections.Count > 0)
88+
{
89+
sb.Append(" \"");
90+
var tests = string.Join(",", failedCollections
91+
.OrderBy(t => t.Item2)
92+
.Select(c => c.Item2.ToLowerInvariant()
93+
.Split('.')
94+
.Last()
95+
.Replace("apitests", "")
96+
.Replace("usagetests", "")
97+
.Replace("tests", "")
98+
));
99+
sb.Append(tests);
100+
sb.Append("\"");
101+
}
102+
103+
var reproduceLine = sb.ToString();
104+
return reproduceLine;
105+
}
106+
}
107+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
using Elastic.Xunit;
2+
using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap;
3+
using Xunit;
4+
5+
[assembly: TestFramework("Elastic.Xunit.Sdk.ElasticTestFramework", "Elastic.Xunit")]
6+
[assembly: ElasticXunitConfiguration(typeof(SerilogSinkElasticsearchXunitRunOptions))]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap;
2+
3+
namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Clusters
4+
{
5+
/// <summary>
6+
/// Use this cluster for APIs that do writes. If they are however intrusive or long running consider IntrusiveOperationCluster
7+
/// instead.
8+
/// </summary>
9+
public class Elasticsearch7XCluster : ClientTestClusterBase
10+
{
11+
public Elasticsearch7XCluster() : base(CreateConfiguration()) { }
12+
13+
private static ClientTestClusterConfiguration CreateConfiguration()
14+
{
15+
return new ClientTestClusterConfiguration("7.0.0")
16+
{
17+
MaxConcurrency = 1
18+
};
19+
}
20+
21+
protected override void SeedCluster() { }
22+
}
23+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System.Linq;
2+
using Elastic.Managed.Ephemeral;
3+
using Elastic.Xunit;
4+
using Elastic.Xunit.XunitPlumbing;
5+
using FluentAssertions;
6+
using Nest;
7+
using Serilog.Core;
8+
using Serilog.Sinks.Elasticsearch.IntegrationTests.Clusters;
9+
using Xunit;
10+
11+
namespace Serilog.Sinks.Elasticsearch.IntegrationTests
12+
{
13+
public class Elasticsearch7XSetup
14+
{
15+
public const string IndexPrefix = "logs-7x-";
16+
public const string TemplateName = "serilog-logs-7x";
17+
public Elasticsearch7XSetup()
18+
{
19+
var loggerConfig = new LoggerConfiguration()
20+
.MinimumLevel.Information()
21+
.WriteTo.ColoredConsole()
22+
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions
23+
{
24+
25+
IndexFormat = IndexPrefix + "{0:yyyy.MM.dd}",
26+
TemplateName = TemplateName,
27+
AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
28+
AutoRegisterTemplate = true
29+
});
30+
var logger = loggerConfig.CreateLogger();
31+
32+
logger.Information("Hello Information");
33+
logger.Debug("Hello Debug");
34+
logger.Warning("Hello Warning");
35+
logger.Error("Hello Error");
36+
logger.Fatal("Hello Fatal");
37+
38+
logger.Dispose();
39+
}
40+
41+
}
42+
43+
44+
public class Elasticsearch7X : IClusterFixture<Elasticsearch7XCluster>, IClassFixture<Elasticsearch7XSetup>
45+
{
46+
private readonly Elasticsearch7XCluster _cluster;
47+
private IElasticClient _client;
48+
49+
public Elasticsearch7X(Elasticsearch7XCluster cluster, Elasticsearch7XSetup setup)
50+
{
51+
_cluster = cluster;
52+
_client = cluster.Client;
53+
}
54+
55+
56+
[I] public void AssertTemplate()
57+
{
58+
var templateResponse = _client.Indices.GetTemplate(Elasticsearch7XSetup.TemplateName);
59+
templateResponse.TemplateMappings.Should().NotBeEmpty();
60+
templateResponse.TemplateMappings.Keys.Should().Contain(Elasticsearch7XSetup.TemplateName);
61+
62+
var template = templateResponse.TemplateMappings[Elasticsearch7XSetup.TemplateName];
63+
64+
template.IndexPatterns.Should().Contain(pattern => pattern.StartsWith(Elasticsearch7XSetup.IndexPrefix));
65+
66+
}
67+
[I] public void AssertLogs()
68+
{
69+
var refreshed = _client.Indices.Refresh(Elasticsearch7XSetup.IndexPrefix + "*");
70+
71+
var search = _client.Search<object>(s => s.Index(Elasticsearch7XSetup.IndexPrefix + "*"));
72+
73+
// Informational should be filtered
74+
search.Documents.Count().Should().Be(4);
75+
76+
77+
}
78+
}
79+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project Sdk="Microsoft.NET.Sdk">
3+
<PropertyGroup>
4+
<TargetFrameworks>netcoreapp2.1;net461</TargetFrameworks>
5+
<NoWarn>$(NoWarn);xUnit1013</NoWarn>
6+
<DebugSymbols>True</DebugSymbols>
7+
<LangVersion>latest</LangVersion>
8+
<IsTestProject>True</IsTestProject>
9+
</PropertyGroup>
10+
<ItemGroup>
11+
<ProjectReference Include="..\src\Serilog.Sinks.Elasticsearch\Serilog.Sinks.Elasticsearch.csproj" />
12+
</ItemGroup>
13+
<ItemGroup>
14+
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
15+
16+
<PackageReference Include="xunit" Version="2.3.1" />
17+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
18+
<PackageReference Include="xunit.extensibility.execution" Version="2.3.1" />
19+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
20+
<PackageReference Include="Elastic.Managed" Version="0.1.0-ci20190627T121416" />
21+
<PackageReference Include="Elastic.Xunit" Version="0.1.0-ci20190627T121416" />
22+
<PackageReference Include="FluentAssertions" Version="5.7.0" />
23+
<PackageReference Include="NEST" Version="7.0.0" />
24+
<PackageReference Include="Serilog.Sinks.ColoredConsole" Version="3.0.1" />
25+
</ItemGroup>
26+
</Project>

serilog-sinks-elasticsearch.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Serilog.Sinks.Elasticsearch
2424
EndProject
2525
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Serilog.Formatting.Elasticsearch", "src\Serilog.Formatting.Elasticsearch\Serilog.Formatting.Elasticsearch.csproj", "{0E6D34BF-322A-4803-94D1-355F6D5024BE}"
2626
EndProject
27+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serilog.Sinks.Elasticsearch.IntegrationTests", "Serilog.Sinks.Elasticsearch.IntegrationTests\Serilog.Sinks.Elasticsearch.IntegrationTests.csproj", "{23BC3821-E028-48B4-8F2C-83BB1B8B5525}"
28+
EndProject
2729
Global
2830
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2931
Debug|Any CPU = Debug|Any CPU
@@ -46,6 +48,10 @@ Global
4648
{0E6D34BF-322A-4803-94D1-355F6D5024BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
4749
{0E6D34BF-322A-4803-94D1-355F6D5024BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
4850
{0E6D34BF-322A-4803-94D1-355F6D5024BE}.Release|Any CPU.Build.0 = Release|Any CPU
51+
{23BC3821-E028-48B4-8F2C-83BB1B8B5525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
52+
{23BC3821-E028-48B4-8F2C-83BB1B8B5525}.Debug|Any CPU.Build.0 = Debug|Any CPU
53+
{23BC3821-E028-48B4-8F2C-83BB1B8B5525}.Release|Any CPU.ActiveCfg = Release|Any CPU
54+
{23BC3821-E028-48B4-8F2C-83BB1B8B5525}.Release|Any CPU.Build.0 = Release|Any CPU
4955
EndGlobalSection
5056
GlobalSection(SolutionProperties) = preSolution
5157
HideSolutionNode = FALSE
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Elasticsearch/@EntryIndexedValue">True</s:Boolean>
3+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Serilog/@EntryIndexedValue">True</s:Boolean>
4+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Xunit/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

src/Serilog.Sinks.Elasticsearch/Serilog.Sinks.ElasticSearch.Symbols.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<tags>serilog logging elasticsearch</tags>
1313
<dependencies>
1414
<dependency id="Serilog" version="2.6.0" />
15-
<dependency id="Elasticsearch.Net" version="6.0.0" />
15+
<dependency id="Elasticsearch.Net" version="7.0.0" />
1616
<dependency id="Serilog.Sinks.File" version="4.0.0" />
1717
<dependency id="Serilog.Sinks.PeriodicBatching" version="2.1.1" />
1818
<dependency id="Serilog.Sinks.RollingFile" version="3.3.0" />

src/Serilog.Sinks.Elasticsearch/Serilog.Sinks.ElasticSearch.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<tags>serilog logging elasticsearch</tags>
1414
<dependencies>
1515
<dependency id="Serilog" version="2.6.0" />
16-
<dependency id="Elasticsearch.Net" version="6.0.0" />
16+
<dependency id="Elasticsearch.Net" version="7.0.0" />
1717
<dependency id="Serilog.Sinks.File" version="4.0.0" />
1818
<dependency id="Serilog.Sinks.PeriodicBatching" version="2.1.1" />
1919
<dependency id="Serilog.Sinks.RollingFile" version="3.3.0" />

0 commit comments

Comments
 (0)