1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be 306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file. 406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include <string.h> 606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include <utility> 706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/values.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/common_param_traits.h" 1106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "googleurl/src/gurl.h" 1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "ipc/ipc_message.h" 1306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "ipc/ipc_message_utils.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/host_port_pair.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "printing/backend/print_backend.h" 1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "printing/page_range.h" 1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 1806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 2006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Tests that serialize/deserialize correctly understand each other 2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(IPCMessageTest, Serialize) { 2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const char* serialize_cases[] = { 2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch "http://www.google.com/", 2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch "http://user:pass@host.com:888/foo;bar?baz#nop", 2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch "#inva://idurl/", 2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch }; 2806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 2906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch for (size_t i = 0; i < arraysize(serialize_cases); i++) { 3006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch GURL input(serialize_cases[i]); 3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::ParamTraits<GURL>::Write(&msg, input); 3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch GURL output; 3506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 3606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(IPC::ParamTraits<GURL>::Read(&msg, &iter, &output)); 3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // We want to test each component individually to make sure its range was 3906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // correctly serialized and deserialized, not just the spec. 4006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.possibly_invalid_spec(), output.possibly_invalid_spec()); 4106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.is_valid(), output.is_valid()); 4206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.scheme(), output.scheme()); 4306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.username(), output.username()); 4406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.password(), output.password()); 4506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.host(), output.host()); 4606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.port(), output.port()); 4706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.path(), output.path()); 4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.query(), output.query()); 4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(input.ref(), output.ref()); 5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch } 5106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 5206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Also test the corrupt case. 5306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 5406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch msg.WriteInt(99); 5506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch GURL output; 5606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 5706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(IPC::ParamTraits<GURL>::Read(&msg, &iter, &output)); 5806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 5906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 6006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Tests std::pair serialization 6106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(IPCMessageTest, Pair) { 6206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch typedef std::pair<std::string, std::string> TestPair; 6306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 6406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch TestPair input("foo", "bar"); 6506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 6606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::ParamTraits<TestPair>::Write(&msg, input); 6706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 6806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch TestPair output; 6906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 7006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(IPC::ParamTraits<TestPair>::Read(&msg, &iter, &output)); 7106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(output.first, "foo"); 7206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(output.second, "bar"); 7306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 7406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 7506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 7606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Tests bitmap serialization. 7706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(IPCMessageTest, Bitmap) { 7806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch SkBitmap bitmap; 7906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 8006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 5); 8106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bitmap.allocPixels(); 8206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch memset(bitmap.getPixels(), 'A', bitmap.getSize()); 8306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 8406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 8506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::ParamTraits<SkBitmap>::Write(&msg, bitmap); 8606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 8706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch SkBitmap output; 8806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 8906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(IPC::ParamTraits<SkBitmap>::Read(&msg, &iter, &output)); 9006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 9106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(bitmap.config(), output.config()); 9206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(bitmap.width(), output.width()); 9306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(bitmap.height(), output.height()); 9406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(bitmap.rowBytes(), output.rowBytes()); 9506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(bitmap.getSize(), output.getSize()); 9606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ(memcmp(bitmap.getPixels(), output.getPixels(), bitmap.getSize()), 9706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 0); 9806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 9906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Also test the corrupt case. 10006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL); 10106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Copy the first message block over to |bad_msg|. 10206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const char* fixed_data; 10306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch int fixed_data_size; 10406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch iter = NULL; 10506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch msg.ReadData(&iter, &fixed_data, &fixed_data_size); 10606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bad_msg.WriteData(fixed_data, fixed_data_size); 10706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Add some bogus pixel data. 10806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const size_t bogus_pixels_size = bitmap.getSize() * 2; 10906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch scoped_array<char> bogus_pixels(new char[bogus_pixels_size]); 11006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch memset(bogus_pixels.get(), 'B', bogus_pixels_size); 11106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bad_msg.WriteData(bogus_pixels.get(), bogus_pixels_size); 11206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Make sure we don't read out the bitmap! 11306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch SkBitmap bad_output; 11406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch iter = NULL; 11506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(IPC::ParamTraits<SkBitmap>::Read(&bad_msg, &iter, &bad_output)); 11606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 11706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 11806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(IPCMessageTest, ListValue) { 11906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ListValue input; 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen input.Set(0, Value::CreateDoubleValue(42.42)); 12106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch input.Set(1, Value::CreateStringValue("forty")); 12206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch input.Set(2, Value::CreateNullValue()); 12306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 12406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 12506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::WriteParam(&msg, input); 12606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 12706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ListValue output; 12806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 12906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output)); 13006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 13106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(input.Equals(&output)); 13206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 13306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Also test the corrupt case. 13406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL); 13506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bad_msg.WriteInt(99); 13606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch iter = NULL; 13706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output)); 13806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 13906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 14006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(IPCMessageTest, DictionaryValue) { 14106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch DictionaryValue input; 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick input.Set("null", Value::CreateNullValue()); 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick input.Set("bool", Value::CreateBooleanValue(true)); 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick input.Set("int", Value::CreateIntegerValue(42)); 14506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 14606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch scoped_ptr<DictionaryValue> subdict(new DictionaryValue()); 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick subdict->Set("str", Value::CreateStringValue("forty two")); 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick subdict->Set("bool", Value::CreateBooleanValue(false)); 14906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 15006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch scoped_ptr<ListValue> sublist(new ListValue()); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sublist->Set(0, Value::CreateDoubleValue(42.42)); 15206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch sublist->Set(1, Value::CreateStringValue("forty")); 15306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch sublist->Set(2, Value::CreateStringValue("two")); 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick subdict->Set("list", sublist.release()); 15506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick input.Set("dict", subdict.release()); 15706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 15806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 15906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::WriteParam(&msg, input); 16006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 16106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch DictionaryValue output; 16206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch void* iter = NULL; 16306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output)); 16406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 16506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(input.Equals(&output)); 16606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 16706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch // Also test the corrupt case. 16806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL); 16906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch bad_msg.WriteInt(99); 17006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch iter = NULL; 17106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output)); 17206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 17306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Tests net::HostPortPair serialization 175dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(IPCMessageTest, HostPortPair) { 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HostPortPair input("host.com", 12345); 177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::ParamTraits<net::HostPortPair>::Write(&msg, input); 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HostPortPair output; 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void* iter = NULL; 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(IPC::ParamTraits<net::HostPortPair>::Read(&msg, &iter, &output)); 184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(input.host(), output.host()); 185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_EQ(input.port(), output.port()); 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 187