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/bind.h" 6 #include "base/memory/ref_counted_memory.h" 7 #include "base/strings/utf_string_conversions.h" 8 #include "content/browser/webui/web_ui_data_source_impl.h" 9 #include "content/test/test_content_client.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace content { 13 namespace { 14 15 const int kDummyStringId = 123; 16 const int kDummyDefaultResourceId = 456; 17 const int kDummyResourceId = 789; 18 19 const char kDummyString[] = "foo"; 20 const char kDummyDefaultResource[] = "<html>foo</html>"; 21 const char kDummytResource[] = "<html>blah</html>"; 22 23 class TestClient : public TestContentClient { 24 public: 25 TestClient() {} 26 virtual ~TestClient() {} 27 28 virtual base::string16 GetLocalizedString(int message_id) const OVERRIDE { 29 if (message_id == kDummyStringId) 30 return base::UTF8ToUTF16(kDummyString); 31 return base::string16(); 32 33 } 34 35 virtual base::RefCountedStaticMemory* GetDataResourceBytes( 36 int resource_id) const OVERRIDE { 37 base::RefCountedStaticMemory* bytes = NULL; 38 if (resource_id == kDummyDefaultResourceId) { 39 bytes = new base::RefCountedStaticMemory( 40 kDummyDefaultResource, arraysize(kDummyDefaultResource)); 41 } else if (resource_id == kDummyResourceId) { 42 bytes = new base::RefCountedStaticMemory( 43 kDummytResource, arraysize(kDummytResource)); 44 } 45 return bytes; 46 } 47 }; 48 49 } 50 51 class WebUIDataSourceTest : public testing::Test { 52 public: 53 WebUIDataSourceTest() : result_data_(NULL) {} 54 virtual ~WebUIDataSourceTest() {} 55 WebUIDataSourceImpl* source() { return source_.get(); } 56 57 void StartDataRequest(const std::string& path) { 58 source_->StartDataRequest( 59 path, 60 0, 0, 61 base::Bind(&WebUIDataSourceTest::SendResult, 62 base::Unretained(this))); 63 } 64 65 std::string GetMimeType(const std::string& path) const { 66 return source_->GetMimeType(path); 67 } 68 69 scoped_refptr<base::RefCountedMemory> result_data_; 70 71 private: 72 virtual void SetUp() { 73 SetContentClient(&client_); 74 WebUIDataSource* source = WebUIDataSourceImpl::Create("host"); 75 WebUIDataSourceImpl* source_impl = static_cast<WebUIDataSourceImpl*>( 76 source); 77 source_impl->disable_set_font_strings_for_testing(); 78 source_ = make_scoped_refptr(source_impl); 79 } 80 81 // Store response for later comparisons. 82 void SendResult(base::RefCountedMemory* data) { 83 result_data_ = data; 84 } 85 86 scoped_refptr<WebUIDataSourceImpl> source_; 87 TestClient client_; 88 }; 89 90 TEST_F(WebUIDataSourceTest, EmptyStrings) { 91 source()->SetJsonPath("strings.js"); 92 StartDataRequest("strings.js"); 93 std::string result(result_data_->front_as<char>(), result_data_->size()); 94 EXPECT_NE(result.find("var templateData = {"), std::string::npos); 95 EXPECT_NE(result.find("};"), std::string::npos); 96 } 97 98 TEST_F(WebUIDataSourceTest, SomeStrings) { 99 source()->SetJsonPath("strings.js"); 100 source()->AddString("planet", base::ASCIIToUTF16("pluto")); 101 source()->AddLocalizedString("button", kDummyStringId); 102 StartDataRequest("strings.js"); 103 std::string result(result_data_->front_as<char>(), result_data_->size()); 104 EXPECT_NE(result.find("\"planet\":\"pluto\""), std::string::npos); 105 EXPECT_NE(result.find("\"button\":\"foo\""), std::string::npos); 106 } 107 108 TEST_F(WebUIDataSourceTest, DefaultResource) { 109 source()->SetDefaultResource(kDummyDefaultResourceId); 110 StartDataRequest("foobar" ); 111 std::string result(result_data_->front_as<char>(), result_data_->size()); 112 EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos); 113 StartDataRequest("strings.js"); 114 result = std::string(result_data_->front_as<char>(), result_data_->size()); 115 EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos); 116 } 117 118 TEST_F(WebUIDataSourceTest, NamedResource) { 119 source()->SetDefaultResource(kDummyDefaultResourceId); 120 source()->AddResourcePath("foobar", kDummyResourceId); 121 StartDataRequest("foobar"); 122 std::string result(result_data_->front_as<char>(), result_data_->size()); 123 EXPECT_NE(result.find(kDummytResource), std::string::npos); 124 StartDataRequest("strings.js"); 125 result = std::string(result_data_->front_as<char>(), result_data_->size()); 126 EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos); 127 } 128 129 TEST_F(WebUIDataSourceTest, MimeType) { 130 const char* html = "text/html"; 131 const char* js = "application/javascript"; 132 EXPECT_EQ(GetMimeType(std::string()), html); 133 EXPECT_EQ(GetMimeType("foo"), html); 134 EXPECT_EQ(GetMimeType("foo.html"), html); 135 EXPECT_EQ(GetMimeType(".js"), js); 136 EXPECT_EQ(GetMimeType("foo.js"), js); 137 EXPECT_EQ(GetMimeType("js"), html); 138 EXPECT_EQ(GetMimeType("foojs"), html); 139 EXPECT_EQ(GetMimeType("foo.jsp"), html); 140 } 141 142 } // namespace content 143