| Index: courgette/encoded_program_fuzz_unittest.cc
|
| diff --git a/courgette/encoded_program_fuzz_unittest.cc b/courgette/encoded_program_fuzz_unittest.cc
|
| index be32adf24ab9cf4481e7a7bd7d0660d33129aed2..10828351632637404a0be98b7736be831b918871 100644
|
| --- a/courgette/encoded_program_fuzz_unittest.cc
|
| +++ b/courgette/encoded_program_fuzz_unittest.cc
|
| @@ -17,10 +17,9 @@
|
| #include <memory>
|
|
|
| #include "base/test/test_suite.h"
|
| -#include "courgette/assembly_program.h"
|
| #include "courgette/base_test_unittest.h"
|
| #include "courgette/courgette.h"
|
| -#include "courgette/program_detector.h"
|
| +#include "courgette/courgette_flow.h"
|
| #include "courgette/streams.h"
|
|
|
| class DecodeFuzzTest : public BaseTest {
|
| @@ -41,32 +40,36 @@ class DecodeFuzzTest : public BaseTest {
|
| void DecodeFuzzTest::FuzzExe(const char* file_name) const {
|
| std::string file1 = FileContents(file_name);
|
|
|
| - const uint8_t* original_buffer =
|
| - reinterpret_cast<const uint8_t*>(file1.data());
|
| + const uint8_t* original_data = reinterpret_cast<const uint8_t*>(file1.data());
|
| size_t original_length = file1.length();
|
| + courgette::CourgetteFlow flow;
|
|
|
| - std::unique_ptr<courgette::AssemblyProgram> program;
|
| - const courgette::Status parse_status =
|
| - courgette::ParseDetectedExecutable(original_buffer, original_length,
|
| - &program);
|
| - EXPECT_EQ(courgette::C_OK, parse_status);
|
| + courgette::RegionBuffer original_buffer(
|
| + courgette::Region(original_data, original_length));
|
| + flow.ReadAssemblyProgramFromBuffer(flow.ONLY, original_buffer, false);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr != flow.data(flow.ONLY)->program.get());
|
|
|
| - std::unique_ptr<courgette::EncodedProgram> encoded;
|
| - const courgette::Status encode_status = Encode(*program, &encoded);
|
| - EXPECT_EQ(courgette::C_OK, encode_status);
|
| + flow.CreateEncodedProgramFromAssemblyProgram(flow.ONLY);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr != flow.data(flow.ONLY)->encoded.get());
|
|
|
| - program.reset();
|
| + flow.DestroyAssemblyProgram(flow.ONLY);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr == flow.data(flow.ONLY)->program.get());
|
|
|
| - courgette::SinkStreamSet sinks;
|
| - const courgette::Status write_status =
|
| - WriteEncodedProgram(encoded.get(), &sinks);
|
| - EXPECT_EQ(courgette::C_OK, write_status);
|
| + flow.WriteSinkStreamSetFromEncodedProgram(flow.ONLY);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
|
|
| - encoded.reset();
|
| + flow.DestroyEncodedProgram(flow.ONLY);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr == flow.data(flow.ONLY)->encoded.get());
|
|
|
| courgette::SinkStream sink;
|
| - bool can_collect = sinks.CopyTo(&sink);
|
| - EXPECT_TRUE(can_collect);
|
| + flow.WriteSinkStreamFromSinkStreamSet(flow.ONLY, &sink);
|
| + EXPECT_EQ(courgette::C_OK, flow.status());
|
| + EXPECT_TRUE(flow.ok());
|
| + EXPECT_FALSE(flow.failed());
|
|
|
| size_t length = sink.Length();
|
|
|
| @@ -173,34 +176,27 @@ void DecodeFuzzTest::FuzzBits(const std::string& base_buffer,
|
| }
|
| }
|
|
|
| -bool DecodeFuzzTest::TryAssemble(const std::string& buffer,
|
| +bool DecodeFuzzTest::TryAssemble(const std::string& file,
|
| std::string* output) const {
|
| - std::unique_ptr<courgette::EncodedProgram> encoded;
|
| - bool result = false;
|
| -
|
| - courgette::SourceStreamSet sources;
|
| - bool can_get_source_streams = sources.Init(buffer.c_str(), buffer.length());
|
| - if (can_get_source_streams) {
|
| - const courgette::Status read_status =
|
| - ReadEncodedProgram(&sources, &encoded);
|
| - if (read_status == courgette::C_OK) {
|
| - courgette::SinkStream assembled;
|
| - const courgette::Status assemble_status =
|
| - Assemble(encoded.get(), &assembled);
|
| -
|
| - if (assemble_status == courgette::C_OK) {
|
| - const void* assembled_buffer = assembled.Buffer();
|
| - size_t assembled_length = assembled.Length();
|
| -
|
| - output->clear();
|
| - output->assign(reinterpret_cast<const char*>(assembled_buffer),
|
| - assembled_length);
|
| - result = true;
|
| - }
|
| - }
|
| - }
|
| + courgette::CourgetteFlow flow;
|
| + courgette::RegionBuffer file_buffer(courgette::Region(
|
| + reinterpret_cast<const uint8_t*>(file.data()), file.length()));
|
| + flow.ReadSourceStreamSetFromBuffer(flow.ONLY, file_buffer);
|
| + if (flow.failed())
|
| + return false;
|
| +
|
| + flow.ReadEncodedProgramFromSourceStreamSet(flow.ONLY);
|
| + if (flow.failed())
|
| + return false;
|
| +
|
| + courgette::SinkStream sink;
|
| + flow.WriteExecutableFromEncodedProgram(flow.ONLY, &sink);
|
| + if (flow.failed())
|
| + return false;
|
|
|
| - return result;
|
| + output->clear();
|
| + output->assign(reinterpret_cast<const char*>(sink.Buffer()), sink.Length());
|
| + return true;
|
| }
|
|
|
| TEST_F(DecodeFuzzTest, All) {
|
|
|