//-----------------------------------------------------------------------------
//
// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License").
// You may not use this file except in compliance with the License.
// A copy of the License is located at
//
// http://aws.amazon.com/apache2.0
//
// or in the "license" file accompanying this file. This file 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.
//
//-----------------------------------------------------------------------------
#if !NET45
using Amazon.XRay.Recorder.AutoInstrumentation.Unittests.Tools;
using Amazon.XRay.Recorder.Core;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace Amazon.XRay.Recorder.AutoInstrumentation.Unittests
{
[TestClass]
public class EntityFrameworkWithSqlDiagnosticListenerTest : TestBase
{
private const string _connectionString = "datasource=:memory:";
private SqliteConnection connection = null;
private static IDisposable _subscription;
private static AWSXRayRecorder _recorder;
[TestInitialize]
public void TestInitialize()
{
_recorder = new AWSXRayRecorder();
AWSXRayRecorder.InitializeInstance(recorder: _recorder);
// In-memory database only exists while the connection is open
connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
}
[TestCleanup]
public new void TestCleanup()
{
connection.Close();
base.TestCleanup();
_recorder.Dispose();
_recorder = null;
_subscription.Dispose();
}
[TestMethod]
public void TestEFCoreRequestWithEntityFrameworkCoreAndSqlDiagnosticListener()
{
// EntityFramework request will first trigger EntityFrameworkCoreDiagnosticListener and then SqlDiagnosticListener,
// With EntityFrameworkCoreDiagnosticListener, SqlDiagnosticListener will process EF Core request.
var subscription = new List()
{
new EntityFrameworkCoreDiagnosticListener(),
new SqlDiagnosticListener()
};
_subscription = DiagnosticListener.AllListeners.Subscribe(new DiagnosticListenerObserver(subscription));
_recorder.BeginSegment("EFCoreRequestWithEntityFrameworkCoreAndSqlDiagnosticListener");
var context = GetTestEFContext();
var users = context.Users.Where(u => u.UserId == 1).ToList();
var segment = _recorder.TraceContext.GetEntity();
Assert.AreEqual(4, segment.Subsegments.Count);
var subsegment = segment.Subsegments[3];
Assert.IsNotNull(subsegment);
Assert.IsNotNull(subsegment.Sql);
Assert.AreEqual(0, subsegment.Subsegments.Count); // No nested duplicate subsegment
Assert.AreEqual("sqlite", subsegment.Sql["database_type"]);
Assert.AreEqual(_connectionString, subsegment.Sql["connection_string"]);
Assert.AreEqual(connection.ServerVersion, subsegment.Sql["database_version"]);
_recorder.EndSegment();
}
private MockEntityFrameworkCoreDbContext GetTestEFContext()
{
var options = new DbContextOptionsBuilder()
.UseSqlite(connection)
.Options;
var context = new MockEntityFrameworkCoreDbContext(options);
context.Database.EnsureCreated();
return context;
}
}
}
#endif