Merge "Add Google benchmark JSON parser"
diff --git a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
index 5cd7d6f..8fa26c5 100644
--- a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.cpp
@@ -119,6 +119,7 @@
 
   out.indent();
   GenerateClassConstructionFunction(out, message, fuzzer_extended_class_name);
+  GeneratePublicFunctionDeclarations(out, message);
   out.unindent();
 
   out << " protected:" << "\n";
diff --git a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
index 7f39838..4935373 100644
--- a/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
+++ b/compilation_tools/vtsc/code_gen/driver/DriverCodeGenBase.h
@@ -116,6 +116,10 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name);
 
+  // Generates header code for public function declarations if any.
+  virtual void GeneratePublicFunctionDeclarations(
+      Formatter& /*out*/, const ComponentSpecificationMessage& /*message*/) {};
+
   // Generates header code for private member declarations if any.
   virtual void GeneratePrivateMemberDeclarations(Formatter& /*out*/,
       const ComponentSpecificationMessage& /*message*/) {};
diff --git a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
index be13dc5..5b1c447 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
+++ b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.cpp
@@ -356,6 +356,16 @@
     out << "HAL_HIDL)";
   }
   out << " {}" << "\n";
+  out << "\n";
+
+  FQName fqname = GetFQName(message);
+  out << "explicit " << fuzzer_extended_class_name << "(" << fqname.cppName()
+      << "* hw_binder_proxy) : FuzzerBase("
+      << "HAL_HIDL)";
+  if (message.component_name() != "types") {
+    out << ", " << kInstanceVariableName << "(hw_binder_proxy)";
+  }
+  out << " {}\n";
 }
 
 void HalHidlCodeGen::GenerateHeaderGlobalFunctionDeclarations(Formatter& out,
@@ -561,6 +571,15 @@
   }
 }
 
+void HalHidlCodeGen::GeneratePublicFunctionDeclarations(
+    Formatter& out, const ComponentSpecificationMessage& /*message*/) {
+  out << "uint64_t GetHidlInterfaceProxy() const {\n";
+  out.indent();
+  out << "return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());\n";
+  out.unindent();
+  out << "}\n";
+}
+
 void HalHidlCodeGen::GeneratePrivateMemberDeclarations(Formatter& out,
     const ComponentSpecificationMessage& message) {
   FQName fqname = GetFQName(message);
@@ -1314,7 +1333,16 @@
     case TYPE_HIDL_INTERFACE:
     {
       out << result_msg << "->set_type(TYPE_HIDL_INTERFACE);\n";
-      out << "/* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */\n";
+      if (!val.has_predefined_type()) {
+        cerr << __func__ << ":" << __LINE__
+             << " HIDL interface is a return type"
+             << "but predefined_type is unset." << endl;
+        exit(-1);
+      }
+      out << result_msg << "->set_hidl_interface_pointer("
+          << "reinterpret_cast<uintptr_t>(" << result_value << ".get()));\n";
+      out << result_msg << "->set_predefined_type(\"" << val.predefined_type()
+          << "\");\n";
       break;
     }
     case TYPE_HIDL_MEMORY:
diff --git a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
index bfb5db6..ebcef52 100644
--- a/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
+++ b/compilation_tools/vtsc/code_gen/driver/HalHidlCodeGen.h
@@ -88,6 +88,9 @@
       const ComponentSpecificationMessage& message,
       const string& fuzzer_extended_class_name) override;
 
