1*61c4878aSAndroid Build Coastguard Worker // Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker #include "pw_bluetooth/uuid.h"
15*61c4878aSAndroid Build Coastguard Worker
16*61c4878aSAndroid Build Coastguard Worker #include <array>
17*61c4878aSAndroid Build Coastguard Worker #include <cstdint>
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Worker namespace pw::bluetooth {
23*61c4878aSAndroid Build Coastguard Worker namespace {
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker // 16-bit and 32-bit short form UUID.
26*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kShortUuid16{0x1234};
27*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kShortUuid32{0xabcd1234};
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker // UUID initialized from a span.
30*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kLongUuidArray{
31*61c4878aSAndroid Build Coastguard Worker pw::span<const uint8_t, 16>(std::array<uint8_t, 16>{
32*61c4878aSAndroid Build Coastguard Worker 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})};
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker // UUID initialized from a string. This is the same as kLongUuidArray but in
35*61c4878aSAndroid Build Coastguard Worker // string form.
36*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kLongUuidString{"100f0e0d-0c0b-0a09-0807-060504030201"};
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker // UUID initialized combining another UUID with a 32-bit value.
39*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kLongUuidComposed1 = Uuid(0xabcd, kLongUuidString);
40*61c4878aSAndroid Build Coastguard Worker constexpr Uuid kLongUuidComposed2 = Uuid(0x1234abcd, kLongUuidString);
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker // Make sure that all these values are actually constexpr.
43*61c4878aSAndroid Build Coastguard Worker static_assert(kShortUuid16 != kShortUuid32, "constexpr check");
44*61c4878aSAndroid Build Coastguard Worker static_assert(kLongUuidArray == kLongUuidString, "constexpr check");
45*61c4878aSAndroid Build Coastguard Worker static_assert(kLongUuidComposed2.ToString() ==
46*61c4878aSAndroid Build Coastguard Worker "1234abcd-0c0b-0a09-0807-060504030201",
47*61c4878aSAndroid Build Coastguard Worker "constexpr check");
48*61c4878aSAndroid Build Coastguard Worker
TEST(UuidTest,ConstructorTest)49*61c4878aSAndroid Build Coastguard Worker TEST(UuidTest, ConstructorTest) {
50*61c4878aSAndroid Build Coastguard Worker // Compare 16-bit with 128-bit.
51*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kShortUuid16, Uuid("00001234-0000-1000-8000-00805f9b34fb"));
52*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kShortUuid32, Uuid("abcd1234-0000-1000-8000-00805f9b34fb"));
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kShortUuid16.ToString(), "00001234-0000-1000-8000-00805f9b34fb");
55*61c4878aSAndroid Build Coastguard Worker auto short_span = kShortUuid16.As16BitSpan();
56*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(2u, short_span.size());
57*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(short_span[0], 0x34); // UUIDs are encoded little endian.
58*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(short_span[1], 0x12);
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kLongUuidArray.ToString(), "100f0e0d-0c0b-0a09-0807-060504030201");
61*61c4878aSAndroid Build Coastguard Worker auto long_span = kLongUuidArray.As128BitSpan();
62*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(16u, long_span.size());
63*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(long_span[12], 0x0d);
64*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(long_span[13], 0x0e);
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker // These two are the same UUID initialized in different ways.
67*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kLongUuidArray, kLongUuidString);
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker // Composed UUID always set the 32-bits in the first groups, regardless of
70*61c4878aSAndroid Build Coastguard Worker // whether we pass a 16-bit or 32-bit value, thus the first 0 chars in this
71*61c4878aSAndroid Build Coastguard Worker // string are 0.
72*61c4878aSAndroid Build Coastguard Worker static_assert(
73*61c4878aSAndroid Build Coastguard Worker kLongUuidComposed1.ToString() == "0000abcd-0c0b-0a09-0807-060504030201",
74*61c4878aSAndroid Build Coastguard Worker "constexpr check");
75*61c4878aSAndroid Build Coastguard Worker static_assert(
76*61c4878aSAndroid Build Coastguard Worker kLongUuidComposed2.ToString() == "1234abcd-0c0b-0a09-0807-060504030201",
77*61c4878aSAndroid Build Coastguard Worker "constexpr check");
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker // Check that the standard Bluetooth Base is correct.
80*61c4878aSAndroid Build Coastguard Worker static_assert(Uuid::BluetoothBase().ToString() ==
81*61c4878aSAndroid Build Coastguard Worker "00000000-0000-1000-8000-00805f9b34fb",
82*61c4878aSAndroid Build Coastguard Worker "constexpr check");
83*61c4878aSAndroid Build Coastguard Worker }
84*61c4878aSAndroid Build Coastguard Worker
TEST(UuidTest,CombineShortUuidTest)85*61c4878aSAndroid Build Coastguard Worker TEST(UuidTest, CombineShortUuidTest) {
86*61c4878aSAndroid Build Coastguard Worker // The short 16-bit value can be represented as 16 or 32 bit, but the 32-bit
87*61c4878aSAndroid Build Coastguard Worker // one can only be represented as 32-bits.
88*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kShortUuid16.Is16BitUuid());
89*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kShortUuid16.Is32BitUuid());
90*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(kShortUuid32.Is16BitUuid());
91*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kShortUuid32.Is32BitUuid());
92*61c4878aSAndroid Build Coastguard Worker
93*61c4878aSAndroid Build Coastguard Worker // The composed UUID is not a standard one, but matches the base it was used
94*61c4878aSAndroid Build Coastguard Worker // to construct it.
95*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(kLongUuidComposed1.Is16BitUuid());
96*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(kLongUuidComposed1.Is32BitUuid());
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kLongUuidComposed1.Same96BitBase(kLongUuidString));
99*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kLongUuidComposed2.Same96BitBase(kLongUuidString));
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker // Composing always uses 32-bit values (setting the high bits as 0s) so they
102*61c4878aSAndroid Build Coastguard Worker // don't match the base, unless it is zero extended.
103*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(kLongUuidComposed1.Same112BitBase(kLongUuidString));
104*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(kLongUuidComposed2.Same112BitBase(kLongUuidString));
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(kLongUuidComposed1.Same112BitBase(Uuid(0, kLongUuidString)));
107*61c4878aSAndroid Build Coastguard Worker }
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker } // namespace
110*61c4878aSAndroid Build Coastguard Worker } // namespace pw::bluetooth
111