Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests: Skip testing deprecated non-async client methods in latest Elastic.Clients.Elasticsearch versions #2569

Merged
merged 5 commits into from
Jun 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
// Copyright 2020 New Relic, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

// Non-async client methods are deprecated in the latest Elastic.Clients.Elasticsearch
#if !NET481_OR_GREATER && !NET8_0_OR_GREATER
#define SYNC_METHODS_OK
#endif

using System;
using System.Collections.Generic;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.Core.MSearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using Elastic.Transport;
using NewRelic.Agent.IntegrationTests.Shared;


namespace MultiFunctionApplicationHelpers.NetStandardLibraries.Elasticsearch
{
internal class ElasticsearchElasticClient : ElasticsearchTestClient
{
private ElasticsearchClient _client;

private const string NonAsyncDeprecationMessage = "Non-async methods are deprecated in the latest Elasticsearch clients.";

protected override Uri Address
{
get
Expand All @@ -41,7 +47,7 @@ protected override string Password
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void Connect()
public override async Task ConnectAsync()
{
var settings = new ElasticsearchClientSettings(Address)
.Authentication(new BasicAuthentication(Username, Password)).
Expand All @@ -51,23 +57,23 @@ public override void Connect()

// This isn't necessary but will log the response, which can help troubleshoot if
// you're having connection errors
#pragma warning disable CS0618 // obsolete usage is ok here
_client.Ping();
#pragma warning restore CS0618
_ = await _client.PingAsync();
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void Index()
{
#if SYNC_METHODS_OK
var record = FlightRecord.GetSample();
#pragma warning disable CS0618 // Type or member is obsolete
var response = _client.Index(record, (IndexName)IndexName);
#pragma warning restore CS0618 // Type or member is obsolete

if (!response.IsSuccess())
{
throw new Exception($"Response was not successful. {response.ElasticsearchServerError}");
}
#else
throw new NotImplementedException(NonAsyncDeprecationMessage);
#endif
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand All @@ -86,7 +92,7 @@ public override async Task<bool> IndexAsync()
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void Search()
{
#pragma warning disable CS0618 // obsolete usage is ok here
#if SYNC_METHODS_OK
var response = _client.Search<FlightRecord>(s => s
.Index(IndexName)
.From(0)
Expand All @@ -97,9 +103,10 @@ public override void Search()
)
)
);
#pragma warning restore CS0618

AssertResponseIsSuccess(response);
#else
throw new NotImplementedException(NonAsyncDeprecationMessage);
#endif
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand All @@ -124,13 +131,15 @@ public override async Task<long> SearchAsync()
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void IndexMany()
{
#if SYNC_METHODS_OK
var records = FlightRecord.GetSamples(3);

#pragma warning disable CS0618 // Type or member is obsolete
var response = _client.IndexMany(records, (IndexName)IndexName);
#pragma warning restore CS0618 // Type or member is obsolete

AssertResponseIsSuccess(response);
#else
throw new NotImplementedException(NonAsyncDeprecationMessage);
#endif
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand All @@ -148,26 +157,11 @@ public override async Task<bool> IndexManyAsync()
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void MultiSearch()
{
#if NET8_0_OR_GREATER || NET481_OR_GREATER
var req = new MultiSearchRequest
{
Searches =
[
new SearchRequestItem(
new MultisearchHeader { Indices = Infer.Index<FlightRecord>() },
new MultisearchBody { From = 0, Query = new MatchAllQuery() }
)
]
};
#pragma warning disable CS0618 // obsolete usage is ok here
var response = _client.MultiSearch<FlightRecord>(req);
#pragma warning restore CS0618
#else
#pragma warning disable CS0618 // obsolete usage is ok here
#if SYNC_METHODS_OK
var response = _client.MultiSearch<FlightRecord>();
#pragma warning restore CS0618
#endif

#else
throw new NotImplementedException(NonAsyncDeprecationMessage);
#endif
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand All @@ -194,7 +188,7 @@ public override async Task<long> MultiSearchAsync()
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void GenerateError()
public override async Task GenerateErrorAsync()
{
// This isn't the password, so connection should fail, but we won't get an error until the Ping
var settings = new ElasticsearchClientSettings(Address)
Expand All @@ -204,9 +198,7 @@ public override void GenerateError()

var client = new ElasticsearchClient(settings);

#pragma warning disable CS0618 // obsolete usage is ok here
var response = client.Ping();
#pragma warning restore CS0618
var response = await client.PingAsync();

if (response.IsSuccess())
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 New Relic, Inc. All rights reserved.
// Copyright 2020 New Relic, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

using System;
Expand Down Expand Up @@ -27,7 +27,7 @@ private enum ClientType
/// Sets the library to use for further actions
/// </summary>
/// <param name="client">ElasticsearchNet, NEST, or ElasticClients</param>
public void SetClient(string clientType)
public async Task SetClient(string clientType)
{
if (Enum.TryParse(clientType, out ClientType client))
{
Expand All @@ -44,7 +44,7 @@ public void SetClient(string clientType)
_client = new ElasticsearchElasticClient();
break;
}
_client.Connect();
await _client.ConnectAsync();
}
else
{
Expand Down Expand Up @@ -94,6 +94,6 @@ public void SetClient(string clientType)
[LibraryMethod]
[Transaction]
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public void GenerateError() => _client.GenerateError();
public async Task GenerateErrorAsync() => await _client.GenerateErrorAsync();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 New Relic, Inc. All rights reserved.
// Copyright 2020 New Relic, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

using System;
Expand Down Expand Up @@ -36,7 +36,7 @@ protected override string Password
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void Connect()
public override async Task ConnectAsync()
{
var settings = new ConnectionSettings(Address).
BasicAuthentication(Username,Password).
Expand All @@ -46,7 +46,7 @@ public override void Connect()

// This isn't necessary but will log the response, which can help troubleshoot if
// you're having connection errors
_client.Ping();
await _client.PingAsync();
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand Down Expand Up @@ -176,7 +176,7 @@ public override async Task<long> MultiSearchAsync()
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void GenerateError()
public override async Task GenerateErrorAsync()
{
// This isn't the password, so connection should fail, but we won't get an error until the Ping
var settings = new ConnectionSettings(Address).
Expand All @@ -186,7 +186,7 @@ public override void GenerateError()

var client = new ElasticClient(settings);

var response = client.Ping();
var response = await client.PingAsync();
if (response.IsValid)
{
throw new Exception($"Response was successful but we expected an error. {response.ServerError}");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 New Relic, Inc. All rights reserved.
// Copyright 2020 New Relic, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

using System;
Expand Down Expand Up @@ -36,13 +36,14 @@ protected override string Password
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void Connect()
public override async Task ConnectAsync()
{
var settings = new ConnectionConfiguration(Address)
.BasicAuthentication(Username, Password)
.RequestTimeout(TimeSpan.FromMinutes(2));

_client = new ElasticLowLevelClient(settings);
await _client.PingAsync<StringResponse>();
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
Expand Down Expand Up @@ -210,7 +211,7 @@ public override async Task<long> MultiSearchAsync()
}

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
public override void GenerateError()
public override async Task GenerateErrorAsync()
{
// This isn't the password, so connection should fail, but we won't get an error until the Ping
var settings = new ConnectionConfiguration(Address)
Expand All @@ -219,7 +220,7 @@ public override void GenerateError()
.RequestTimeout(TimeSpan.FromMinutes(2));

var client = new ElasticLowLevelClient(settings);
var response = client.Ping<StringResponse>();
var response = await client.PingAsync<StringResponse>();

if (response.Success)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 New Relic, Inc. All rights reserved.
// Copyright 2020 New Relic, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

using System;
Expand Down Expand Up @@ -28,7 +28,7 @@ protected abstract string Password

public ElasticsearchTestClient() { }

public abstract void Connect();
public abstract Task ConnectAsync();

public abstract void Index();

Expand All @@ -46,7 +46,7 @@ public ElasticsearchTestClient() { }

public abstract Task<long> MultiSearchAsync();

public abstract void GenerateError();
public abstract Task GenerateErrorAsync();
}

public class FlightRecord
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,27 @@ protected enum ClientType

const string IndexName = "flights";

protected readonly bool _syncMethodsOk;
const string SyncMethodSkipReason = "Synchronous methods are deprecated in latest Elastic.Clients.Elasticsearch";


protected ElasticsearchTestsBase(TFixture fixture, ITestOutputHelper output, ClientType clientType) : base(fixture)
{
_fixture = fixture;
_fixture.TestLogger = output;
_clientType = clientType;

// non-async methods are deprecated in the latest Elastic.Clients.Elasticsearch versions
if (_clientType != ClientType.ElasticClients ||
(_fixture.GetType() != typeof(ConsoleDynamicMethodFixtureCoreLatest) && _fixture.GetType() != typeof(ConsoleDynamicMethodFixtureFWLatest)))
{
_syncMethodsOk = true;
}
else
{
_syncMethodsOk = false;
}
nr-ahemsath marked this conversation as resolved.
Show resolved Hide resolved

_host = GetHostFromElasticServer(_clientType);

_fixture.SetTimeout(TimeSpan.FromMinutes(2));
Expand All @@ -51,13 +65,17 @@ protected ElasticsearchTestsBase(TFixture fixture, ITestOutputHelper output, Cli
_fixture.AddCommand($"ElasticsearchExerciser SearchAsync");
_fixture.AddCommand($"ElasticsearchExerciser IndexManyAsync");
_fixture.AddCommand($"ElasticsearchExerciser MultiSearchAsync");
_fixture.AddCommand($"ElasticsearchExerciser GenerateErrorAsync");

// Sync operations
_fixture.AddCommand($"ElasticsearchExerciser Index");
_fixture.AddCommand($"ElasticsearchExerciser Search");
_fixture.AddCommand($"ElasticsearchExerciser IndexMany");
_fixture.AddCommand($"ElasticsearchExerciser MultiSearch");
_fixture.AddCommand($"ElasticsearchExerciser GenerateError");
if (_syncMethodsOk )
{
_fixture.AddCommand($"ElasticsearchExerciser Index");
_fixture.AddCommand($"ElasticsearchExerciser Search");
_fixture.AddCommand($"ElasticsearchExerciser IndexMany");
_fixture.AddCommand($"ElasticsearchExerciser MultiSearch");

}

_fixture.AddActions
(
Expand All @@ -82,27 +100,31 @@ protected ElasticsearchTestsBase(TFixture fixture, ITestOutputHelper output, Cli
_fixture.Initialize();
}

[Fact]
[SkippableFact]
public void Index()
{
Skip.IfNot(_syncMethodsOk, SyncMethodSkipReason);
nr-ahemsath marked this conversation as resolved.
Show resolved Hide resolved
ValidateOperation("Index");
}

[Fact]
[SkippableFact]
public void Search()
{
Skip.IfNot(_syncMethodsOk, SyncMethodSkipReason);
ValidateOperation("Search");
}

[Fact]
[SkippableFact]
public void IndexMany()
{
Skip.IfNot(_syncMethodsOk, SyncMethodSkipReason);
ValidateOperation("IndexMany");
}

[Fact]
[SkippableFact]
public void MultiSearch()
{
Skip.IfNot(_syncMethodsOk, SyncMethodSkipReason);
ValidateOperation("MultiSearch");
}

Expand Down Expand Up @@ -131,9 +153,9 @@ public void MultiSearchAsync()
}

[Fact]
public void Error()
public void ErrorAsync()
{
ValidateError("GenerateError");
ValidateError("GenerateErrorAsync");
}

private void ValidateError(string operationName)
Expand Down
Loading
Loading