15e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang/*
25e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * Copyright (C) 2016, The Android Open Source Project
35e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang *
45e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * Licensed under the Apache License, Version 2.0 (the "License");
55e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * you may not use this file except in compliance with the License.
65e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * You may obtain a copy of the License at
75e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang *
85e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang *     http://www.apache.org/licenses/LICENSE-2.0
95e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang *
105e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * Unless required by applicable law or agreed to in writing, software
115e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * distributed under the License is distributed on an "AS IS" BASIS,
125e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * See the License for the specific language governing permissions and
145e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang * limitations under the License.
155e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang */
165e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
175e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang#include <memory>
185e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
195e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang#include <gtest/gtest.h>
205e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
214a10da1c100160f2ab357e108bfd602e4421bdb1Roshan Pius#include "wificond/net/kernel-header-latest/nl80211.h"
22808c670699b218f8cc16f83e81be408ae441d44aNingyuan Wang#include "wificond/net/nl80211_attribute.h"
235e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
245e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wangnamespace android {
255e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wangnamespace wificond {
265e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
275e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wangnamespace {
285e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
2996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint32_t kU8Value1 = 200;
3096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint32_t kU16Value1 = 5000;
3196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint32_t kU32Value1 = 250000;
3296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint32_t kU32Value2 = 500000;
3396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst std::string kIFName = "wlan0";
3496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kMacAddress[] = {
3596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0xc0, 0x3f, 0x0e, 0x77, 0xe8, 0x7f
3696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
3796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
3896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang// This header contains invalid buffer length
3996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kBrokenBuffer[] = {
4096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0xff, 0xff, // nla_len = 0xffff
4196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x01, 0x11, // nla_type
4296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x15, 0x12, // payload
4396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x00, 0x00  // padding
4496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
4596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kValidU32AttrBuffer[] = {
4696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x08, 0x00, // nla_len = 8
4796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x01, 0x00, // nla_type
4896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0xf1, 0x12, 0x12, 0x2a // payload
4996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
5096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kBufferContainsStringWithTrailingZero[] = {
5196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x0a, 0x00, // nla_len = 10
5296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x01, 0x00, // nla_type
5396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    'w', 'l', 'a', 'n', '0', '\0',
5496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x00, 0x00  // padding
5596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
5696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kBufferContainsStringWithTrailingZeros[] = {
5796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x0c, 0x00, // nla_len = 12
5896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x01, 0x00, // nla_type
5996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    'w', 'l', 'a', 'n', '0', '\0', '\0', '\0'
6096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
6196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wangconst uint8_t kBufferContainsStringWithoutTrailingZero[] = {
6296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x09, 0x00, // nla_len = 9
6396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x01, 0x00, // nla_type
6496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    'w', 'l', 'a', 'n', '0',
6596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang    0x00, 0x00, 0x00  // padding
6696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang};
675e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
6858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wangconst uint8_t kBufferContainsListOfAttributes[] = {
6958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x28, 0x00, // nla_len = 40
7058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x01, 0x00, // nla_type
7158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // List of attributes:
7258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // They have attribute id from 0 to N.
7358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0a, 0x00, // nla_len = 10
7458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x00, 0x00, // nla_type = 0
7558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    'f', 'i', 'r', 's', 't','\0',
7658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x00, 0x00,  // padding
7758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0b, 0x00, // nla_len = 11
7858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x01, 0x00, // nla_type = 1
7958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    's', 'e', 'c', 'o', 'n', 'd','\0',
8058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x00, // padding
8158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0a, 0x00, // nla_len = 10
8258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x02, 0x00, // nla_type = 2
8358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    't', 'h', 'i', 'r', 'd','\0',
8458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x00, 0x00, // padding
8558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang};
8658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
8758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wangconst uint8_t kBufferContainsListOfNestedAttributes[] = {
8858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x28, 0x00, // nla_len = 40
8958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x01, 0x00, // nla_type
9058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
9158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // List of nested attributes:
9258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // They have attribute id from 0 to N.
9358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
9458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // Nested attribute 1:
9558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0c, 0x00, // nla_len = 12
9658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x00, 0x00, // nla_type = 0
9758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x06, 0x00, // nla_len = 6
9858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x01, 0x00, // nla_type
9958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x05, 0x00, // uint16_t attribute with value 5
10058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x00, 0x00, // padding
10158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
10258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // Nested attribute 2:
10358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0c, 0x00, // nla_len = 12
10458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x01, 0x00, // nla_type = 1
10558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x08, 0x00, // nla_len = 8
10658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x01, 0x00, // nla_type
10758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x0a, 0x00,
10858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x00, 0x00, // uint32_t attribute with value 10
10958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
11058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    // Nested attribute 3:
11158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x0c, 0x00, // nla_len = 12
11258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang    0x02, 0x00, // nla_type = 2
11358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x05, 0x00, // nla_len = 5
11458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x01, 0x00, // nla_type
11558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x08, 0x00, // uint8_t attribute with value 8
11658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang        0x00, 0x00, // padding
11758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang};
11858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
1195e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang}  // namespace
1205e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
12196f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest,U8AttributesSeriallizeCorrectly) {
12296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint8_t> u8_attr(1, kU8Value1);
12396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(u8_attr.GetValue(), kU8Value1);
12496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
1255e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
12696f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest,U16AttributesSeriallizeCorrectly) {
12796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint16_t> u16_attr(1, kU16Value1);
12896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(u16_attr.GetValue(), kU16Value1);
12996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
1305e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
13196f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest,U32AttributesSeriallizeCorrectly) {
13296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr(1, kU32Value1);
13396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(u32_attr.GetValue(), kU32Value1);
13496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
1355e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
13696f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest,StringAttributesSeriallizeCorrectly) {
13796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<std::string> str_attr(1, kIFName);
13896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(str_attr.GetValue(), kIFName);
1395e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang}
1405e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
14196f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, ByteVectorsSeriallizeCorrectly) {
14296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> mac_address(
14396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kMacAddress,
14496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kMacAddress + sizeof(kMacAddress));
14596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> byte_vector_attr(1, mac_address);
14696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(byte_vector_attr.GetValue(), mac_address);
14796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
14896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
14996f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, CanGetNestedAttributes) {
15096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211NestedAttr nested_attr(1);
15196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
15296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr_2(2, kU32Value2);
15396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
15496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  nested_attr.AddAttribute(u32_attr_1);
15596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  nested_attr.AddAttribute(u32_attr_2);
15696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
15796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(nested_attr.HasAttribute(1));
15896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(nested_attr.HasAttribute(2));
15996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
16096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  uint32_t attr_value;
16196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(nested_attr.GetAttributeValue(1, &attr_value));
16296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(attr_value, kU32Value1);
16396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(nested_attr.GetAttributeValue(2, &attr_value));
16496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ(attr_value, kU32Value2);
16596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
16696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
16796f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, CannotGetDoubleNestedAttributes) {
16896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211NestedAttr nested_attr(1);
16996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211NestedAttr deeper_nested_attr(2);
17096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr_1(3, kU32Value1);
17196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
17296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  deeper_nested_attr.AddAttribute(u32_attr_1);
17396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  nested_attr.AddAttribute(deeper_nested_attr);
17496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
17596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(nested_attr.HasAttribute(3));
17696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
17796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
17896f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, CannotGetMissingAttribute) {
17996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211NestedAttr nested_attr(1);
18096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
18196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
18296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  nested_attr.AddAttribute(u32_attr_1);
18396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
18496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  uint32_t attr_value;
18596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(nested_attr.HasAttribute(2));
18696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(nested_attr.GetAttributeValue(2, &attr_value));
18796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
18896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
18996f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, CannotGetAttributeWithWrongType) {
19096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211NestedAttr nested_attr(1);
19196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
19296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
19396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  nested_attr.AddAttribute(u32_attr_1);
19496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
19596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  uint16_t attr_value;
19696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(nested_attr.HasAttribute(1));
19796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(nested_attr.GetAttributeValue(1, &attr_value));
19896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
19996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
20096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
20196f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InvalidU32AttributeWithEmptyBuffer) {
20296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer;
20396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> invalid_attr(buffer);
20496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(invalid_attr.IsValid());
20596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
20696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
20796f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InvalidU32AttributeWithBrokenBuffer) {
20896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer(
20996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBrokenBuffer,
21096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBrokenBuffer + sizeof(kBrokenBuffer));
21196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> invalid_attr(buffer);
21296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(invalid_attr.IsValid());
21396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
21496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
21596f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InvalidU16AttributeWithU32Buffer) {
21696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer(
21796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kValidU32AttrBuffer,
21896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kValidU32AttrBuffer + sizeof(kValidU32AttrBuffer));
21996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint32_t> valid_attr(buffer);
22096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<uint16_t> invalid_attr(buffer);
22196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_TRUE(valid_attr.IsValid());
22296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_FALSE(invalid_attr.IsValid());
22396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
22496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
22596f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InitStringAttributeWithTrailingZeroFromBuffer) {
22696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer(
22796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithTrailingZero,
22896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithTrailingZero +
22996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang          sizeof(kBufferContainsStringWithTrailingZero));
23096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<std::string> str_attr(buffer);
23196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ("wlan0", str_attr.GetValue());
23296f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
23396f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang
23496f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InitStringAttributeWithTrailingZerosFromBuffer) {
23596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer(
23696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithTrailingZeros,
23796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithTrailingZeros +
23896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang          sizeof(kBufferContainsStringWithTrailingZeros));
23996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<std::string> str_attr(buffer);
24096f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ("wlan0", str_attr.GetValue());
24196f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang}
2425e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
24396f218d3f9ca023f90479bb17056c734d506a650Ningyuan WangTEST(NL80211AttributeTest, InitStringAttributeWithoutTrailingZeroFromBuffer) {
24496f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  std::vector<uint8_t> buffer(
24596f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithoutTrailingZero,
24696f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang      kBufferContainsStringWithoutTrailingZero +
24796f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang          sizeof(kBufferContainsStringWithoutTrailingZero));
24896f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  NL80211Attr<std::string> str_attr(buffer);
24996f218d3f9ca023f90479bb17056c734d506a650Ningyuan Wang  EXPECT_EQ("wlan0", str_attr.GetValue());
2505e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang}
2515e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang
25258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan WangTEST(NL80211AttributeTest, GetListOfStringsFromBuffer) {
25358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  std::vector<uint8_t> buffer(
25458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang      kBufferContainsListOfAttributes,
25558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang      kBufferContainsListOfAttributes +
25658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang          sizeof(kBufferContainsListOfAttributes));
25758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  std::vector<std::string> strs;
25858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  std::vector<std::string> expected_strs = {"first", "second", "third"};
25958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  NL80211NestedAttr nested_attr(buffer);
26058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  nested_attr.GetListOfAttributeValues(&strs);
26158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_EQ(expected_strs, strs);
26258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang}
26358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
2644f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan PiusTEST(NL80211AttributeTest, GetListOfAttributesFromBuffer) {
2654f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  std::vector<uint8_t> buffer(
2664f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius      kBufferContainsListOfAttributes,
2674f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius      kBufferContainsListOfAttributes +
2684f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius          sizeof(kBufferContainsListOfAttributes));
2694f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius
2704f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  std::vector<NL80211Attr<std::string>> attrs;
2714f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  NL80211NestedAttr attr(buffer);
2724f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  EXPECT_TRUE(attr.GetListOfAttributes(&attrs));
2734f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  EXPECT_TRUE(attrs.size() == 3);
2744f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ(0, attrs[0].GetAttributeId());
2754f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ(1, attrs[1].GetAttributeId());
2764f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ(2, attrs[2].GetAttributeId());
2774f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ("first", attrs[0].GetValue());
2784f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ("second", attrs[1].GetValue());
2794f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius  ASSERT_EQ("third", attrs[2].GetValue());
2804f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius}
2814f20cdaa6a8aa5ead081fdfe14f1315d801d7db2Roshan Pius
28258b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan WangTEST(NL80211AttributeTest, GetListOfNestedAttributesFromBuffer) {
28358b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  std::vector<uint8_t> buffer(
28458b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang      kBufferContainsListOfNestedAttributes,
28558b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang      kBufferContainsListOfNestedAttributes +
28658b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang          sizeof(kBufferContainsListOfNestedAttributes));
28758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  std::vector<NL80211NestedAttr> nested_attrs;
28858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  NL80211NestedAttr attr(buffer);
28958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_TRUE(attr.GetListOfNestedAttributes(&nested_attrs));
29058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_TRUE(nested_attrs.size() == 3);
291e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  uint16_t value1 = 0;
292e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  uint32_t value2 = 0;
293e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  uint8_t value3 = 0;
294e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  ASSERT_TRUE(nested_attrs[0].GetAttributeValue(1, &value1));
295e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  ASSERT_TRUE(nested_attrs[1].GetAttributeValue(1, &value2));
296e0d5304beb40a2972666dcb5ce467f5009046cfcManoj Gupta  ASSERT_TRUE(nested_attrs[2].GetAttributeValue(1, &value3));
29758b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_TRUE(value1 == 5);
29858b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_TRUE(value2 == 10);
29958b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang  EXPECT_TRUE(value3 == 8);
30058b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang}
30158b77ef36d8d08626a10a88aa5ab8ab254eba5b7Ningyuan Wang
3027e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan WangTEST(NL80211AttributeTest, MergeAttributes) {
3037e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> attr1(1, {'a', 'b', 'c'});
3047e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> attr2(1, {'d', 'e'});
3057e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  ASSERT_TRUE(attr1.Merge(attr2));
3067e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  std::vector<uint8_t> expected_value{{'a', 'b', 'c', 'd', 'e'}};
3077e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_EQ(expected_value, attr1.GetValue());
3087e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang}
3097e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang
3107e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan WangTEST(NL80211AttributeTest, CannotMergeInvalidAttributeWithBrokenBuffer) {
3117e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> valid_attr(1, {'a', 'b', 'c'});
3127e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  std::vector<uint8_t> broken_buffer(
3137e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang      kBrokenBuffer,
3147e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang      kBrokenBuffer + sizeof(kBrokenBuffer));
3157e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> invalid_attr(broken_buffer);
3167e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_FALSE(valid_attr.Merge(invalid_attr));
3177e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang}
3187e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang
3197e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan WangTEST(NL80211AttributeTest, CannotMergeAttributesWithDifferentIds) {
3207e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> attr1(1, {'a', 'b', 'c'});
3217e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<std::vector<uint8_t>> attr2(2, {'d', 'e', 'f'});
3227e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_FALSE(attr1.Merge(attr2));
3237e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang}
3247e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang
3257e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan WangTEST(NL80211AttributeTest, MergeNestedAttributes) {
3267e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211NestedAttr nested_attr1(0);
3277e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211NestedAttr nested_attr2(0);
3287e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<uint32_t> uint32_attr1(1, kU32Value1);
3297e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  NL80211Attr<uint32_t> uint32_attr2(2, kU32Value2);
3307e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  nested_attr1.AddAttribute(uint32_attr1);
3317e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  nested_attr2.AddAttribute(uint32_attr2);
3327e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  ASSERT_TRUE(nested_attr1.Merge(nested_attr2));
3337e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang
3347e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  uint32_t value1, value2;
3357e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_TRUE(nested_attr1.GetAttributeValue(1, &value1));
3367e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_TRUE(value1 == kU32Value1);
3377e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_TRUE(nested_attr1.GetAttributeValue(2, &value2));
3387e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang  EXPECT_TRUE(value2 == kU32Value2);
3397e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang}
3407e8a6b0475eb51f30deaa05df80b0f9fbf91f075Ningyuan Wang
3415e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang}  // namespace wificond
3425e4d528807f476399fe2ed395db1517bd7541f68Ningyuan Wang}  // namespace android
343