OSDN Git Service

Revert "Use new netlink attribute for scan result timestamp" am: ecb6bb205f
[android-x86/system-connectivity-wificond.git] / tests / nl80211_attribute_unittest.cpp
1 /*
2  * Copyright (C) 2016, The Android Open Source Project
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
17 #include <memory>
18
19 #include <gtest/gtest.h>
20
21 #include <linux/nl80211.h>
22
23 #include "wificond/net/nl80211_attribute.h"
24
25 namespace android {
26 namespace wificond {
27
28 namespace {
29
30 const uint32_t kU8Value1 = 200;
31 const uint32_t kU16Value1 = 5000;
32 const uint32_t kU32Value1 = 250000;
33 const uint32_t kU32Value2 = 500000;
34 const std::string kIFName = "wlan0";
35 const uint8_t kMacAddress[] = {
36     0xc0, 0x3f, 0x0e, 0x77, 0xe8, 0x7f
37 };
38
39 // This header contains invalid buffer length
40 const uint8_t kBrokenBuffer[] = {
41     0xff, 0xff, // nla_len = 0xffff
42     0x01, 0x11, // nla_type
43     0x15, 0x12, // payload
44     0x00, 0x00  // padding
45 };
46 const uint8_t kValidU32AttrBuffer[] = {
47     0x08, 0x00, // nla_len = 8
48     0x01, 0x00, // nla_type
49     0xf1, 0x12, 0x12, 0x2a // payload
50 };
51 const uint8_t kBufferContainsStringWithTrailingZero[] = {
52     0x0a, 0x00, // nla_len = 10
53     0x01, 0x00, // nla_type
54     'w', 'l', 'a', 'n', '0', '\0',
55     0x00, 0x00  // padding
56 };
57 const uint8_t kBufferContainsStringWithTrailingZeros[] = {
58     0x0c, 0x00, // nla_len = 12
59     0x01, 0x00, // nla_type
60     'w', 'l', 'a', 'n', '0', '\0', '\0', '\0'
61 };
62 const uint8_t kBufferContainsStringWithoutTrailingZero[] = {
63     0x09, 0x00, // nla_len = 9
64     0x01, 0x00, // nla_type
65     'w', 'l', 'a', 'n', '0',
66     0x00, 0x00, 0x00  // padding
67 };
68
69 const uint8_t kBufferContainsListOfAttributes[] = {
70     0x28, 0x00, // nla_len = 40
71     0x01, 0x00, // nla_type
72     // List of attributes:
73     // They have attribute id from 0 to N.
74     0x0a, 0x00, // nla_len = 10
75     0x00, 0x00, // nla_type = 0
76     'f', 'i', 'r', 's', 't','\0',
77     0x00, 0x00,  // padding
78     0x0b, 0x00, // nla_len = 11
79     0x01, 0x00, // nla_type = 1
80     's', 'e', 'c', 'o', 'n', 'd','\0',
81     0x00, // padding
82     0x0a, 0x00, // nla_len = 10
83     0x02, 0x00, // nla_type = 2
84     't', 'h', 'i', 'r', 'd','\0',
85     0x00, 0x00, // padding
86 };
87
88 const uint8_t kBufferContainsListOfNestedAttributes[] = {
89     0x28, 0x00, // nla_len = 40
90     0x01, 0x00, // nla_type
91
92     // List of nested attributes:
93     // They have attribute id from 0 to N.
94
95     // Nested attribute 1:
96     0x0c, 0x00, // nla_len = 12
97     0x00, 0x00, // nla_type = 0
98         0x06, 0x00, // nla_len = 6
99         0x01, 0x00, // nla_type
100         0x05, 0x00, // uint16_t attribute with value 5
101         0x00, 0x00, // padding
102
103     // Nested attribute 2:
104     0x0c, 0x00, // nla_len = 12
105     0x01, 0x00, // nla_type = 1
106         0x08, 0x00, // nla_len = 8
107         0x01, 0x00, // nla_type
108         0x0a, 0x00,
109         0x00, 0x00, // uint32_t attribute with value 10
110
111     // Nested attribute 3:
112     0x0c, 0x00, // nla_len = 12
113     0x02, 0x00, // nla_type = 2
114         0x05, 0x00, // nla_len = 5
115         0x01, 0x00, // nla_type
116         0x08, 0x00, // uint8_t attribute with value 8
117         0x00, 0x00, // padding
118 };
119
120 }  // namespace
121
122 TEST(NL80211AttributeTest,U8AttributesSeriallizeCorrectly) {
123   NL80211Attr<uint8_t> u8_attr(1, kU8Value1);
124   EXPECT_EQ(u8_attr.GetValue(), kU8Value1);
125 }
126
127 TEST(NL80211AttributeTest,U16AttributesSeriallizeCorrectly) {
128   NL80211Attr<uint16_t> u16_attr(1, kU16Value1);
129   EXPECT_EQ(u16_attr.GetValue(), kU16Value1);
130 }
131
132 TEST(NL80211AttributeTest,U32AttributesSeriallizeCorrectly) {
133   NL80211Attr<uint32_t> u32_attr(1, kU32Value1);
134   EXPECT_EQ(u32_attr.GetValue(), kU32Value1);
135 }
136
137 TEST(NL80211AttributeTest,StringAttributesSeriallizeCorrectly) {
138   NL80211Attr<std::string> str_attr(1, kIFName);
139   EXPECT_EQ(str_attr.GetValue(), kIFName);
140 }
141
142 TEST(NL80211AttributeTest, ByteVectorsSeriallizeCorrectly) {
143   std::vector<uint8_t> mac_address(
144       kMacAddress,
145       kMacAddress + sizeof(kMacAddress));
146   NL80211Attr<std::vector<uint8_t>> byte_vector_attr(1, mac_address);
147   EXPECT_EQ(byte_vector_attr.GetValue(), mac_address);
148 }
149
150 TEST(NL80211AttributeTest, CanGetNestedAttributes) {
151   NL80211NestedAttr nested_attr(1);
152   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
153   NL80211Attr<uint32_t> u32_attr_2(2, kU32Value2);
154
155   nested_attr.AddAttribute(u32_attr_1);
156   nested_attr.AddAttribute(u32_attr_2);
157
158   EXPECT_TRUE(nested_attr.HasAttribute(1));
159   EXPECT_TRUE(nested_attr.HasAttribute(2));
160
161   uint32_t attr_value;
162   EXPECT_TRUE(nested_attr.GetAttributeValue(1, &attr_value));
163   EXPECT_EQ(attr_value, kU32Value1);
164   EXPECT_TRUE(nested_attr.GetAttributeValue(2, &attr_value));
165   EXPECT_EQ(attr_value, kU32Value2);
166 }
167
168 TEST(NL80211AttributeTest, CannotGetDoubleNestedAttributes) {
169   NL80211NestedAttr nested_attr(1);
170   NL80211NestedAttr deeper_nested_attr(2);
171   NL80211Attr<uint32_t> u32_attr_1(3, kU32Value1);
172
173   deeper_nested_attr.AddAttribute(u32_attr_1);
174   nested_attr.AddAttribute(deeper_nested_attr);
175
176   EXPECT_FALSE(nested_attr.HasAttribute(3));
177 }
178
179 TEST(NL80211AttributeTest, CannotGetMissingAttribute) {
180   NL80211NestedAttr nested_attr(1);
181   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
182
183   nested_attr.AddAttribute(u32_attr_1);
184
185   uint32_t attr_value;
186   EXPECT_FALSE(nested_attr.HasAttribute(2));
187   EXPECT_FALSE(nested_attr.GetAttributeValue(2, &attr_value));
188 }
189
190 TEST(NL80211AttributeTest, CannotGetAttributeWithWrongType) {
191   NL80211NestedAttr nested_attr(1);
192   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
193
194   nested_attr.AddAttribute(u32_attr_1);
195
196   uint16_t attr_value;
197   EXPECT_TRUE(nested_attr.HasAttribute(1));
198   EXPECT_FALSE(nested_attr.GetAttributeValue(1, &attr_value));
199 }
200
201
202 TEST(NL80211AttributeTest, InvalidU32AttributeWithEmptyBuffer) {
203   std::vector<uint8_t> buffer;
204   NL80211Attr<uint32_t> invalid_attr(buffer);
205   EXPECT_FALSE(invalid_attr.IsValid());
206 }
207
208 TEST(NL80211AttributeTest, InvalidU32AttributeWithBrokenBuffer) {
209   std::vector<uint8_t> buffer(
210       kBrokenBuffer,
211       kBrokenBuffer + sizeof(kBrokenBuffer));
212   NL80211Attr<uint32_t> invalid_attr(buffer);
213   EXPECT_FALSE(invalid_attr.IsValid());
214 }
215
216 TEST(NL80211AttributeTest, InvalidU16AttributeWithU32Buffer) {
217   std::vector<uint8_t> buffer(
218       kValidU32AttrBuffer,
219       kValidU32AttrBuffer + sizeof(kValidU32AttrBuffer));
220   NL80211Attr<uint32_t> valid_attr(buffer);
221   NL80211Attr<uint16_t> invalid_attr(buffer);
222   EXPECT_TRUE(valid_attr.IsValid());
223   EXPECT_FALSE(invalid_attr.IsValid());
224 }
225
226 TEST(NL80211AttributeTest, InitStringAttributeWithTrailingZeroFromBuffer) {
227   std::vector<uint8_t> buffer(
228       kBufferContainsStringWithTrailingZero,
229       kBufferContainsStringWithTrailingZero +
230           sizeof(kBufferContainsStringWithTrailingZero));
231   NL80211Attr<std::string> str_attr(buffer);
232   EXPECT_EQ("wlan0", str_attr.GetValue());
233 }
234
235 TEST(NL80211AttributeTest, InitStringAttributeWithTrailingZerosFromBuffer) {
236   std::vector<uint8_t> buffer(
237       kBufferContainsStringWithTrailingZeros,
238       kBufferContainsStringWithTrailingZeros +
239           sizeof(kBufferContainsStringWithTrailingZeros));
240   NL80211Attr<std::string> str_attr(buffer);
241   EXPECT_EQ("wlan0", str_attr.GetValue());
242 }
243
244 TEST(NL80211AttributeTest, InitStringAttributeWithoutTrailingZeroFromBuffer) {
245   std::vector<uint8_t> buffer(
246       kBufferContainsStringWithoutTrailingZero,
247       kBufferContainsStringWithoutTrailingZero +
248           sizeof(kBufferContainsStringWithoutTrailingZero));
249   NL80211Attr<std::string> str_attr(buffer);
250   EXPECT_EQ("wlan0", str_attr.GetValue());
251 }
252
253 TEST(NL80211AttributeTest, GetListOfStringsFromBuffer) {
254   std::vector<uint8_t> buffer(
255       kBufferContainsListOfAttributes,
256       kBufferContainsListOfAttributes +
257           sizeof(kBufferContainsListOfAttributes));
258   std::vector<std::string> strs;
259   std::vector<std::string> expected_strs = {"first", "second", "third"};
260   NL80211NestedAttr nested_attr(buffer);
261   nested_attr.GetListOfAttributeValues(&strs);
262   EXPECT_EQ(expected_strs, strs);
263 }
264
265 TEST(NL80211AttributeTest, GetListOfNestedAttributesFromBuffer) {
266   std::vector<uint8_t> buffer(
267       kBufferContainsListOfNestedAttributes,
268       kBufferContainsListOfNestedAttributes +
269           sizeof(kBufferContainsListOfNestedAttributes));
270   std::vector<NL80211NestedAttr> nested_attrs;
271   NL80211NestedAttr attr(buffer);
272   EXPECT_TRUE(attr.GetListOfNestedAttributes(&nested_attrs));
273   EXPECT_TRUE(nested_attrs.size() == 3);
274   uint16_t value1;
275   uint32_t value2;
276   uint8_t value3;
277   EXPECT_TRUE(nested_attrs[0].GetAttributeValue(1, &value1));
278   EXPECT_TRUE(nested_attrs[1].GetAttributeValue(1, &value2));
279   EXPECT_TRUE(nested_attrs[2].GetAttributeValue(1, &value3));
280   EXPECT_TRUE(value1 == 5);
281   EXPECT_TRUE(value2 == 10);
282   EXPECT_TRUE(value3 == 8);
283 }
284
285 }  // namespace wificond
286 }  // namespace android