Updated license from GPL version 2 or later to GPL version 3 or later.
[debian/gnuradio] / usrp / host / lib / inband / qa_inband_packet_prims.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <qa_inband_packet_prims.h>
27 #include <cppunit/TestAssert.h>
28 #include <stdio.h>
29 #include <usrp_inband_usb_packet.h>             // will change on gigabit crossover
30
31 typedef usrp_inband_usb_packet transport_pkt;
32
33 void
34 qa_inband_packet_prims::test_flags()
35 {
36   transport_pkt pkt;
37
38   // Test each one of the flags while ensuring no other fields become set in the process
39   pkt.set_header(pkt.FL_START_OF_BURST,0,0,0);
40   CPPUNIT_ASSERT_EQUAL(1, pkt.start_of_burst());
41   CPPUNIT_ASSERT_EQUAL(0, pkt.end_of_burst());
42   CPPUNIT_ASSERT_EQUAL(0, pkt.overrun());
43   CPPUNIT_ASSERT_EQUAL(0, pkt.underrun());
44   CPPUNIT_ASSERT_EQUAL(0, pkt.dropped());
45   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
46   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
47   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
48
49   pkt.set_header(pkt.FL_END_OF_BURST,0,0,0);
50   CPPUNIT_ASSERT_EQUAL(0, pkt.start_of_burst());
51   CPPUNIT_ASSERT_EQUAL(1, pkt.end_of_burst());
52   CPPUNIT_ASSERT_EQUAL(0, pkt.overrun());
53   CPPUNIT_ASSERT_EQUAL(0, pkt.underrun());
54   CPPUNIT_ASSERT_EQUAL(0, pkt.dropped());
55   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
56   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
57   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
58
59   pkt.set_header(pkt.FL_OVERRUN,0,0,0);
60   CPPUNIT_ASSERT_EQUAL(0, pkt.start_of_burst());
61   CPPUNIT_ASSERT_EQUAL(0, pkt.end_of_burst());
62   CPPUNIT_ASSERT_EQUAL(1, pkt.overrun());
63   CPPUNIT_ASSERT_EQUAL(0, pkt.underrun());
64   CPPUNIT_ASSERT_EQUAL(0, pkt.dropped());
65   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
66   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
67   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
68
69   pkt.set_header(pkt.FL_UNDERRUN,0,0,0);
70   CPPUNIT_ASSERT_EQUAL(0, pkt.start_of_burst());
71   CPPUNIT_ASSERT_EQUAL(0, pkt.end_of_burst());
72   CPPUNIT_ASSERT_EQUAL(0, pkt.overrun());
73   CPPUNIT_ASSERT_EQUAL(1, pkt.underrun());
74   CPPUNIT_ASSERT_EQUAL(0, pkt.dropped());
75   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
76   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
77   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
78
79   pkt.set_header(pkt.FL_DROPPED,0,0,0);
80   CPPUNIT_ASSERT_EQUAL(0, pkt.start_of_burst());
81   CPPUNIT_ASSERT_EQUAL(0, pkt.end_of_burst());
82   CPPUNIT_ASSERT_EQUAL(0, pkt.overrun());
83   CPPUNIT_ASSERT_EQUAL(0, pkt.underrun());
84   CPPUNIT_ASSERT_EQUAL(1, pkt.dropped());
85   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
86   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
87   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
88
89   // test of all fields set
90   pkt.set_header(
91     pkt.FL_START_OF_BURST |
92     pkt.FL_END_OF_BURST |
93     pkt.FL_UNDERRUN |
94     pkt.FL_OVERRUN |
95     pkt.FL_DROPPED 
96     ,0,0,0);
97   CPPUNIT_ASSERT_EQUAL(1, pkt.start_of_burst());
98   CPPUNIT_ASSERT_EQUAL(1, pkt.end_of_burst());
99   CPPUNIT_ASSERT_EQUAL(1, pkt.overrun());
100   CPPUNIT_ASSERT_EQUAL(1, pkt.underrun());
101   CPPUNIT_ASSERT_EQUAL(1, pkt.dropped());
102   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
103   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
104   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
105
106
107 }
108 //////////////////////////////////////////////////////////////////////
109
110 void
111 qa_inband_packet_prims::test_fields()
112 {
113   transport_pkt pkt;
114   void * payload;
115   
116   // test word0 field exclusiveness
117   //
118   // I want to test max values of each field to ensure field boundaries
119   // but these max values could change based on technology?  The
120   // max payload is returned by a private method so the code is not
121   // technology dependent
122   pkt.set_header(0,16,0,0);
123   CPPUNIT_ASSERT_EQUAL(16, pkt.chan());
124   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
125   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
126
127   pkt.set_header(0,0,8,0);
128   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
129   CPPUNIT_ASSERT_EQUAL(8, pkt.tag());
130   CPPUNIT_ASSERT_EQUAL(0,pkt.payload_len());
131
132   pkt.set_header(0,0,0,pkt.max_payload());  
133   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
134   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
135   CPPUNIT_ASSERT_EQUAL(pkt.max_payload(), pkt.payload_len());
136
137   // test timestamp, shouldn't have to test other fields since
138   // setting the timestamp only has the ability to affect one word
139   pkt.set_timestamp(54);
140   CPPUNIT_ASSERT_EQUAL(uint32_t(54), pkt.timestamp());
141
142   // test the payload, ensure no other fields overwritten
143   //
144   // is there a better test for this?
145   pkt.set_header(0,0,0,0);
146   payload = malloc(pkt.payload_len());
147   memset(payload, 'f', pkt.payload_len());
148   memcpy(pkt.payload(), payload, pkt.payload_len());
149   CPPUNIT_ASSERT_EQUAL(0, memcmp(pkt.payload(), payload, pkt.payload_len()));
150   CPPUNIT_ASSERT_EQUAL(0, pkt.start_of_burst());
151   CPPUNIT_ASSERT_EQUAL(0, pkt.end_of_burst());
152   CPPUNIT_ASSERT_EQUAL(0, pkt.overrun());
153   CPPUNIT_ASSERT_EQUAL(0, pkt.underrun());
154   CPPUNIT_ASSERT_EQUAL(0, pkt.dropped());
155   CPPUNIT_ASSERT_EQUAL(0, pkt.chan());
156   CPPUNIT_ASSERT_EQUAL(0, pkt.tag());
157   CPPUNIT_ASSERT_EQUAL(0, pkt.payload_len());
158   free(payload);
159
160 }
161 //////////////////////////////////////////////////////////////////////