1341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker/* 2341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Copyright 2018 The Android Open Source Project 3341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * 4341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Licensed under the Apache License, Version 2.0 (the "License"); 5341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * you may not use this file except in compliance with the License. 6341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * You may obtain a copy of the License at 7341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * 8341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * http://www.apache.org/licenses/LICENSE-2.0 9341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * 10341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Unless required by applicable law or agreed to in writing, software 11341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * distributed under the License is distributed on an "AS IS" BASIS, 12341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * See the License for the specific language governing permissions and 14341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * limitations under the License. 15341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker */ 16341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 178f7377353db29efe0a506123deec03d70935957aAjay Panicker#include <tuple> 18341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 19341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include <gtest/gtest.h> 20341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 21341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "avrcp_test_packets.h" 22341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "packet_test_helper.h" 23341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "vendor_packet.h" 24341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 25341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickernamespace bluetooth { 26341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 27341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker// A helper class that has public accessors to protected methods 28341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerclass TestPacketBuilder : public PacketBuilder { 29341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker public: 30341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker static std::unique_ptr<TestPacketBuilder> MakeBuilder( 31341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::vector<uint8_t> data) { 32341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::unique_ptr<TestPacketBuilder> builder(new TestPacketBuilder(data)); 33341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker return builder; 34341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker }; 35341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 36341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker // Make all the utility functions public 37341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::ReserveSpace; 38341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets1; 39341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets2; 40341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets3; 41341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets4; 42341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets6; 43341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker using PacketBuilder::AddPayloadOctets8; 44341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 45341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker size_t size() const override { return data_.size(); }; 46341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 47341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker bool Serialize(const std::shared_ptr<Packet>& pkt) override { 48341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ReserveSpace(pkt, size()); 49341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 50341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker for (uint8_t byte : data_) { 51341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker AddPayloadOctets1(pkt, byte); 52341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker } 53341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 54341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker return true; 55341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker } 56341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 57341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker TestPacketBuilder(std::vector<uint8_t> data) : data_(data){}; 58341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 59341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::vector<uint8_t> data_; 60341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}; 61341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 62341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickernamespace avrcp { 63341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 64341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerusing TestVendorPacket = TestPacketType<VendorPacket>; 65341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 66341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST(VendorPacketBuilderTest, builderTest) { 67341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::vector<uint8_t> get_cap_payload_data = {0x03}; 68341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 69341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto get_cap_payload = TestPacketBuilder::MakeBuilder(get_cap_payload_data); 70341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 71341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto builder = VendorPacketBuilder::MakeBuilder( 72341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CType::STATUS, CommandPdu::GET_CAPABILITIES, PacketType::SINGLE, 73341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::move(get_cap_payload)); 74341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 75341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_EQ(builder->size(), get_capabilities_request.size()); 76341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 77341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto test_packet = TestVendorPacket::Make(); 78341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker builder->Serialize(test_packet); 79341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_EQ(test_packet->GetData(), get_capabilities_request); 80341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} 81341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 82341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerusing TestParam = std::tuple<std::vector<uint8_t>, CommandPdu>; 83341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerclass VendorPacketTest : public ::testing::TestWithParam<TestParam> { 84341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker public: 85341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::vector<uint8_t> GetPacketData() { return std::get<0>(GetParam()); } 86341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu GetCommandPdu() { return std::get<1>(GetParam()); } 87341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}; 88341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 89341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerINSTANTIATE_TEST_CASE_P( 90341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker VendorPacketParameterTest, VendorPacketTest, 91341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ::testing::Values( 92341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_capabilities_request, CommandPdu::GET_CAPABILITIES), 93341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_capabilities_response_company_id, 94341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::GET_CAPABILITIES), 95341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_capabilities_response_events_supported, 96341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::GET_CAPABILITIES), 97341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_element_attributes_request_partial, 98341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::GET_ELEMENT_ATTRIBUTES), 99341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_element_attributes_request_full, 100341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::GET_ELEMENT_ATTRIBUTES), 101341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_elements_attributes_response_full, 102341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::GET_ELEMENT_ATTRIBUTES), 103341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_play_status_request, CommandPdu::GET_PLAY_STATUS), 104341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(get_play_status_response, CommandPdu::GET_PLAY_STATUS), 105341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(register_play_status_notification, 106341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::REGISTER_NOTIFICATION), 107341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(interim_play_status_notification, 108341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::REGISTER_NOTIFICATION), 109341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(interim_track_changed_notification, 110341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::REGISTER_NOTIFICATION), 111341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::make_tuple(changed_play_pos_notification, 112341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker CommandPdu::REGISTER_NOTIFICATION))); 113341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 114341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(VendorPacketTest, getterTest) { 115341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto test_packet = TestVendorPacket::Make(GetPacketData()); 116341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 117341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_EQ(test_packet->GetCompanyId(), BLUETOOTH_COMPANY_ID); 118341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_EQ(test_packet->GetCommandPdu(), GetCommandPdu()); 119341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_EQ(test_packet->GetPacketType(), PacketType::SINGLE); 120341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker // ASSERT_EQ(test_packet->GetParameterLength(), 0x01); 121341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} 122341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 123341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(VendorPacketTest, validTest) { 124341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto test_packet = TestVendorPacket::Make(GetPacketData()); 125341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_TRUE(test_packet->IsValid()); 126341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} 127341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 128341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_F(VendorPacketTest, invalidTest) { 129341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto get_capabilities_request_copy = get_capabilities_request; 130341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker get_capabilities_request_copy.push_back(0x00); 131341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker auto test_packet = TestVendorPacket::Make(get_capabilities_request_copy); 132341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_FALSE(test_packet->IsValid()); 133341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 134341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker std::vector<uint8_t> short_packet = {0x01, 0x02, 0x03, 0x04, 0x05}; 135341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker test_packet = TestVendorPacket::Make(short_packet); 136341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker ASSERT_FALSE(test_packet->IsValid()); 137341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} 138341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker 139341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} // namespace avrcp 140341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker} // namespace bluetooth