Commit 1ff18517 authored by mbarbella's avatar mbarbella Committed by Commit bot

Add IPC fuzzer GenerateTraits for some cc types.

BUG=450268
R=inferno@chromium.org,tsepez@chromium.org

Review URL: https://codereview.chromium.org/873253004

Cr-Commit-Position: refs/heads/master@{#313632}
parent 01e81ff9
...@@ -400,7 +400,7 @@ struct GenerateTraits<Tuple<A, B, C, D, E>> { ...@@ -400,7 +400,7 @@ struct GenerateTraits<Tuple<A, B, C, D, E>> {
template <class A> template <class A>
struct GenerateTraits<std::vector<A> > { struct GenerateTraits<std::vector<A> > {
static bool Generate(std::vector<A>* p, Generator* generator) { static bool Generate(std::vector<A>* p, Generator* generator) {
size_t count = ++g_depth > 3 ? 0 : RandInRange(20); size_t count = ++g_depth > 3 ? 0 : RandElementCount();
p->resize(count); p->resize(count);
for (size_t i = 0; i < count; ++i) { for (size_t i = 0; i < count; ++i) {
if (!GenerateParam(&p->at(i), generator)) { if (!GenerateParam(&p->at(i), generator)) {
...@@ -417,7 +417,7 @@ template <class A> ...@@ -417,7 +417,7 @@ template <class A>
struct GenerateTraits<std::set<A> > { struct GenerateTraits<std::set<A> > {
static bool Generate(std::set<A>* p, Generator* generator) { static bool Generate(std::set<A>* p, Generator* generator) {
static int g_depth = 0; static int g_depth = 0;
size_t count = ++g_depth > 3 ? 0 : RandInRange(20); size_t count = ++g_depth > 3 ? 0 : RandElementCount();
A a; A a;
for (size_t i = 0; i < count; ++i) { for (size_t i = 0; i < count; ++i) {
if (!GenerateParam(&a, generator)) { if (!GenerateParam(&a, generator)) {
...@@ -436,7 +436,7 @@ template <class A, class B> ...@@ -436,7 +436,7 @@ template <class A, class B>
struct GenerateTraits<std::map<A, B> > { struct GenerateTraits<std::map<A, B> > {
static bool Generate(std::map<A, B>* p, Generator* generator) { static bool Generate(std::map<A, B>* p, Generator* generator) {
static int g_depth = 0; static int g_depth = 0;
size_t count = ++g_depth > 3 ? 0 : RandInRange(10); size_t count = ++g_depth > 3 ? 0 : RandElementCount();
std::pair<A, B> place_holder; std::pair<A, B> place_holder;
for (size_t i = 0; i < count; ++i) { for (size_t i = 0; i < count; ++i) {
if (!GenerateParam(&place_holder, generator)) { if (!GenerateParam(&place_holder, generator)) {
...@@ -709,16 +709,125 @@ struct GenerateTraits<blink::WebGamepadButton> { ...@@ -709,16 +709,125 @@ struct GenerateTraits<blink::WebGamepadButton> {
template <> template <>
struct GenerateTraits<cc::CompositorFrame> { struct GenerateTraits<cc::CompositorFrame> {
// FIXME: this should actually generate something
static bool Generate(cc::CompositorFrame* p, Generator* generator) { static bool Generate(cc::CompositorFrame* p, Generator* generator) {
if (!GenerateParam(&p->metadata, generator))
return false;
switch (RandInRange(4)) {
case 0: {
p->delegated_frame_data.reset(new cc::DelegatedFrameData());
if (!GenerateParam(p->delegated_frame_data.get(), generator))
return false;
return true;
}
case 1: {
p->gl_frame_data.reset(new cc::GLFrameData());
if (!GenerateParam(p->gl_frame_data.get(), generator))
return false;
return true;
}
case 2: {
p->software_frame_data.reset(new cc::SoftwareFrameData());
if (!GenerateParam(p->software_frame_data.get(), generator))
return false;
return true;
}
default:
// Generate nothing to handle the no frame case.
return true; return true;
} }
}
}; };
template <> template <>
struct GenerateTraits<cc::CompositorFrameAck> { struct GenerateTraits<cc::CompositorFrameAck> {
// FIXME: this should actually generate something
static bool Generate(cc::CompositorFrameAck* p, Generator* generator) { static bool Generate(cc::CompositorFrameAck* p, Generator* generator) {
if (!GenerateParam(&p->resources, generator))
return false;
if (!GenerateParam(&p->last_software_frame_id, generator))
return false;
p->gl_frame_data.reset(new cc::GLFrameData);
if (!GenerateParam(p->gl_frame_data.get(), generator))
return false;
return true;
}
};
template <>
struct GenerateTraits<cc::DelegatedFrameData> {
static bool Generate(cc::DelegatedFrameData* p, Generator* generator) {
if (!GenerateParam(&p->device_scale_factor, generator))
return false;
if (!GenerateParam(&p->resource_list, generator))
return false;
if (!GenerateParam(&p->render_pass_list, generator))
return false;
return true;
}
};
template <class A>
struct GenerateTraits<cc::ListContainer<A>> {
static bool Generate(cc::ListContainer<A>* p, Generator* generator) {
// TODO(mbarbella): This should actually generate something.
return true;
}
};
template <>
struct GenerateTraits<cc::QuadList> {
static bool Generate(cc::QuadList* p, Generator* generator) {
// TODO(mbarbella): This should actually generate something.
return true;
}
};
template <>
struct GenerateTraits<cc::RenderPass> {
static bool Generate(cc::RenderPass* p, Generator* generator) {
if (!GenerateParam(&p->id, generator))
return false;
if (!GenerateParam(&p->output_rect, generator))
return false;
if (!GenerateParam(&p->damage_rect, generator))
return false;
if (!GenerateParam(&p->transform_to_root_target, generator))
return false;
if (!GenerateParam(&p->has_transparent_background, generator))
return false;
if (!GenerateParam(&p->quad_list, generator))
return false;
if (!GenerateParam(&p->shared_quad_state_list, generator))
return false;
// Omitting |copy_requests| as it is not sent over IPC.
return true;
}
};
template <>
struct GenerateTraits<cc::RenderPassList> {
static bool Generate(cc::RenderPassList* p, Generator* generator) {
size_t count = RandElementCount();
for (size_t i = 0; i < count; ++i) {
scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
if (!GenerateParam(render_pass.get(), generator))
return false;
p->push_back(render_pass.Pass());
}
return true;
}
};
template <>
struct GenerateTraits<cc::SoftwareFrameData> {
static bool Generate(cc::SoftwareFrameData* p, Generator* generator) {
if (!GenerateParam(&p->id, generator))
return false;
if (!GenerateParam(&p->size, generator))
return false;
if (!GenerateParam(&p->damage_rect, generator))
return false;
if (!GenerateParam(&p->bitmap_id, generator))
return false;
return true; return true;
} }
}; };
...@@ -1062,34 +1171,6 @@ struct GenerateTraits<gfx::PointF> { ...@@ -1062,34 +1171,6 @@ struct GenerateTraits<gfx::PointF> {
} }
}; };
template <>
struct GenerateTraits<gfx::Size> {
static bool Generate(gfx::Size *p, Generator* generator) {
int w;
int h;
if (!GenerateParam(&w, generator))
return false;
if (!GenerateParam(&h, generator))
return false;
p->SetSize(w, h);
return true;
}
};
template <>
struct GenerateTraits<gfx::SizeF> {
static bool Generate(gfx::SizeF *p, Generator* generator) {
float w;
float h;
if (!GenerateParam(&w, generator))
return false;
if (!GenerateParam(&h, generator))
return false;
p->SetSize(w, h);
return true;
}
};
template <> template <>
struct GenerateTraits<gfx::Rect> { struct GenerateTraits<gfx::Rect> {
static bool Generate(gfx::Rect *p, Generator* generator) { static bool Generate(gfx::Rect *p, Generator* generator) {
...@@ -1134,6 +1215,48 @@ struct GenerateTraits<gfx::Range> { ...@@ -1134,6 +1215,48 @@ struct GenerateTraits<gfx::Range> {
} }
}; };
template <>
struct GenerateTraits<gfx::Size> {
static bool Generate(gfx::Size* p, Generator* generator) {
int w;
int h;
if (!GenerateParam(&w, generator))
return false;
if (!GenerateParam(&h, generator))
return false;
p->SetSize(w, h);
return true;
}
};
template <>
struct GenerateTraits<gfx::SizeF> {
static bool Generate(gfx::SizeF* p, Generator* generator) {
float w;
float h;
if (!GenerateParam(&w, generator))
return false;
if (!GenerateParam(&h, generator))
return false;
p->SetSize(w, h);
return true;
}
};
template <>
struct GenerateTraits<gfx::Transform> {
static bool Generate(gfx::Transform* p, Generator* generator) {
SkMScalar matrix[16];
if (!GenerateParamArray(&matrix[0], arraysize(matrix), generator))
return false;
*p = gfx::Transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4],
matrix[5], matrix[6], matrix[7], matrix[8], matrix[9],
matrix[10], matrix[11], matrix[12], matrix[13],
matrix[14], matrix[15]);
return true;
}
};
template <> template <>
struct GenerateTraits<gfx::Vector2d> { struct GenerateTraits<gfx::Vector2d> {
static bool Generate(gfx::Vector2d *p, Generator* generator) { static bool Generate(gfx::Vector2d *p, Generator* generator) {
......
...@@ -35,6 +35,10 @@ inline bool RandEvent(uint32 frequency) { ...@@ -35,6 +35,10 @@ inline bool RandEvent(uint32 frequency) {
return RandInRange(frequency) == 0; return RandInRange(frequency) == 0;
} }
inline size_t RandElementCount() {
return RandU32() % 10;
}
} // namespace ipc_fuzzer } // namespace ipc_fuzzer
#endif // TOOLS_IPC_FUZZER_MUTATE_RAND_UTIL_H_ #endif // TOOLS_IPC_FUZZER_MUTATE_RAND_UTIL_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment