1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Infrastructure
{
using System.Data.Common;
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.ModelConfiguration.Internal.UnitTests;
using System.Data.Entity.Utilities;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using Xunit;
#if NET40
using System.Data.Entity.Resources;
using Moq;
#endif
public class DefaultDbProviderFactoryServiceTests : TestBase
{
[Fact]
public void GetProviderFactory_throws_for_null_connection()
{
Assert.Equal(
"connection",
Assert.Throws<ArgumentNullException>(() => new DefaultDbProviderFactoryService().GetProviderFactory(null)).ParamName);
}
[Fact]
public void GetProviderFactory_for_SqlConnection_should_return_SqlClientFactory()
{
Assert.Equal(SqlClientFactory.Instance, new DefaultDbProviderFactoryService().GetProviderFactory(new SqlConnection()));
}
[Fact]
public void GetProviderFactory_for_EntityConnection_should_return_EntityProviderFactory()
{
Assert.Equal(EntityProviderFactory.Instance, new DefaultDbProviderFactoryService().GetProviderFactory(new EntityConnection()));
}
[Fact]
public void GetProviderFactory_for_generic_connection_should_return_correct_generic_factory()
{
Assert.NotNull(GenericProviderFactory<DbProviderFactory>.Instance);
Assert.Equal(
GenericProviderFactory<DbProviderFactory>.Instance,
new DefaultDbProviderFactoryService(
new ProviderRowFinder(DbProviderFactories.GetFactoryClasses().Rows.OfType<DataRow>()))
.GetProviderFactory(new GenericConnection<DbProviderFactory>()));
}
#if NET40
[Fact]
public void GetProviderFactory_throws_for_unknown_provider_on_net40()
{
var mockConnection = new Mock<DbConnection>();
mockConnection.Setup(m => m.ToString()).Returns("Disco 2000");
Assert.Equal(
Strings.ProviderNotFound("Disco 2000"),
Assert.Throws<NotSupportedException>(
() => new DefaultDbProviderFactoryService().GetProviderFactory(mockConnection.Object)).Message);
}
[Fact]
public void GetProviderFactory_caches_factory_instances_on_net40()
{
var mockFinder = new Mock<ProviderRowFinder>(null)
{
CallBase = true
};
var service = new DefaultDbProviderFactoryService(mockFinder.Object);
Assert.Equal(SqlClientFactory.Instance, service.GetProviderFactory(new SqlConnection()));
mockFinder.Verify(m => m.FindRow(It.IsAny<Type>(), It.IsAny<Func<DataRow, bool>>()), Times.Once());
Assert.Equal(SqlClientFactory.Instance, service.GetProviderFactory(new SqlConnection()));
mockFinder.Verify(m => m.FindRow(It.IsAny<Type>(), It.IsAny<Func<DataRow, bool>>()), Times.Once()); // Finder not called again
}
#endif
[Fact]
public void GetProviderFactory_returns_exact_connection_type_match_in_same_assembly()
{
var rows = new[]
{
CreateProviderRow("Row1", "Row.1", _weakProviderType2.AssemblyQualifiedName),
CreateProviderRow("Row2", "Row.2", typeof(FakeProviderFactory2).AssemblyQualifiedName),
CreateProviderRow("Row3", "Row.3", _weakProviderType1.AssemblyQualifiedName),
CreateProviderRow("Row4", "Row.4", typeof(FakeSqlProviderFactory).AssemblyQualifiedName),
};
Assert.Same(
FakeSqlProviderFactory.Instance,
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows)).GetProviderFactory(new FakeSqlConnection()));
}
[Fact]
public void GetProviderFactory_returns_exact_connection_type_match_in_different_assembly()
{
var rows = new[]
{
CreateProviderRow("Row1", "Row.1", _weakProviderType2.AssemblyQualifiedName),
CreateProviderRow("Row2", "Row.2", typeof(FakeProviderFactory2).AssemblyQualifiedName),
CreateProviderRow("Row3", "Row.3", _weakProviderType1.AssemblyQualifiedName),
};
Assert.Same(
GetFactoryInstance(_weakProviderType1),
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows))
.GetProviderFactory(new FakeSqlConnection("2008", GetFactoryInstance(_weakProviderType1))));
}
[Fact]
public void GetProviderFactory_returns_derived_connection_type_match_in_same_assembly()
{
var rows = new[]
{
CreateProviderRow("Row1", "Row.1", _weakProviderType2.AssemblyQualifiedName),
CreateProviderRow("Row2", "Row.2", typeof(FakeProviderFactory2).AssemblyQualifiedName),
};
Assert.Same(
FakeProviderFactory2.Instance,
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows))
.GetProviderFactory(new FakeSqlConnection("2008", FakeProviderFactory2.Instance)));
}
[Fact]
public void GetProviderFactory_returns_derived_connection_type_match_in_different_assembly()
{
var rows = new[]
{
CreateProviderRow("Row1", "Row.1", _weakProviderType2.AssemblyQualifiedName),
};
Assert.Same(
GetFactoryInstance(_weakProviderType2),
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows))
.GetProviderFactory(new FakeSqlConnection("2008", GetFactoryInstance(_weakProviderType2))));
}
[Fact]
public void GetProviderFactory_returns_provider_in_weakly_named_assembly_without_version_or_key_in_name()
{
var rows = new[]
{
CreateProviderRow("ProviderFactory", "Provider.Factory", "WeakProviderFactory, ProviderAssembly1"),
};
Assert.Same(
GetFactoryInstance(_weakProviderType1),
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows))
.GetProviderFactory(new FakeSqlConnection("2008", GetFactoryInstance(_weakProviderType1))));
}
[Fact]
public void GetProviderFactory_returns_provider_in_weakly_named_assembly_with_non_standard_spacing_in_name()
{
var rows = new[]
{
CreateProviderRow(
"ProviderFactory", "Provider.Factory",
"WeakProviderFactory,ProviderAssembly1, Version=0.0.0.0, Culture=neutral,PublicKeyToken=null"),
};
Assert.Same(
GetFactoryInstance(_weakProviderType1),
new DefaultDbProviderFactoryService(new ProviderRowFinder(rows))
.GetProviderFactory(new FakeSqlConnection("2008", GetFactoryInstance(_weakProviderType1))));
}
private static readonly Type _weakProviderType1 = CreateWeakProviderType(typeof(FakeProviderBase1), "ProviderAssembly1");
private static readonly Type _weakProviderType2 = CreateWeakProviderType(typeof(FakeProviderBase2), "ProviderAssembly2");
private static Type CreateWeakProviderType(Type baseProviderType, string assemblyName)
{
var assembly = new DynamicAssembly();
var dynamicType =
assembly.DynamicStructuralType("WeakProviderFactory").HasBaseClass(baseProviderType);
dynamicType.CtorAccess = MemberAccess.Public;
dynamicType.Field("Instance").HasType(dynamicType).IsStatic().IsInstance();
var compiledAssembly = assembly.Compile(new AssemblyName(assemblyName));
// We need this so that Type.GetType() used in DbProviderFactories.GetFactory will work for
// the dynamic assembly. In other words, this is only needed for the test code to work.
AppDomain.CurrentDomain.AssemblyResolve +=
(sender, args) => args.Name.StartsWith(assemblyName) ? compiledAssembly : null;
return assembly.GetType("WeakProviderFactory");
}
private static DbProviderFactory GetFactoryInstance(Type factoryType)
{
return (DbProviderFactory)factoryType.GetField("Instance").GetValue(null);
}
public class FakeProviderBase1 : DbProviderFactory
{
public override DbConnection CreateConnection()
{
return new FakeSqlConnection();
}
}
public class FakeProviderBase2 : DbProviderFactory
{
public override DbConnection CreateConnection()
{
return new DerivedFakeSqlConnection();
}
}
public class FakeProviderFactory2 : DbProviderFactory
{
public static readonly FakeProviderFactory2 Instance = new FakeProviderFactory2();
public override DbConnection CreateConnection()
{
return new DerivedFakeSqlConnection();
}
}
public class DerivedFakeSqlConnection : FakeSqlConnection
{
}
}
}
|