forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOracleDataClientDriverFixture.cs
153 lines (130 loc) · 5.79 KB
/
OracleDataClientDriverFixture.cs
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
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.SqlCommand;
using NHibernate.SqlTypes;
using NHibernate.Util;
using NUnit.Framework;
using Environment = NHibernate.Cfg.Environment;
namespace NHibernate.Test.DriverTest
{
[TestFixture]
public class OracleDataClientDriverFixture
{
/// <summary>
/// Testing NH-302 to verify that a DbType.Boolean gets replaced
/// with an appropriate type.
/// </summary>
[Test]
[Category("ODP.NET")]
[Theory]
public void NoBooleanParameters(bool managed)
{
var driver = GetDriver(managed, TestConfigurationHelper.GetDefaultConfiguration().Properties);
var param = GetParameterForType(driver, SqlTypeFactory.Boolean);
Assert.That(param.DbType, Is.Not.EqualTo(DbType.Boolean), "should not still be a DbType.Boolean");
}
[Test]
[Category("ODP.NET")]
[Theory]
public void UnicodeParameters(bool managed)
{
var cfg = TestConfigurationHelper.GetDefaultConfiguration();
var driver = GetDriver(managed, cfg.Properties);
var useNPrefixedTypesForUnicode = PropertiesHelper.GetBoolean(Environment.OracleUseNPrefixedTypesForUnicode, cfg.Properties, false);
Assert.That(driver.UseNPrefixedTypesForUnicode, Is.EqualTo(useNPrefixedTypesForUnicode),
$"Unexpected value for {nameof(OracleDataClientDriverBase)}.{nameof(OracleDataClientDriverBase.UseNPrefixedTypesForUnicode)}");
var param = GetParameterForType(driver, SqlTypeFactory.GetString(200));
var oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo(useNPrefixedTypesForUnicode ? "NVarchar2" : "Varchar2").IgnoreCase,
"Unexpected Unicode string parameter type");
param = GetParameterForType(driver, new StringFixedLengthSqlType(10));
oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo(useNPrefixedTypesForUnicode ? "NChar" : "Char").IgnoreCase,
"Unexpected Unicode string fixed length parameter type");
}
[Test]
[Category("ODP.NET")]
[Theory]
public void UnicodeParametersNoPrefix(bool managed)
{
var cfg = TestConfigurationHelper.GetDefaultConfiguration();
cfg.SetProperty(Environment.OracleUseNPrefixedTypesForUnicode, "false");
var driver = GetDriver(managed, cfg.Properties);
Assert.That(driver.UseNPrefixedTypesForUnicode, Is.False,
$"Unexpected value for {nameof(OracleDataClientDriverBase)}.{nameof(OracleDataClientDriverBase.UseNPrefixedTypesForUnicode)}");
var param = GetParameterForType(driver, SqlTypeFactory.GetString(200));
var oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo("Varchar2").IgnoreCase, "Unexpected Unicode string parameter type");
param = GetParameterForType(driver, new StringFixedLengthSqlType(10));
oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo("Char").IgnoreCase, "Unexpected Unicode string fixed length parameter type");
}
[Test]
[Category("ODP.NET")]
[Theory]
public void UnicodeParametersWithPrefix(bool managed)
{
var cfg = TestConfigurationHelper.GetDefaultConfiguration();
cfg.SetProperty(Environment.OracleUseNPrefixedTypesForUnicode, "true");
var driver = GetDriver(managed, cfg.Properties);
Assert.That(driver.UseNPrefixedTypesForUnicode, Is.True,
$"Unexpected value for {nameof(OracleDataClientDriverBase)}.{nameof(OracleDataClientDriverBase.UseNPrefixedTypesForUnicode)}");
var param = GetParameterForType(driver, SqlTypeFactory.GetString(200));
var oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo("NVarchar2").IgnoreCase, "Unexpected Unicode string parameter type");
param = GetParameterForType(driver, new StringFixedLengthSqlType(10));
oracleParamType = GetOracleParameterType(param);
Assert.That(oracleParamType.ToString(), Is.EqualTo("NChar").IgnoreCase, "Unexpected Unicode string fixed length parameter type");
}
[Test]
[Category("ODP.NET")]
[Theory]
public void HasSameUnicodeDefaultThanDialect(bool managed)
{
var cfg = TestConfigurationHelper.GetDefaultConfiguration();
cfg.Properties.Remove(Environment.OracleUseNPrefixedTypesForUnicode);
var driver = GetDriver(managed, cfg.Properties);
var dialect = new Oracle8iDialect();
dialect.Configure(cfg.Properties);
Assert.That(driver.UseNPrefixedTypesForUnicode, Is.EqualTo(dialect.UseNPrefixedTypesForUnicode),
$"Default {nameof(Oracle8iDialect.UseNPrefixedTypesForUnicode)} values mismatch between driver and dialect");
}
private static OracleDataClientDriverBase GetDriver(bool managed, IDictionary<string, string> settings)
{
OracleDataClientDriverBase driver = null;
try
{
driver = managed
? (OracleDataClientDriverBase)new OracleManagedDataClientDriver()
: new OracleDataClientDriver();
}
catch (Exception ex)
{
Assert.Ignore("Unable to load the driver: {0}", ex);
}
driver.Configure(settings);
return driver;
}
private static DbParameter GetParameterForType(IDriver driver, SqlType paramType)
{
var builder = new SqlStringBuilder();
builder.Add("select * from table1 where col1=");
builder.Add(Parameter.Placeholder);
var cmd = driver.GenerateCommand(CommandType.Text, builder.ToSqlString(), new[] { paramType });
Assert.That(cmd.Parameters, Has.Count.EqualTo(1), "Unexpected parameters count");
var param = cmd.Parameters[0];
return param;
}
private static object GetOracleParameterType(DbParameter dbParameter)
{
var parameterType = dbParameter.GetType();
var typeProperty = parameterType.GetProperty("OracleDbType") ??
throw new InvalidOperationException("Unable to find OracleDbType property");
return typeProperty.GetValue(dbParameter);
}
}
}