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