1 // Copyright 2017 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 6 #define COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 7 8 #include <memory> 9 #include <string> 10 #include <vector> 11 12 #include "components/zucchini/buffer_view.h" 13 #include "components/zucchini/disassembler.h" 14 #include "components/zucchini/image_utils.h" 15 16 namespace zucchini { 17 18 // A trivial Disassembler that reads injected references of 3 different types. 19 // This is only meant for testing and is not a full implementation of a 20 // disassembler. Reading reference ignores bounds, and writing references does 21 // nothing. 22 class TestDisassembler : public Disassembler { 23 public: 24 TestDisassembler(const ReferenceTypeTraits& traits1, 25 const std::vector<Reference>& refs1, 26 const ReferenceTypeTraits& traits2, 27 const std::vector<Reference>& refs2, 28 const ReferenceTypeTraits& traits3, 29 const std::vector<Reference>& refs3); 30 TestDisassembler(const TestDisassembler&) = delete; 31 const TestDisassembler& operator=(const TestDisassembler&) = delete; 32 ~TestDisassembler() override; 33 34 // Disassembler: 35 ExecutableType GetExeType() const override; 36 std::string GetExeTypeString() const override; 37 std::vector<ReferenceGroup> MakeReferenceGroups() const override; 38 39 // Disassembler::ReaderFactory: MakeReadRefs1(offset_t,offset_t)40 std::unique_ptr<ReferenceReader> MakeReadRefs1(offset_t /*lower*/, 41 offset_t /*upper*/) { 42 return MakeReadRefs(0); 43 } MakeReadRefs2(offset_t,offset_t)44 std::unique_ptr<ReferenceReader> MakeReadRefs2(offset_t /*lower*/, 45 offset_t /*upper*/) { 46 return MakeReadRefs(1); 47 } MakeReadRefs3(offset_t,offset_t)48 std::unique_ptr<ReferenceReader> MakeReadRefs3(offset_t /*lower*/, 49 offset_t /*upper*/) { 50 return MakeReadRefs(2); 51 } 52 53 // Disassembler::WriterFactory: MakeWriteRefs1(MutableBufferView image)54 std::unique_ptr<ReferenceWriter> MakeWriteRefs1(MutableBufferView image) { 55 return MakeWriteRefs(image); 56 } MakeWriteRefs2(MutableBufferView image)57 std::unique_ptr<ReferenceWriter> MakeWriteRefs2(MutableBufferView image) { 58 return MakeWriteRefs(image); 59 } MakeWriteRefs3(MutableBufferView image)60 std::unique_ptr<ReferenceWriter> MakeWriteRefs3(MutableBufferView image) { 61 return MakeWriteRefs(image); 62 } 63 64 private: 65 // Disassembler: 66 bool Parse(ConstBufferView image) override; 67 68 std::unique_ptr<ReferenceReader> MakeReadRefs(int type); 69 std::unique_ptr<ReferenceWriter> MakeWriteRefs(MutableBufferView image); 70 71 ReferenceTypeTraits traits_[3]; 72 std::vector<Reference> refs_[3]; 73 }; 74 75 } // namespace zucchini 76 77 #endif // COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_ 78