// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/basictypes.h"
#include "base/strings/string_number_conversions.h"
#include "device/bluetooth/bluetooth_service_record_win.h"
#include "device/bluetooth/bluetooth_uuid.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

const char kTestNoRfcommSdpBytes[] =
    "35510900000a00010001090001350319110a09000435103506190100090019350619001909"
    "010209000535031910020900093508350619110d090102090100250c417564696f20536f75"
    "726365090311090001";
const int kTestNoRfcommSdpBytesSize = sizeof(kTestNoRfcommSdpBytes) / 2;
const device::BluetoothUUID kTestNoRfcommSdpUuid("110a");

const char kTestRfcommSdpBytes[] =
    "354b0900000a000100030900013506191112191203090004350c3503190100350519000308"
    "0b090005350319100209000935083506191108090100090100250d566f6963652047617465"
    "776179";
const int kTestRfcommSdpBytesSize = sizeof(kTestRfcommSdpBytes) / 2;
const device::BluetoothUUID kTestRfcommSdpUuid("1112");
const int kTestRfcommChannel = 11;

}  // namespace

namespace device {

class BluetoothServiceRecordWinTest : public testing::Test {
 protected:
  void ConvertSdpBytes(const char* sdp_hex_char,
                       std::vector<uint8>* sdp_bytes_vector) {
    base::HexStringToBytes(sdp_hex_char, sdp_bytes_vector);
  }
};

TEST_F(BluetoothServiceRecordWinTest, NoRfcommSdp) {
  std::vector<uint8> sdp_bytes_array;
  ConvertSdpBytes(kTestNoRfcommSdpBytes, &sdp_bytes_array);
  BluetoothServiceRecordWin service_record(
      "01:02:03:0A:10:A0", "NoRfcommSdp", sdp_bytes_array, BluetoothUUID());
  EXPECT_EQ(kTestNoRfcommSdpUuid, service_record.uuid());
  EXPECT_FALSE(service_record.SupportsRfcomm());
}


TEST_F(BluetoothServiceRecordWinTest, RfcommSdp) {
  std::vector<uint8> sdp_bytes_array;
  ConvertSdpBytes(kTestRfcommSdpBytes, &sdp_bytes_array);
  BluetoothServiceRecordWin service_record(
      "01:02:03:0A:10:A0", "RfcommSdp", sdp_bytes_array, BluetoothUUID());
  EXPECT_EQ(kTestRfcommSdpUuid, service_record.uuid());
  EXPECT_TRUE(service_record.SupportsRfcomm());
  EXPECT_EQ(kTestRfcommChannel, service_record.rfcomm_channel());
}

TEST_F(BluetoothServiceRecordWinTest, BthAddr) {
  std::vector<uint8> sdp_bytes_array;
  ConvertSdpBytes(kTestRfcommSdpBytes, &sdp_bytes_array);
  BluetoothServiceRecordWin service_record(
      "01:02:03:0A:10:A0", "Sdp", sdp_bytes_array, BluetoothUUID());
  EXPECT_EQ(1108152553632, service_record.device_bth_addr());
}

}  // namespace device
