some clean-ups
[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().da().value(),
63             senf::MACAddress::from_string("00:18:4d:6e:78:48") );
64     BOOST_CHECK_EQUAL( 
65             p->dataFrame().sa().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(), p->dataFrame().ra().value() );
73     BOOST_CHECK_EQUAL( 
74             p->dataFrame().ta().value(), p->dataFrame().sa().value() );
75
76     BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
77     BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
78 }
79
80
81 /* test parser with creating a data frame*/
82 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
83 {
84     senf::WLANPacket p (senf::WLANPacket::create());
85
86     SENF_CHECK_NO_THROW( p->init_dataFrame() );
87     SENF_CHECK_NO_THROW( p->dataFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
88     BOOST_CHECK_EQUAL( p->type(), 2u );
89 }
90
91
92 /* test parser with a beacon frame */
93 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
94 {
95     unsigned char data[] = {
96             0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
97             0xff, 0xff, 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c,
98             0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c, 0xe0, 0x12,
99             0x38, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00,
100             0x64, 0x00, 0x01, 0x05, 0x00, 0x05, 0x62, 0x6f,
101             0x78, 0x43, 0x31, 0x01, 0x08, 0x8c, 0x12, 0x98,
102             0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x40,
103             0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x2a,
104             0x4e, 0x41, 0x49, 0x24, 0x01, 0x11, 0x28, 0x01,
105             0x11, 0x2c, 0x01, 0x11, 0x30, 0x01, 0x11, 0x34,
106             0x01, 0x17, 0x38, 0x01, 0x17, 0x3c, 0x01, 0x17,
107             0x40, 0x01, 0x17, 0x95, 0x01, 0x1e, 0x99, 0x01,
108             0x1e, 0x9d, 0x01, 0x1e, 0xa1, 0x01, 0x1e, 0xa5,
109             0x01, 0x1e, 0x20, 0x01, 0x00, 0xdd, 0x18, 0x00,
110             0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x02,
111             0xa3, 0x40, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42,
112             0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xa0,
113             0x00, 0xdd, 0x09, 0x00, 0x03, 0x7f, 0x01, 0x01,
114             0x00, 0x24, 0xff, 0x7f, 0x87, 0x07, 0x1f, 0xf5,
115     };
116
117     senf::WLANPacket p (senf::WLANPacket::create(data));
118
119     BOOST_CHECK_EQUAL( p->version(),        0u    );
120     BOOST_CHECK_EQUAL( p->type(),           0u    );
121     BOOST_CHECK_EQUAL( p->subtype(),        8u    );
122     BOOST_CHECK_EQUAL( p->toDS(),           false );
123     BOOST_CHECK_EQUAL( p->fromDS(),         false );
124     BOOST_CHECK_EQUAL( p->moreFrag(),       false );
125     BOOST_CHECK_EQUAL( p->retry(),          false );
126     BOOST_CHECK_EQUAL( p->pwrMgt(),         false );
127     BOOST_CHECK_EQUAL( p->moreData(),       false );
128     BOOST_CHECK_EQUAL( p->protectedFrame(), false );
129     BOOST_CHECK_EQUAL( p->order(),          false );
130     BOOST_CHECK_EQUAL( p->duration(),       0u    );
131
132     BOOST_CHECK_EQUAL( p->has_mgtFrame(),   true  );
133
134     BOOST_CHECK_EQUAL( 
135             p->mgtFrame().destinationAddress().value(),
136             senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff") );
137     BOOST_CHECK_EQUAL( 
138             p->mgtFrame().sourceAddress().value(),
139             senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
140     BOOST_CHECK_EQUAL( 
141             p->mgtFrame().bssid().value(),
142             senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
143     
144     BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
145     BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u   );
146
147     BOOST_CHECK_EQUAL( p->fcs(), 0x87071ff5 );
148 }
149
150
151 /* test parser with creating a beacon frame*/
152 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
153 {
154     senf::WLANPacket p (senf::WLANPacket::create());
155
156     SENF_CHECK_NO_THROW( p->init_mgtFrame() );
157     SENF_CHECK_NO_THROW(
158             p->mgtFrame().destinationAddress() = senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
159     );
160     SENF_CHECK_NO_THROW(
161             p->mgtFrame().sourceAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
162     );
163     SENF_CHECK_NO_THROW(
164             p->mgtFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
165     );
166
167     BOOST_CHECK_EQUAL( p->type(), 0u );
168 }
169
170
171 /* test parser with an ACK frame*/
172 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
173 {
174     unsigned char data[] = {
175             0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
176             0x06, 0xb0, 0x4f, 0xda
177     };
178
179     senf::WLANPacket p (senf::WLANPacket::create(data));
180
181     BOOST_CHECK_EQUAL( p->version(),        0u    );
182     BOOST_CHECK_EQUAL( p->type(),           1u    );
183     BOOST_CHECK_EQUAL( p->subtype(),        13u   );
184     BOOST_CHECK_EQUAL( p->toDS(),           false );
185     BOOST_CHECK_EQUAL( p->fromDS(),         false );
186     BOOST_CHECK_EQUAL( p->moreFrag(),       false );
187     BOOST_CHECK_EQUAL( p->retry(),          false );
188     BOOST_CHECK_EQUAL( p->pwrMgt(),         false );
189     BOOST_CHECK_EQUAL( p->moreData(),       false );
190     BOOST_CHECK_EQUAL( p->protectedFrame(), false );
191     BOOST_CHECK_EQUAL( p->order(),          false );
192
193     BOOST_CHECK_EQUAL( p->duration(),       0u    );
194
195     BOOST_CHECK_EQUAL( 
196             p->ctrlFrame().recieverAddress().value(),
197             senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
198 }
199
200
201 /* test parser with creating an ACK frame*/
202 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
203 {
204     senf::WLANPacket p (senf::WLANPacket::create()) ;
205 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
206     SENF_CHECK_NO_THROW(p->init_ctrlFrame());
207 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
208     p->ctrlFrame().recieverAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
209     p->ctrlFrame().set_ack();
210     BOOST_CHECK_EQUAL( p->type(), 1u);
211     BOOST_CHECK_EQUAL( p->subtype(), 13u);
212 }
213