Remove whitespace from TraceMe and ScopedAnnotation strings

PiperOrigin-RevId: 267490110
This commit is contained in:
Jose Baiocchi 2019-09-05 17:13:26 -07:00 committed by TensorFlower Gardener
parent 216a46b130
commit 8d5f8bcd9b
2 changed files with 46 additions and 16 deletions
tensorflow/core/profiler/internal

View File

@ -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});
}

View File

@ -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