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