Utils/Logger: Change FileTarget default console node name to file basename
[senf.git] / Packets / 80211Bundle / WLANPacket.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Christian Niephaus <cni@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief WLANPacket.test unit tests */
25
26 // Custom includes
27
28 #include "../../Packets/Packets.hh"
29 #include "../../Utils/auto_unit_test.hh"
30 #include <boost/test/test_tools.hpp>
31 #include "WLANPacket.hh"
32
33 /* test parser with a data frame */
34 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_packet)
35 {
36     unsigned char data[] = {
37             0x88, 0x01, 0x00, 0x00, 0x00, 0x1a,             //header
38             0x4d, 0x3e, 0xc7, 0x5c, 0x00, 0x0b, 0x6b, 0x57,
39             0x06, 0xb0, 0x00, 0x18, 0x4d, 0x6e, 0x78, 0x48,
40             0x30, 0x00, 0x01, 0x00,
41             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //dummy data
42             0x38, 0x39, 0x30, 0x31                          //trailer
43     };
44
45     senf::WLANPacket p (senf::WLANPacket::create(data));
46
47     BOOST_CHECK_EQUAL( p->version(),        0u    );
48     BOOST_CHECK_EQUAL( p->type(),           2u    );
49     BOOST_CHECK_EQUAL( p->subtype(),        8u    );
50     BOOST_CHECK_EQUAL( p->toDS(),           true  );
51     BOOST_CHECK_EQUAL( p->fromDS(),         false );
52     BOOST_CHECK_EQUAL( p->moreFrag(),       false );
53     BOOST_CHECK_EQUAL( p->retry(),          false );
54     BOOST_CHECK_EQUAL( p->pwrMgt(),         false );
55     BOOST_CHECK_EQUAL( p->moreData(),       false );
56     BOOST_CHECK_EQUAL( p->protectedFrame(), false );
57     BOOST_CHECK_EQUAL( p->order(),          false );
58
59     BOOST_CHECK_EQUAL( p->duration(),       0u    );
60
61     BOOST_CHECK_EQUAL(
62             p->dataFrame().destinationAddress().value(),
63             senf::MACAddress::from_string("00:18:4d:6e:78:48") );
64     BOOST_CHECK_EQUAL(
65             p->dataFrame().sourceAddress().value(),
66             senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
67     BOOST_CHECK_EQUAL(
68             p->dataFrame().bssid().value(),
69             senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
70
71     BOOST_CHECK_EQUAL(
72             p->dataFrame().bssid().value(),
73             p->dataFrame().receiverAddress().value() );
74     BOOST_CHECK_EQUAL(
75             p->dataFrame().transmitterAddress().value(),
76             p->dataFrame().sourceAddress().value() );
77
78     BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
79     BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
80
81     std::ostringstream oss (std::ostringstream::out);
82     SENF_CHECK_NO_THROW( p.dump( oss));
83 }
84
85
86 /* test parser with creating a data frame*/
87 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
88 {
89     senf::WLANPacket p (senf::WLANPacket::create());
90
91     SENF_CHECK_NO_THROW( p->init_dataFrame() );
92     SENF_CHECK_NO_THROW( p->dataFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
93     BOOST_CHECK_EQUAL( p->type(), 2u );
94 }
95
96
97 /* test parser with a beacon frame */
98 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
99 {
100     unsigned char data[] = {
101             0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
102             0xff, 0xff, 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c,
103             0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c, 0xe0, 0x12,
104             0x38, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00,
105             0x64, 0x00, 0x01, 0x05, 0x00, 0x05, 0x62, 0x6f,
106             0x78, 0x43, 0x31, 0x01, 0x08, 0x8c, 0x12, 0x98,
107             0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x40,
108             0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x2a,
109             0x4e, 0x41, 0x49, 0x24, 0x01, 0x11, 0x28, 0x01,
110             0x11, 0x2c, 0x01, 0x11, 0x30, 0x01, 0x11, 0x34,
111             0x01, 0x17, 0x38, 0x01, 0x17, 0x3c, 0x01, 0x17,
112             0x40, 0x01, 0x17, 0x95, 0x01, 0x1e, 0x99, 0x01,
113             0x1e, 0x9d, 0x01, 0x1e, 0xa1, 0x01, 0x1e, 0xa5,
114             0x01, 0x1e, 0x20, 0x01, 0x00, 0xdd, 0x18, 0x00,
115             0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x02,
116             0xa3, 0x40, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42,
117             0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xa0,
118             0x00, 0xdd, 0x09, 0x00, 0x03, 0x7f, 0x01, 0x01,
119             0x00, 0x24, 0xff, 0x7f, 0x87, 0x07, 0x1f, 0xf5,
120     };
121
122     senf::WLANPacket p (senf::WLANPacket::create(data));
123
124     BOOST_CHECK_EQUAL( p->version(),        0u    );
125     BOOST_CHECK_EQUAL( p->type(),           0u    );
126     BOOST_CHECK_EQUAL( p->subtype(),        8u    );
127     BOOST_CHECK_EQUAL( p->toDS(),           false );
128     BOOST_CHECK_EQUAL( p->fromDS(),         false );
129     BOOST_CHECK_EQUAL( p->moreFrag(),       false );
130     BOOST_CHECK_EQUAL( p->retry(),          false );
131     BOOST_CHECK_EQUAL( p->pwrMgt(),         false );
132     BOOST_CHECK_EQUAL( p->moreData(),       false );
133     BOOST_CHECK_EQUAL( p->protectedFrame(), false );
134     BOOST_CHECK_EQUAL( p->order(),          false );
135     BOOST_CHECK_EQUAL( p->duration(),       0u    );
136
137     BOOST_CHECK_EQUAL( p->is_mgtFrame(),    true  );
138
139     BOOST_CHECK_EQUAL(
140             p->mgtFrame().destinationAddress().value(),
141             senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff") );
142     BOOST_CHECK_EQUAL(
143             p->mgtFrame().sourceAddress().value(),
144             senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
145     BOOST_CHECK_EQUAL(
146             p->mgtFrame().bssid().value(),
147             senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
148
149     BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
150     BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u   );
151
152     BOOST_CHECK_EQUAL( p->fcs(), 0x87071ff5 );
153 }
154
155
156 /* test parser with creating a beacon frame*/
157 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
158 {
159     senf::WLANPacket p (senf::WLANPacket::create());
160
161     SENF_CHECK_NO_THROW( p->init_mgtFrame() );
162     SENF_CHECK_NO_THROW(
163             p->mgtFrame().destinationAddress() = senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
164     );
165     SENF_CHECK_NO_THROW(
166             p->mgtFrame().sourceAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
167     );
168     SENF_CHECK_NO_THROW(
169             p->mgtFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
170     );
171
172     BOOST_CHECK_EQUAL( p->type(), 0u );
173 }
174
175
176 /* test parser with an ACK frame*/
177 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
178 {
179     unsigned char data[] = {
180             0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
181             0x06, 0xb0, 0x4f, 0xda
182     };
183
184     senf::WLANPacket p (senf::WLANPacket::create(data));
185
186     BOOST_CHECK_EQUAL( p->version(),        0u    );
187     BOOST_CHECK_EQUAL( p->type(),           1u    );
188     BOOST_CHECK_EQUAL( p->subtype(),        13u   );
189     BOOST_CHECK_EQUAL( p->toDS(),           false );
190     BOOST_CHECK_EQUAL( p->fromDS(),         false );
191     BOOST_CHECK_EQUAL( p->moreFrag(),       false );
192     BOOST_CHECK_EQUAL( p->retry(),          false );
193     BOOST_CHECK_EQUAL( p->pwrMgt(),         false );
194     BOOST_CHECK_EQUAL( p->moreData(),       false );
195     BOOST_CHECK_EQUAL( p->protectedFrame(), false );
196     BOOST_CHECK_EQUAL( p->order(),          false );
197
198     BOOST_CHECK_EQUAL( p->duration(),       0u    );
199
200     BOOST_CHECK_EQUAL(
201             p->ctrlFrame().receiverAddress().value(),
202             senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
203 }
204
205
206 /* test parser with creating an ACK frame*/
207 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
208 {
209     senf::WLANPacket p (senf::WLANPacket::create()) ;
210 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
211     SENF_CHECK_NO_THROW(p->init_ctrlFrame());
212 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
213     p->ctrlFrame().receiverAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
214     p->ctrlFrame().set_ack();
215     BOOST_CHECK_EQUAL( p->type(), 1u);
216     BOOST_CHECK_EQUAL( p->subtype(), 13u);
217 }
218