[ http://issues.apache.org/jira/browse/IBATISNET-118?page=all ]
     
Gilles Bayon resolved IBATISNET-118:
------------------------------------

    Resolution: Fixed

In SVN

> CacheKey.Equals(object) override can return true when the parameters have the 
> same HashCode but are not equal.
> --------------------------------------------------------------------------------------------------------------
>
>          Key: IBATISNET-118
>          URL: http://issues.apache.org/jira/browse/IBATISNET-118
>      Project: iBatis for .NET
>         Type: Bug
>   Components: DataMapper
>     Versions: DataMapper 1.2.1
>  Environment: Windows
>     Reporter: Thomas Tannahill
>     Assignee: Gilles Bayon
>      Fix For: DataMapper 1.3

>
> CacheKey.Equals(object) override can return true when the parameters have the 
> same HashCode but are not equal.  This can cause false cache hits.
> Only an issue for complex parameters.
> Failing NUnit test:
> ---- UNIT TEST BEGIN ----
> using IBatisNet.DataMapper;
> using IBatisNet.DataMapper.TypeHandlers;
> using NUnit.Framework;
> namespace IBatisNet.DataAccess
> {
>       [TestFixture]
>       public class CacheKeyTests
>       {
>               private const long A_LONG = 1L;
>               private const long ANOTHER_LONG_WITH_SAME_HASHCODE = 
> -9223372034707292159;
>               
>               public CacheKeyTests()
>               {
>               }
>               [Test]
>               public void 
> ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotEqual()
>               {
>                       TypeHandlerFactory factory = new TypeHandlerFactory(); 
>                       // Two cache keys are equal except for the parameter.
>                       CacheKey key = new CacheKey(factory, "STATEMENT", 
> "SQL", new TestClass(A_LONG), new string[] {"AProperty"}, 0, 0, 
> CacheKeyType.Object);
>                       CacheKey aDifferentKey = new CacheKey(factory, 
> "STATEMENT", "SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new 
> string[] {"AProperty"}, 0, 0, CacheKeyType.Object);
>                       Assert.IsFalse(aDifferentKey.Equals(key)); // should 
> not be equal.
>               }
>       }
>       public class TestClass
>       {
>               private long aProperty;
>               public TestClass(long aProperty)
>               {
>                       this.aProperty = aProperty;
>               }
>               public long AProperty
>               {
>                       get { return aProperty; }
>                       set { aProperty = value; }
>               }
>       }
> }
> ---- UNIT TEST END ----
> The test passes if you replace this line in CacheKey.Equals():
>                if (_hashCode != cacheKey._hashCode) return false;
> with something like this:
>                if (this._parameter == null && cacheKey._parameter != null) 
> return false;
>                if (this._parameter != null && cacheKey._parameter == null) 
> return false;
>                if (!this._parameter.Equals(cacheKey._parameter)) return false;

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to