13d73f617610de09a68243852c91a2fffcabc367cArman Uguray// 23d73f617610de09a68243852c91a2fffcabc367cArman Uguray// Copyright (C) 2015 Google, Inc. 33d73f617610de09a68243852c91a2fffcabc367cArman Uguray// 43d73f617610de09a68243852c91a2fffcabc367cArman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 53d73f617610de09a68243852c91a2fffcabc367cArman Uguray// you may not use this file except in compliance with the License. 63d73f617610de09a68243852c91a2fffcabc367cArman Uguray// You may obtain a copy of the License at: 73d73f617610de09a68243852c91a2fffcabc367cArman Uguray// 83d73f617610de09a68243852c91a2fffcabc367cArman Uguray// http://www.apache.org/licenses/LICENSE-2.0 93d73f617610de09a68243852c91a2fffcabc367cArman Uguray// 103d73f617610de09a68243852c91a2fffcabc367cArman Uguray// Unless required by applicable law or agreed to in writing, software 113d73f617610de09a68243852c91a2fffcabc367cArman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 123d73f617610de09a68243852c91a2fffcabc367cArman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d73f617610de09a68243852c91a2fffcabc367cArman Uguray// See the License for the specific language governing permissions and 143d73f617610de09a68243852c91a2fffcabc367cArman Uguray// limitations under the License. 153d73f617610de09a68243852c91a2fffcabc367cArman Uguray// 163d73f617610de09a68243852c91a2fffcabc367cArman Uguray 173d73f617610de09a68243852c91a2fffcabc367cArman Uguray#include <gtest/gtest.h> 183d73f617610de09a68243852c91a2fffcabc367cArman Uguray 19234138e2606dd7a54fbcc540643511abc0a3598dArman Uguray#include "service/common/bluetooth/advertise_data.h" 203d73f617610de09a68243852c91a2fffcabc367cArman Uguray#include "stack/include/bt_types.h" 213d73f617610de09a68243852c91a2fffcabc367cArman Uguray#include "stack/include/hcidefs.h" 223d73f617610de09a68243852c91a2fffcabc367cArman Uguray 233d73f617610de09a68243852c91a2fffcabc367cArman Uguraynamespace bluetooth { 243d73f617610de09a68243852c91a2fffcabc367cArman Uguray 253d73f617610de09a68243852c91a2fffcabc367cArman UgurayTEST(AdvertiseDataTest, EmptyData) { 263d73f617610de09a68243852c91a2fffcabc367cArman Uguray const std::vector<uint8_t> data0; 273d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv0(data0); 283d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_TRUE(adv0.IsValid()); 293d73f617610de09a68243852c91a2fffcabc367cArman Uguray 3012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Single empty field not allowed. 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data1{0x00}; 323d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv1(data1); 3312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(adv1.IsValid()); 343d73f617610de09a68243852c91a2fffcabc367cArman Uguray} 353d73f617610de09a68243852c91a2fffcabc367cArman Uguray 363d73f617610de09a68243852c91a2fffcabc367cArman UgurayTEST(AdvertiseDataTest, BadTLV) { 373d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Single field, field empty. 38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data0{0x01}; 393d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv0(data0); 403d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv0.IsValid()); 413d73f617610de09a68243852c91a2fffcabc367cArman Uguray 423d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Single field, first field length too long. 43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data1{0x05, 0x02, 0x00, 0x00, 0x00}; 443d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv1(data1); 453d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv1.IsValid()); 463d73f617610de09a68243852c91a2fffcabc367cArman Uguray 473d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Two fields, second field length too long. 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data2{0x02, 0x02, 0x00, 0x02, 0x00}; 493d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv2(data2); 503d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv2.IsValid()); 513d73f617610de09a68243852c91a2fffcabc367cArman Uguray 523d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Two fields, second field empty. 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data3{0x02, 0x02, 0x00, 0x01}; 543d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv3(data3); 553d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv3.IsValid()); 563d73f617610de09a68243852c91a2fffcabc367cArman Uguray} 573d73f617610de09a68243852c91a2fffcabc367cArman Uguray 583d73f617610de09a68243852c91a2fffcabc367cArman UgurayTEST(AdvertiseDataTest, GoodTLV) { 593d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Singe field. 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data0{0x03, 0x02, 0x01, 0x02}; 613d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv0(data0); 623d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_TRUE(adv0.IsValid()); 633d73f617610de09a68243852c91a2fffcabc367cArman Uguray 643d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Twi fields. 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data1{0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01}; 663d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv1(data1); 673d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_TRUE(adv0.IsValid()); 683d73f617610de09a68243852c91a2fffcabc367cArman Uguray} 693d73f617610de09a68243852c91a2fffcabc367cArman Uguray 703d73f617610de09a68243852c91a2fffcabc367cArman UgurayTEST(AdvertiseDataTest, DisallowedFields) { 713d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Singe field. 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data0{0x02, HCI_EIR_FLAGS_TYPE, 0x00}; 733d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv0(data0); 743d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv0.IsValid()); 753d73f617610de09a68243852c91a2fffcabc367cArman Uguray 763d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Two fields, first invalid. 773d73f617610de09a68243852c91a2fffcabc367cArman Uguray const std::vector<uint8_t> data1{ 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x02, HCI_EIR_FLAGS_TYPE, 0x00, 0x03, 0x02, 0x01, 0x02}; 793d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv1(data1); 803d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv1.IsValid()); 813d73f617610de09a68243852c91a2fffcabc367cArman Uguray 823d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Two fields, second invalid. 833d73f617610de09a68243852c91a2fffcabc367cArman Uguray const std::vector<uint8_t> data2{ 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x03, 0x02, 0x01, 0x02, 0x02, HCI_EIR_FLAGS_TYPE, 0x00}; 853d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv2(data2); 863d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv2.IsValid()); 873d73f617610de09a68243852c91a2fffcabc367cArman Uguray 883d73f617610de09a68243852c91a2fffcabc367cArman Uguray // Check all blacklisted fields 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t blacklist[] = {HCI_EIR_FLAGS_TYPE, HCI_EIR_OOB_BD_ADDR_TYPE, 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_EIR_OOB_COD_TYPE, HCI_EIR_OOB_SSP_HASH_C_TYPE, 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_EIR_OOB_SSP_RAND_R_TYPE}; 923d73f617610de09a68243852c91a2fffcabc367cArman Uguray for (size_t i = 0; i < sizeof(blacklist); i++) { 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data{0x02, blacklist[i], 0x00}; 943d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv(data); 953d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv.IsValid()); 963d73f617610de09a68243852c91a2fffcabc367cArman Uguray } 973d73f617610de09a68243852c91a2fffcabc367cArman Uguray} 983d73f617610de09a68243852c91a2fffcabc367cArman Uguray 993d73f617610de09a68243852c91a2fffcabc367cArman UgurayTEST(AdvertiseDataTest, EqualsData) { 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data0{0x02, 0x02, 0x00}; 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const std::vector<uint8_t> data1{0x02, 0x03, 0x00}; 1023d73f617610de09a68243852c91a2fffcabc367cArman Uguray 1033d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv0(data0); 1043d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv1(data1); 1053d73f617610de09a68243852c91a2fffcabc367cArman Uguray 1063d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_FALSE(adv0 == adv1); 1073d73f617610de09a68243852c91a2fffcabc367cArman Uguray 1083d73f617610de09a68243852c91a2fffcabc367cArman Uguray AdvertiseData adv2(data1); 1093d73f617610de09a68243852c91a2fffcabc367cArman Uguray EXPECT_TRUE(adv1 == adv2); 1103d73f617610de09a68243852c91a2fffcabc367cArman Uguray} 1113d73f617610de09a68243852c91a2fffcabc367cArman Uguray 1123d73f617610de09a68243852c91a2fffcabc367cArman Uguray} // namespace bluetooth 113