Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Side by Side Diff: components/arc/bluetooth/bluetooth_type_converters.cc

Issue 2046283003: Add unit test for ArcBluetoothBridge and TypeConverter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bt
Patch Set: Range check in type_converters Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 #include <cctype> 6 #include <cctype>
7 #include <iomanip> 7 #include <iomanip>
8 #include <ios> 8 #include <ios>
9 #include <sstream> 9 #include <sstream>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "components/arc/bluetooth/bluetooth_type_converters.h" 15 #include "components/arc/bluetooth/bluetooth_type_converters.h"
16 #include "device/bluetooth/bluetooth_gatt_service.h" 16 #include "device/bluetooth/bluetooth_gatt_service.h"
17 #include "device/bluetooth/bluetooth_uuid.h" 17 #include "device/bluetooth/bluetooth_uuid.h"
18 #include "mojo/public/cpp/bindings/array.h" 18 #include "mojo/public/cpp/bindings/array.h"
19 19
20 namespace { 20 namespace {
21 21
22 constexpr size_t kAddressSize = 6;
23 constexpr size_t kUUIDSize = 16;
24 constexpr char kInvalidAddress[] = "00:00:00:00:00:00";
25
22 bool IsNonHex(char c) { 26 bool IsNonHex(char c) {
23 return !isxdigit(c); 27 return !isxdigit(c);
24 } 28 }
25 29
26 std::string StripNonHex(const std::string& str) { 30 std::string StripNonHex(const std::string& str) {
27 std::string result = str; 31 std::string result = str;
28 result.erase(std::remove_if(result.begin(), result.end(), IsNonHex), 32 result.erase(std::remove_if(result.begin(), result.end(), IsNonHex),
29 result.end()); 33 result.end());
30 34
31 return result; 35 return result;
32 } 36 }
33 37
34 } // namespace 38 } // namespace
35 39
36 namespace mojo { 40 namespace mojo {
37 41
38 // TODO(smbarber): Add unit tests for Bluetooth type converters.
39
40 // static 42 // static
41 arc::mojom::BluetoothAddressPtr 43 arc::mojom::BluetoothAddressPtr
42 TypeConverter<arc::mojom::BluetoothAddressPtr, std::string>::Convert( 44 TypeConverter<arc::mojom::BluetoothAddressPtr, std::string>::Convert(
43 const std::string& address) { 45 const std::string& address) {
44 std::string stripped = StripNonHex(address); 46 std::string stripped = StripNonHex(address);
45 47
46 std::vector<uint8_t> address_bytes; 48 std::vector<uint8_t> address_bytes;
47 base::HexStringToBytes(stripped, &address_bytes); 49 base::HexStringToBytes(stripped, &address_bytes);
48 50
49 arc::mojom::BluetoothAddressPtr mojo_addr = 51 arc::mojom::BluetoothAddressPtr mojo_addr =
50 arc::mojom::BluetoothAddress::New(); 52 arc::mojom::BluetoothAddress::New();
51 mojo_addr->address = mojo::Array<uint8_t>::From(address_bytes); 53 mojo_addr->address = mojo::Array<uint8_t>::From(address_bytes);
52 54
53 return mojo_addr; 55 return mojo_addr;
54 } 56 }
55 57
56 // static 58 // static
57 std::string TypeConverter<std::string, arc::mojom::BluetoothAddress>::Convert( 59 std::string TypeConverter<std::string, arc::mojom::BluetoothAddress>::Convert(
58 const arc::mojom::BluetoothAddress& address) { 60 const arc::mojom::BluetoothAddress& address) {
59 std::ostringstream addr_stream; 61 std::ostringstream addr_stream;
60 addr_stream << std::setfill('0') << std::hex << std::uppercase; 62 addr_stream << std::setfill('0') << std::hex << std::uppercase;
61 63
62 const mojo::Array<uint8_t>& bytes = address.address; 64 const mojo::Array<uint8_t>& bytes = address.address;
63 65
66 if (address.address.size() != kAddressSize)
67 return std::string(kInvalidAddress);
68
64 for (size_t k = 0; k < bytes.size(); k++) { 69 for (size_t k = 0; k < bytes.size(); k++) {
65 addr_stream << std::setw(2) << (unsigned int)bytes[k]; 70 addr_stream << std::setw(2) << (unsigned int)bytes[k];
66 addr_stream << ((k == bytes.size() - 1) ? "" : ":"); 71 addr_stream << ((k == bytes.size() - 1) ? "" : ":");
67 } 72 }
68 73
69 return addr_stream.str(); 74 return addr_stream.str();
70 } 75 }
71 76
72 // static 77 // static
73 arc::mojom::BluetoothUUIDPtr 78 arc::mojom::BluetoothUUIDPtr
74 TypeConverter<arc::mojom::BluetoothUUIDPtr, device::BluetoothUUID>::Convert( 79 TypeConverter<arc::mojom::BluetoothUUIDPtr, device::BluetoothUUID>::Convert(
75 const device::BluetoothUUID& uuid) { 80 const device::BluetoothUUID& uuid) {
76 std::string uuid_str = StripNonHex(uuid.canonical_value()); 81 std::string uuid_str = StripNonHex(uuid.canonical_value());
77 82
78 std::vector<uint8_t> address_bytes; 83 std::vector<uint8_t> address_bytes;
79 base::HexStringToBytes(uuid_str, &address_bytes); 84 base::HexStringToBytes(uuid_str, &address_bytes);
80 85
81 arc::mojom::BluetoothUUIDPtr uuidp = arc::mojom::BluetoothUUID::New(); 86 arc::mojom::BluetoothUUIDPtr uuidp = arc::mojom::BluetoothUUID::New();
82 uuidp->uuid = mojo::Array<uint8_t>::From(address_bytes); 87 uuidp->uuid = mojo::Array<uint8_t>::From(address_bytes);
83 88
84 return uuidp; 89 return uuidp;
85 } 90 }
86 91
87 // static 92 // static
88 device::BluetoothUUID 93 device::BluetoothUUID
89 TypeConverter<device::BluetoothUUID, arc::mojom::BluetoothUUIDPtr>::Convert( 94 TypeConverter<device::BluetoothUUID, arc::mojom::BluetoothUUIDPtr>::Convert(
90 const arc::mojom::BluetoothUUIDPtr& uuid) { 95 const arc::mojom::BluetoothUUIDPtr& uuid) {
91 std::vector<uint8_t> address_bytes = uuid->uuid.To<std::vector<uint8_t>>(); 96 std::vector<uint8_t> address_bytes = uuid->uuid.To<std::vector<uint8_t>>();
92 97
98 if (address_bytes.size() != kUUIDSize)
99 return device::BluetoothUUID();
100
93 // BluetoothUUID expects the format below with the dashes inserted. 101 // BluetoothUUID expects the format below with the dashes inserted.
94 // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 102 // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
95 std::string uuid_str = 103 std::string uuid_str =
96 base::HexEncode(address_bytes.data(), address_bytes.size()); 104 base::HexEncode(address_bytes.data(), address_bytes.size());
97 const size_t uuid_dash_pos[] = {8, 13, 18, 23}; 105 const size_t uuid_dash_pos[] = {8, 13, 18, 23};
98 for (auto pos : uuid_dash_pos) 106 for (auto pos : uuid_dash_pos)
99 uuid_str = uuid_str.insert(pos, "-"); 107 uuid_str = uuid_str.insert(pos, "-");
100 108
101 device::BluetoothUUID result(uuid_str); 109 device::BluetoothUUID result(uuid_str);
102 110
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 break; 144 break;
137 145
138 default: 146 default:
139 ret = arc::mojom::BluetoothGattStatus::GATT_FAILURE; 147 ret = arc::mojom::BluetoothGattStatus::GATT_FAILURE;
140 break; 148 break;
141 } 149 }
142 return ret; 150 return ret;
143 } 151 }
144 152
145 } // namespace mojo 153 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698