1 #include <cstddef>
2 #include <cstdint>
3 
4 #include "avrcp_packet.h"
5 #include "device.h"
6 #include "packet_test_helper.h"
7 #include "stack_config.h"
8 
9 namespace bluetooth {
10 namespace avrcp {
11 class FakeMediaInterface : public MediaInterface {
12  public:
SendKeyEvent(uint8_t key,KeyState state)13   virtual void SendKeyEvent(uint8_t key, KeyState state) {}
14   using SongInfoCallback = base::Callback<void(SongInfo)>;
GetSongInfo(SongInfoCallback info_cb)15   virtual void GetSongInfo(SongInfoCallback info_cb) {}
16   using PlayStatusCallback = base::Callback<void(PlayStatus)>;
GetPlayStatus(PlayStatusCallback status_cb)17   virtual void GetPlayStatus(PlayStatusCallback status_cb) {}
18   using NowPlayingCallback =
19       base::Callback<void(std::string, std::vector<SongInfo>)>;
GetNowPlayingList(NowPlayingCallback now_playing_cb)20   virtual void GetNowPlayingList(NowPlayingCallback now_playing_cb) {}
21   using MediaListCallback =
22       base::Callback<void(uint16_t curr_player, std::vector<MediaPlayerInfo>)>;
GetMediaPlayerList(MediaListCallback list_cb)23   virtual void GetMediaPlayerList(MediaListCallback list_cb) {}
24   using FolderItemsCallback = base::Callback<void(std::vector<ListItem>)>;
GetFolderItems(uint16_t player_id,std::string media_id,FolderItemsCallback folder_cb)25   virtual void GetFolderItems(uint16_t player_id, std::string media_id,
26                               FolderItemsCallback folder_cb) {}
27   using SetBrowsedPlayerCallback = base::Callback<void(
28       bool success, std::string root_id, uint32_t num_items)>;
SetBrowsedPlayer(uint16_t player_id,SetBrowsedPlayerCallback browse_cb)29   virtual void SetBrowsedPlayer(uint16_t player_id,
30                                 SetBrowsedPlayerCallback browse_cb) {}
PlayItem(uint16_t player_id,bool now_playing,std::string media_id)31   virtual void PlayItem(uint16_t player_id, bool now_playing,
32                         std::string media_id) {}
SetActiveDevice(const RawAddress & address)33   virtual void SetActiveDevice(const RawAddress& address) {}
RegisterUpdateCallback(MediaCallbacks * callback)34   virtual void RegisterUpdateCallback(MediaCallbacks* callback) {}
UnregisterUpdateCallback(MediaCallbacks * callback)35   virtual void UnregisterUpdateCallback(MediaCallbacks* callback) {}
36 };
37 
38 class FakeVolumeInterface : public VolumeInterface {
39  public:
DeviceConnected(const RawAddress & bdaddr)40   virtual void DeviceConnected(const RawAddress& bdaddr) {}
DeviceConnected(const RawAddress & bdaddr,VolumeChangedCb cb)41   virtual void DeviceConnected(const RawAddress& bdaddr, VolumeChangedCb cb) {}
DeviceDisconnected(const RawAddress & bdaddr)42   virtual void DeviceDisconnected(const RawAddress& bdaddr) {}
SetVolume(int8_t volume)43   virtual void SetVolume(int8_t volume) {}
44 };
45 
46 class FakeA2dpInterface : public A2dpInterface {
47  public:
active_peer()48   virtual RawAddress active_peer() { return RawAddress(); }
is_peer_in_silence_mode(const RawAddress & peer_address)49   virtual bool is_peer_in_silence_mode(const RawAddress& peer_address) {
50     return false;
51   }
52 };
53 
get_pts_avrcp_test(void)54 bool get_pts_avrcp_test(void) { return false; }
55 
56 const stack_config_t interface = {
57     nullptr, get_pts_avrcp_test, nullptr, nullptr, nullptr, nullptr, nullptr,
58     nullptr};
59 
Callback(uint8_t,bool,std::unique_ptr<::bluetooth::PacketBuilder>)60 void Callback(uint8_t, bool, std::unique_ptr<::bluetooth::PacketBuilder>) {}
61 
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)62 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
63   FakeMediaInterface fmi;
64   FakeVolumeInterface fvi;
65   FakeA2dpInterface fai;
66 
67   std::vector<uint8_t> Packet(Data, Data + Size);
68   Device device(RawAddress::kAny, true,
69                 base::Bind([](uint8_t, bool,
70                               std::unique_ptr<::bluetooth::PacketBuilder>) {}),
71                 0xFFFF, 0xFFFF);
72   device.RegisterInterfaces(&fmi, &fai, &fvi);
73 
74   auto browse_request = TestPacketType<BrowsePacket>::Make(Packet);
75   device.BrowseMessageReceived(1, browse_request);
76 
77   auto avrcp_request = TestPacketType<avrcp::Packet>::Make(Packet);
78   device.MessageReceived(1, avrcp_request);
79   return 0;
80 }
81 }  // namespace avrcp
82 }  // namespace bluetooth
83 
stack_config_get_interface(void)84 const stack_config_t* stack_config_get_interface(void) {
85   return &bluetooth::avrcp::interface;
86 }