| Index: tools/ipc_fuzzer/mutate/fuzzer.h
 | 
| diff --git a/tools/ipc_fuzzer/mutate/fuzzer.h b/tools/ipc_fuzzer/mutate/fuzzer.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..047b47b7820e710af884efc2ca7497e0ac10cba0
 | 
| --- /dev/null
 | 
| +++ b/tools/ipc_fuzzer/mutate/fuzzer.h
 | 
| @@ -0,0 +1,86 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef TOOLS_IPC_FUZZER_MUTATE_FUZZER_H_
 | 
| +#define TOOLS_IPC_FUZZER_MUTATE_FUZZER_H_
 | 
| +
 | 
| +#include <string>
 | 
| +#include <vector>
 | 
| +
 | 
| +#include "base/basictypes.h"
 | 
| +#include "base/strings/string_util.h"
 | 
| +#include "ipc/ipc_message.h"
 | 
| +
 | 
| +namespace ipc_fuzzer {
 | 
| +
 | 
| +// Interface implemented by those who generate basic types.  The types all
 | 
| +// correspond to the types which a pickle from base/pickle.h can pickle,
 | 
| +// plus the floating point types.
 | 
| +class Fuzzer {
 | 
| + public:
 | 
| +  // Functions for various data types.
 | 
| +  virtual void FuzzBool(bool* value) = 0;
 | 
| +  virtual void FuzzInt(int* value) = 0;
 | 
| +  virtual void FuzzLong(long* value) = 0;
 | 
| +  virtual void FuzzSize(size_t* value) = 0;
 | 
| +  virtual void FuzzUChar(unsigned char* value) = 0;
 | 
| +  virtual void FuzzWChar(wchar_t* value) = 0;
 | 
| +  virtual void FuzzUInt16(uint16* value) = 0;
 | 
| +  virtual void FuzzUInt32(uint32* value) = 0;
 | 
| +  virtual void FuzzInt64(int64* value) = 0;
 | 
| +  virtual void FuzzUInt64(uint64* value) = 0;
 | 
| +  virtual void FuzzFloat(float* value) = 0;
 | 
| +  virtual void FuzzDouble(double *value) = 0;
 | 
| +  virtual void FuzzString(std::string* value) = 0;
 | 
| +  virtual void FuzzString16(base::string16* value) = 0;
 | 
| +  virtual void FuzzData(char* data, int length) = 0;
 | 
| +  virtual void FuzzBytes(void* data, int data_len) = 0;
 | 
| +
 | 
| +  // Used to determine if a completely new value should be generated for
 | 
| +  // certain types instead of attempting to modify the existing one.
 | 
| +  virtual bool ShouldGenerate();
 | 
| +};
 | 
| +
 | 
| +class NoOpFuzzer : public Fuzzer {
 | 
| + public:
 | 
| +  NoOpFuzzer() {}
 | 
| +  virtual ~NoOpFuzzer() {}
 | 
| +
 | 
| +  void FuzzBool(bool* value) override {}
 | 
| +  void FuzzInt(int* value) override {}
 | 
| +  void FuzzLong(long* value) override {}
 | 
| +  void FuzzSize(size_t* value) override {}
 | 
| +  void FuzzUChar(unsigned char* value) override {}
 | 
| +  void FuzzWChar(wchar_t* value) override {}
 | 
| +  void FuzzUInt16(uint16* value) override {}
 | 
| +  void FuzzUInt32(uint32* value) override {}
 | 
| +  void FuzzInt64(int64* value) override {}
 | 
| +  void FuzzUInt64(uint64* value) override {}
 | 
| +  void FuzzFloat(float* value) override {}
 | 
| +  void FuzzDouble(double* value) override {}
 | 
| +  void FuzzString(std::string* value) override {}
 | 
| +  void FuzzString16(base::string16* value) override {}
 | 
| +  void FuzzData(char* data, int length) override {}
 | 
| +  void FuzzBytes(void* data, int data_len) override {}
 | 
| +};
 | 
| +
 | 
| +typedef IPC::Message* (*FuzzerFunction)(IPC::Message*, Fuzzer*);
 | 
| +
 | 
| +// Used for mutating messages. Once populated, the map associates a message ID
 | 
| +// with a FuzzerFunction used for mutation of that message type.
 | 
| +typedef base::hash_map<uint32, FuzzerFunction> FuzzerFunctionMap;
 | 
| +void PopulateFuzzerFunctionMap(FuzzerFunctionMap* map);
 | 
| +
 | 
| +// Used for generating new messages. Once populated, the vector contains
 | 
| +// FuzzerFunctions for all message types that we know how to generate.
 | 
| +typedef std::vector<FuzzerFunction> FuzzerFunctionVector;
 | 
| +void PopulateFuzzerFunctionVector(FuzzerFunctionVector* function_vector);
 | 
| +
 | 
| +// Since IPC::Message can be serialized, we also track a global function vector
 | 
| +// to handle generation of new messages while fuzzing.
 | 
| +extern FuzzerFunctionVector g_function_vector;
 | 
| +
 | 
| +}  // namespace ipc_fuzzer
 | 
| +
 | 
| +#endif  // TOOLS_IPC_FUZZER_MUTATE_FUZZER_H_
 | 
| 
 |