blob: 93b17e3a0f8c7e857a2586ba5ad13ae60b57cfc8 [file] [log] [blame]
Tomek OsiƄskie9ccf412018-01-13 19:44:11 +01001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.xmpp.core.ctl.handlers;
18
19import com.google.common.collect.Lists;
20import io.netty.buffer.ByteBuf;
21import io.netty.buffer.Unpooled;
22import io.netty.channel.Channel;
23import org.apache.commons.io.Charsets;
24import org.junit.Test;
25import org.onosproject.xmpp.core.ctl.ChannelAdapter;
26import org.onosproject.xmpp.core.ctl.ChannelHandlerContextAdapter;
27
28import javax.xml.namespace.QName;
29import javax.xml.stream.events.EndElement;
30import javax.xml.stream.events.StartElement;
31import javax.xml.stream.events.XMLEvent;
32import java.util.List;
33
34import static org.hamcrest.MatcherAssert.assertThat;
35import static org.hamcrest.Matchers.instanceOf;
36import static org.hamcrest.Matchers.is;
37
38/**
39 * Test class for XmlStreamDecoder.
40 */
41public class XmlStreamDecoderTest {
42
43 private String streamOpenMsg = String.format("<stream:stream to='%s' %s %s %s %s %s>", "xmpp.onosproject.org",
44 "from='test@xmpp.org'",
45 "xmlns:stream='http://etherx.jabber.org/streams'",
46 "xmlns='jabber:client'", "xml:lang='en'", "version='1.0'");
47
48 private String streamCloseMsg = "</stream:stream>";
49
50 private String subscribeMsg = "<iq type='set'" +
51 " from='test@xmpp.org'" +
52 " to='xmpp.onosproject.org'" +
53 " id='sub1'>" +
54 " <pubsub xmlns='http://jabber.org/protocol/pubsub'>" +
55 " <subscribe node='test'/>" +
56 " </pubsub>" +
57 "</iq>";
58
59
60 public class ActiveChannelHandlerContextAdapter
61 extends ChannelHandlerContextAdapter {
62 @Override
63 public Channel channel() {
64 return new ChannelAdapter() {
65 @Override
66 public boolean isActive() {
67 return true;
68 }
69 };
70 }
71 }
72
73 @Test
74 public void testDecodeNoChannel() throws Exception {
75 XmlStreamDecoder decoder = new XmlStreamDecoder();
76
77 List<Object> list = Lists.newArrayList();
78 decoder.decode(new ActiveChannelHandlerContextAdapter(),
79 Unpooled.buffer(), list);
80 assertThat(list.size(), is(0));
81 }
82
83 @Test
84 public void testDecodeStreamOpen() throws Exception {
85 XmlStreamDecoder decoder = new XmlStreamDecoder();
86 ByteBuf buffer = Unpooled.buffer();
87 buffer.writeBytes(streamOpenMsg.getBytes(Charsets.UTF_8));
88 List<Object> list = Lists.newArrayList();
89 decoder.decode(new ChannelHandlerContextAdapter(), buffer, list);
90 list.forEach(object -> {
91 assertThat(object, is(instanceOf(XMLEvent.class)));
92 });
93 assertThat(list.size(), is(2));
94 assertThat(((XMLEvent) list.get(0)).isStartDocument(), is(true));
95 ((XMLEvent) list.get(0)).isStartElement();
96 }
97
98 @Test
99 public void testDecodeStreamClose() throws Exception {
100 XmlStreamDecoder decoder = new XmlStreamDecoder();
101 // open stream
102 ByteBuf buffer1 = Unpooled.buffer();
103 buffer1.writeBytes(streamOpenMsg.getBytes(Charsets.UTF_8));
104 List<Object> list1 = Lists.newArrayList();
105 decoder.decode(new ChannelHandlerContextAdapter(), buffer1, list1);
106
107 // close stream
108 ByteBuf buffer2 = Unpooled.buffer();
109 buffer2.writeBytes(streamCloseMsg.getBytes(Charsets.UTF_8));
110 List<Object> list2 = Lists.newArrayList();
111 decoder.decode(new ChannelHandlerContextAdapter(), buffer2, list2);
112 list2.forEach(object -> {
113 assertThat(object, is(instanceOf(XMLEvent.class)));
114 });
115 assertThat(list2.size(), is(1));
116 assertThat(((XMLEvent) list2.get(0)).isEndElement(), is(true));
117 }
118
119 @Test
120 public void testDecodeXmppStanza() throws Exception {
121 XmlStreamDecoder decoder = new XmlStreamDecoder();
122 ByteBuf buffer = Unpooled.buffer();
123 buffer.writeBytes(subscribeMsg.getBytes(Charsets.UTF_8));
124 List<Object> list = Lists.newArrayList();
125 decoder.decode(new ChannelHandlerContextAdapter(), buffer, list);
126 assertThat(list.size(), is(10));
127 list.forEach(object -> {
128 assertThat(object, is(instanceOf(XMLEvent.class)));
129 });
130 assertThat(((XMLEvent) list.get(0)).isStartDocument(), is(true));
131 XMLEvent secondEvent = (XMLEvent) list.get(1);
132 assertThat(secondEvent.isStartElement(), is(true));
133 StartElement secondEventAsStartElement = (StartElement) secondEvent;
134 assertThat(secondEventAsStartElement.getName().getLocalPart(), is("iq"));
135 assertThat(Lists.newArrayList(secondEventAsStartElement.getAttributes()).size(), is(4));
136 assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("type")).getValue(), is("set"));
137 assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("from")).getValue(),
138 is("test@xmpp.org"));
139 assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("to")).getValue(),
140 is("xmpp.onosproject.org"));
141 assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("id")).getValue(),
142 is("sub1"));
143 XMLEvent fourthEvent = (XMLEvent) list.get(3);
144 assertThat(fourthEvent.isStartElement(), is(true));
145 StartElement fourthEventAsStartElement = (StartElement) fourthEvent;
146 assertThat(fourthEventAsStartElement.getName().getLocalPart(), is("pubsub"));
147 assertThat(fourthEventAsStartElement.getNamespaceURI(""),
148 is("http://jabber.org/protocol/pubsub"));
149 XMLEvent fifthEvent = (XMLEvent) list.get(5);
150 assertThat(fifthEvent.isStartElement(), is(true));
151 StartElement fifthEventAsStartElement = (StartElement) fifthEvent;
152 assertThat(fifthEventAsStartElement.getName().getLocalPart(), is("subscribe"));
153 assertThat(fifthEventAsStartElement.getAttributeByName(QName.valueOf("node")).getValue(), is("test"));
154 XMLEvent sixthEvent = (XMLEvent) list.get(6);
155 assertThat(sixthEvent.isEndElement(), is(true));
156 EndElement sixthEventAsEndElement = (EndElement) sixthEvent;
157 assertThat(sixthEventAsEndElement.getName().getLocalPart(), is("subscribe"));
158 XMLEvent seventhEvent = (XMLEvent) list.get(8);
159 assertThat(seventhEvent.isEndElement(), is(true));
160 EndElement seventhEventAsEndElement = (EndElement) seventhEvent;
161 assertThat(seventhEventAsEndElement.getName().getLocalPart(), is("pubsub"));
162 XMLEvent eighthEvent = (XMLEvent) list.get(9);
163 assertThat(eighthEvent.isEndElement(), is(true));
164 EndElement eighthEventAsEndElement = (EndElement) eighthEvent;
165 assertThat(eighthEventAsEndElement.getName().getLocalPart(), is("iq"));
166 }
167}