Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

147 lines
7.5 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Metadata
{
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Core.Metadata.Edm;
using System.Reflection;
using Xunit;
public class MetadataCachingTests : FunctionalTestBase
{
private static readonly string connectionString = string.Format(
@"metadata=res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.csdl|res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.ssdl|res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.msl;provider=System.Data.SqlClient;provider connection string=""{0}""",
ModelHelpers.SimpleConnectionString("tempdb"));
[Fact]
public void Verify_that_metadata_is_the_same_for_two_workspaces_created_from_two_entity_connections_with_same_connection_strings()
{
var connection1 = new EntityConnection(connectionString);
var connection2 = new EntityConnection(connectionString);
var workspace1 = connection1.GetMetadataWorkspace();
var workspace2 = connection2.GetMetadataWorkspace();
Assert.Same(workspace1.GetItemCollection(DataSpace.CSpace), workspace2.GetItemCollection(DataSpace.CSpace));
Assert.Same(workspace1.GetItemCollection(DataSpace.SSpace), workspace2.GetItemCollection(DataSpace.SSpace));
Assert.Same(workspace1.GetItemCollection(DataSpace.CSSpace), workspace2.GetItemCollection(DataSpace.CSSpace));
}
[Fact]
public void
Verify_that_metadata_is_the_same_for_two_workspaces_created_from_two_entity_connections_with_equivalent_connection_strings()
{
var connection1 = new EntityConnection(connectionString);
var connection2 = new EntityConnection(connectionString + ";;");
var workspace1 = connection1.GetMetadataWorkspace();
var workspace2 = connection2.GetMetadataWorkspace();
Assert.Same(workspace1.GetItemCollection(DataSpace.CSpace), workspace2.GetItemCollection(DataSpace.CSpace));
Assert.Same(workspace1.GetItemCollection(DataSpace.SSpace), workspace2.GetItemCollection(DataSpace.SSpace));
Assert.Same(workspace1.GetItemCollection(DataSpace.CSSpace), workspace2.GetItemCollection(DataSpace.CSSpace));
}
[Fact]
public void
Verify_that_conceptual_metadata_is_the_same_for_two_workspaces_created_from_two_entity_connections_with_reordered_metadata_in_connection_strings
()
{
var connectionString2 = string.Format(
@"metadata=res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.msl|res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.ssdl|res://EntityFramework.FunctionalTests.Transitional/System.Data.Entity.Metadata.MetadataCachingModel.csdl;provider=System.Data.SqlClient;provider connection string=""{0}""",
ModelHelpers.SimpleConnectionString("tempdb"));
var connection1 = new EntityConnection(connectionString);
var connection2 = new EntityConnection(connectionString2);
var workspace1 = connection1.GetMetadataWorkspace();
var workspace2 = connection2.GetMetadataWorkspace();
Assert.Same(workspace1.GetItemCollection(DataSpace.CSpace), workspace2.GetItemCollection(DataSpace.CSpace));
}
[Fact]
public void Verify_that_opening_connection_does_not_create_new_MetadataWorkspace()
{
var connection = new EntityConnection(connectionString);
var workspace = connection.GetMetadataWorkspace();
connection.Open();
Assert.Same(workspace, connection.GetMetadataWorkspace());
}
[Fact]
public void Metadata_does_not_get_garbage_collected_if_references_are_alive()
{
Action garbageCollection = () =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
};
MetadataCachingWithGarbageCollectionTemplate(garbageCollection);
}
[Fact]
public void Metadata_does_not_get_garbage_collected_after_cleanup_is_performed_once_if_references_are_alive()
{
Action garbageCollection = () =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
CallPeriodicCleanupMethod();
};
MetadataCachingWithGarbageCollectionTemplate(garbageCollection);
}
[Fact]
public void Metadata_does_not_get_garbage_collected_after_cleanup_is_performed_twice_if_references_are_alive()
{
Action garbageCollection = () =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
CallPeriodicCleanupMethod();
CallPeriodicCleanupMethod();
};
MetadataCachingWithGarbageCollectionTemplate(garbageCollection);
}
private void MetadataCachingWithGarbageCollectionTemplate(Action garbageCollection)
{
MetadataWorkspace.ClearCache();
var weakReferences = new WeakReference[3];
// load metadata
using (var connection1 = new EntityConnection(connectionString))
{
connection1.Open();
weakReferences[0] = new WeakReference(connection1.GetMetadataWorkspace().GetItemCollection(DataSpace.CSpace));
weakReferences[1] = new WeakReference(connection1.GetMetadataWorkspace().GetItemCollection(DataSpace.SSpace));
weakReferences[2] = new WeakReference(connection1.GetMetadataWorkspace().GetItemCollection(DataSpace.CSSpace));
}
// perform necessary garbage collection steps
garbageCollection();
// verify that metadata was cached
using (var connection2 = new EntityConnection(connectionString))
{
connection2.Open();
Assert.Same(weakReferences[0].Target, connection2.GetMetadataWorkspace().GetItemCollection(DataSpace.CSpace));
Assert.Same(weakReferences[1].Target, connection2.GetMetadataWorkspace().GetItemCollection(DataSpace.SSpace));
Assert.Same(weakReferences[2].Target, connection2.GetMetadataWorkspace().GetItemCollection(DataSpace.CSSpace));
}
}
internal static void CallPeriodicCleanupMethod()
{
var method = typeof(MetadataCache).GetMethod(
"PeriodicCleanupCallback", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(object) }, null);
method.Invoke(null, new object[] { null });
}
}
}