fileicon_source_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/memory/ref_counted_memory.h" 6#include "base/message_loop.h" 7#include "chrome/browser/icon_manager.h" 8#include "chrome/browser/profiles/profile.h" 9#include "chrome/browser/ui/webui/fileicon_source.h" 10#include "chrome/test/base/testing_profile.h" 11#include "content/public/test/test_browser_thread.h" 12#include "testing/gtest/include/gtest/gtest.h" 13#include "testing/gmock/include/gmock/gmock.h" 14 15using content::BrowserThread; 16 17namespace { 18 19class TestFileIconSource : public FileIconSource { 20 public: 21 explicit TestFileIconSource() {} 22 23 MOCK_METHOD4(FetchFileIcon, 24 void(const base::FilePath& path, 25 ui::ScaleFactor scale_factor, 26 IconLoader::IconSize icon_size, 27 const content::URLDataSource::GotDataCallback& callback)); 28 29 virtual ~TestFileIconSource() {} 30}; 31 32class FileIconSourceTest : public testing::Test { 33 public: 34 FileIconSourceTest() 35 : loop_(MessageLoop::TYPE_UI), 36 ui_thread_(BrowserThread::UI, MessageLoop::current()), 37 file_thread_(BrowserThread::FILE, MessageLoop::current()) {} 38 39 static TestFileIconSource* CreateFileIconSource() { 40 return new TestFileIconSource(); 41 } 42 43 private: 44 MessageLoop loop_; 45 content::TestBrowserThread ui_thread_; 46 content::TestBrowserThread file_thread_; 47}; 48 49const struct FetchFileIconExpectation { 50 const char* request_path; 51 const base::FilePath::CharType* unescaped_path; 52 ui::ScaleFactor scale_factor; 53 IconLoader::IconSize size; 54} kBasicExpectations[] = { 55 { "foo?bar", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 56 IconLoader::NORMAL }, 57 { "foo?bar&scale=2x", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_200P, 58 IconLoader::NORMAL }, 59 { "foo?iconsize=small", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 60 IconLoader::SMALL }, 61 { "foo?iconsize=normal", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 62 IconLoader::NORMAL }, 63 { "foo?iconsize=large", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 64 IconLoader::LARGE }, 65 { "foo?iconsize=asdf", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 66 IconLoader::NORMAL }, 67 { "foo?blah=b&iconsize=small", FILE_PATH_LITERAL("foo"), 68 ui::SCALE_FACTOR_100P, IconLoader::SMALL }, 69 { "foo?blah&iconsize=small", FILE_PATH_LITERAL("foo"), ui::SCALE_FACTOR_100P, 70 IconLoader::SMALL }, 71 { "a%3Fb%26c%3Dd.txt?iconsize=small", FILE_PATH_LITERAL("a?b&c=d.txt"), 72 ui::SCALE_FACTOR_100P, IconLoader::SMALL }, 73 { "a%3Ficonsize%3Dsmall?iconsize=large", 74 FILE_PATH_LITERAL("a?iconsize=small"), ui::SCALE_FACTOR_100P, 75 IconLoader::LARGE }, 76 { "o%40%23%24%25%26*()%20%2B%3D%3F%2C%3A%3B%22.jpg", 77 FILE_PATH_LITERAL("o@#$%&*() +=?,:;\".jpg"), ui::SCALE_FACTOR_100P, 78 IconLoader::NORMAL }, 79#if defined(OS_WIN) 80 { "c:/foo/bar/baz", FILE_PATH_LITERAL("c:\\foo\\bar\\baz"), 81 ui::SCALE_FACTOR_100P, IconLoader::NORMAL }, 82 { "/foo?bar=asdf&asdf", FILE_PATH_LITERAL("\\foo"), ui::SCALE_FACTOR_100P, 83 IconLoader::NORMAL }, 84 { "c%3A%2Fusers%2Ffoo%20user%2Fbar.txt", 85 FILE_PATH_LITERAL("c:\\users\\foo user\\bar.txt"), ui::SCALE_FACTOR_100P, 86 IconLoader::NORMAL }, 87 { "c%3A%2Fusers%2F%C2%A9%202000.pdf", 88 FILE_PATH_LITERAL("c:\\users\\\xa9 2000.pdf"), ui::SCALE_FACTOR_100P, 89 IconLoader::NORMAL }, 90 { "%E0%B6%9A%E0%B6%BB%E0%B7%9D%E0%B6%B8%E0%B7%8A", 91 FILE_PATH_LITERAL("\x0d9a\x0dbb\x0ddd\x0db8\x0dca"), ui::SCALE_FACTOR_100P, 92 IconLoader::NORMAL }, 93 { "%2Ffoo%2Fbar", FILE_PATH_LITERAL("\\foo\\bar"), ui::SCALE_FACTOR_100P, 94 IconLoader::NORMAL }, 95 { "%2Fbaz%20(1).txt?iconsize=small", FILE_PATH_LITERAL("\\baz (1).txt"), 96 ui::SCALE_FACTOR_100P, IconLoader::SMALL }, 97#else 98 { "/foo/bar/baz", FILE_PATH_LITERAL("/foo/bar/baz"), ui::SCALE_FACTOR_100P, 99 IconLoader::NORMAL }, 100 { "/foo?bar", FILE_PATH_LITERAL("/foo"), ui::SCALE_FACTOR_100P, 101 IconLoader::NORMAL }, 102 { "%2Ffoo%2f%E0%B6%9A%E0%B6%BB%E0%B7%9D%E0%B6%B8%E0%B7%8A", 103 FILE_PATH_LITERAL("/foo/\xe0\xb6\x9a\xe0\xb6\xbb\xe0\xb7\x9d") 104 FILE_PATH_LITERAL("\xe0\xb6\xb8\xe0\xb7\x8a"), ui::SCALE_FACTOR_100P, 105 IconLoader::NORMAL }, 106 { "%2Ffoo%2Fbar", FILE_PATH_LITERAL("/foo/bar"), ui::SCALE_FACTOR_100P, 107 IconLoader::NORMAL }, 108 { "%2Fbaz%20(1).txt?iconsize=small", FILE_PATH_LITERAL("/baz (1).txt"), 109 ui::SCALE_FACTOR_100P, IconLoader::SMALL }, 110#endif 111}; 112 113// Test that the callback is NULL. 114MATCHER(CallbackIsNull, "") { 115 return arg.is_null(); 116} 117 118} // namespace 119 120TEST_F(FileIconSourceTest, FileIconSource_Parse) { 121 std::vector<ui::ScaleFactor> supported_scale_factors; 122 supported_scale_factors.push_back(ui::SCALE_FACTOR_100P); 123 supported_scale_factors.push_back(ui::SCALE_FACTOR_200P); 124 ui::test::ScopedSetSupportedScaleFactors scoped_supported( 125 supported_scale_factors); 126 127 for (unsigned i = 0; i < arraysize(kBasicExpectations); i++) { 128 scoped_ptr<TestFileIconSource> source(CreateFileIconSource()); 129 content::URLDataSource::GotDataCallback callback; 130 EXPECT_CALL(*source.get(), 131 FetchFileIcon( 132 base::FilePath(kBasicExpectations[i].unescaped_path), 133 kBasicExpectations[i].scale_factor, 134 kBasicExpectations[i].size, CallbackIsNull())); 135 source->StartDataRequest(kBasicExpectations[i].request_path, false, 136 callback); 137 } 138} 139