LazyDataObject bindingEquals fix 39/40439/6
authorFilip Gregor <fgregor@cisco.com>
Thu, 16 Jun 2016 12:02:19 +0000 (14:02 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 17 Jun 2016 21:07:38 +0000 (21:07 +0000)
added check for byte arrays

Change-Id: I238d92bc7a23ac0157ff66046e5d137d6e10582e
Signed-off-by: Filip Gregor <fgregor@cisco.com>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/LazyDataObject.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/BinaryKeyTest.java [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/yang/opendaylight-test-binary-key-bug.yang [new file with mode: 0644]

index 732903d9b963aedf0df9c99fcc19a9b0ebfc9540..c3e5e032c6aac309c441c74695c618d324038814 100644 (file)
@@ -16,6 +16,7 @@ import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -87,7 +88,15 @@ class LazyDataObject<D extends DataObject> implements InvocationHandler, Augment
             for (final Method m : context.getHashCodeAndEqualsMethods()) {
                 final Object thisValue = getBindingData(m);
                 final Object otherValue = m.invoke(other);
-                if (!Objects.equals(thisValue, otherValue)) {
+                /*
+                *   added for valid byte array comparison, when list key type is binary
+                *   deepEquals is not used since it does excessive amount of instanceof calls.
+                */
+                if (thisValue instanceof byte[] && otherValue instanceof byte[]) {
+                    if (!Arrays.equals((byte[]) thisValue, (byte[]) otherValue)) {
+                        return false;
+                    }
+                } else if (!Objects.equals(thisValue, otherValue)){
                     return false;
                 }
             }
diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/BinaryKeyTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/BinaryKeyTest.java
new file mode 100644 (file)
index 0000000..661493d
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.binding.data.codec.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import com.google.common.base.Optional;
+import javassist.ClassPool;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.odl.test.binary.key.rev160101.BinaryList;
+import org.opendaylight.yang.gen.v1.odl.test.binary.key.rev160101.BinaryListBuilder;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+public class BinaryKeyTest extends AbstractBindingRuntimeTest {
+    private BindingNormalizedNodeCodecRegistry registry;
+    private InstanceIdentifier<BinaryList> instanceIdentifier;
+
+    @Override
+    public void setup() {
+        super.setup();
+        final JavassistUtils utils = JavassistUtils.forClassPool(ClassPool.getDefault());
+        registry = new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(utils));
+        registry.onBindingRuntimeContextUpdated(getRuntimeContext());
+        instanceIdentifier = InstanceIdentifier.builder(BinaryList.class).build();
+    }
+
+    @Test
+    public void binaryKeyTest() {
+        final byte[] binaryKey1 = {1, 1, 1};
+        final byte[] binaryKey2 = {1};
+        final BinaryList binaryList1 = new BinaryListBuilder()
+                .setBinaryItem("first")
+                .setBinaryKey(binaryKey1)
+                .build();
+        final BinaryList binaryList2 = new BinaryListBuilder()
+                .setBinaryItem("second")
+                .setBinaryKey(binaryKey2)
+                .build();
+        final BinaryList processedBinaryList1 = process(binaryList1);
+        final BinaryList processedBinaryList2 = process(binaryList2);
+
+        assertEquals(binaryList1, processedBinaryList1);
+        assertEquals(binaryList1, binaryList1);
+        assertEquals(processedBinaryList1, processedBinaryList1);
+
+        assertNotEquals(binaryList1, processedBinaryList2);
+        assertNotEquals(binaryList1, binaryList2);
+        assertNotEquals(processedBinaryList1, processedBinaryList2);
+    }
+
+    private BinaryList process(final BinaryList binaryList) {
+        final NormalizedNode<?, ?> domTreeEntry = registry.toNormalizedNode(instanceIdentifier, binaryList).getValue();
+        return registry.deserializeFunction(instanceIdentifier).apply(Optional.<NormalizedNode<?, ?>>of(domTreeEntry)).get();
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-test-binary-key-bug.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-test-binary-key-bug.yang
new file mode 100644 (file)
index 0000000..9c33a27
--- /dev/null
@@ -0,0 +1,20 @@
+module binary-key {
+    yang-version 1;
+    namespace "odl:test:binary-key";
+    prefix "bk";
+
+    revision "2016-01-01" {
+    }
+
+    list binary-list {
+        key "binary-key";
+
+        leaf binary-key {
+            type binary;
+        }
+
+        leaf binary-item {
+            type string;
+        }
+    }
+}
\ No newline at end of file