| Index: courgette/encode_decode_unittest.cc
|
| diff --git a/courgette/encode_decode_unittest.cc b/courgette/encode_decode_unittest.cc
|
| index 6e88ee3dc74017996966cab28791a9e18dbfd508..7b705f12fd4555299ae0397fcd485f7648e35fea 100644
|
| --- a/courgette/encode_decode_unittest.cc
|
| +++ b/courgette/encode_decode_unittest.cc
|
| @@ -9,10 +9,13 @@
|
| #include "courgette/assembly_program.h"
|
| #include "courgette/base_test_unittest.h"
|
| #include "courgette/courgette.h"
|
| +#include "courgette/courgette_flow.h"
|
| #include "courgette/encoded_program.h"
|
| #include "courgette/program_detector.h"
|
| #include "courgette/streams.h"
|
|
|
| +namespace courgette {
|
| +
|
| class EncodeDecodeTest : public BaseTest {
|
| public:
|
| void TestAssembleToStreamDisassemble(const std::string& file,
|
| @@ -22,57 +25,63 @@ class EncodeDecodeTest : public BaseTest {
|
| void EncodeDecodeTest::TestAssembleToStreamDisassemble(
|
| const std::string& file,
|
| size_t expected_encoded_length) const {
|
| - const uint8_t* original_buffer =
|
| - reinterpret_cast<const uint8_t*>(file.data());
|
| + const uint8_t* original_data = reinterpret_cast<const uint8_t*>(file.data());
|
| size_t original_length = file.length();
|
| + 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);
|
| -
|
| - std::unique_ptr<courgette::EncodedProgram> encoded;
|
| - const courgette::Status encode_status = Encode(*program, &encoded);
|
| - EXPECT_EQ(courgette::C_OK, encode_status);
|
| + // Convert executable to encoded assembly.
|
| + RegionBuffer original_buffer(Region(original_data, original_length));
|
| + flow.ReadAssemblyProgramFromBuffer(flow.ONLY, original_buffer, false);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr != flow.data(flow.ONLY)->program.get());
|
|
|
| - program.reset();
|
| + flow.CreateEncodedProgramFromAssemblyProgram(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr != flow.data(flow.ONLY)->encoded.get());
|
|
|
| - courgette::SinkStreamSet sinks;
|
| - const courgette::Status write_status =
|
| - WriteEncodedProgram(encoded.get(), &sinks);
|
| - EXPECT_EQ(courgette::C_OK, write_status);
|
| + flow.DestroyAssemblyProgram(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr == flow.data(flow.ONLY)->program.get());
|
|
|
| - encoded.reset();
|
| + flow.WriteSinkStreamSetFromEncodedProgram(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
|
|
| - courgette::SinkStream sink;
|
| - bool can_collect = sinks.CopyTo(&sink);
|
| - EXPECT_TRUE(can_collect);
|
| + flow.DestroyEncodedProgram(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr == flow.data(flow.ONLY)->encoded.get());
|
|
|
| - const void* buffer = sink.Buffer();
|
| - size_t length = sink.Length();
|
| + SinkStream sink;
|
| + flow.WriteSinkStreamFromSinkStreamSet(flow.ONLY, &sink);
|
| + EXPECT_EQ(C_OK, flow.status());
|
|
|
| - EXPECT_EQ(expected_encoded_length, length);
|
| + const void* encoded_data = sink.Buffer();
|
| + size_t encoded_length = sink.Length();
|
| + EXPECT_EQ(expected_encoded_length, encoded_length);
|
|
|
| - courgette::SourceStreamSet sources;
|
| - bool can_get_source_streams = sources.Init(buffer, length);
|
| - EXPECT_TRUE(can_get_source_streams);
|
| + // Convert encoded assembly back to executable.
|
| + RegionBuffer encoded_buffer(Region(encoded_data, encoded_length));
|
| + flow.ReadSourceStreamSetFromBuffer(flow.ONLY, encoded_buffer);
|
| + EXPECT_EQ(C_OK, flow.status());
|
|
|
| - std::unique_ptr<courgette::EncodedProgram> encoded2;
|
| - const courgette::Status read_status = ReadEncodedProgram(&sources, &encoded2);
|
| - EXPECT_EQ(courgette::C_OK, read_status);
|
| + flow.ReadEncodedProgramFromSourceStreamSet(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr != flow.data(flow.ONLY)->encoded.get());
|
|
|
| - courgette::SinkStream assembled;
|
| - const courgette::Status assemble_status =
|
| - Assemble(encoded2.get(), &assembled);
|
| - EXPECT_EQ(courgette::C_OK, assemble_status);
|
| + SinkStream executable;
|
| + flow.WriteExecutableFromEncodedProgram(flow.ONLY, &executable);
|
| + EXPECT_EQ(C_OK, flow.status());
|
|
|
| - encoded2.reset();
|
| + flow.DestroyEncodedProgram(flow.ONLY);
|
| + EXPECT_EQ(C_OK, flow.status());
|
| + EXPECT_TRUE(nullptr == flow.data(flow.ONLY)->encoded.get());
|
| + EXPECT_TRUE(flow.ok());
|
| + EXPECT_FALSE(flow.failed());
|
|
|
| - const void* assembled_buffer = assembled.Buffer();
|
| - size_t assembled_length = assembled.Length();
|
| + const void* executable_data = executable.Buffer();
|
| + size_t executable_length = executable.Length();
|
| + EXPECT_EQ(original_length, executable_length);
|
|
|
| - EXPECT_EQ(original_length, assembled_length);
|
| - EXPECT_EQ(0, memcmp(original_buffer, assembled_buffer, original_length));
|
| + EXPECT_EQ(0, memcmp(original_data, executable_data, original_length));
|
| }
|
|
|
| TEST_F(EncodeDecodeTest, PE) {
|
| @@ -99,3 +108,5 @@ TEST_F(EncodeDecodeTest, Elf_Arm) {
|
| std::string file = FileContents("elf-armv7");
|
| TestAssembleToStreamDisassemble(file, 8531);
|
| }
|
| +
|
| +} // namespace courgette
|
|
|