mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-17 16:43:53 +00:00
Add UUID::InitializeFromString().
R=mark@chromium.org TEST=util_test --gtest_filter=UUID.FromString Review URL: https://codereview.chromium.org/820783004
This commit is contained in:
parent
1cdb7c1d04
commit
c75dc46b17
@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
#include "util/misc/uuid.h"
|
#include "util/misc/uuid.h"
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
#include "base/basictypes.h"
|
||||||
@ -52,6 +54,35 @@ void UUID::InitializeFromBytes(const uint8_t* bytes) {
|
|||||||
data_3 = base::NetToHost16(data_3);
|
data_3 = base::NetToHost16(data_3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UUID::InitializeFromString(const base::StringPiece& string) {
|
||||||
|
if (string.length() != 36)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
UUID temp;
|
||||||
|
const char kScanFormat[] =
|
||||||
|
"%08" SCNx32 "-%04" SCNx16 "-%04" SCNx16
|
||||||
|
"-%02" SCNx8 "%02" SCNx8
|
||||||
|
"-%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8;
|
||||||
|
int rv = sscanf(string.data(),
|
||||||
|
kScanFormat,
|
||||||
|
&temp.data_1,
|
||||||
|
&temp.data_2,
|
||||||
|
&temp.data_3,
|
||||||
|
&temp.data_4[0],
|
||||||
|
&temp.data_4[1],
|
||||||
|
&temp.data_5[0],
|
||||||
|
&temp.data_5[1],
|
||||||
|
&temp.data_5[2],
|
||||||
|
&temp.data_5[3],
|
||||||
|
&temp.data_5[4],
|
||||||
|
&temp.data_5[5]);
|
||||||
|
if (rv != 11)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*this = temp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::string UUID::ToString() const {
|
std::string UUID::ToString() const {
|
||||||
return base::StringPrintf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
return base::StringPrintf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
data_1,
|
data_1,
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "base/strings/string_piece.h"
|
||||||
|
|
||||||
namespace crashpad {
|
namespace crashpad {
|
||||||
|
|
||||||
//! \brief A universally unique identifier (%UUID).
|
//! \brief A universally unique identifier (%UUID).
|
||||||
@ -49,6 +51,16 @@ struct UUID {
|
|||||||
//! %UUID.
|
//! %UUID.
|
||||||
void InitializeFromBytes(const uint8_t* bytes);
|
void InitializeFromBytes(const uint8_t* bytes);
|
||||||
|
|
||||||
|
//! \brief Initializes the %UUID from a RFC 4122 §3 formatted string.
|
||||||
|
//!
|
||||||
|
//! \param[in] string A string of the form
|
||||||
|
//! `"00112233-4455-6677-8899-aabbccddeeff"`.
|
||||||
|
//!
|
||||||
|
//! \return `true` if the string was formatted correctly and the object has
|
||||||
|
//! been initialized with the data. `false` if the string could not be
|
||||||
|
//! parsed, with the object state untouched.
|
||||||
|
bool InitializeFromString(const base::StringPiece& string);
|
||||||
|
|
||||||
//! \brief Formats the %UUID per RFC 4122 §3.
|
//! \brief Formats the %UUID per RFC 4122 §3.
|
||||||
//!
|
//!
|
||||||
//! \return A string of the form `"00112233-4455-6677-8899-aabbccddeeff"`.
|
//! \return A string of the form `"00112233-4455-6677-8899-aabbccddeeff"`.
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
#include "base/basictypes.h"
|
||||||
|
#include "base/strings/stringprintf.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
namespace crashpad {
|
namespace crashpad {
|
||||||
@ -152,6 +153,56 @@ TEST(UUID, UUID) {
|
|||||||
EXPECT_EQ("45454545-4545-4545-4545-454545454545", uuid.ToString());
|
EXPECT_EQ("45454545-4545-4545-4545-454545454545", uuid.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(UUID, FromString) {
|
||||||
|
const struct TestCase {
|
||||||
|
const char* uuid_string;
|
||||||
|
bool success;
|
||||||
|
} kCases[] = {
|
||||||
|
// Valid:
|
||||||
|
{"c6849cb5-fe14-4a79-8978-9ae6034c521d", true},
|
||||||
|
{"00000000-0000-0000-0000-000000000000", true},
|
||||||
|
{"ffffffff-ffff-ffff-ffff-ffffffffffff", true},
|
||||||
|
// Outside HEX range:
|
||||||
|
{"7318z10b-c453-4cef-9dc8-015655cb4bbc", false},
|
||||||
|
{"7318a10b-c453-4cef-9dz8-015655cb4bbc", false},
|
||||||
|
// Incomplete:
|
||||||
|
{"15655cb4-", false},
|
||||||
|
{"7318f10b-c453-4cef-9dc8-015655cb4bb", false},
|
||||||
|
{"318f10b-c453-4cef-9dc8-015655cb4bb2", false},
|
||||||
|
{"7318f10b-c453-4ef-9dc8-015655cb4bb2", false},
|
||||||
|
{"", false},
|
||||||
|
{"abcd", false},
|
||||||
|
// Trailing data:
|
||||||
|
{"6d247a34-53d5-40ec-a90d-d8dea9e94cc01", false}
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::string empty_uuid = UUID().ToString();
|
||||||
|
|
||||||
|
for (size_t index = 0; index < arraysize(kCases); ++index) {
|
||||||
|
const TestCase& test_case = kCases[index];
|
||||||
|
SCOPED_TRACE(
|
||||||
|
base::StringPrintf("index %zu: %s", index, test_case.uuid_string));
|
||||||
|
|
||||||
|
UUID uuid;
|
||||||
|
EXPECT_EQ(test_case.success,
|
||||||
|
uuid.InitializeFromString(test_case.uuid_string));
|
||||||
|
if (test_case.success) {
|
||||||
|
EXPECT_EQ(test_case.uuid_string, uuid.ToString());
|
||||||
|
} else {
|
||||||
|
EXPECT_EQ(empty_uuid, uuid.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test for case insensitivty.
|
||||||
|
UUID uuid;
|
||||||
|
uuid.InitializeFromString("F32E5BDC-2681-4C73-A4E6-911FFD89B846");
|
||||||
|
EXPECT_EQ("f32e5bdc-2681-4c73-a4e6-911ffd89b846", uuid.ToString());
|
||||||
|
|
||||||
|
// Mixed case.
|
||||||
|
uuid.InitializeFromString("5762C15D-50b5-4171-a2e9-7429C9EC6CAB");
|
||||||
|
EXPECT_EQ("5762c15d-50b5-4171-a2e9-7429c9ec6cab", uuid.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace crashpad
|
} // namespace crashpad
|
||||||
|
Loading…
x
Reference in New Issue
Block a user