Home | History | Annotate | Download | only in driver
      1 /*
      2  * Copyright 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef VTS_COMPILATION_TOOLS_VTSC_CODE_GEN_DRIVER_CODEGENBASE_H_
     18 #define VTS_COMPILATION_TOOLS_VTSC_CODE_GEN_DRIVER_CODEGENBASE_H_
     19 
     20 #include <string>
     21 
     22 #include <hidl-util/Formatter.h>
     23 #include <hidl-util/FQName.h>
     24 
     25 #include "code_gen/CodeGenBase.h"
     26 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
     27 
     28 using namespace std;
     29 
     30 namespace android {
     31 namespace vts {
     32 
     33 class DriverCodeGenBase : public CodeGenBase {
     34  public:
     35   explicit DriverCodeGenBase(const char* input_vts_file_path)
     36       : CodeGenBase(input_vts_file_path) {}
     37 
     38   // Generate both a C/C++ file and its header file.
     39   virtual void GenerateAll(Formatter& header_out, Formatter& source_out,
     40                            const ComponentSpecificationMessage& message);
     41 
     42   // Generates source file.
     43   virtual void GenerateSourceFile(
     44       Formatter& out, const ComponentSpecificationMessage& message);
     45 
     46   // Generates header file.
     47   virtual void GenerateHeaderFile(
     48       Formatter& out, const ComponentSpecificationMessage& message);
     49 
     50  protected:
     51 
     52   // Generates header code for a specific class.
     53   virtual void GenerateClassHeader(Formatter& out,
     54       const ComponentSpecificationMessage& message,
     55       const string& fuzzer_extended_class_name);
     56 
     57   // Generates source code for a specific class.
     58   virtual void GenerateClassImpl(Formatter& out,
     59       const ComponentSpecificationMessage& message,
     60       const string& fuzzer_extended_class_name);
     61 
     62   // Generates code for Fuzz(...) function body.
     63   virtual void GenerateCppBodyFuzzFunction(Formatter& out,
     64       const ComponentSpecificationMessage& message,
     65       const string& fuzzer_extended_class_name) = 0;
     66 
     67   // Generates code for GetAttribute(...) function body.
     68   virtual void GenerateCppBodyGetAttributeFunction(Formatter& out,
     69       const ComponentSpecificationMessage& message,
     70       const string& fuzzer_extended_class_name) = 0;
     71 
     72   // Generates code for CallFuction(...) function body.
     73   virtual void GenerateDriverFunctionImpl(Formatter& out,
     74       const ComponentSpecificationMessage& message,
     75       const string& fuzzer_extended_class_name);
     76 
     77   // Generates code for VerifyResults(...) function body.
     78   virtual void GenerateVerificationFunctionImpl(Formatter& out,
     79       const ComponentSpecificationMessage& message,
     80       const string& fuzzer_extended_class_name);
     81 
     82   // Generates C/C++ code for interface implemetation class.
     83   virtual void GenerateCppBodyInterfaceImpl(
     84       Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/,
     85       const string& /*fuzzer_extended_class_name*/) {};
     86 
     87   // Generates header code for interface impl class.
     88   virtual void GenerateHeaderInterfaceImpl(
     89       Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/) {};
     90 
     91   // Generates header code for construction function.
     92   virtual void GenerateClassConstructionFunction(Formatter& /*out*/,
     93       const ComponentSpecificationMessage& /*message*/,
     94       const string& /*fuzzer_extended_class_name*/) {};
     95 
     96   // Generates header code for additional function declarations if any.
     97   virtual void GenerateAdditionalFuctionDeclarations(Formatter& /*out*/,
     98       const ComponentSpecificationMessage& /*message*/,
     99       const string& /*fuzzer_extended_class_name*/) {};
    100 
    101   // Generates header code to declare the C/C++ global functions.
    102   virtual void GenerateHeaderGlobalFunctionDeclarations(Formatter& out,
    103       const ComponentSpecificationMessage& message,
    104       const bool print_extern_block = true);
    105 
    106   // Generates code for the bodies of the C/C++ global functions.
    107   virtual void GenerateCppBodyGlobalFunctions(Formatter& out,
    108       const ComponentSpecificationMessage& message,
    109       const string& fuzzer_extended_class_name,
    110       const bool print_extern_block = true);
    111 
    112   // Generates header code for include declarations.
    113   virtual void GenerateHeaderIncludeFiles(Formatter& out,
    114       const ComponentSpecificationMessage& message,
    115       const string& fuzzer_extended_class_name);
    116 
    117   // Generates source code for include declarations.
    118   virtual void GenerateSourceIncludeFiles(Formatter& out,
    119       const ComponentSpecificationMessage& message,
    120       const string& fuzzer_extended_class_name);
    121 
    122   // Generates header code for public function declarations if any.
    123   virtual void GeneratePublicFunctionDeclarations(
    124       Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/) {};
    125 
    126   // Generates header code for private member declarations if any.
    127   virtual void GeneratePrivateMemberDeclarations(Formatter& /*out*/,
    128       const ComponentSpecificationMessage& /*message*/) {};
    129 
    130   //**********   Utility functions   *****************
    131   // Generates the namespace name of a HIDL component, crashes otherwise.
    132   void GenerateNamespaceName(
    133       Formatter& out, const ComponentSpecificationMessage& message);
    134 
    135   // Generates code that opens the default namespaces.
    136   void GenerateOpenNameSpaces(
    137       Formatter& out, const ComponentSpecificationMessage& message);
    138 
    139   // Generates code that closes the default namespaces.
    140   void GenerateCloseNameSpaces(Formatter& out,
    141       const ComponentSpecificationMessage& message);
    142 
    143   // Generates code that starts the measurement.
    144   void GenerateCodeToStartMeasurement(Formatter& out);
    145 
    146   // Generates code that stops the measurement.
    147   void GenerateCodeToStopMeasurement(Formatter& out);
    148 
    149   void GenerateFuzzFunctionForSubStruct(
    150       Formatter& out, const StructSpecificationMessage& message,
    151       const string& parent_path);
    152 };
    153 
    154 }  // namespace vts
    155 }  // namespace android
    156 
    157 #endif  // VTS_COMPILATION_TOOLS_VTSC_CODE_GEN_DRIVER_CODEGENBASE_H_
    158