blob: 2a8dba353812a815f47bfc3b827195af233de5e3 [file] [log] [blame]
// Copyright (c) 2006-2008 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 "config.h"
#include <string>
#include "base/compiler_specific.h"
MSVC_PUSH_WARNING_LEVEL(0);
#include "CString.h"
#include "FormData.h"
#include "HistoryItem.h"
#include "PlatformString.h"
#include "ResourceRequest.h"
MSVC_POP_WARNING();
#undef LOG
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/glue/glue_serialize.h"
using namespace std;
using namespace WebCore;
using namespace webkit_glue;
// These exist only to support the gTest assertion macros, and
// shouldn't be used in normal program code.
static std::ostream& operator<<(std::ostream& out, const String& str)
{
return out << str.latin1().data();
}
static std::ostream& operator<<(std::ostream& out, const FormDataElement& e)
{
return out << e.m_type << ": " <<
e.m_data.size() <<
" <" << string(e.m_data.data() ? e.m_data.data() : "", e.m_data.size()) << "> " <<
e.m_filename;
}
template<typename T>
static std::ostream& operator<<(std::ostream& out, const Vector<T>& v)
{
for (size_t i = 0; i < v.size(); ++i)
out << "[" << v[i] << "] ";
return out;
}
static std::ostream& operator<<(std::ostream& out, const FormData& data)
{
return out << data.elements();
}
static std::ostream& operator<<(std::ostream& out, const IntPoint& pt)
{
return out << "(" << pt.x() << "," << pt.y() << ")";
}
namespace {
class GlueSerializeTest : public testing::Test {
public:
// Makes a FormData with some random data.
PassRefPtr<FormData> MakeFormData() {
RefPtr<FormData> form_data = FormData::create();
char d1[] = "first data block";
form_data->appendData(d1, sizeof(d1)-1);
form_data->appendFile("file.txt");
char d2[] = "data the second";
form_data->appendData(d2, sizeof(d2)-1);
return form_data.release();
}
// Constructs a HistoryItem with some random data and an optional child.
PassRefPtr<HistoryItem> MakeHistoryItem(bool with_form_data, bool pregnant) {
RefPtr<HistoryItem> item = HistoryItem::create();
item->setURLString("urlString");
item->setOriginalURLString("originalURLString");
item->setTarget("target");
item->setParent("parent");
item->setTitle("title");
item->setAlternateTitle("alternateTitle");
item->setLastVisitedTime(13.37);
item->setScrollPoint(IntPoint(42, -42));
item->setIsTargetItem(true);
item->setVisitCount(42*42);
Vector<String> document_state;
document_state.append("state1");
document_state.append("state2");
document_state.append("state AWESOME");
item->setDocumentState(document_state);
// Form Data
ResourceRequest dummy_request; // only way to initialize HistoryItem
if (with_form_data) {
dummy_request.setHTTPBody(MakeFormData());
dummy_request.setHTTPContentType("formContentType");
dummy_request.setHTTPReferrer("referrer");
dummy_request.setHTTPMethod("POST");
}
item->setFormInfoFromRequest(dummy_request);
// Setting the FormInfo causes the referrer to be set, so we set the
// referrer after setting the form info.
item->setReferrer("referrer");
// Children
if (pregnant)
item->addChildItem(MakeHistoryItem(false, false));
return item.release();
}
// Checks that a == b.
void HistoryItemExpectEqual(HistoryItem* a, HistoryItem* b) {
EXPECT_EQ(a->urlString(), b->urlString());
EXPECT_EQ(a->originalURLString(), b->originalURLString());
EXPECT_EQ(a->target(), b->target());
EXPECT_EQ(a->parent(), b->parent());
EXPECT_EQ(a->title(), b->title());
EXPECT_EQ(a->alternateTitle(), b->alternateTitle());
EXPECT_EQ(a->lastVisitedTime(), b->lastVisitedTime());
EXPECT_EQ(a->scrollPoint(), b->scrollPoint());
EXPECT_EQ(a->isTargetItem(), b->isTargetItem());
EXPECT_EQ(a->visitCount(), b->visitCount());
EXPECT_EQ(a->referrer(), b->referrer());
EXPECT_EQ(a->documentState(), b->documentState());
// Form Data
EXPECT_EQ(a->formData() != NULL, b->formData() != NULL);
if (a->formData() && b->formData())
EXPECT_EQ(*a->formData(), *b->formData());
EXPECT_EQ(a->formContentType(), b->formContentType());
// Children
EXPECT_EQ(a->children().size(), b->children().size());
for (size_t i = 0, c = a->children().size(); i < c; ++i) {
HistoryItemExpectEqual(a->children().at(i).get(),
b->children().at(i).get());
}
}
};
// Test old versions of serialized data to ensure that newer versions of code
// can still read history items written by previous versions.
TEST_F(GlueSerializeTest, BackwardsCompatibleTest) {
RefPtr<HistoryItem> item = MakeHistoryItem(false, false);
// Make sure version 3 (current version) can read versions 1 and 2.
for (int i = 1; i <= 2; i++) {
string serialized_item;
HistoryItemToVersionedString(item.get(), i, &serialized_item);
RefPtr<HistoryItem> deserialized_item = HistoryItemFromString(serialized_item);
ASSERT_FALSE(item == NULL);
ASSERT_FALSE(deserialized_item == NULL);
HistoryItemExpectEqual(item.get(), deserialized_item.get());
}
}
// Makes sure that a HistoryItem remains intact after being serialized and
// deserialized.
TEST_F(GlueSerializeTest, HistoryItemSerializeTest) {
RefPtr<HistoryItem> item = MakeHistoryItem(true, true);
string serialized_item;
HistoryItemToString(item, &serialized_item);
RefPtr<HistoryItem> deserialized_item = HistoryItemFromString(serialized_item);
ASSERT_FALSE(item == NULL);
ASSERT_FALSE(deserialized_item == NULL);
HistoryItemExpectEqual(item.get(), deserialized_item.get());
}
} // namespace