| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/sync/base/deletion_origin.h" |
| |
| #include <string> |
| #include <string_view> |
| |
| #include "base/hash/hash.h" |
| #include "base/location.h" |
| #include "components/sync/protocol/deletion_origin.pb.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace syncer { |
| |
| namespace { |
| |
| TEST(DeletionOriginTest, ShouldDistinguishSpecifiedFromUnspecified) { |
| EXPECT_FALSE(DeletionOrigin::Unspecified().is_specified()); |
| EXPECT_TRUE(DeletionOrigin::FromLocation(FROM_HERE).is_specified()); |
| } |
| |
| TEST(DeletionOriginTest, ShouldConvertToProto) { |
| const base::Location kLocation = FROM_HERE; |
| const std::string kTestVersion = "1234.0.5.0"; |
| |
| const sync_pb::DeletionOrigin proto = |
| DeletionOrigin::FromLocation(kLocation).ToProto(kTestVersion); |
| |
| EXPECT_EQ(proto.chromium_version(), kTestVersion); |
| EXPECT_EQ(proto.file_name_hash(), |
| base::PersistentHash(kLocation.file_name())); |
| EXPECT_EQ(proto.file_line_number(), kLocation.line_number()); |
| EXPECT_TRUE(std::string_view(proto.file_name_possibly_truncated()) |
| .ends_with("deletion_origin_unittest.cc")); |
| } |
| |
| TEST(DeletionOriginTest, ShouldTruncateFileName) { |
| // See constant with the same name in deletion_origin.cc. |
| const size_t kMaxFileNameBeforeTruncation = 30; |
| |
| const std::string kShortFileName("foo.cc"); |
| const std::string kLongFileName("components/xxxxxxxxxxxxxxxxxxxx/foo.cc"); |
| const std::string kExactTruncationLengthFileName( |
| "components/xxxxxxxxxxxx/foo.cc"); |
| |
| ASSERT_LT(kShortFileName.size(), kMaxFileNameBeforeTruncation); |
| ASSERT_GT(kLongFileName.size(), kMaxFileNameBeforeTruncation); |
| ASSERT_EQ(kExactTruncationLengthFileName.size(), |
| kMaxFileNameBeforeTruncation); |
| |
| const base::Location kShortFileNameLocation = |
| base::Location::CreateForTesting("function_name", kShortFileName.c_str(), |
| 1, FROM_HERE.program_counter()); |
| const base::Location kLongFileNameLocation = base::Location::CreateForTesting( |
| "function_name", kLongFileName.c_str(), 1, FROM_HERE.program_counter()); |
| const base::Location kExactTruncationLengthFileNameLocation = |
| base::Location::CreateForTesting("function_name", |
| kExactTruncationLengthFileName.c_str(), |
| 1, FROM_HERE.program_counter()); |
| |
| EXPECT_EQ(kShortFileName, DeletionOrigin::FromLocation(kShortFileNameLocation) |
| .ToProto("") |
| .file_name_possibly_truncated()); |
| EXPECT_EQ(kExactTruncationLengthFileName, |
| DeletionOrigin::FromLocation(kExactTruncationLengthFileNameLocation) |
| .ToProto("") |
| .file_name_possibly_truncated()); |
| |
| // The overly long filename should be truncated. |
| const std::string kExpectedTruncatedFileName( |
| "...xxxxxxxxxxxxxxxxxxxx/foo.cc"); |
| ASSERT_EQ(kExpectedTruncatedFileName.size(), kMaxFileNameBeforeTruncation); |
| EXPECT_EQ(kExpectedTruncatedFileName, |
| DeletionOrigin::FromLocation(kLongFileNameLocation) |
| .ToProto("") |
| .file_name_possibly_truncated()); |
| } |
| |
| } // namespace |
| |
| } // namespace syncer |