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