+  void GeneratePublicFunctionDeclarations(
+      Formatter& out, const ComponentSpecificationMessage& message) override;
+
   void GeneratePrivateMemberDeclarations(Formatter& out,
       const ComponentSpecificationMessage& message) override;
 
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp b/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp
new file mode 100644
index 0000000..550fcd4
--- /dev/null
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Bar.driver.cpp
@@ -0,0 +1,1047 @@
+#include "android/hardware/tests/bar/1.0/Bar.vts.h"
+#include "vts_measurement.h"
+#include <iostream>
+#include <hidl/HidlSupport.h>
+#include <android/hardware/tests/bar/1.0/IBar.h>
+#include <android/hardware/tests/foo/1.0/IFoo.h>
+#include <android/hardware/tests/foo/1.0/IFooCallback.h>
+#include <android/hardware/tests/foo/1.0/IMyTypes.h>
+#include <android/hardware/tests/foo/1.0/ISimple.h>
+#include <android/hardware/tests/foo/1.0/ITheirTypes.h>
+#include <android/hardware/tests/foo/1.0/types.h>
+#include <android/hidl/base/1.0/types.h>
+
+
+using namespace android::hardware::tests::bar::V1_0;
+namespace android {
+namespace vts {
+void MessageTo__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& var_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated* arg) {
+    MessageTo__android__hardware__tests__foo__V1_0__Unrelated(var_msg.struct_value(0), &(arg->myRelated));
+}
+bool Verify__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result){
+    if (!Verify__android__hardware__tests__foo__V1_0__Unrelated(expected_result.struct_value(0), actual_result.struct_value(0))) { return false; }
+    return true;
+}
+
+void SetResult__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* result_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated result_value){
+    result_msg->set_type(TYPE_STRUCT);
+    auto *result_msg_myRelated = result_msg->add_struct_value();
+    result_msg_myRelated->set_type(TYPE_STRUCT);
+    SetResult__android__hardware__tests__foo__V1_0__Unrelated(result_msg_myRelated, result_value.myRelated);
+    result_msg_myRelated->set_name("myRelated");
+}
+
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::GetService(bool get_stub, const char* service_name) {
+    static bool initialized = false;
+    if (!initialized) {
+        cout << "[agent:hal] HIDL getService" << endl;
+        if (service_name) {
+          cout << "  - service name: " << service_name << endl;
+        }
+        hw_binder_proxy_ = ::android::hardware::tests::bar::V1_0::IBar::getService(service_name, get_stub);
+        if (hw_binder_proxy_ == nullptr) {
+            cerr << "getService() returned a null pointer." << endl;
+            return false;
+        }
+        cout << "[agent:hal] hw_binder_proxy_ = " << hw_binder_proxy_.get() << endl;
+        initialized = true;
+    }
+    return true;
+}
+
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::Fuzz(
+    FunctionSpecificationMessage* func_msg,
+    void** result, const string& callback_socket_name) {
+    return true;
+}
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::GetAttribute(
+    FunctionSpecificationMessage* func_msg,
+    void** result) {
+    cerr << "attribute not found" << endl;
+    return false;
+}
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg) {
+    const char* func_name = func_msg.name().c_str();
+    cout << "Function: " << __func__ << " " << func_name << endl;
+    if (!strcmp(func_name, "doThis")) {
+        float arg0;
+        arg0 = 0;
+        arg0 = func_msg.arg(0).scalar_value().float_t();
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->doThis(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("doThis");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "doThatAndReturnSomething")) {
+        int64_t arg0;
+        arg0 = 0;
+        arg0 = func_msg.arg(0).scalar_value().int64_t();
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        int32_t result0;
+        result0 = hw_binder_proxy_->doThatAndReturnSomething(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("doThatAndReturnSomething");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_SCALAR);
+        result_val_0->set_scalar_type("int32_t");
+        result_val_0->mutable_scalar_value()->set_int32_t(result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "doQuiteABit")) {
+        int32_t arg0;
+        arg0 = 0;
+        arg0 = func_msg.arg(0).scalar_value().int32_t();
+        int64_t arg1;
+        arg1 = 0;
+        arg1 = func_msg.arg(1).scalar_value().int64_t();
+        float arg2;
+        arg2 = 0;
+        arg2 = func_msg.arg(2).scalar_value().float_t();
+        double arg3;
+        arg3 = 0;
+        arg3 = func_msg.arg(3).scalar_value().double_t();
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        double result0;
+        result0 = hw_binder_proxy_->doQuiteABit(arg0,arg1,arg2,arg3);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("doQuiteABit");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_SCALAR);
+        result_val_0->set_scalar_type("double_t");
+        result_val_0->mutable_scalar_value()->set_double_t(result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "doSomethingElse")) {
+         ::android::hardware::hidl_array<int32_t,15> arg0;
+        for (int i = 0; i < func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = func_msg.arg(0).vector_value(i).scalar_value().int32_t();
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_array<int32_t,32> result0;
+        hw_binder_proxy_->doSomethingElse(arg0, [&](const ::android::hardware::hidl_array<int32_t,32>& arg0){
+            cout << "callback doSomethingElse called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("doSomethingElse");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ARRAY);
+        result_val_0->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *result_val_0_array_i = result_val_0->add_vector_value();
+            result_val_0_array_i->set_type(TYPE_SCALAR);
+            result_val_0_array_i->set_scalar_type("int32_t");
+            result_val_0_array_i->mutable_scalar_value()->set_int32_t(result0[i]);
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "doStuffAndReturnAString")) {
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_string result0;
+        hw_binder_proxy_->doStuffAndReturnAString([&](const ::android::hardware::hidl_string& arg0){
+            cout << "callback doStuffAndReturnAString called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("doStuffAndReturnAString");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_STRING);
+        result_val_0->mutable_string_value()->set_message(result0.c_str());
+        result_val_0->mutable_string_value()->set_length(result0.size());
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "mapThisVector")) {
+         ::android::hardware::hidl_vec<int32_t> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = func_msg.arg(0).vector_value(i).scalar_value().int32_t();
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<int32_t> result0;
+        hw_binder_proxy_->mapThisVector(arg0, [&](const ::android::hardware::hidl_vec<int32_t>& arg0){
+            cout << "callback mapThisVector called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("mapThisVector");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_SCALAR);
+            result_val_0_vector_i->set_scalar_type("int32_t");
+            result_val_0_vector_i->mutable_scalar_value()->set_int32_t(result0[i]);
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "callMe")) {
+        sp<::android::hardware::tests::foo::V1_0::IFooCallback> arg0;
+        arg0 = VtsFuzzerCreateVts_android_hardware_tests_foo_V1_0_IFooCallback(callback_socket_name);
+        static_cast<Vts_android_hardware_tests_foo_V1_0_IFooCallback*>(arg0.get())->Register(func_msg.arg(0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->callMe(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("callMe");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "useAnEnum")) {
+        ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum arg0;
+        arg0 = EnumValue__android__hardware__tests__foo__V1_0__IFoo__SomeEnum(func_msg.arg(0).scalar_value());
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::tests::foo::V1_0::IFoo::SomeEnum result0;
+        result0 = hw_binder_proxy_->useAnEnum(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("useAnEnum");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ENUM);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__SomeEnum(result_val_0, result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAGooberVec")) {
+         ::android::hardware::hidl_vec<::android::hardware::tests::foo::V1_0::IFoo::Goober> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            MessageTo__android__hardware__tests__foo__V1_0__IFoo__Goober(func_msg.arg(0).vector_value(i), &(arg0[i]));
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->haveAGooberVec(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAGooberVec");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAGoober")) {
+        ::android::hardware::tests::foo::V1_0::IFoo::Goober arg0;
+        MessageTo__android__hardware__tests__foo__V1_0__IFoo__Goober(func_msg.arg(0), &(arg0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->haveAGoober(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAGoober");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAGooberArray")) {
+         ::android::hardware::hidl_array<::android::hardware::tests::foo::V1_0::IFoo::Goober,20> arg0;
+        for (int i = 0; i < func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i].q = func_msg.arg(0).vector_value(i).struct_value(0).scalar_value().int32_t();
+            arg0[i].name = ::android::hardware::hidl_string(func_msg.arg(0).vector_value(i).struct_value(1).string_value().message());
+            arg0[i].address = ::android::hardware::hidl_string(func_msg.arg(0).vector_value(i).struct_value(2).string_value().message());
+            for (int i = 0; i < func_msg.arg(0).vector_value(i).struct_value(3).vector_value_size(); i++) {
+                arg0[i].numbers[i] = func_msg.arg(0).vector_value(i).struct_value(3).vector_value(i).scalar_value().double_t();
+            }
+            MessageTo__android__hardware__tests__foo__V1_0__IFoo__Fumble(func_msg.arg(0).vector_value(i).struct_value(4), &(arg0[i].fumble));
+            MessageTo__android__hardware__tests__foo__V1_0__IFoo__Fumble(func_msg.arg(0).vector_value(i).struct_value(5), &(arg0[i].gumble));
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->haveAGooberArray(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAGooberArray");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveATypeFromAnotherFile")) {
+        ::android::hardware::tests::foo::V1_0::Abc arg0;
+        MessageTo__android__hardware__tests__foo__V1_0__Abc(func_msg.arg(0), &(arg0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->haveATypeFromAnotherFile(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveATypeFromAnotherFile");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveSomeStrings")) {
+         ::android::hardware::hidl_array<::android::hardware::hidl_string,3> arg0;
+        for (int i = 0; i < func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = ::android::hardware::hidl_string(func_msg.arg(0).vector_value(i).string_value().message());
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_array<::android::hardware::hidl_string,2> result0;
+        hw_binder_proxy_->haveSomeStrings(arg0, [&](const ::android::hardware::hidl_array<::android::hardware::hidl_string,2>& arg0){
+            cout << "callback haveSomeStrings called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveSomeStrings");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ARRAY);
+        result_val_0->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *result_val_0_array_i = result_val_0->add_vector_value();
+            result_val_0_array_i->set_type(TYPE_STRING);
+            result_val_0_array_i->mutable_string_value()->set_message(result0[i].c_str());
+            result_val_0_array_i->mutable_string_value()->set_length(result0[i].size());
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAStringVec")) {
+         ::android::hardware::hidl_vec<::android::hardware::hidl_string> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = ::android::hardware::hidl_string(func_msg.arg(0).vector_value(i).string_value().message());
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<::android::hardware::hidl_string> result0;
+        hw_binder_proxy_->haveAStringVec(arg0, [&](const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& arg0){
+            cout << "callback haveAStringVec called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAStringVec");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_STRING);
+            result_val_0_vector_i->mutable_string_value()->set_message(result0[i].c_str());
+            result_val_0_vector_i->mutable_string_value()->set_length(result0[i].size());
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "transposeMe")) {
+         ::android::hardware::hidl_array<float, 3,5> arg0;
+        for (int i = 0; i < func_msg.arg(0).vector_value_size(); i++) {
+            for (int i = 0; i < func_msg.arg(0).vector_value(i).vector_value_size(); i++) {
+                arg0[i][i] = func_msg.arg(0).vector_value(i).vector_value(i).scalar_value().float_t();
+            }
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_array<float, 5,3> result0;
+        hw_binder_proxy_->transposeMe(arg0, [&](const ::android::hardware::hidl_array<float, 5,3>& arg0){
+            cout << "callback transposeMe called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("transposeMe");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ARRAY);
+        result_val_0->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *result_val_0_array_i = result_val_0->add_vector_value();
+            result_val_0_array_i->set_type(TYPE_ARRAY);
+            result_val_0_array_i->set_vector_size(1);
+            for (int i = 0; i < 1; i++) {
+                auto *result_val_0_array_i_array_i = result_val_0_array_i->add_vector_value();
+                result_val_0_array_i_array_i->set_type(TYPE_SCALAR);
+                result_val_0_array_i_array_i->set_scalar_type("float_t");
+                result_val_0_array_i_array_i->mutable_scalar_value()->set_float_t(result0[i][i]);
+            }
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "callingDrWho")) {
+        ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional arg0;
+        MessageTo__android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(func_msg.arg(0), &(arg0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional result0;
+        hw_binder_proxy_->callingDrWho(arg0, [&](const ::android::hardware::tests::foo::V1_0::IFoo::MultiDimensional& arg0){
+            cout << "callback callingDrWho called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("callingDrWho");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(result_val_0, result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "transpose")) {
+        ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix5x3 arg0;
+        MessageTo__android__hardware__tests__foo__V1_0__IFoo__StringMatrix5x3(func_msg.arg(0), &(arg0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5 result0;
+        hw_binder_proxy_->transpose(arg0, [&](const ::android::hardware::tests::foo::V1_0::IFoo::StringMatrix3x5& arg0){
+            cout << "callback transpose called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("transpose");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__StringMatrix3x5(result_val_0, result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "transpose2")) {
+         ::android::hardware::hidl_array<::android::hardware::hidl_string, 5,3> arg0;
+        for (int i = 0; i < func_msg.arg(0).vector_value_size(); i++) {
+            for (int i = 0; i < func_msg.arg(0).vector_value(i).vector_value_size(); i++) {
+                arg0[i][i] = ::android::hardware::hidl_string(func_msg.arg(0).vector_value(i).vector_value(i).string_value().message());
+            }
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5> result0;
+        hw_binder_proxy_->transpose2(arg0, [&](const ::android::hardware::hidl_array<::android::hardware::hidl_string, 3,5>& arg0){
+            cout << "callback transpose2 called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("transpose2");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ARRAY);
+        result_val_0->set_vector_size(1);
+        for (int i = 0; i < 1; i++) {
+            auto *result_val_0_array_i = result_val_0->add_vector_value();
+            result_val_0_array_i->set_type(TYPE_ARRAY);
+            result_val_0_array_i->set_vector_size(1);
+            for (int i = 0; i < 1; i++) {
+                auto *result_val_0_array_i_array_i = result_val_0_array_i->add_vector_value();
+                result_val_0_array_i_array_i->set_type(TYPE_STRING);
+                result_val_0_array_i_array_i->mutable_string_value()->set_message(result0[i][i].c_str());
+                result_val_0_array_i_array_i->mutable_string_value()->set_length(result0[i][i].size());
+            }
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "sendVec")) {
+         ::android::hardware::hidl_vec<uint8_t> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            arg0[i] = func_msg.arg(0).vector_value(i).scalar_value().uint8_t();
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<uint8_t> result0;
+        hw_binder_proxy_->sendVec(arg0, [&](const ::android::hardware::hidl_vec<uint8_t>& arg0){
+            cout << "callback sendVec called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("sendVec");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_SCALAR);
+            result_val_0_vector_i->set_scalar_type("uint8_t");
+            result_val_0_vector_i->mutable_scalar_value()->set_uint8_t(result0[i]);
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "sendVecVec")) {
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>> result0;
+        hw_binder_proxy_->sendVecVec([&](const ::android::hardware::hidl_vec<::android::hardware::hidl_vec<uint8_t>>& arg0){
+            cout << "callback sendVecVec called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("sendVecVec");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_VECTOR);
+            result_val_0_vector_i->set_vector_size(result0[i].size());
+            for (int i = 0; i < (int)result0[i].size(); i++) {
+                auto *result_val_0_vector_i_vector_i = result_val_0_vector_i->add_vector_value();
+                result_val_0_vector_i_vector_i->set_type(TYPE_SCALAR);
+                result_val_0_vector_i_vector_i->set_scalar_type("uint8_t");
+                result_val_0_vector_i_vector_i->mutable_scalar_value()->set_uint8_t(result0[i][i]);
+            }
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAVectorOfInterfaces")) {
+         ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>> result0;
+        hw_binder_proxy_->haveAVectorOfInterfaces(arg0, [&](const ::android::hardware::hidl_vec<sp<::android::hardware::tests::foo::V1_0::ISimple>>& arg0){
+            cout << "callback haveAVectorOfInterfaces called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAVectorOfInterfaces");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
+            result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
+            result_val_0_vector_i->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAVectorOfGenericInterfaces")) {
+         ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> arg0;
+        arg0.resize(func_msg.arg(0).vector_value_size());
+        for (int i = 0; i <func_msg.arg(0).vector_value_size(); i++) {
+            /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        }
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>> result0;
+        hw_binder_proxy_->haveAVectorOfGenericInterfaces(arg0, [&](const ::android::hardware::hidl_vec<sp<::android::hidl::base::V1_0::IBase>>& arg0){
+            cout << "callback haveAVectorOfGenericInterfaces called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAVectorOfGenericInterfaces");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_HIDL_INTERFACE);
+            result_val_0_vector_i->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0[i].get()));
+            result_val_0_vector_i->set_predefined_type("::android::hidl::base::V1_0::IBase");
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "echoNullInterface")) {
+        sp<::android::hardware::tests::foo::V1_0::IFooCallback> arg0;
+        arg0 = VtsFuzzerCreateVts_android_hardware_tests_foo_V1_0_IFooCallback(callback_socket_name);
+        static_cast<Vts_android_hardware_tests_foo_V1_0_IFooCallback*>(arg0.get())->Register(func_msg.arg(0));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        bool result0;
+        sp<::android::hardware::tests::foo::V1_0::IFooCallback> result1;
+        hw_binder_proxy_->echoNullInterface(arg0, [&](bool arg0,const sp<::android::hardware::tests::foo::V1_0::IFooCallback>& arg1){
+            cout << "callback echoNullInterface called" << endl;
+            result0 = arg0;
+            result1 = arg1;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("echoNullInterface");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_SCALAR);
+        result_val_0->set_scalar_type("bool_t");
+        result_val_0->mutable_scalar_value()->set_bool_t(result0);
+        VariableSpecificationMessage* result_val_1 = result_msg->add_return_type_hidl();
+        result_val_1->set_type(TYPE_HIDL_CALLBACK);
+        /* ERROR: TYPE_HIDL_CALLBACK is not supported yet. */
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "createMyHandle")) {
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::tests::foo::V1_0::IFoo::MyHandle result0;
+        hw_binder_proxy_->createMyHandle([&](const ::android::hardware::tests::foo::V1_0::IFoo::MyHandle& arg0){
+            cout << "callback createMyHandle called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("createMyHandle");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_STRUCT);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__MyHandle(result_val_0, result0);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "createHandles")) {
+        uint32_t arg0;
+        arg0 = 0;
+        arg0 = func_msg.arg(0).scalar_value().uint32_t();
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::hidl_vec<::android::hardware::hidl_handle> result0;
+        hw_binder_proxy_->createHandles(arg0, [&](const ::android::hardware::hidl_vec<::android::hardware::hidl_handle>& arg0){
+            cout << "callback createHandles called" << endl;
+            result0 = arg0;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("createHandles");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_VECTOR);
+        result_val_0->set_vector_size(result0.size());
+        for (int i = 0; i < (int)result0.size(); i++) {
+            auto *result_val_0_vector_i = result_val_0->add_vector_value();
+            result_val_0_vector_i->set_type(TYPE_HANDLE);
+            /* ERROR: TYPE_HANDLE is not supported yet. */
+        }
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "closeHandles")) {
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->closeHandles();
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("closeHandles");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "thisIsNew")) {
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        hw_binder_proxy_->thisIsNew();
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("thisIsNew");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "expectNullHandle")) {
+        ::android::hardware::hidl_handle arg0;
+        /* ERROR: TYPE_HANDLE is not supported yet. */
+        ::android::hardware::tests::foo::V1_0::Abc arg1;
+        MessageTo__android__hardware__tests__foo__V1_0__Abc(func_msg.arg(1), &(arg1));
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        bool result0;
+        bool result1;
+        hw_binder_proxy_->expectNullHandle(arg0,arg1, [&](bool arg0,bool arg1){
+            cout << "callback expectNullHandle called" << endl;
+            result0 = arg0;
+            result1 = arg1;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("expectNullHandle");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_SCALAR);
+        result_val_0->set_scalar_type("bool_t");
+        result_val_0->mutable_scalar_value()->set_bool_t(result0);
+        VariableSpecificationMessage* result_val_1 = result_msg->add_return_type_hidl();
+        result_val_1->set_type(TYPE_SCALAR);
+        result_val_1->set_scalar_type("bool_t");
+        result_val_1->mutable_scalar_value()->set_bool_t(result1);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "takeAMask")) {
+        ::android::hardware::tests::foo::V1_0::IFoo::BitField arg0;
+        arg0 = EnumValue__android__hardware__tests__foo__V1_0__IFoo__BitField(func_msg.arg(0).scalar_value());
+        uint8_t arg1;
+        arg1 = func_msg.arg(1).scalar_value().uint8_t();
+        ::android::hardware::tests::foo::V1_0::IFoo::MyMask arg2;
+        MessageTo__android__hardware__tests__foo__V1_0__IFoo__MyMask(func_msg.arg(2), &(arg2));
+        uint8_t arg3;
+        arg3 = func_msg.arg(3).scalar_value().uint8_t();
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        ::android::hardware::tests::foo::V1_0::IFoo::BitField result0;
+        uint8_t result1;
+        uint8_t result2;
+        uint8_t result3;
+        hw_binder_proxy_->takeAMask(arg0,arg1,arg2,arg3, [&](::android::hardware::tests::foo::V1_0::IFoo::BitField arg0,uint8_t arg1,uint8_t arg2,uint8_t arg3){
+            cout << "callback takeAMask called" << endl;
+            result0 = arg0;
+            result1 = arg1;
+            result2 = arg2;
+            result3 = arg3;
+        });
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("takeAMask");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_ENUM);
+        SetResult__android__hardware__tests__foo__V1_0__IFoo__BitField(result_val_0, result0);
+        VariableSpecificationMessage* result_val_1 = result_msg->add_return_type_hidl();
+        result_val_1->set_type(TYPE_SCALAR);
+        result_val_1->set_scalar_type("uint8_t");
+        result_val_1->mutable_scalar_value()->set_uint8_t(result1);
+        VariableSpecificationMessage* result_val_2 = result_msg->add_return_type_hidl();
+        result_val_2->set_type(TYPE_SCALAR);
+        result_val_2->set_scalar_type("uint8_t");
+        result_val_2->mutable_scalar_value()->set_uint8_t(result2);
+        VariableSpecificationMessage* result_val_3 = result_msg->add_return_type_hidl();
+        result_val_3->set_type(TYPE_SCALAR);
+        result_val_3->set_scalar_type("uint8_t");
+        result_val_3->mutable_scalar_value()->set_uint8_t(result3);
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "haveAInterface")) {
+        sp<::android::hardware::tests::foo::V1_0::ISimple> arg0;
+        /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        VtsMeasurement vts_measurement;
+        vts_measurement.Start();
+        cout << "Call an API" << endl;
+        cout << "local_device = " << hw_binder_proxy_.get() << endl;
+        sp<::android::hardware::tests::foo::V1_0::ISimple> result0;
+        result0 = hw_binder_proxy_->haveAInterface(arg0);
+        vector<float>* measured = vts_measurement.Stop();
+        cout << "time " << (*measured)[0] << endl;
+        result_msg->set_name("haveAInterface");
+        VariableSpecificationMessage* result_val_0 = result_msg->add_return_type_hidl();
+        result_val_0->set_type(TYPE_HIDL_INTERFACE);
+        result_val_0->set_hidl_interface_pointer(reinterpret_cast<uintptr_t>(result0.get()));
+        result_val_0->set_predefined_type("::android::hardware::tests::foo::V1_0::ISimple");
+        cout << "called" << endl;
+        return true;
+    }
+    if (!strcmp(func_name, "notifySyspropsChanged")) {
+        cout << "Call notifySyspropsChanged" << endl;
+        hw_binder_proxy_->notifySyspropsChanged();
+        result_msg->set_name("notifySyspropsChanged");
+        cout << "called" << endl;
+        return true;
+    }
+    return false;
+}
+
+bool FuzzerExtended_android_hardware_tests_bar_V1_0_IBar::VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result) {
+    if (!strcmp(actual_result.name().c_str(), "doThis")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "doThatAndReturnSomething")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).scalar_value().int32_t() != expected_result.return_type_hidl(0).scalar_value().int32_t()) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "doQuiteABit")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).scalar_value().double_t() != expected_result.return_type_hidl(0).scalar_value().double_t()) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "doSomethingElse")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i < expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).scalar_value().int32_t() != expected_result.return_type_hidl(0).vector_value(i).scalar_value().int32_t()) { return false; }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "doStuffAndReturnAString")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (strcmp(actual_result.return_type_hidl(0).string_value().message().c_str(), expected_result.return_type_hidl(0).string_value().message().c_str())!= 0){ return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "mapThisVector")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).scalar_value().int32_t() != expected_result.return_type_hidl(0).vector_value(i).scalar_value().int32_t()) { return false; }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "callMe")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "useAnEnum")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if(!Verify__android__hardware__tests__foo__V1_0__IFoo__SomeEnum(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAGooberVec")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAGoober")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAGooberArray")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveATypeFromAnotherFile")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveSomeStrings")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i < expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (strcmp(actual_result.return_type_hidl(0).vector_value(i).string_value().message().c_str(), expected_result.return_type_hidl(0).vector_value(i).string_value().message().c_str())!= 0){ return false; }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAStringVec")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (strcmp(actual_result.return_type_hidl(0).vector_value(i).string_value().message().c_str(), expected_result.return_type_hidl(0).vector_value(i).string_value().message().c_str())!= 0){ return false; }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "transposeMe")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i < expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).vector_value_size() != expected_result.return_type_hidl(0).vector_value(i).vector_value_size()) {
+                cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value(i).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value(i).vector_value_size();
+                return false;
+            }
+            for (int i = 0; i < expected_result.return_type_hidl(0).vector_value(i).vector_value_size(); i++) {
+                if (actual_result.return_type_hidl(0).vector_value(i).vector_value(i).scalar_value().float_t() != expected_result.return_type_hidl(0).vector_value(i).vector_value(i).scalar_value().float_t()) { return false; }
+            }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "callingDrWho")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (!Verify__android__hardware__tests__foo__V1_0__IFoo__MultiDimensional(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "transpose")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (!Verify__android__hardware__tests__foo__V1_0__IFoo__StringMatrix3x5(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "transpose2")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i < expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).vector_value_size() != expected_result.return_type_hidl(0).vector_value(i).vector_value_size()) {
+                cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value(i).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value(i).vector_value_size();
+                return false;
+            }
+            for (int i = 0; i < expected_result.return_type_hidl(0).vector_value(i).vector_value_size(); i++) {
+                if (strcmp(actual_result.return_type_hidl(0).vector_value(i).vector_value(i).string_value().message().c_str(), expected_result.return_type_hidl(0).vector_value(i).vector_value(i).string_value().message().c_str())!= 0){ return false; }
+            }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "sendVec")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).scalar_value().uint8_t() != expected_result.return_type_hidl(0).vector_value(i).scalar_value().uint8_t()) { return false; }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "sendVecVec")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            if (actual_result.return_type_hidl(0).vector_value(i).vector_value_size() != expected_result.return_type_hidl(0).vector_value(i).vector_value_size()) {
+                cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value(i).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value(i).vector_value_size();
+                return false;
+            }
+            for (int i = 0; i <expected_result.return_type_hidl(0).vector_value(i).vector_value_size(); i++) {
+                if (actual_result.return_type_hidl(0).vector_value(i).vector_value(i).scalar_value().uint8_t() != expected_result.return_type_hidl(0).vector_value(i).vector_value(i).scalar_value().uint8_t()) { return false; }
+            }
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAVectorOfInterfaces")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAVectorOfGenericInterfaces")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "echoNullInterface")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).scalar_value().bool_t() != expected_result.return_type_hidl(0).scalar_value().bool_t()) { return false; }
+        /* ERROR: TYPE_HIDL_CALLBACK is not supported yet. */
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "createMyHandle")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (!Verify__android__hardware__tests__foo__V1_0__IFoo__MyHandle(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "createHandles")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).vector_value_size() != expected_result.return_type_hidl(0).vector_value_size()) {
+            cerr << "Verification failed for vector size. expected: " << expected_result.return_type_hidl(0).vector_value_size() << " actual: " << actual_result.return_type_hidl(0).vector_value_size();
+            return false;
+        }
+        for (int i = 0; i <expected_result.return_type_hidl(0).vector_value_size(); i++) {
+            /* ERROR: TYPE_HANDLE is not supported yet. */
+        }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "closeHandles")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "thisIsNew")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "expectNullHandle")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if (actual_result.return_type_hidl(0).scalar_value().bool_t() != expected_result.return_type_hidl(0).scalar_value().bool_t()) { return false; }
+        if (actual_result.return_type_hidl(1).scalar_value().bool_t() != expected_result.return_type_hidl(1).scalar_value().bool_t()) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "takeAMask")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        if(!Verify__android__hardware__tests__foo__V1_0__IFoo__BitField(expected_result.return_type_hidl(0), actual_result.return_type_hidl(0))) { return false; }
+        if (actual_result.return_type_hidl(1).scalar_value().uint8_t() != expected_result.return_type_hidl(1).scalar_value().uint8_t()) { return false; }
+        if (actual_result.return_type_hidl(2).scalar_value().uint8_t() != expected_result.return_type_hidl(2).scalar_value().uint8_t()) { return false; }
+        if (actual_result.return_type_hidl(3).scalar_value().uint8_t() != expected_result.return_type_hidl(3).scalar_value().uint8_t()) { return false; }
+        return true;
+    }
+    if (!strcmp(actual_result.name().c_str(), "haveAInterface")) {
+        if (actual_result.return_type_hidl_size() != expected_result.return_type_hidl_size() ) { return false; }
+        /* ERROR: TYPE_HIDL_INTERFACE is not supported yet. */
+        return true;
+    }
+    return false;
+}
+
+extern "C" {
+android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_1_IBar_() {
+    return (android::vts::FuzzerBase*) new android::vts::FuzzerExtended_android_hardware_tests_bar_V1_0_IBar();
+}
+
+}
+}  // namespace vts
+}  // namespace android
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h
new file mode 100644
index 0000000..2378c52
--- /dev/null
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Bar.vts.h
@@ -0,0 +1,64 @@
+#ifndef __VTS_DRIVER__android_hardware_tests_bar_V1_0_IBar__
+#define __VTS_DRIVER__android_hardware_tests_bar_V1_0_IBar__
+
+#undef LOG_TAG
+#define LOG_TAG "FuzzerExtended_android_hardware_tests_bar_V1_0_IBar"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utils/Log.h>
+
+#include <fuzz_tester/FuzzerBase.h>
+#include <fuzz_tester/FuzzerCallbackBase.h>
+
+#include <android/hardware/tests/bar/1.0/IBar.h>
+#include <hidl/HidlSupport.h>
+#include <android/hardware/tests/foo/1.0/IFoo.h>
+#include <android/hardware/tests/foo/1.0/Foo.vts.h>
+#include <android/hardware/tests/foo/1.0/IFooCallback.h>
+#include <android/hardware/tests/foo/1.0/FooCallback.vts.h>
+#include <android/hardware/tests/foo/1.0/IMyTypes.h>
+#include <android/hardware/tests/foo/1.0/MyTypes.vts.h>
+#include <android/hardware/tests/foo/1.0/ISimple.h>
+#include <android/hardware/tests/foo/1.0/Simple.vts.h>
+#include <android/hardware/tests/foo/1.0/ITheirTypes.h>
+#include <android/hardware/tests/foo/1.0/TheirTypes.vts.h>
+#include <android/hardware/tests/foo/1.0/types.h>
+#include <android/hardware/tests/foo/1.0/types.vts.h>
+#include <android/hidl/base/1.0/types.h>
+
+
+using namespace android::hardware::tests::bar::V1_0;
+namespace android {
+namespace vts {
+void MessageTo__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& var_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated* arg);
+bool Verify__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(const VariableSpecificationMessage& expected_result, const VariableSpecificationMessage& actual_result);
+void SetResult__android__hardware__tests__bar__V1_0__IBar__SomethingRelated(VariableSpecificationMessage* result_msg, ::android::hardware::tests::bar::V1_0::IBar::SomethingRelated result_value);
+class FuzzerExtended_android_hardware_tests_bar_V1_0_IBar : public FuzzerBase {
+ public:
+    FuzzerExtended_android_hardware_tests_bar_V1_0_IBar() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_tests_bar_V1_0_IBar(::android::hardware::tests::bar::V1_0::IBar* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+    uint64_t GetHidlInterfaceProxy() const {
+        return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
+    }
+ protected:
+    bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
+    bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
+    bool VerifyResults(const FunctionSpecificationMessage& expected_result, const FunctionSpecificationMessage& actual_result);
+    bool GetAttribute(FunctionSpecificationMessage* func_msg, void** result);
+    bool GetService(bool get_stub, const char* service_name);
+
+ private:
+    sp<::android::hardware::tests::bar::V1_0::IBar> hw_binder_proxy_;
+};
+
+
+extern "C" {
+extern android::vts::FuzzerBase* vts_func_4_android_hardware_tests_bar_1_IBar_();
+}
+}  // namespace vts
+}  // namespace android
+#endif
diff --git a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
index bb978b3..347ba8d 100644
--- a/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
+++ b/compilation_tools/vtsc/test/golden/DRIVER/Nfc.vts.h
@@ -28,6 +28,11 @@
 class FuzzerExtended_android_hardware_nfc_V1_0_INfc : public FuzzerBase {
  public:
     FuzzerExtended_android_hardware_nfc_V1_0_INfc() : FuzzerBase(HAL_HIDL), hw_binder_proxy_() {}
+
+    explicit FuzzerExtended_android_hardware_nfc_V1_0_INfc(::android::hardware::nfc::V1_0::INfc* hw_binder_proxy) : FuzzerBase(HAL_HIDL), hw_binder_proxy_(hw_binder_proxy) {}
+    uint64_t GetHidlInterfaceProxy() const {
+        return reinterpret_cast<uintptr_t>(hw_binder_proxy_.get());
+    }
  protected:
     bool Fuzz(FunctionSpecificationMessage* func_msg, void** result, const string& callback_socket_name);
     bool CallFunction(const FunctionSpecificationMessage& func_msg, const string& callback_socket_name, FunctionSpecificationMessage* result_msg);
diff --git a/compilation_tools/vtsc/test/test_vtsc.py b/compilation_tools/vtsc/test/test_vtsc.py
index 196ba14..052ca33 100755
--- a/compilation_tools/vtsc/test/test_vtsc.py
+++ b/compilation_tools/vtsc/test/test_vtsc.py
@@ -81,19 +81,24 @@
         """Run tests for DRIVER mode. """
         logging.info("Running TestDriver test case.")
         # Tests for Hidl Hals.
-        self.GenerateVtsFile("android.hardware.nfc@1.0")
-        for component_name in ["Nfc", "types", "NfcClientCallback"]:
-            self.RunTest(
-                "DRIVER",
-                os.path.join(self._temp_dir, component_name + ".vts"),
-                "%s.vts.h" % component_name,
-                header_file_name="%s.vts.h" % component_name,
-                file_type="HEADER")
-            self.RunTest(
-                "DRIVER",
-                os.path.join(self._temp_dir, component_name + ".vts"),
-                "%s.driver.cpp" % component_name,
-                file_type="SOURCE")
+        for package_path, component_names in zip(
+            ["android.hardware.nfc@1.0",
+             "android.hardware.tests.bar@1.0"],
+            [["Nfc", "NfcClientCallback", "types"],
+             ["Bar"]]):
+            self.GenerateVtsFile(package_path)
+            for component_name in component_names:
+                self.RunTest(
+                    "DRIVER",
+                    os.path.join(self._temp_dir, component_name + ".vts"),
+                    "%s.vts.h" % component_name,
+                    header_file_name="%s.vts.h" % component_name,
+                    file_type="HEADER")
+                self.RunTest(
+                    "DRIVER",
+                    os.path.join(self._temp_dir, component_name + ".vts"),
+                    "%s.driver.cpp" % component_name,
+                    file_type="SOURCE")
         # Tests for conventional Hals.
         for package_path, component_name in zip(
             ["camera/2.1", "bluetooth/1.0", "bluetooth/1.0", "wifi/1.0"], [
diff --git a/utils/python/mirror/pb2py.py b/utils/python/mirror/pb2py.py
index dd435b0..c560fc8 100644
--- a/utils/python/mirror/pb2py.py
+++ b/utils/python/mirror/pb2py.py
@@ -32,6 +32,18 @@
     return getattr(var.scalar_value, var.scalar_type)
 
 
+def PbMask2PyValue(var):
+    """Converts VariableSecificationMessage (Mask) to Python value.
+
+    Args:
+        var: VariableSpecificationMessage to convert.
+
+    Returns:
+        a converted value.
+    """
+    return getattr(var.scalar_value, var.scalar_type)
+
+
 def PbScalar2PyValue(var):
     """Converts VariableSecificationMessage (Scalar) to Python value.
 
@@ -77,6 +89,27 @@
     return result
 
 
+def PbArray2PyList(var):
+    """Converts VariableSecificationMessage (Array) to a Python list.
+
+    Args:
+        var: VariableSpecificationMessage to convert.
+
+    Returns:
+        A converted list.
+    """
+    result = []
+    for curr_value in var.vector_value:
+        if curr_value.type == CompSpecMsg.TYPE_SCALAR:
+            result.append(PbScalar2PyValue(curr_value))
+        elif curr_value.type == CompSpecMsg.TYPE_STRUCT:
+            result.append(PbStruct2PyDict(curr_value))
+        else:
+            logging.error("unsupported type %s", curr_value.type)
+            sys.exit(-1)
+    return result
+
+
 def PbStruct2PyDict(var):
     """Converts VariableSecificationMessage (struct) to Python dict.
 
@@ -98,6 +131,8 @@
             result[attr.name] = PbVector2PyList(attr)
         elif attr.type == CompSpecMsg.TYPE_STRUCT:
             result[attr.name] = PbStruct2PyDict(attr)
+        elif attr.type == CompSpecMsg.TYPE_Array:
+            result[attr.name] = PbArray2PyList(attr)
         else:
             logging.error("PyDict2PbStruct: unsupported type %s",
                           attr.type)
@@ -138,6 +173,8 @@
         return PbEnum2PyValue(var)
     elif var.type == CompSpecMsg.TYPE_STRING:
         return PbString2PyString(var)
+    elif var.type == CompSpecMsg.TYPE_MASK:
+        return PbMask2PyValue(var)
     else:
         logging.error("Got unsupported callback arg type %s" % var.type)
         sys.exit(-1)
diff --git a/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java b/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java
index 0235d8f..fff8b5b 100644
--- a/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java
+++ b/web/dashboard/src/main/java/com/android/vts/servlet/VtsAlertJobServlet.java
@@ -154,16 +154,18 @@
             if (mostRecentRun == null) {
                 mostRecentRun = testRunEntity;
             }
+            List<Key> testCaseKeys = new ArrayList<>();
             for (long testCaseId : testRunEntity.testCaseIds) {
-                Entity testCaseRun;
-                try {
-                    testCaseRun =
-                            datastore.get(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-                } catch (EntityNotFoundException e) {
+                testCaseKeys.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
+            }
+            Map<Key, Entity> entityMap = datastore.get(testCaseKeys);
+            for (Key testCaseKey : testCaseKeys) {
+                if (!entityMap.containsKey(testCaseKey)) {
                     logger.log(Level.WARNING,
-                            "Test case \"" + testCaseId + "\" from test " + testName);
+                            "Test case missing from test: " + testCaseKey);
                     continue;
                 }
+                Entity testCaseRun = entityMap.get(testCaseKey);
                 TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(testCaseRun);
                 if (testCaseRunEntity == null) {
                     logger.log(Level.WARNING, "Invalid test case run: " + testCaseRun.getKey());
diff --git a/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java b/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java
index 9435e17..19ffbd3 100644
--- a/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java
+++ b/web/dashboard/src/main/java/com/android/vts/util/DatastoreHelper.java
@@ -160,6 +160,8 @@
         long coveredLineCount = 0;
         long totalLineCount = 0;
 
+        List<Entity> testCasePuts = new ArrayList<>();
+
         // Process test cases
         for (TestCaseReportMessage testCase : report.getTestCaseList()) {
             String testCaseName = testCase.getName().toStringUtf8();
@@ -200,8 +202,9 @@
             testCaseIds.add(keys.getStart().getId());
             TestCaseRunEntity testCaseRunEntity = new TestCaseRunEntity(
                     keys.getStart(), testCaseName, result.getNumber(), systraceLink);
-            datastore.put(testCaseRunEntity.toEntity());
+            testCasePuts.add(testCaseRunEntity.toEntity());
         }
+        datastore.put(testCasePuts);
 
         // Process device information
         for (AndroidDeviceInfoMessage device : report.getDeviceInfoList()) {