Home | History | Annotate | Download | only in webui
      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 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           reinterpret_cast<const unsigned char*>(kDummyDefaultResource),
     41           arraysize(kDummyDefaultResource));
     42     } else if (resource_id == kDummyResourceId) {
     43       bytes = new base::RefCountedStaticMemory(
     44           reinterpret_cast<const unsigned char*>(kDummytResource),
     45           arraysize(kDummytResource));
     46     }
     47     return bytes;
     48   }
     49 };
     50 
     51 }
     52 
     53 class WebUIDataSourceTest : public testing::Test {
     54  public:
     55   WebUIDataSourceTest() : result_data_(NULL) {}
     56   virtual ~WebUIDataSourceTest() {}
     57   WebUIDataSourceImpl* source() { return source_.get(); }
     58 
     59   void StartDataRequest(const std::string& path) {
     60      source_->StartDataRequest(
     61         path,
     62         0, 0,
     63         base::Bind(&WebUIDataSourceTest::SendResult,
     64         base::Unretained(this)));
     65   }
     66 
     67   std::string GetMimeType(const std::string& path) const {
     68     return source_->GetMimeType(path);
     69   }
     70 
     71   scoped_refptr<base::RefCountedMemory> result_data_;
     72 
     73  private:
     74   virtual void SetUp() {
     75     SetContentClient(&client_);
     76     WebUIDataSource* source = WebUIDataSourceImpl::Create("host");
     77     WebUIDataSourceImpl* source_impl = static_cast<WebUIDataSourceImpl*>(
     78         source);
     79     source_impl->disable_set_font_strings_for_testing();
     80     source_ = make_scoped_refptr(source_impl);
     81   }
     82 
     83   // Store response for later comparisons.
     84   void SendResult(base::RefCountedMemory* data) {
     85     result_data_ = data;
     86   }
     87 
     88   scoped_refptr<WebUIDataSourceImpl> source_;
     89   TestClient client_;
     90 };
     91 
     92 TEST_F(WebUIDataSourceTest, EmptyStrings) {
     93   source()->SetJsonPath("strings.js");
     94   StartDataRequest("strings.js");
     95   std::string result(reinterpret_cast<const char*>(
     96       result_data_->front()), result_data_->size());
     97   EXPECT_NE(result.find("var templateData = {"), std::string::npos);
     98   EXPECT_NE(result.find("};"), std::string::npos);
     99 }
    100 
    101 TEST_F(WebUIDataSourceTest, SomeStrings) {
    102   source()->SetJsonPath("strings.js");
    103   source()->AddString("planet", ASCIIToUTF16("pluto"));
    104   source()->AddLocalizedString("button", kDummyStringId);
    105   StartDataRequest("strings.js");
    106   std::string result(reinterpret_cast<const char*>(
    107       result_data_->front()), result_data_->size());
    108   EXPECT_NE(result.find("\"planet\":\"pluto\""), std::string::npos);
    109   EXPECT_NE(result.find("\"button\":\"foo\""), std::string::npos);
    110 }
    111 
    112 TEST_F(WebUIDataSourceTest, DefaultResource) {
    113   source()->SetDefaultResource(kDummyDefaultResourceId);
    114   StartDataRequest("foobar" );
    115   std::string result(
    116       reinterpret_cast<const char*>(result_data_->front()),
    117       result_data_->size());
    118   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
    119   StartDataRequest("strings.js");
    120   result = std::string(
    121       reinterpret_cast<const char*>(result_data_->front()),
    122       result_data_->size());
    123   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
    124 }
    125 
    126 TEST_F(WebUIDataSourceTest, NamedResource) {
    127   source()->SetDefaultResource(kDummyDefaultResourceId);
    128   source()->AddResourcePath("foobar", kDummyResourceId);
    129   StartDataRequest("foobar");
    130   std::string result(
    131       reinterpret_cast<const char*>(result_data_->front()),
    132       result_data_->size());
    133   EXPECT_NE(result.find(kDummytResource), std::string::npos);
    134   StartDataRequest("strings.js");
    135   result = std::string(
    136       reinterpret_cast<const char*>(result_data_->front()),
    137       result_data_->size());
    138   EXPECT_NE(result.find(kDummyDefaultResource), std::string::npos);
    139 }
    140 
    141 TEST_F(WebUIDataSourceTest, MimeType) {
    142   const char* html = "text/html";
    143   const char* js = "application/javascript";
    144   EXPECT_EQ(GetMimeType(std::string()), html);
    145   EXPECT_EQ(GetMimeType("foo"), html);
    146   EXPECT_EQ(GetMimeType("foo.html"), html);
    147   EXPECT_EQ(GetMimeType(".js"), js);
    148   EXPECT_EQ(GetMimeType("foo.js"), js);
    149   EXPECT_EQ(GetMimeType("js"), html);
    150   EXPECT_EQ(GetMimeType("foojs"), html);
    151   EXPECT_EQ(GetMimeType("foo.jsp"), html);
    152 }
    153 
    154 }  // namespace content
    155