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