/*
* Copyright (c) 2017 Pantheon Technologies s.r.o. 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.controller.cluster.datastore.node.utils.stream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.google.common.collect.ImmutableSet;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import javax.xml.transform.dom.DOMSource;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.w3c.dom.Document;
public class SerializationUtilsTest {
private static final QName CONTAINER_Q_NAME = QName.create("ns-1", "2017-03-17", "container1");
@Test
public void testSerializeDeserializeNodes() throws IOException {
final NormalizedNode, ?> normalizedNode = createNormalizedNode();
final byte[] bytes = serializeNormalizedNode(normalizedNode);
assertEquals(10564, bytes.length);
assertEquals(normalizedNode, deserializeNormalizedNode(bytes));
}
@Test
public void testSerializeDeserializeAnyXmlNode() throws Exception {
final ByteArrayInputStream is =
new ByteArrayInputStream("".getBytes(Charset.defaultCharset()));
final Document parse = UntrustedXML.newDocumentBuilder().parse(is);
final AnyXmlNode anyXmlNode = Builders.anyXmlBuilder()
.withNodeIdentifier(id("anyXmlNode"))
.withValue(new DOMSource(parse))
.build();
final byte[] bytes = serializeNormalizedNode(anyXmlNode);
assertEquals(113, bytes.length);
final NormalizedNode, ?> deserialized = deserializeNormalizedNode(bytes);
final DOMSource value = (DOMSource) deserialized.getValue();
final Diff diff = XMLUnit.compareXML((Document) anyXmlNode.getValue().getNode(),
value.getNode().getOwnerDocument());
assertTrue(diff.toString(), diff.similar());
}
@Test
public void testSerializeDeserializePath() throws IOException {
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final DataOutput out = new DataOutputStream(bos);
final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
.node(id("container1"))
.node(autmentationId("list1", "list2"))
.node(listId("list1", "keyName1", "keyValue1"))
.node(leafSetId("leafSer1", "leafSetValue1"))
.build();
SerializationUtils.writePath(out, path);
final byte[] bytes = bos.toByteArray();
assertEquals(119, bytes.length);
final YangInstanceIdentifier deserialized =
SerializationUtils.readPath(new DataInputStream(new ByteArrayInputStream(bytes)));
assertEquals(path, deserialized);
}
@Test
public void testSerializeDeserializePathAndNode() throws IOException {
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final DataOutput out = new DataOutputStream(bos);
final NormalizedNode, ?> node = createNormalizedNode();
final YangInstanceIdentifier path = YangInstanceIdentifier.create(id("container1"));
SerializationUtils.writeNodeAndPath(out, path, node);
final byte[] bytes = bos.toByteArray();
assertEquals(10566, bytes.length);
final DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
final AtomicBoolean applierCalled = new AtomicBoolean(false);
SerializationUtils.readNodeAndPath(in, applierCalled, (instance, deserializedPath, deserializedNode) -> {
assertEquals(path, deserializedPath);
assertEquals(node, deserializedNode);
applierCalled.set(true);
});
assertTrue(applierCalled.get());
}
@Test
public void testSerializeDeserializeAugmentNoref() throws IOException {
final YangInstanceIdentifier expected = YangInstanceIdentifier.create(
AugmentationIdentifier.create(ImmutableSet.of(
QName.create("foo", "leaf1"),
QName.create("bar", "leaf2"))));
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final DataOutput out = new DataOutputStream(bos);
SerializationUtils.writePath(out, expected);
final byte[] bytes = bos.toByteArray();
assertEquals(37, bytes.length);
final DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
final YangInstanceIdentifier read = SerializationUtils.readPath(in);
assertEquals(expected, read);
}
private static NormalizedNode, ?> deserializeNormalizedNode(final byte[] bytes) throws IOException {
return SerializationUtils.readNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes))).get();
}
private static byte[] serializeNormalizedNode(final NormalizedNode, ?> node) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
SerializationUtils.writeNormalizedNode(new DataOutputStream(bos), node);
return bos.toByteArray();
}
private static NormalizedNode, ?> createNormalizedNode() {
final LeafSetNode