Move yang-common(-netty)
[yangtools.git] / yang / yang-data-codec-binfmt / src / test / java / org / opendaylight / yangtools / yang / data / codec / binfmt / YiidSerializationTest.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.data.codec.binfmt;
9
10 import com.google.common.io.ByteStreams;
11 import java.io.ByteArrayOutputStream;
12 import java.io.IOException;
13 import java.util.Arrays;
14 import org.junit.Assert;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.junit.runners.Parameterized;
18 import org.junit.runners.Parameterized.Parameter;
19 import org.junit.runners.Parameterized.Parameters;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder;
23
24 @RunWith(Parameterized.class)
25 public class YiidSerializationTest extends AbstractSerializationTest {
26     @Parameters(name = "{0}")
27     public static Iterable<Object[]> data() {
28         return Arrays.asList(
29             new Object[] { NormalizedNodeStreamVersion.LITHIUM,
30                 100, 116, 596, 611, 612, 628, 4196, 4436, 1_052_772, 1_246_036, 2_298_693
31             },
32             new Object[] { NormalizedNodeStreamVersion.NEON_SR2,
33                 102, 108, 288, 489, 294, 502, 1638, 3414,   394_854,   982_870, 1_377_611
34             },
35             new Object[] { NormalizedNodeStreamVersion.SODIUM_SR1,
36                 96,   98, 158, 359, 164, 372,  612, 2388,   131_684,   719_700,   916_815
37             },
38             new Object[] { NormalizedNodeStreamVersion.MAGNESIUM,
39                 96,   98, 158, 359, 164, 372,  612, 2388,   131_684 ,  719_700,   916_815
40             });
41     }
42
43     @Parameter(1)
44     public int emptySize;
45     @Parameter(2)
46     public int oneSize;
47     @Parameter(3)
48     public int size31;
49     @Parameter(4)
50     public int uniqueSize31;
51     @Parameter(5)
52     public int size32;
53     @Parameter(6)
54     public int uniqueSize32;
55     @Parameter(7)
56     public int size256;
57     @Parameter(8)
58     public int uniqueSize256;
59     @Parameter(9)
60     public int size65792;
61     @Parameter(10)
62     public int uniqueSize65792;
63     @Parameter(11)
64     public int twiceSize65792;
65
66     @Test
67     public void testEmptyIdentifier() {
68         assertSame(YangInstanceIdentifier.empty(), emptySize);
69     }
70
71     @Test
72     public void testOneIdentifier() {
73         assertEquals(YangInstanceIdentifier.of(TestModel.TEST_QNAME), oneSize);
74     }
75
76     @Test
77     public void test31() {
78         assertEquals(fillIdentifier(31), size31);
79         assertEquals(fillUniqueIdentifier(31), uniqueSize31);
80     }
81
82     @Test
83     public void test32() {
84         assertEquals(fillIdentifier(32), size32);
85         assertEquals(fillUniqueIdentifier(32), uniqueSize32);
86     }
87
88     @Test
89     public void test256() {
90         assertEquals(fillIdentifier(256), size256);
91         assertEquals(fillUniqueIdentifier(256), uniqueSize256);
92     }
93
94     @Test
95     public void test65792() {
96         assertEquals(fillIdentifier(65792), size65792);
97         assertEquals(fillUniqueIdentifier(65792), uniqueSize65792);
98     }
99
100     @Test
101     public void testTwice65536() {
102         final YangInstanceIdentifier yiid = fillUniqueIdentifier(65792);
103
104         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
105         try (NormalizedNodeDataOutput nnout = version.newDataOutput(ByteStreams.newDataOutput(baos))) {
106             nnout.writeYangInstanceIdentifier(yiid);
107             nnout.writeYangInstanceIdentifier(yiid);
108         } catch (IOException e) {
109             throw new AssertionError("Failed to serialize", e);
110         }
111
112         final byte[] bytes = baos.toByteArray();
113         Assert.assertEquals(twiceSize65792, bytes.length);
114
115         try {
116             final NormalizedNodeDataInput input = NormalizedNodeDataInput.newDataInput(ByteStreams.newDataInput(bytes));
117             Assert.assertEquals(yiid, input.readYangInstanceIdentifier());
118             Assert.assertEquals(yiid, input.readYangInstanceIdentifier());
119         } catch (IOException e) {
120             throw new AssertionError("Failed to deserialize", e);
121         }
122     }
123
124     private static YangInstanceIdentifier fillIdentifier(final int size) {
125         final InstanceIdentifierBuilder builder = YangInstanceIdentifier.builder();
126         for (int i = 0; i < size; ++i) {
127             builder.node(TestModel.TEST_QNAME);
128         }
129         final YangInstanceIdentifier ret = builder.build();
130         Assert.assertEquals(size, ret.getPathArguments().size());
131         return ret;
132     }
133
134     private static YangInstanceIdentifier fillUniqueIdentifier(final int size) {
135         final InstanceIdentifierBuilder builder = YangInstanceIdentifier.builder();
136         for (int i = 0; i < size; ++i) {
137             builder.node(QName.create(TestModel.TEST_QNAME, "a" + Integer.toHexString(i)));
138         }
139         final YangInstanceIdentifier ret = builder.build();
140         Assert.assertEquals(size, ret.getPathArguments().size());
141         return ret;
142     }
143 }