15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <stdlib.h> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <iostream> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <ostream> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <set> 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/pickle.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message_utils.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_switches.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_sync_channel.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_sync_message.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/message_lib/message_file.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/mutate/rand_util.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_POSIX) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <unistd.h> 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// First include of message files to provide basic type. 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/message_lib/all_messages.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message_null_macros.h" 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace IPC { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Message; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace IPC 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// For breaking deep recursion. 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int g_depth = 0; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ipc_fuzzer { 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Interface implemented by those who generate basic types. The types all 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// correspond to the types which a pickle from base/pickle.h can pickle, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// plus the floating point types. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Generator { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateBool(bool* value) = 0; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateInt(int* value) = 0; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateLong(long* value) = 0; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateSize(size_t* value) = 0; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUChar(unsigned char *value) = 0; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt16(uint16* value) = 0; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt32(uint32* value) = 0; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateInt64(int64* value) = 0; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt64(uint64* value) = 0; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateFloat(float *value) = 0; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateDouble(double *value) = 0; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateString(std::string* value) = 0; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateString16(base::string16* value) = 0; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateData(char* data, int length) = 0; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateBytes(void* data, int data_len) = 0; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <typename T> 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GenerateIntegralType(T* value) { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (RandInRange(16)) { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = 0; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = 1; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = -1; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = 2; 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = static_cast<T>(RandU64()); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <typename T> 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GenerateFloatingType(T* value) { 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = RandDouble(); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <typename T> 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GenerateStringType(T* value) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) T temp_string; 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t length = RandInRange(300); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < length; ++i) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_string += RandInRange(256); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = temp_string; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GeneratorImpl : public Generator { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GeneratorImpl() {} 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~GeneratorImpl() {} 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateBool(bool* value) OVERRIDE { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = RandInRange(2); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateInt(int* value) OVERRIDE { 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<int>(value); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateLong(long* value) OVERRIDE { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<long>(value); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateSize(size_t* value) OVERRIDE { 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<size_t>(value); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUChar(unsigned char* value) OVERRIDE { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<unsigned char>(value); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt16(uint16* value) OVERRIDE { 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<uint16>(value); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt32(uint32* value) OVERRIDE { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<uint32>(value); 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateInt64(int64* value) OVERRIDE { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<int64>(value); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateUInt64(uint64* value) OVERRIDE { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<uint64>(value); 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateFloat(float* value) OVERRIDE { 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateFloatingType<float>(value); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateDouble(double* value) OVERRIDE { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateFloatingType<double>(value); 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateString(std::string* value) OVERRIDE { 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStringType<std::string>(value); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateString16(base::string16* value) OVERRIDE { 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateStringType<base::string16>(value); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateData(char* data, int length) OVERRIDE { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < length; ++i) { 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateIntegralType<char>(&data[i]); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateBytes(void* data, int data_len) OVERRIDE { 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateData(static_cast<char*>(data), data_len); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Partially-specialized class that knows how to generate a given type. 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class P> 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits { 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(P* p, Generator *generator) { 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is the catch-all for types we don't have enough information 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to generate. 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Can't handle " << __PRETTY_FUNCTION__ << "\n"; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Template function to invoke partially-specialized class method. 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class P> 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static bool GenerateParam(P* p, Generator* generator) { 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GenerateTraits<P>::Generate(p, generator); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Specializations to generate primitive types. 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<bool> { 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(bool* p, Generator* generator) { 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateBool(p); 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<int> { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(int* p, Generator* generator) { 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt(p); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<unsigned int> { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(unsigned int* p, Generator* generator) { 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt(reinterpret_cast<int*>(p)); 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<long> { 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(long* p, Generator* generator) { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateLong(p); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<unsigned long> { 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(unsigned long* p, Generator* generator) { 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateLong(reinterpret_cast<long*>(p)); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<long long> { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(long long* p, Generator* generator) { 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt64(reinterpret_cast<int64*>(p)); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<unsigned long long> { 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(unsigned long long* p, Generator* generator) { 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt64(reinterpret_cast<int64*>(p)); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<short> { 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(short* p, Generator* generator) { 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateUInt16(reinterpret_cast<uint16*>(p)); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<unsigned short> { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(unsigned short* p, Generator* generator) { 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateUInt16(reinterpret_cast<uint16*>(p)); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<char> { 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(char* p, Generator* generator) { 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateUChar(reinterpret_cast<unsigned char*>(p)); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<unsigned char> { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(unsigned char* p, Generator* generator) { 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateUChar(p); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<float> { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(float* p, Generator* generator) { 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateFloat(p); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<double> { 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(double* p, Generator* generator) { 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateDouble(p); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<std::string> { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(std::string* p, Generator* generator) { 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateString(p); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::string16> { 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::string16* p, Generator* generator) { 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateString16(p); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Specializations to generate tuples. 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple0> { 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple0* p, Generator* generator) { 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A> 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple1<A> > { 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple1<A>* p, Generator* generator) { 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GenerateParam(&p->a, generator); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B> 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple2<A, B> > { 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple2<A, B>* p, Generator* generator) { 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->a, generator) && 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->b, generator); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B, class C> 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple3<A, B, C> > { 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple3<A, B, C>* p, Generator* generator) { 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->a, generator) && 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->b, generator) && 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->c, generator); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B, class C, class D> 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple4<A, B, C, D> > { 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple4<A, B, C, D>* p, Generator* generator) { 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->a, generator) && 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->b, generator) && 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->c, generator) && 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->d, generator); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B, class C, class D, class E> 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<Tuple5<A, B, C, D, E> > { 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(Tuple5<A, B, C, D, E>* p, Generator* generator) { 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->a, generator) && 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->b, generator) && 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->c, generator) && 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->d, generator) && 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->e, generator); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Specializations to generate containers. 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A> 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<std::vector<A> > { 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(std::vector<A>* p, Generator* generator) { 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count = ++g_depth > 3 ? 0 : RandInRange(20); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->resize(count); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&p->at(i), generator)) { 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A> 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<std::set<A> > { 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(std::set<A>* p, Generator* generator) { 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static int g_depth = 0; 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count = ++g_depth > 3 ? 0 : RandInRange(20); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) A a; 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&a, generator)) { 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->insert(a); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B> 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<std::map<A, B> > { 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(std::map<A, B>* p, Generator* generator) { 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static int g_depth = 0; 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count = ++g_depth > 3 ? 0 : RandInRange(20); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::pair<A, B> place_holder; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&place_holder, generator)) { 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->insert(place_holder); 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class A, class B> 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<std::pair<A, B> > { 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(std::pair<A, B>* p, Generator* generator) { 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->first, generator) && 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->second, generator); 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Specializations to generate hand-coded tyoes 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::NullableString16> { 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::NullableString16* p, Generator* generator) { 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = base::NullableString16(); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::FileDescriptor> { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::FileDescriptor* p, Generator* generator) { 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // I don't think we can generate real ones due to check on construct. 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->fd = -1; 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::FilePath> { 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::FilePath* p, Generator* generator) { 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char path_chars[] = "ACz0/.~:"; 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count = RandInRange(60); 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string random_path; 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_path += path_chars[RandInRange(sizeof(path_chars) - 1)]; 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = base::FilePath(random_path); 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::File::Error> { 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::File::Error* p, Generator* generator) { 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int temporary; 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&temporary, generator)) 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = static_cast<base::File::Error>(temporary); 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::File::Info> { 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::File::Info* p, Generator* generator) { 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double last_modified; 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double last_accessed; 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double creation_time; 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&p->size, generator)) 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&p->is_directory, generator)) 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&last_modified, generator)) 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&last_accessed, generator)) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&creation_time, generator)) 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->last_modified = base::Time::FromDoubleT(last_modified); 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->last_accessed = base::Time::FromDoubleT(last_accessed); 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->creation_time = base::Time::FromDoubleT(creation_time); 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::Time> { 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::Time* p, Generator* generator) { 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = base::Time::FromInternalValue(RandU64()); 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::TimeDelta> { 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::TimeDelta* p, Generator* generator) { 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = base::TimeDelta::FromInternalValue(RandU64()); 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::TimeTicks> { 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::TimeTicks* p, Generator* generator) { 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = base::TimeTicks::FromInternalValue(RandU64()); 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::ListValue> { 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::ListValue* p, Generator* generator) { 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++g_depth; 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t list_length = g_depth > 3 ? 0 : RandInRange(8); 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t index = 0; index < list_length; ++index) { 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (RandInRange(8)) 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_BOOLEAN: { 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool tmp; 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateBool(&tmp); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, new base::FundamentalValue(tmp)); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_INTEGER: { 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int tmp; 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt(&tmp); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, new base::FundamentalValue(tmp)); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_DOUBLE: { 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double tmp; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateDouble(&tmp); 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, new base::FundamentalValue(tmp)); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_STRING: { 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string tmp; 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateString(&tmp); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, new base::StringValue(tmp)); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_BINARY: { 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char tmp[200]; 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t bin_length = RandInRange(sizeof(tmp)); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateData(tmp, bin_length); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::BinaryValue::CreateWithCopiedBuffer(tmp, bin_length)); 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_DICTIONARY: { 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* tmp = new base::DictionaryValue(); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(tmp, generator); 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, tmp); 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_LIST: { 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* tmp = new base::ListValue(); 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(tmp, generator); 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->Set(index, tmp); 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_NULL: 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<base::DictionaryValue> { 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(base::DictionaryValue* p, Generator* generator) { 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++g_depth; 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t dict_length = g_depth > 3 ? 0 : RandInRange(8); 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t index = 0; index < dict_length; ++index) { 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string property; 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateString(&property); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (RandInRange(8)) 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_BOOLEAN: { 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool tmp; 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateBool(&tmp); 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, new base::FundamentalValue(tmp)); 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_INTEGER: { 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int tmp; 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateInt(&tmp); 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, new base::FundamentalValue(tmp)); 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_DOUBLE: { 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double tmp; 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateDouble(&tmp); 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, new base::FundamentalValue(tmp)); 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_STRING: { 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string tmp; 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateString(&tmp); 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, new base::StringValue(tmp)); 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_BINARY: { 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char tmp[200]; 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t bin_length = RandInRange(sizeof(tmp)); 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateData(tmp, bin_length); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion( 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property, 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::BinaryValue::CreateWithCopiedBuffer(tmp, bin_length)); 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_DICTIONARY: { 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* tmp = new base::DictionaryValue(); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(tmp, generator); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, tmp); 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_LIST: { 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* tmp = new base::ListValue(); 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(tmp, generator); 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetWithoutPathExpansion(property, tmp); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case base::Value::TYPE_NULL: 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<GURL> { 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(GURL *p, Generator* generator) { 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char url_chars[] = "Ahtp0:/.?+\%&#"; 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count = RandInRange(100); 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string random_url; 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_url += url_chars[RandInRange(sizeof(url_chars) - 1)]; 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int selector = RandInRange(10); 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (selector == 0) 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_url = std::string("http://") + random_url; 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (selector == 1) 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_url = std::string("file://") + random_url; 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (selector == 2) 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_url = std::string("javascript:") + random_url; 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (selector == 2) 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) random_url = std::string("data:") + random_url; 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = GURL(random_url); 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// FIXME: Actually generate something. 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<SkBitmap> { 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(SkBitmap* p, Generator* generator) { 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = SkBitmap(); 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<IPC::ChannelHandle> { 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(IPC::ChannelHandle* p, Generator* generator) { 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->name, generator) && 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->socket, generator); 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<cc::CompositorFrame> { 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: this should actually generate something 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(cc::CompositorFrame* p, Generator* generator) { 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<cc::CompositorFrameAck> { 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: this should actually generate something 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(cc::CompositorFrameAck* p, Generator* generator) { 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<content::IndexedDBKey> { 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(content::IndexedDBKey* p, Generator* generator) { 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++g_depth; 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebIDBKeyType web_type = 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<blink::WebIDBKeyType>(RandInRange(7)); 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (web_type) 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeArray: { 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t length = g_depth > 3 ? 0 : RandInRange(4); 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<content::IndexedDBKey> array; 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) array.resize(length); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < length; ++i) { 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&array[i], generator)) 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKey(array); 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeBinary: { 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string binary; 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&binary, generator)) 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKey(binary); 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeString: { 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string; 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&string, generator)) 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKey(string); 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeDate: 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeNumber: { 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double number; 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&number, generator)) 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKey(number, web_type); 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeInvalid: 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case blink::WebIDBKeyTypeNull: { 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKey(web_type); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) --g_depth; 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<content::IndexedDBKeyRange> { 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(content::IndexedDBKeyRange *p, Generator* generator) { 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::IndexedDBKey lower; 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::IndexedDBKey upper; 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool lower_open; 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool upper_open; 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&lower, generator)) 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&upper, generator)) 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&lower_open, generator)) 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&upper_open, generator)) 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKeyRange(lower, upper, lower_open, upper_open); 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<content::IndexedDBKeyPath> { 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(content::IndexedDBKeyPath *p, Generator* generator) { 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (RandInRange(3)) { 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0: { 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> array; 7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&array, generator)) 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKeyPath(array); 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 1: { 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string; 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&string, generator)) 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKeyPath(string); 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: { 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::IndexedDBKeyPath(); 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<content::PageState> { 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(content::PageState *p, Generator* generator) { 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string junk; 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&junk, generator)) 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = content::PageState::CreateFromEncodedData(junk); 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gpu::Mailbox> { 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gpu::Mailbox *p, Generator* generator) { 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateBytes(p->name, sizeof(p->name)); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<media::AudioParameters> { 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(media::AudioParameters *p, Generator* generator) { 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int format; 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int channel_layout; 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sample_rate; 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int bits_per_sample; 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frames_per_buffer; 8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int channels; 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int effects; 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&format, generator)) 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&channel_layout, generator)) 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&sample_rate, generator)) 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&bits_per_sample, generator)) 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&frames_per_buffer, generator)) 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!GenerateParam(&channels, generator)) 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&effects, generator)) 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::AudioParameters params( 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<media::AudioParameters::Format>(format), 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<media::ChannelLayout>(channel_layout), 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci channels, 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sample_rate, 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bits_per_sample, 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frames_per_buffer, 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci effects); 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = params; 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<media::VideoCaptureFormat> { 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(media::VideoCaptureFormat *p, Generator* generator) { 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame_size_width; 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int frame_size_height; 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int pixel_format; 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&frame_size_height, generator)) 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&frame_size_width, generator)) 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&pixel_format, generator)) 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&p->frame_rate, generator)) 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->frame_size.SetSize(frame_size_width, frame_size_height); 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->pixel_format = static_cast<media::VideoPixelFormat>(pixel_format); 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<net::LoadTimingInfo> { 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(net::LoadTimingInfo *p, Generator* generator) { 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->socket_log_id, generator) && 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->socket_reused, generator) && 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->request_start_time, generator) && 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->request_start, generator) && 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->proxy_resolve_start, generator) && 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->proxy_resolve_end, generator) && 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.dns_start, generator) && 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.dns_end, generator) && 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.connect_start, generator) && 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.connect_end, generator) && 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.ssl_start, generator) && 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->connect_timing.ssl_end, generator) && 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->send_start, generator) && 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->send_end, generator) && 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GenerateParam(&p->receive_headers_end, generator); 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<net::HostPortPair> { 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(net::HostPortPair *p, Generator* generator) { 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string host; 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16 port; 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&host, generator)) 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&port, generator)) 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_host(host); 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_port(port); 9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<net::IPEndPoint> { 9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(net::IPEndPoint *p, Generator* generator) { 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::IPAddressNumber address; 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int port; 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&address, generator)) 9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&port, generator)) 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::IPEndPoint ip_endpoint(address, port); 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = ip_endpoint; 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Point> { 9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Point *p, Generator* generator) { 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int x; 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int y; 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&x, generator)) 9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&y, generator)) 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetPoint(x, y); 9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::PointF> { 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::PointF *p, Generator* generator) { 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float x; 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float y; 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&x, generator)) 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&y, generator)) 9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetPoint(x, y); 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Size> { 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Size *p, Generator* generator) { 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int w; 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int h; 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&w, generator)) 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&h, generator)) 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetSize(w, h); 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::SizeF> { 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::SizeF *p, Generator* generator) { 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float w; 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float h; 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&w, generator)) 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&h, generator)) 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetSize(w, h); 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Rect> { 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Rect *p, Generator* generator) { 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point origin; 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size size; 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&origin, generator)) 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&size, generator)) 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_origin(origin); 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_size(size); 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::RectF> { 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::RectF *p, Generator* generator) { 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF origin; 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::SizeF size; 10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&origin, generator)) 10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&size, generator)) 10105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_origin(origin); 10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->set_size(size); 10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Range> { 10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Range *p, Generator* generator) { 10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t start; 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t end; 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&start, generator)) 10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&end, generator)) 10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = gfx::Range(start, end); 10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Vector2d> { 10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Vector2d *p, Generator* generator) { 10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int x; 10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int y; 10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&x, generator)) 10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&y, generator)) 10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = gfx::Vector2d(x, y); 10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<gfx::Vector2dF> { 10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(gfx::Vector2dF *p, Generator* generator) { 10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float x; 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float y; 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&x, generator)) 10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&y, generator)) 10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = gfx::Vector2dF(x, y); 10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// PP_ traits. 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<PP_Bool> { 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(PP_Bool *p, Generator* generator) { 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool tmp; 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&tmp, generator)) 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = PP_FromBool(tmp); 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<PP_NetAddress_Private> { 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(PP_NetAddress_Private *p, Generator* generator) { 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->size = RandInRange(sizeof(p->data) + 1); 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator->GenerateBytes(&p->data, p->size); 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<ppapi::HostResource> { 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(ppapi::HostResource *p, Generator* generator) { 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Instance instance; 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource resource; 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&instance, generator)) 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&resource, generator)) 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetHostResource(instance, resource); 10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<ppapi::PepperFilePath> { 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(ppapi::PepperFilePath *p, Generator* generator) { 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned domain = RandInRange(ppapi::PepperFilePath::DOMAIN_MAX_VALID+1); 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath path; 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&path, generator)) 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = ppapi::PepperFilePath( 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<ppapi::PepperFilePath::Domain>(domain), path); 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<ppapi::PpapiPermissions> { 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(ppapi::PpapiPermissions *p, Generator* generator) { 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t bits; 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&bits, generator)) 11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *p = ppapi::PpapiPermissions(bits); 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GenerateTraits<ppapi::SocketOptionData> { 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(ppapi::SocketOptionData *p, Generator* generator) { 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: we can do better here. 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 temp; 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&temp, generator)) 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p->SetInt32(temp); 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Redefine macros to generate generating from traits declarations. 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// STRUCT declarations cause corresponding STRUCT_TRAITS declarations to occur. 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_BEGIN 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_BEGIN_WITH_PARENT 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_MEMBER 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_END 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, parent) \ 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_STRUCT_BEGIN(struct_name) 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_BEGIN(struct_name) IPC_STRUCT_TRAITS_BEGIN(struct_name) 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_MEMBER(type, name, ...) IPC_STRUCT_TRAITS_MEMBER(name) 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_END() IPC_STRUCT_TRAITS_END() 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Set up so next include will generate generate trait classes. 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_TRAITS_BEGIN 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_TRAITS_MEMBER 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_TRAITS_PARENT 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_STRUCT_TRAITS_END 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_TRAITS_BEGIN(struct_name) \ 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <> \ 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct GenerateTraits<struct_name> { \ 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(struct_name *p, Generator* generator) { 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_TRAITS_MEMBER(name) \ 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(&p->name, generator)) \ 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_TRAITS_PARENT(type) \ 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GenerateParam(static_cast<type*>(p), generator)) \ 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_STRUCT_TRAITS_END() \ 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; \ 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// If |condition| isn't met, the messsge will fail to serialize. Try 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// increasingly smaller ranges until we find one that happens to meet 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the condition, or fail trying. 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_ENUM_TRAITS_VALIDATE 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_ENUM_TRAITS_VALIDATE(enum_name, condition) \ 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <> \ 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct GenerateTraits<enum_name> { \ 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool Generate(enum_name* p, Generator* generator) { \ 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int shift = 30; shift; --shift) { \ 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int tries = 0; tries < 2; ++tries) { \ 11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int value = RandInRange(1 << shift); \ 11765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (condition) { \ 11775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *reinterpret_cast<int*>(p) = value; \ 11785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; \ 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "failed to satisfy " << #condition << "\n"; \ 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; \ 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Bring them into existence. 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/message_lib/all_messages.h" 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message_null_macros.h" 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Redefine macros to generate generating funtions 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_MESSAGE_DECL 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MESSAGE_DECL(kind, type, name, in, out, ilist, olist) \ 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_##kind##_##type##_GENERATE(name, in, out, ilist, olist) 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_EMPTY_CONTROL_GENERATE(name, in, out, ilist, olist) \ 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(); \ 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_EMPTY_ROUTED_GENERATE(name, in, out, ilist, olist) \ 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(RandInRange(MAX_FAKE_ROUTING_ID)); \ 12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_ASYNC_CONTROL_GENERATE(name, in, out, ilist, olist) \ 12075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 12085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_TUPLE_IN_##in ilist p; \ 12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&p, generator)) { \ 12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(IPC_MEMBERS_IN_##in(p)); \ 12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Don't know how to generate " << #name << "\n"; \ 12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; \ 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_ASYNC_ROUTED_GENERATE(name, in, out, ilist, olist) \ 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_TUPLE_IN_##in ilist p; \ 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&p, generator)) { \ 12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(RandInRange(MAX_FAKE_ROUTING_ID) \ 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_COMMA_##in \ 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MEMBERS_IN_##in(p)); \ 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Don't know how to generate " << #name << "\n"; \ 12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; \ 12265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_SYNC_CONTROL_GENERATE(name, in, out, ilist, olist) \ 12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_TUPLE_IN_##in ilist p; \ 12315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&p, generator)) { \ 12325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(IPC_MEMBERS_IN_##in(p) \ 12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_COMMA_AND_##out(IPC_COMMA_##in) \ 12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MEMBERS_OUT_##out()); \ 12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Don't know how to generate " << #name << "\n"; \ 12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; \ 12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_SYNC_ROUTED_GENERATE(name, in, out, ilist, olist) \ 12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* generator_for_##name(Generator* generator) { \ 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_TUPLE_IN_##in ilist p; \ 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GenerateParam(&p, generator)) { \ 12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new name(RandInRange(MAX_FAKE_ROUTING_ID) \ 12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_COMMA_OR_##out(IPC_COMMA_##in) \ 12465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MEMBERS_IN_##in(p) \ 12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_COMMA_AND_##out(IPC_COMMA_##in) \ 12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MEMBERS_OUT_##out()); \ 12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } \ 12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Don't know how to generate " << #name << "\n"; \ 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; \ 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAX_FAKE_ROUTING_ID 15 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_0(p) 12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_1(p) p.a 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_2(p) p.a, p.b 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_3(p) p.a, p.b, p.c 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_4(p) p.a, p.b, p.c, p.d 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_IN_5(p) p.a, p.b, p.c, p.d, p.e 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_0() 12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_1() NULL 12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_2() NULL, NULL 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_3() NULL, NULL, NULL 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_4() NULL, NULL, NULL, NULL 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MEMBERS_OUT_5() NULL, NULL, NULL, NULL, NULL 12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/message_lib/all_messages.h" 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message_null_macros.h" 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef IPC::Message* (*GeneratorFunction)(Generator*); 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef std::vector<GeneratorFunction> GeneratorFunctionVector; 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PopulateGeneratorFunctionVector( 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GeneratorFunctionVector *function_vector) { 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef IPC_MESSAGE_DECL 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define IPC_MESSAGE_DECL(kind, type, name, in, out, ilist, olist) \ 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) function_vector->push_back(generator_for_##name); 12815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "tools/ipc_fuzzer/message_lib/all_messages.h" 12825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const char kCountSwitch[] = "count"; 12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const char kHelpSwitch[] = "help"; 12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int GenerateMain(int argc, char** argv) { 12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandLine::Init(argc, argv); 12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandLine* cmd = CommandLine::ForCurrentProcess(); 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandLine::StringVector args = cmd->GetArgs(); 12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (args.size() != 1 || cmd->HasSwitch(kHelpSwitch)) { 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Usage: ipc_fuzzer_generate [--help] [--count=n] outfile\n"; 12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return EXIT_FAILURE; 12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string output_file_name = args[0]; 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int message_count = 1000; 12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cmd->HasSwitch(kCountSwitch)) 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_count = atoi(cmd->GetSwitchValueASCII(kCountSwitch).c_str()); 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitRand(); 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GeneratorFunctionVector function_vector; 13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateGeneratorFunctionVector(&function_vector); 13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Counted " << function_vector.size() 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " distinct messages present in chrome.\n"; 13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Generator* generator = new GeneratorImpl(); 13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MessageVector message_vector; 13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int bad_count = 0; 13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (message_count < 0) { 13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Enumerate them all. 13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < function_vector.size(); ++i) { 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IPC::Message* new_message = (*function_vector[i])(generator)) 13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_vector.push_back(new_message); 13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bad_count += 1; 13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate a random batch. 13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < message_count; ++i) { 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t index = RandInRange(function_vector.size()); 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IPC::Message* new_message = (*function_vector[index])(generator)) 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_vector.push_back(new_message); 13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bad_count += 1; 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::cerr << "Failed to generate " << bad_count << " messages.\n"; 13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!MessageFile::Write(base::FilePath(output_file_name), message_vector)) 13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return EXIT_FAILURE; 13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return EXIT_SUCCESS; 13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace ipc_fuzzer 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int main(int argc, char** argv) { 13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ipc_fuzzer::GenerateMain(argc, argv); 13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345