Remove whitespace from TraceMe and ScopedAnnotation strings
PiperOrigin-RevId: 267490110
This commit is contained in:
parent
216a46b130
commit
8d5f8bcd9b
tensorflow/core/profiler/internal
@ -14,6 +14,7 @@ limitations under the License.
|
||||
==============================================================================*/
|
||||
#include "tensorflow/core/profiler/internal/parse_annotation.h"
|
||||
|
||||
#include "absl/strings/ascii.h"
|
||||
#include "absl/strings/str_split.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
|
||||
@ -28,7 +29,7 @@ std::vector<absl::string_view> SplitNameAndMetadata(
|
||||
parts.emplace_back(annotation);
|
||||
} else {
|
||||
annotation.remove_suffix(1);
|
||||
parts = absl::StrSplit(annotation, '#', absl::SkipEmpty());
|
||||
parts = absl::StrSplit(annotation, '#');
|
||||
if (parts.size() > 2) {
|
||||
parts.resize(2);
|
||||
}
|
||||
@ -42,10 +43,16 @@ std::vector<absl::string_view> SplitNameAndMetadata(
|
||||
std::vector<std::pair<absl::string_view, absl::string_view>> ParseMetadata(
|
||||
absl::string_view metadata) {
|
||||
std::vector<std::pair<absl::string_view, absl::string_view>> key_values;
|
||||
for (absl::string_view pair : absl::StrSplit(metadata, ',')) {
|
||||
std::vector<absl::string_view> parts = absl::StrSplit(pair, '=');
|
||||
if (parts.size() == 2 && !parts[0].empty() && !parts[1].empty()) {
|
||||
key_values.push_back(std::make_pair(parts[0], parts[1]));
|
||||
for (absl::string_view pair :
|
||||
absl::StrSplit(metadata, ',', absl::SkipWhitespace())) {
|
||||
std::vector<absl::string_view> parts =
|
||||
absl::StrSplit(pair, absl::MaxSplits('=', 1));
|
||||
if (parts.size() == 2) {
|
||||
absl::string_view key = absl::StripAsciiWhitespace(parts[0]);
|
||||
absl::string_view value = absl::StripAsciiWhitespace(parts[1]);
|
||||
if (!key.empty() && !value.empty()) {
|
||||
key_values.push_back({key, value});
|
||||
}
|
||||
}
|
||||
}
|
||||
return key_values;
|
||||
@ -57,7 +64,7 @@ Annotation ParseAnnotation(absl::string_view annotation) {
|
||||
Annotation result;
|
||||
std::vector<absl::string_view> parts = SplitNameAndMetadata(annotation);
|
||||
if (!parts.empty()) {
|
||||
result.name = parts[0];
|
||||
result.name = absl::StripAsciiWhitespace(parts[0]);
|
||||
for (const auto& key_value : ParseMetadata(parts[1])) {
|
||||
result.metadata.push_back({key_value.first, key_value.second});
|
||||
}
|
||||
|
@ -53,6 +53,12 @@ TEST(ParseAnnotationTest, SimpleNameTest) {
|
||||
EXPECT_TRUE(annotation.metadata.empty());
|
||||
}
|
||||
|
||||
TEST(ParseAnnotationTest, SimpleNameWithWhitespaceTest) {
|
||||
Annotation annotation = ParseAnnotation("name ");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
EXPECT_TRUE(annotation.metadata.empty());
|
||||
}
|
||||
|
||||
TEST(ParseAnnotationTest, EmptyMetadataTest) {
|
||||
Annotation annotation = ParseAnnotation("name#");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
@ -70,7 +76,7 @@ TEST(ParseAnnotationTest, EmptyMetadataTest) {
|
||||
TEST(ParseAnnotationTest, SingleMetadataTest) {
|
||||
Annotation annotation = ParseAnnotation("name#key=value#");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
EXPECT_EQ(annotation.metadata.size(), 1);
|
||||
ASSERT_EQ(annotation.metadata.size(), 1);
|
||||
EXPECT_EQ(annotation.metadata.at(0).key, "key");
|
||||
EXPECT_EQ(annotation.metadata.at(0).value, "value");
|
||||
}
|
||||
@ -78,7 +84,7 @@ TEST(ParseAnnotationTest, SingleMetadataTest) {
|
||||
TEST(ParseAnnotationTest, MultipleMetadataTest) {
|
||||
Annotation annotation = ParseAnnotation("name#k1=v1,k2=v2,k3=v3#");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
EXPECT_EQ(annotation.metadata.size(), 3);
|
||||
ASSERT_EQ(annotation.metadata.size(), 3);
|
||||
EXPECT_EQ(annotation.metadata.at(0).key, "k1");
|
||||
EXPECT_EQ(annotation.metadata.at(0).value, "v1");
|
||||
EXPECT_EQ(annotation.metadata.at(1).key, "k2");
|
||||
@ -87,17 +93,34 @@ TEST(ParseAnnotationTest, MultipleMetadataTest) {
|
||||
EXPECT_EQ(annotation.metadata.at(2).value, "v3");
|
||||
}
|
||||
|
||||
TEST(ParseAnnotationTest, ExtraCharactersTest) {
|
||||
Annotation annotation = ParseAnnotation("name#k1=v1,k2=,k3=v3,k4=v4=#more#");
|
||||
TEST(ParseAnnotationTest, MultipleMetadataWithWhitespaceTest) {
|
||||
Annotation annotation = ParseAnnotation("name # k1 = v1, ,k2=v2 #");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
EXPECT_EQ(annotation.metadata.size(), 2);
|
||||
ASSERT_EQ(annotation.metadata.size(), 2);
|
||||
EXPECT_EQ(annotation.metadata.at(0).key, "k1");
|
||||
EXPECT_EQ(annotation.metadata.at(0).value, "v1");
|
||||
// "k2=" is ignored due to missing value.
|
||||
EXPECT_EQ(annotation.metadata.at(1).key, "k3");
|
||||
EXPECT_EQ(annotation.metadata.at(1).value, "v3");
|
||||
// "k4=v4=" is ignored due to extra '='.
|
||||
// "more#" is ignored.
|
||||
EXPECT_EQ(annotation.metadata.at(1).key, "k2");
|
||||
EXPECT_EQ(annotation.metadata.at(1).value, "v2");
|
||||
}
|
||||
|
||||
TEST(ParseAnnotationTest, KeyValueSeparatorTest) {
|
||||
Annotation annotation = ParseAnnotation("name#=v1,k2=,k3==v3,k4=v4=#");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
ASSERT_EQ(annotation.metadata.size(), 2);
|
||||
// "=v1" is ignored due to empty key.
|
||||
// "k2=" is ignored due to empty value.
|
||||
// "=" in value is OK.
|
||||
EXPECT_EQ(annotation.metadata.at(0).key, "k3");
|
||||
EXPECT_EQ(annotation.metadata.at(0).value, "=v3");
|
||||
EXPECT_EQ(annotation.metadata.at(1).key, "k4");
|
||||
EXPECT_EQ(annotation.metadata.at(1).value, "v4=");
|
||||
}
|
||||
|
||||
TEST(ParseAnnotationTest, ExtraMetadataSeparatorTest) {
|
||||
Annotation annotation = ParseAnnotation("name##k1=v1#");
|
||||
EXPECT_EQ(annotation.name, "name");
|
||||
// "k1=v1" is ignored due to extra metadata separator.
|
||||
EXPECT_TRUE(annotation.metadata.empty());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
Loading…
Reference in New Issue
Block a user