| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stddef.h> |
| |
| #include "base/macros.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/shell_dialogs/select_file_dialog.h" |
| |
| TEST(ShellDialogs, ShortenFileNameIfNeeded) { |
| struct ShortenFileNameTestCase { |
| base::FilePath::StringType input; |
| base::FilePath::StringType expected; |
| } test_cases[] = { |
| // Paths with short paths/file names don't get shortened. |
| {FILE_PATH_LITERAL("folder1111/folder2222/file1.html"), |
| FILE_PATH_LITERAL("folder1111/folder2222/file1.html")}, |
| |
| // Path with long filename gets shortened to 255 chars |
| {FILE_PATH_LITERAL("folder1111/" |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234ab" |
| "cdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxy" |
| "z1234.html"), |
| FILE_PATH_LITERAL("folder1111/" |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234ab" |
| "cdefghijklmnopqrstuvwxyz1234abcdefghij.html")}, |
| |
| // Long path but short filename is not truncated, handled by system open |
| // file dialog. |
| {FILE_PATH_LITERAL( |
| "folder1111/folder2222/folder3333/folder4444/folder5555/folder6666/" |
| "folder7777/folder8888/folder9999/folder0000/folder1111/folder2222/" |
| "folder3333/folder4444/folder5555/folder6666/folder7777/folder8888/" |
| "folder9999/folder0000/folder1111/folder2222/folder3333/folder4444/" |
| "folder5555/folder6666/folder7777/folder8888/folder9999/folder0000/" |
| "file1.pdf"), |
| FILE_PATH_LITERAL( |
| "folder1111/folder2222/folder3333/folder4444/folder5555/folder6666/" |
| "folder7777/folder8888/folder9999/folder0000/folder1111/folder2222/" |
| "folder3333/folder4444/folder5555/folder6666/folder7777/folder8888/" |
| "folder9999/folder0000/folder1111/folder2222/folder3333/folder4444/" |
| "folder5555/folder6666/folder7777/folder8888/folder9999/folder0000/" |
| "file1.pdf")}, |
| |
| // Long extension with total file name length < 255 is not truncated. |
| {FILE_PATH_LITERAL("folder1111/folder2222/" |
| "file1." |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234"), |
| FILE_PATH_LITERAL("folder1111/folder2222/" |
| "file1." |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz123" |
| "4")}, |
| |
| // Long extension, medium length file name is truncated so that total |
| // file name length = 255 |
| {FILE_PATH_LITERAL("folder1111/folder2222/" |
| "file1234567890123456789012345678901234567890123456789" |
| "0." |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234"), |
| FILE_PATH_LITERAL("folder1111/folder2222/" |
| "file1234567890123456789012345678901234567890123456789" |
| "0." |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrst")}, |
| |
| // Long extension and long file name -> extension truncated to 13 chars |
| // and file name truncated to 255-13. |
| {FILE_PATH_LITERAL("folder1111/folder2222/" |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234ab" |
| "cdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxy" |
| "z1234." |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234"), |
| FILE_PATH_LITERAL("folder1111/folder2222/" |
| "abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvw" |
| "xyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghijklmnop" |
| "qrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234abcdefghi" |
| "jklmnopqrstuvwxyz1234abcdefghijklmnopqrstuvwxyz1234ab" |
| "cdefghijklmnopqrstuvwxyz1234ab.abcdefghijkl")}}; |
| |
| for (size_t i = 0; i < arraysize(test_cases); ++i) { |
| base::FilePath input = |
| base::FilePath(test_cases[i].input).NormalizePathSeparators(); |
| base::FilePath output = |
| base::FilePath(test_cases[i].expected).NormalizePathSeparators(); |
| EXPECT_EQ(output.value(), |
| ui::SelectFileDialog::GetShortenedFilePath(input).value()); |
| EXPECT_LE(ui::SelectFileDialog::GetShortenedFilePath(input) |
| .BaseName() |
| .value() |
| .length(), |
| 255u); |
| } |
| } |