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