Merge "modified use of generated test in kernel ltp"
diff --git a/doc/testcase_develop_manual/codelab_host_driven_test.md b/doc/testcase_develop_manual/codelab_host_driven_test.md
index 4cfea62..5971133 100644
--- a/doc/testcase_develop_manual/codelab_host_driven_test.md
+++ b/doc/testcase_develop_manual/codelab_host_driven_test.md
@@ -1,8 +1,8 @@
 # Codelab - VTS Host-Driven, Structural Test
 
-##1. Project setup
+## 1. Project setup
 
-###1.1. Setup a local Android repository
+### 1.1. Setup a local Android repository
 
 `$ export branch=master`  # currently, internal master is mainly supported.
 
@@ -18,7 +18,7 @@
 
 `$ ls test/vts`
 
-###1.2. Create a test project
+### 1.2. Create a test project
 
 Create your test project directory under,
 
@@ -30,7 +30,7 @@
 
 - `test/vts/testcases/**kernel**/<your project name>` if your project is for kernel or kernel modules
 
-###1.3. Create Android.mk file
+### 1.3. Create Android.mk file
 
 `$ vi test/vts/testcases/host/codelab/hello_world/Android.mk`
 
@@ -64,7 +64,7 @@
 so that the Android build system can store the compiled executable to
 a designated output directory (under `out/` directory) for packaging.
 
-###1.4. Create AndroidTest.xml file
+### 1.4. Create AndroidTest.xml file
 
 `$ vi test/vts/testcases/host/codelab/hello_world/AndroidTest.xml`
 
@@ -111,13 +111,13 @@
 ```
 ---
 
-##2. Design your test case
+## 2. Design your test case
 
-###2.1. Declare a python module
+### 2.1. Declare a python module
 
 `$ touch test/vts/testcases/host/codelab/hello_world/__init__.py`
 
-###2.2. Actual test case code
+### 2.2. Actual test case code
 
 `$ vi test/vts/testcases/host/codelab/hello_world/CodeLabHelloWorldTest.py`
 
@@ -166,7 +166,7 @@
 ```
 ---
 
-###2.3. Test case config
+### 2.3. Test case config
 
 `$ vi test/vts/testcases/host/codelab/hello_world/CodeLabHelloWorldTest.config`
 
@@ -188,7 +188,7 @@
 ```
 ---
 
-###2.4. Create a test suite
+### 2.4. Create a test suite
 
 `$ vi test/vts/tools/vts-tradefed/res/config/vts-codelab.xml`
 
@@ -206,9 +206,9 @@
 ---
 
 
-##3. Build and Run
+## 3. Build and Run
 
-###3.1. Build
+### 3.1. Build
 
 `$ . build/envsetup.sh`
 
@@ -220,7 +220,7 @@
 
 `$ make vts -j 10`
 
-###3.2. Run
+### 3.2. Run
 
 `$ vts-tradefed`
 
@@ -234,7 +234,7 @@
 
 `target$ setenforce 0`
 
-##4. Serving
+## 4. Serving
 
 [Dashboard](https://android-vts-internal.googleplex.com)
 
diff --git a/proto/InterfaceSpecificationMessage.proto b/proto/InterfaceSpecificationMessage.proto
index 598a21e..e660403 100644
--- a/proto/InterfaceSpecificationMessage.proto
+++ b/proto/InterfaceSpecificationMessage.proto
@@ -92,6 +92,16 @@
 }
 
 
+// To specify the measured native code coverage raw data.
+message NativeCodeCoverageRawDataMessage {
+  // gcno file path.
+  optional bytes file_path = 1;
+
+  // content of a gcda file.
+  optional bytes gcda = 11;
+}
+
+
 // To specify a function.
 message FunctionSpecificationMessage {
   // the function name.
@@ -112,8 +122,11 @@
   // profiling data.
   repeated float profiling_data = 101;
 
-  // coverage measurement data.
-  repeated uint32 coverage_data = 201;
+  // measured processed coverage data.
+  repeated uint32 processed_coverage_data = 201;
+
+  // measured raw coverage data.
+  repeated NativeCodeCoverageRawDataMessage raw_coverage_data = 202;
 
   // not a user-provided variable. used by the frameworks to tell the sub
   // struct hierarchy.
diff --git a/proto/InterfaceSpecificationMessage_pb2.py b/proto/InterfaceSpecificationMessage_pb2.py
index ed68097..0647901 100644
--- a/proto/InterfaceSpecificationMessage_pb2.py
+++ b/proto/InterfaceSpecificationMessage_pb2.py
@@ -14,7 +14,7 @@
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='InterfaceSpecificationMessage.proto',
   package='android.vts',
-  serialized_pb='\n#InterfaceSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"\xec\x02\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12\x16\n\rcoverage_data\x18\xc9\x01 \x03(\r\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\"\xea\x02\n\x16ScalarDataValueMessage\x12\x0c\n\x04\x62ool\x18\x01 \x01(\x05\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\x12\r\n\x04\x62its\x18\xe9\x07 \x01(\r\"\xee\x01\n\x16VectorDataValueMessage\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bscalar_type\x18\x0b \x01(\x0c\x12\x32\n\x05value\x18\x0c \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bstruct_type\x18\x15 \x01(\x0c\x12?\n\x0cstruct_value\x18\x16 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"9\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\r\n\x05value\x18\x02 \x03(\r\"\xbe\x05\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12:\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32#.android.vts.VectorDataValueMessage\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd3\x03\n\x1dInterfaceSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage*\xaa\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b*\x8c\x01\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07*\xe3\x01\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n')
+  serialized_pb='\n#InterfaceSpecificationMessage.proto\x12\x0b\x61ndroid.vts\"e\n\x1c\x43\x61llFlowSpecificationMessage\x12\x14\n\x05\x65ntry\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04\x65xit\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x0c\n\x04next\x18\x0b \x03(\x0c\x12\x0c\n\x04prev\x18\x0c \x03(\x0c\"C\n NativeCodeCoverageRawDataMessage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x0c\n\x04gcno\x18\x0b \x01(\x0c\"\xc1\x03\n\x1c\x46unctionSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12>\n\x0breturn_type\x18\x0b \x01(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x43\n\x10return_type_hidl\x18\x0c \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x36\n\x03\x61rg\x18\x15 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12;\n\x08\x63\x61llflow\x18\x1f \x03(\x0b\x32).android.vts.CallFlowSpecificationMessage\x12\x16\n\x0eprofiling_data\x18\x65 \x03(\x02\x12 \n\x17processed_coverage_data\x18\xc9\x01 \x03(\r\x12I\n\x11raw_coverage_data\x18\xca\x01 \x03(\x0b\x32-.android.vts.NativeCodeCoverageRawDataMessage\x12\x14\n\x0bparent_path\x18\xad\x02 \x01(\x0c\"\xea\x02\n\x16ScalarDataValueMessage\x12\x0c\n\x04\x62ool\x18\x01 \x01(\x05\x12\x0e\n\x06int8_t\x18\x0b \x01(\x05\x12\x0f\n\x07uint8_t\x18\x0c \x01(\r\x12\x0c\n\x04\x63har\x18\r \x01(\x05\x12\r\n\x05uchar\x18\x0e \x01(\r\x12\x0f\n\x07int16_t\x18\x15 \x01(\x05\x12\x10\n\x08uint16_t\x18\x16 \x01(\r\x12\x0f\n\x07int32_t\x18\x1f \x01(\x05\x12\x10\n\x08uint32_t\x18  \x01(\r\x12\x0f\n\x07int64_t\x18) \x01(\x03\x12\x10\n\x08uint64_t\x18* \x01(\x04\x12\x0f\n\x07\x66loat_t\x18\x65 \x01(\x02\x12\x10\n\x08\x64ouble_t\x18\x66 \x01(\x01\x12\x10\n\x07pointer\x18\xc9\x01 \x01(\r\x12\x0f\n\x06opaque\x18\xca\x01 \x01(\r\x12\x15\n\x0cvoid_pointer\x18\xd3\x01 \x01(\r\x12\x15\n\x0c\x63har_pointer\x18\xd4\x01 \x01(\r\x12\x18\n\x0fpointer_pointer\x18\xfb\x01 \x01(\r\x12\r\n\x04\x62its\x18\xe9\x07 \x01(\r\"\xee\x01\n\x16VectorDataValueMessage\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x0c\n\x04size\x18\x02 \x01(\r\x12\x13\n\x0bscalar_type\x18\x0b \x01(\x0c\x12\x32\n\x05value\x18\x0c \x03(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bstruct_type\x18\x15 \x01(\x0c\x12?\n\x0cstruct_value\x18\x16 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd1\x01\n#FunctionPointerSpecificationMessage\x12\x15\n\rfunction_name\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x0b \x01(\r\x12\n\n\x02id\x18\x15 \x01(\x0c\x12\x36\n\x03\x61rg\x18\x65 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12>\n\x0breturn_type\x18o \x01(\x0b\x32).android.vts.VariableSpecificationMessage\"9\n\x16StringDataValueMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x0b \x01(\r\"9\n\x14\x45numDataValueMessage\x12\x12\n\nenumerator\x18\x01 \x03(\x0c\x12\r\n\x05value\x18\x02 \x03(\r\"\xbe\x05\n\x1cVariableSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.android.vts.VariableType\x12\x39\n\x0cscalar_value\x18\x65 \x01(\x0b\x32#.android.vts.ScalarDataValueMessage\x12\x13\n\x0bscalar_type\x18\x66 \x01(\x0c\x12\x39\n\x0cstring_value\x18o \x01(\x0b\x32#.android.vts.StringDataValueMessage\x12\x35\n\nenum_value\x18y \x01(\x0b\x32!.android.vts.EnumDataValueMessage\x12:\n\x0cvector_value\x18\x83\x01 \x03(\x0b\x32#.android.vts.VectorDataValueMessage\x12@\n\x0cstruct_value\x18\x8d\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x14\n\x0bstruct_type\x18\x8e\x01 \x01(\x0c\x12?\n\x0bunion_value\x18\x97\x01 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12\x18\n\x0fpredefined_type\x18\xc9\x01 \x01(\x0c\x12K\n\x10\x66unction_pointer\x18\xdd\x01 \x03(\x0b\x32\x30.android.vts.FunctionPointerSpecificationMessage\x12\x17\n\x08is_input\x18\xad\x02 \x01(\x08:\x04true\x12\x19\n\tis_output\x18\xae\x02 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x08is_const\x18\xaf\x02 \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0bis_callback\x18\xb0\x02 \x01(\x08:\x05\x66\x61lse\"\xfb\x01\n\x1aStructSpecificationMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x19\n\nis_pointer\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x37\n\x03\x61pi\x18\xe9\x07 \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12<\n\nsub_struct\x18\xd1\x0f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\"\xd3\x03\n\x1dInterfaceSpecificationMessage\x12\x34\n\x0f\x63omponent_class\x18\x01 \x01(\x0e\x32\x1b.android.vts.ComponentClass\x12\x32\n\x0e\x63omponent_type\x18\x02 \x01(\x0e\x32\x1a.android.vts.ComponentType\x12!\n\x16\x63omponent_type_version\x18\x03 \x01(\x02:\x01\x31\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\x0c\x12\x0f\n\x07package\x18\x0b \x01(\x0c\x12\x0e\n\x06import\x18\x0c \x03(\x0c\x12%\n\x1coriginal_data_structure_name\x18\xe9\x07 \x01(\x0c\x12\x0f\n\x06header\x18\xea\x07 \x03(\x0c\x12\x37\n\x03\x61pi\x18\xd1\x0f \x03(\x0b\x32).android.vts.FunctionSpecificationMessage\x12=\n\tattribute\x18\xb9\x17 \x03(\x0b\x32).android.vts.VariableSpecificationMessage\x12<\n\nsub_struct\x18\xa1\x1f \x03(\x0b\x32\'.android.vts.StructSpecificationMessage*\xaa\x01\n\x0e\x43omponentClass\x12\x11\n\rUNKNOWN_CLASS\x10\x00\x12\x14\n\x10HAL_CONVENTIONAL\x10\x01\x12\x1e\n\x1aHAL_CONVENTIONAL_SUBMODULE\x10\x02\x12\x0e\n\nHAL_LEGACY\x10\x03\x12\x0c\n\x08HAL_HIDL\x10\x04\x12!\n\x1dHAL_HIDL_WRAPPED_CONVENTIONAL\x10\x05\x12\x0e\n\nLIB_SHARED\x10\x0b*\x8c\x01\n\rComponentType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\n\n\x06\x43\x41MERA\x10\x02\x12\x07\n\x03GPS\x10\x03\x12\t\n\x05LIGHT\x10\x04\x12\x08\n\x04WIFI\x10\x05\x12\n\n\x06MOBILE\x10\x06\x12\r\n\tBLUETOOTH\x10\x07\x12\x07\n\x03NFC\x10\x08\x12\x10\n\x0b\x42IONIC_LIBM\x10\xe9\x07*\xe3\x01\n\x0cVariableType\x12\x19\n\x15UNKNOWN_VARIABLE_TYPE\x10\x00\x12\x13\n\x0fTYPE_PREDEFINED\x10\x01\x12\x0f\n\x0bTYPE_SCALAR\x10\x02\x12\x0f\n\x0bTYPE_STRING\x10\x03\x12\r\n\tTYPE_ENUM\x10\x04\x12\x0e\n\nTYPE_ARRAY\x10\x05\x12\x0f\n\x0bTYPE_VECTOR\x10\x06\x12\x0f\n\x0bTYPE_STRUCT\x10\x07\x12\x19\n\x15TYPE_FUNCTION_POINTER\x10\x08\x12\r\n\tTYPE_VOID\x10\t\x12\x16\n\x12TYPE_HIDL_CALLBACK\x10\n')
 
 _COMPONENTCLASS = _descriptor.EnumDescriptor(
   name='ComponentClass',
@@ -53,8 +53,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=2888,
-  serialized_end=3058,
+  serialized_start=3042,
+  serialized_end=3212,
 )
 
 ComponentClass = enum_type_wrapper.EnumTypeWrapper(_COMPONENTCLASS)
@@ -107,8 +107,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=3061,
-  serialized_end=3201,
+  serialized_start=3215,
+  serialized_end=3355,
 )
 
 ComponentType = enum_type_wrapper.EnumTypeWrapper(_COMPONENTTYPE)
@@ -165,8 +165,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=3204,
-  serialized_end=3431,
+  serialized_start=3358,
+  serialized_end=3585,
 )
 
 VariableType = enum_type_wrapper.EnumTypeWrapper(_VARIABLETYPE)
@@ -250,6 +250,41 @@
 )
 
 
+_NATIVECODECOVERAGERAWDATAMESSAGE = _descriptor.Descriptor(
+  name='NativeCodeCoverageRawDataMessage',
+  full_name='android.vts.NativeCodeCoverageRawDataMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file_path', full_name='android.vts.NativeCodeCoverageRawDataMessage.file_path', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='gcno', full_name='android.vts.NativeCodeCoverageRawDataMessage.gcno', index=1,
+      number=11, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value="",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=155,
+  serialized_end=222,
+)
+
+
 _FUNCTIONSPECIFICATIONMESSAGE = _descriptor.Descriptor(
   name='FunctionSpecificationMessage',
   full_name='android.vts.FunctionSpecificationMessage',
@@ -300,14 +335,21 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='coverage_data', full_name='android.vts.FunctionSpecificationMessage.coverage_data', index=6,
+      name='processed_coverage_data', full_name='android.vts.FunctionSpecificationMessage.processed_coverage_data', index=6,
       number=201, type=13, cpp_type=3, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='parent_path', full_name='android.vts.FunctionSpecificationMessage.parent_path', index=7,
+      name='raw_coverage_data', full_name='android.vts.FunctionSpecificationMessage.raw_coverage_data', index=7,
+      number=202, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='parent_path', full_name='android.vts.FunctionSpecificationMessage.parent_path', index=8,
       number=301, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value="",
       message_type=None, enum_type=None, containing_type=None,
@@ -322,8 +364,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=156,
-  serialized_end=520,
+  serialized_start=225,
+  serialized_end=674,
 )
 
 
@@ -476,8 +518,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=523,
-  serialized_end=885,
+  serialized_start=677,
+  serialized_end=1039,
 )
 
 
@@ -539,8 +581,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=888,
-  serialized_end=1126,
+  serialized_start=1042,
+  serialized_end=1280,
 )
 
 
@@ -595,8 +637,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1129,
-  serialized_end=1338,
+  serialized_start=1283,
+  serialized_end=1492,
 )
 
 
@@ -630,8 +672,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1340,
-  serialized_end=1397,
+  serialized_start=1494,
+  serialized_end=1551,
 )
 
 
@@ -665,8 +707,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1399,
-  serialized_end=1456,
+  serialized_start=1553,
+  serialized_end=1610,
 )
 
 
@@ -798,8 +840,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=1459,
-  serialized_end=2161,
+  serialized_start=1613,
+  serialized_end=2315,
 )
 
 
@@ -854,8 +896,8 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=2164,
-  serialized_end=2415,
+  serialized_start=2318,
+  serialized_end=2569,
 )
 
 
@@ -952,14 +994,15 @@
   options=None,
   is_extendable=False,
   extension_ranges=[],
-  serialized_start=2418,
-  serialized_end=2885,
+  serialized_start=2572,
+  serialized_end=3039,
 )
 
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['return_type'].message_type = _VARIABLESPECIFICATIONMESSAGE
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['return_type_hidl'].message_type = _VARIABLESPECIFICATIONMESSAGE
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['arg'].message_type = _VARIABLESPECIFICATIONMESSAGE
 _FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['callflow'].message_type = _CALLFLOWSPECIFICATIONMESSAGE
+_FUNCTIONSPECIFICATIONMESSAGE.fields_by_name['raw_coverage_data'].message_type = _NATIVECODECOVERAGERAWDATAMESSAGE
 _VECTORDATAVALUEMESSAGE.fields_by_name['type'].enum_type = _VARIABLETYPE
 _VECTORDATAVALUEMESSAGE.fields_by_name['value'].message_type = _SCALARDATAVALUEMESSAGE
 _VECTORDATAVALUEMESSAGE.fields_by_name['struct_value'].message_type = _VARIABLESPECIFICATIONMESSAGE
@@ -982,6 +1025,7 @@
 _INTERFACESPECIFICATIONMESSAGE.fields_by_name['attribute'].message_type = _VARIABLESPECIFICATIONMESSAGE
 _INTERFACESPECIFICATIONMESSAGE.fields_by_name['sub_struct'].message_type = _STRUCTSPECIFICATIONMESSAGE
 DESCRIPTOR.message_types_by_name['CallFlowSpecificationMessage'] = _CALLFLOWSPECIFICATIONMESSAGE
+DESCRIPTOR.message_types_by_name['NativeCodeCoverageRawDataMessage'] = _NATIVECODECOVERAGERAWDATAMESSAGE
 DESCRIPTOR.message_types_by_name['FunctionSpecificationMessage'] = _FUNCTIONSPECIFICATIONMESSAGE
 DESCRIPTOR.message_types_by_name['ScalarDataValueMessage'] = _SCALARDATAVALUEMESSAGE
 DESCRIPTOR.message_types_by_name['VectorDataValueMessage'] = _VECTORDATAVALUEMESSAGE
@@ -998,6 +1042,12 @@
 
   # @@protoc_insertion_point(class_scope:android.vts.CallFlowSpecificationMessage)
 
+class NativeCodeCoverageRawDataMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _NATIVECODECOVERAGERAWDATAMESSAGE
+
+  # @@protoc_insertion_point(class_scope:android.vts.NativeCodeCoverageRawDataMessage)
+
 class FunctionSpecificationMessage(_message.Message):
   __metaclass__ = _reflection.GeneratedProtocolMessageType
   DESCRIPTOR = _FUNCTIONSPECIFICATIONMESSAGE
diff --git a/runners/host/base_test_with_webdb.py b/runners/host/base_test_with_webdb.py
index 1cc712c..41313d8 100644
--- a/runners/host/base_test_with_webdb.py
+++ b/runners/host/base_test_with_webdb.py
@@ -157,53 +157,7 @@
                     logging.warning("data_file_path not set. PATH=%s",
                                     os.environ["PATH"])
                 else:
-                    for src_file in getattr(self, self.COVERAGE_SRC_FILES):
-                        src_file_name = str(src_file)
-                        logging.info("coverage - src file: %s", src_file_name)
-                        coverage = self._current_test_report_msg.coverage.add()
-
-                        coverage.file_name = src_file_name
-                        abs_path = os.path.join(self.data_file_path,
-                                                src_file_name)
-                        src_file_content = None
-                        if not os.path.exists(abs_path):
-                            logging.error("couldn't find src file %s",
-                                          abs_path)
-                            continue
-                        with open(abs_path, "rb") as f:
-                            src_file_content = f.read()
-
-                        if src_file_name.endswith(".c"):
-                            gcov_file_name = src_file_name.replace(".c",
-                                                                   ".gcno")
-                        elif src_file_name.endswith(".cpp"):
-                            gcov_file_name = src_file_name.replace(".cpp",
-                                                                   ".gcno")
-                        elif src_file_name.endswith(".cc"):
-                            gcov_file_name = src_file_name.replace(".cc",
-                                                                   ".gcno")
-                        else:
-                            logging.error("unsupported source file type %s",
-                                          src_file_name)
-                            continue
-
-                        abs_path = os.path.join(self.data_file_path,
-                                                gcov_file_name)
-                        gcov_file_content = None
-                        if not os.path.exists(abs_path):
-                            logging.error("couldn't find gcno file %s",
-                                          abs_path)
-                            continue
-                        with open(abs_path, "rb") as f:
-                            gcov_file_content = f.read()
-
-                        basic_block_id_list = getattr(
-                            self, self.COVERAGE_ATTRIBUTE, [])
-                        if not basic_block_id_list:
-                            logging.error("no basic block info found")
-                        coverage.html = GCNO.GenerateCoverageReport(
-                            src_file_content, gcov_file_content,
-                            basic_block_id_list)
+                    self.ProcessCoverageData()
             else:
                 logging.info("coverage - no coverage src file specified")
         return super(BaseTestWithWebDbClass, self)._tearDownTest(test_name)
@@ -303,16 +257,71 @@
         self._profiling[name].end_timestamp = self.GetTimestamp()
         return True
 
-    def AddCoverageData(self, coverage_data):
-      """Adds the given coverage to the class-level list attribute.
+    def SetCoverageData(self, raw_coverage_data):
+      """Sets the given coverage data to the class-level list attribute.
 
-      Currently, only basic block ID is supported.
+      In case of gcda, the file is always appended so the last one alone is
+      sufficient for coverage visualization.
 
       Args:
-          coverage_data: a list of strings, each string is for coverage data
-                         (e.g., basic block ID or control flow event ID).
+          raw_coverage_data: a list of NativeCodeCoverageRawDataMessage.
       """
-      logging.info("AddCoverageData %s", coverage_data)
-      coverage_data_list = getattr(self, self.COVERAGE_ATTRIBUTE)
-      if coverage_data not in coverage_data_list:
-          coverage_data_list.append(coverage_data)
+      logging.info("AddCoverageData %s", raw_coverage_data)
+      setattr(self, self.COVERAGE_ATTRIBUTE, raw_coverage_data)
+
+    def ProcessCoverageData(self):
+        """Process reported coverage data and store the produced html(s).
+
+        Returns:
+            True if successful, False otherwise.
+        """
+        coverage_data_list = getattr(
+            self, self.COVERAGE_ATTRIBUTE, [])
+        if not coverage_data_list:
+            logging.error("no coverage data found")
+            return False
+        for src_file in getattr(self, self.COVERAGE_SRC_FILES):
+            src_file_name = str(src_file)
+            logging.info("coverage - src file: %s", src_file_name)
+            coverage = self._current_test_report_msg.coverage.add()
+
+            coverage.file_name = src_file_name
+            abs_path = os.path.join(self.data_file_path,
+                                    src_file_name)
+            src_file_content = None
+            if not os.path.exists(abs_path):
+                logging.error("couldn't find src file %s", abs_path)
+                return False
+            with open(abs_path, "rb") as f:
+                src_file_content = f.read()
+
+            if src_file_name.endswith(".c"):
+                gcno_file_name = src_file_name.replace(".c", ".gcno")
+                gcda_file_name = src_file_name.replace(".c", ".gcda")
+            elif src_file_name.endswith(".cpp"):
+                gcno_file_name = src_file_name.replace(".cpp", ".gcno")
+                gcda_file_name = src_file_name.replace(".cpp", ".gcda")
+            elif src_file_name.endswith(".cc"):
+                gcno_file_name = src_file_name.replace(".cc", ".gcno")
+                gcda_file_name = src_file_name.replace(".cc", ".gcda")
+            else:
+                logging.error("unsupported source file type %s",
+                              src_file_name)
+                return False
+
+            abs_path = os.path.join(self.data_file_path, gcno_file_name)
+            gcno_file_content = None
+            if not os.path.exists(abs_path):
+                logging.error("couldn't find gcno file %s", abs_path)
+                return False
+            with open(abs_path, "rb") as f:
+                gcno_file_content = f.read()
+
+            if coverage_data_list:
+                for coverage_data in coverage_data_list:
+                    # TODO: consider path and do exact matching
+                    if coverage_data.file_path.contains(gcda_file_name):
+                        coverage.html = GCNO.GenerateCoverageReport(
+                            src_file_name, src_file_content,
+                            gcno_file_content, coverage_data.gcda)
+                        return True
diff --git a/sysfuzzer/common/fuzz_tester/FuzzerBase.cpp b/sysfuzzer/common/fuzz_tester/FuzzerBase.cpp
index 6a09b86..f533a9d 100644
--- a/sysfuzzer/common/fuzz_tester/FuzzerBase.cpp
+++ b/sysfuzzer/common/fuzz_tester/FuzzerBase.cpp
@@ -24,7 +24,9 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <fstream>
 #include <iostream>
+#include <sstream>
 #include <string>
 #include <vector>
 
@@ -449,21 +451,20 @@
   cout << __func__ << ":" << __LINE__ << " end" << endl;
 }
 
-vector<unsigned>* FuzzerBase::FunctionCallEnd() {
+bool FuzzerBase::FunctionCallEnd(FunctionSpecificationMessage* msg) {
   cout << __FUNCTION__ << ": gcov flush " << endl;
-  std::vector<unsigned>* result = NULL;
   cout << __func__ << endl;
 #if USE_GCOV
   target_loader_.GcovFlush();
   // find the file.
   if (!gcov_output_basepath_) {
     cerr << __FUNCTION__ << ": no gcov basepath set" << endl;
-    return NULL;
+    return false;
   }
   DIR* srcdir = opendir(gcov_output_basepath_);
   if (!srcdir) {
     cerr << __func__ << " couln't open " << gcov_output_basepath_ << endl;
-    return NULL;
+    return false;
   }
 
   int dir_count = 0;
@@ -486,10 +487,27 @@
         if (!buffer) {
           cerr << __FUNCTION__ << ": OOM" << endl;
           closedir(srcdir);
-          return NULL;
+          return false;
         }
         sprintf(buffer, "%s/%s", gcov_output_basepath_, dent->d_name);
-        result = android::vts::parse_gcda_file(buffer);
+
+        vector<unsigned>* processed_data = android::vts::parse_gcda_file(buffer);
+        for (const auto& data : *processed_data) {
+          msg->mutable_processed_coverage_data()->Add(data);
+        }
+
+        ifstream gcda_file(buffer);
+        if (gcda_file.is_open()) {
+          cerr << "Unable to open a gcda file. " << buffer << endl;
+        } else {
+          stringstream str_stream;
+          str_stream << gcda_file.rdbuf();
+          gcda_file.close();
+          NativeCodeCoverageRawDataMessage* raw_msg =
+              msg->mutable_raw_coverage_data()->Add();
+          raw_msg->set_file_path(dent->d_name);
+          raw_msg->set_gcda(str_stream.str());
+        }
 #if USE_GCOV_DEBUG
         if (result) {
           for (unsigned int index = 0; index < result->size(); index++) {
@@ -504,7 +522,7 @@
   }
   closedir(srcdir);
 #endif
-  return result;
+  return true;
 }
 
 }  // namespace vts
diff --git a/sysfuzzer/common/fuzz_tester/FuzzerBase.h b/sysfuzzer/common/fuzz_tester/FuzzerBase.h
index 9924204..95a3f69 100644
--- a/sysfuzzer/common/fuzz_tester/FuzzerBase.h
+++ b/sysfuzzer/common/fuzz_tester/FuzzerBase.h
@@ -53,9 +53,8 @@
   // Called before calling a target function.
   void FunctionCallBegin();
 
-  // Called after calling a target function. Returns a vector which contains
-  // the code coverage info.
-  vector<unsigned>* FunctionCallEnd();
+  // Called after calling a target function. Fills in the code coverage info.
+  bool FunctionCallEnd(FunctionSpecificationMessage* msg);
 
  protected:
   // a pointer to a HAL data structure of the loaded component.
diff --git a/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp b/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
index 5709a48..52f5fd7 100644
--- a/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
+++ b/sysfuzzer/common/specification_parser/SpecificationBuilder.cpp
@@ -245,12 +245,7 @@
   cout << __func__ << ": called" << endl;
 
   // set coverage data.
-  vector<unsigned>* coverage = func_fuzzer->FunctionCallEnd();
-  if (coverage && coverage->size() > 0) {
-    for (unsigned int index = 0; index < coverage->size(); index++) {
-      func_msg->mutable_coverage_data()->Add(coverage->at(index));
-    }
-  }
+  func_fuzzer->FunctionCallEnd(func_msg);
 
   if (func_msg->return_type().type() == TYPE_PREDEFINED) {
     // TODO: actually handle this case.
diff --git a/testcases/fuzz/hal_light/conventional/LightFuzzTest.py b/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
index 78bc685..1f82160 100644
--- a/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
+++ b/testcases/fuzz/hal_light/conventional/LightFuzzTest.py
@@ -91,10 +91,10 @@
             for gene in genes:
                 logging.debug("Gene %d", index)
                 result = self.dut.hal.light.set_light(None, gene)
-                if len(result.coverage_data) > 0:
-                    logging.info("coverage: %s", result.coverage_data)
+                if len(result.processed_coverage_data) > 0:
+                    logging.info("coverage: %s", result.processed_coverage_data)
                     gene_coverage = []
-                    for coverage_data in result.coverage_data:
+                    for coverage_data in result.processed_coverage_data:
                         gene_coverage.append(coverage_data)
                     coverages.append(gene_coverage)
                 index += 1
diff --git a/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py b/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
index ebb5593..560be8d 100644
--- a/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
+++ b/testcases/fuzz/hal_light/conventional_standalone/StandaloneLightFuzzTest.py
@@ -15,6 +15,7 @@
 # limitations under the License.
 #
 
+import copy
 import logging
 import random
 import time
@@ -84,6 +85,7 @@
             flashOffMs=200,
             brightnessMode=self.dut.hal.light.BRIGHTNESS_MODE_USER)
 
+        last_coverage_data = None
         for iteration in range(self.iteartion_count):
             index = 0
             logging.info("whitebox iteration %d", iteration)
@@ -91,18 +93,20 @@
             for gene in genes:
                 logging.debug("Gene %d", index)
                 result = self.dut.hal.light.set_light(None, gene)
-                if len(result.coverage_data) > 0:
+                if len(result.processed_coverage_data) > 0:
                     gene_coverage = []
-                    logging.info("coverage: %s", result.coverage_data)
-                    for coverage_data in result.coverage_data:
-                        gene_coverage.append(coverage_data)
-                        self.AddCoverageData(coverage_data)
+                    logging.info("coverage: %s", result.processed_coverage_data)
+                    for processed_coverage_data in result.processed_coverage_data:
+                        gene_coverage.append(processed_coverage_data)
                     coverages.append(gene_coverage)
+                    last_coverage_data = copy.copy(result.raw_coverage_data)
                 index += 1
             evolution = GenePool.Evolution()
             genes = evolution.Evolve(genes,
                                      self.dut.hal.light.light_state_t_fuzz,
                                      coverages=coverages)
+        if len(last_coverage_data) > 0:
+            self.SetCoverageData(last_coverage_data)
 
 
 if __name__ == "__main__":
diff --git a/testcases/kernel/ltp/KernelLtpTestCase.py b/testcases/kernel/ltp/KernelLtpTestCase.py
index a660001..bf1f079 100644
--- a/testcases/kernel/ltp/KernelLtpTestCase.py
+++ b/testcases/kernel/ltp/KernelLtpTestCase.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3.4
 #
 # Copyright (C) 2016 The Android Open Source Project
 #
@@ -17,7 +18,6 @@
 import os
 import logging
 import copy
-from enum import Enum
 
 from vts.runners.host import const
 from vts.testcases.kernel.ltp import KernelLtpTestCaseRequirements
@@ -27,7 +27,7 @@
 LTPTMP = "/data/local/tmp/ltp/temp"
 
 
-class RequirementState(Enum):
+class RequirementState(object):
     """Enum for test case requirement check state
 
     Attributes:
diff --git a/utils/python/coverage/GCNO.py b/utils/python/coverage/GCNO.py
index 197ef7d..93ba478 100644
--- a/utils/python/coverage/GCNO.py
+++ b/utils/python/coverage/GCNO.py
@@ -292,14 +292,30 @@
         return Parser(stream).parse()
 
 
-def GenerateCoverageReport(src_file_content, gcov_file_content, basicblock_id_list):
-    """Returns the produced html file contents."""
+def GenerateCoverageReport(src_file_name, src_file_content, gcov_file_content,
+                           gcda_file_content):
+    """Returns the produced html file contents.
+
+    This merges the given GCDA files and produces merged coverage html file for
+    each source file.
+
+    Args:
+        src_file_name: string, the source file name.
+        src_file_content: string, the C/C++ source file content.
+        gcov_file_content: string, the raw gcov binary file content.
+        gcda_file_content: string, the raw gcda binary file content.
+
+    Returns:
+        the coverage HTML produced for 'src_file_name'.
+    """
     logging.info("GenerateCoverageReport: src_file_content %s",
                  src_file_content)
-    logging.info("GenerateCoverageReport: gcov_file_content %s",
-                 gcov_file_content)
-    logging.info("GenerateCoverageReport: basicblock_id_list %s",
-                 basicblock_id_list)
+    if gcov_file_content:
+        logging.info("GenerateCoverageReport: gcov_file_content %d bytes",
+                     len(gcov_file_content))
+    if gcda_file_content:
+        logging.info("GenerateCoverageReport: gcda_file_content %d bytes",
+                     len(gcda_file_content))
     return "<table border=0><tr><td>Code coverage will show up at here</table>"
 
 
diff --git a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/proto/VtsReportMessage.java b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/proto/VtsReportMessage.java
index 208c8d4..ca7fb80 100644
--- a/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/proto/VtsReportMessage.java
+++ b/web/dashboard/appengine/servlet/src/main/java/com/google/android/vts/proto/VtsReportMessage.java
@@ -2353,7 +2353,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     java.util.List<com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage> 
@@ -2362,7 +2362,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index);
@@ -2370,7 +2370,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     int getCoverageCount();
@@ -2378,7 +2378,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     java.util.List<? extends com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
@@ -2387,7 +2387,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
@@ -2620,7 +2620,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     public java.util.List<com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
@@ -2630,7 +2630,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     public java.util.List<? extends com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
@@ -2641,7 +2641,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     public int getCoverageCount() {
@@ -2651,7 +2651,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
@@ -2661,7 +2661,7 @@
      * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
      *
      * <pre>
-     * coverage reports
+     * coverage report per file
      * </pre>
      */
     public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
@@ -3204,7 +3204,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public java.util.List<com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
@@ -3218,7 +3218,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public int getCoverageCount() {
@@ -3232,7 +3232,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
@@ -3246,7 +3246,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder setCoverage(
@@ -3267,7 +3267,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder setCoverage(
@@ -3285,7 +3285,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder addCoverage(com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
@@ -3305,7 +3305,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder addCoverage(
@@ -3326,7 +3326,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder addCoverage(
@@ -3344,7 +3344,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder addCoverage(
@@ -3362,7 +3362,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder addAllCoverage(
@@ -3380,7 +3380,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder clearCoverage() {
@@ -3397,7 +3397,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public Builder removeCoverage(int index) {
@@ -3414,7 +3414,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder getCoverageBuilder(
@@ -3425,7 +3425,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
@@ -3439,7 +3439,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public java.util.List<? extends com.google.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
@@ -3454,7 +3454,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder() {
@@ -3465,7 +3465,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder(
@@ -3477,7 +3477,7 @@
        * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
        *
        * <pre>
-       * coverage reports
+       * coverage report per file
        * </pre>
        */
       public java.util.List<com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder> 
@@ -4146,27 +4146,81 @@
   public interface CoverageReportMessageOrBuilder
       extends com.google.protobuf.MessageOrBuilder {
 
-    // optional bytes file_name = 1;
+    // optional bytes dir_path = 1;
     /**
-     * <code>optional bytes file_name = 1;</code>
+     * <code>optional bytes dir_path = 1;</code>
      *
      * <pre>
-     * source or object file name.
+     * the directory path of a source file.
+     * </pre>
+     */
+    boolean hasDirPath();
+    /**
+     * <code>optional bytes dir_path = 1;</code>
+     *
+     * <pre>
+     * the directory path of a source file.
+     * </pre>
+     */
+    com.google.protobuf.ByteString getDirPath();
+
+    // optional bytes file_name = 2;
+    /**
+     * <code>optional bytes file_name = 2;</code>
+     *
+     * <pre>
+     * the name of the source file.
      * </pre>
      */
     boolean hasFileName();
     /**
-     * <code>optional bytes file_name = 1;</code>
+     * <code>optional bytes file_name = 2;</code>
      *
      * <pre>
-     * source or object file name.
+     * the name of the source file.
      * </pre>
      */
     com.google.protobuf.ByteString getFileName();
 
-    // optional bytes gcno = 11;
+    // optional bytes html = 3;
     /**
-     * <code>optional bytes gcno = 11;</code>
+     * <code>optional bytes html = 3;</code>
+     *
+     * <pre>
+     * produced html report.
+     * </pre>
+     */
+    boolean hasHtml();
+    /**
+     * <code>optional bytes html = 3;</code>
+     *
+     * <pre>
+     * produced html report.
+     * </pre>
+     */
+    com.google.protobuf.ByteString getHtml();
+
+    // optional bytes source_code = 11;
+    /**
+     * <code>optional bytes source_code = 11;</code>
+     *
+     * <pre>
+     * the source file content.
+     * </pre>
+     */
+    boolean hasSourceCode();
+    /**
+     * <code>optional bytes source_code = 11;</code>
+     *
+     * <pre>
+     * the source file content.
+     * </pre>
+     */
+    com.google.protobuf.ByteString getSourceCode();
+
+    // optional bytes gcno = 21;
+    /**
+     * <code>optional bytes gcno = 21;</code>
      *
      * <pre>
      * gcov produced data files.
@@ -4174,7 +4228,7 @@
      */
     boolean hasGcno();
     /**
-     * <code>optional bytes gcno = 11;</code>
+     * <code>optional bytes gcno = 21;</code>
      *
      * <pre>
      * gcov produced data files.
@@ -4182,19 +4236,19 @@
      */
     com.google.protobuf.ByteString getGcno();
 
-    // optional bytes gcda = 12;
+    // optional bytes gcda = 22;
     /**
-     * <code>optional bytes gcda = 12;</code>
+     * <code>optional bytes gcda = 22;</code>
      */
     boolean hasGcda();
     /**
-     * <code>optional bytes gcda = 12;</code>
+     * <code>optional bytes gcda = 22;</code>
      */
     com.google.protobuf.ByteString getGcda();
 
-    // repeated bytes data = 101;
+    // repeated bytes data = 31;
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
@@ -4202,7 +4256,7 @@
      */
     java.util.List<com.google.protobuf.ByteString> getDataList();
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
@@ -4210,13 +4264,31 @@
      */
     int getDataCount();
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
      * </pre>
      */
     com.google.protobuf.ByteString getData(int index);
+
+    // optional bytes gcov = 32;
+    /**
+     * <code>optional bytes gcov = 32;</code>
+     *
+     * <pre>
+     * generated gcov data file.
+     * </pre>
+     */
+    boolean hasGcov();
+    /**
+     * <code>optional bytes gcov = 32;</code>
+     *
+     * <pre>
+     * generated gcov data file.
+     * </pre>
+     */
+    com.google.protobuf.ByteString getGcov();
   }
   /**
    * Protobuf type {@code android.vts.CoverageReportMessage}
@@ -4275,27 +4347,47 @@
             }
             case 10: {
               bitField0_ |= 0x00000001;
+              dirPath_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
               fileName_ = input.readBytes();
               break;
             }
+            case 26: {
+              bitField0_ |= 0x00000004;
+              html_ = input.readBytes();
+              break;
+            }
             case 90: {
-              bitField0_ |= 0x00000002;
+              bitField0_ |= 0x00000008;
+              sourceCode_ = input.readBytes();
+              break;
+            }
+            case 170: {
+              bitField0_ |= 0x00000010;
               gcno_ = input.readBytes();
               break;
             }
-            case 98: {
-              bitField0_ |= 0x00000004;
+            case 178: {
+              bitField0_ |= 0x00000020;
               gcda_ = input.readBytes();
               break;
             }
-            case 810: {
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
+            case 250: {
+              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
                 data_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000008;
+                mutable_bitField0_ |= 0x00000040;
               }
               data_.add(input.readBytes());
               break;
             }
+            case 258: {
+              bitField0_ |= 0x00000040;
+              gcov_ = input.readBytes();
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -4304,7 +4396,7 @@
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e.getMessage()).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
+        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
           data_ = java.util.Collections.unmodifiableList(data_);
         }
         this.unknownFields = unknownFields.build();
@@ -4339,45 +4431,117 @@
     }
 
     private int bitField0_;
-    // optional bytes file_name = 1;
-    public static final int FILE_NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString fileName_;
+    // optional bytes dir_path = 1;
+    public static final int DIR_PATH_FIELD_NUMBER = 1;
+    private com.google.protobuf.ByteString dirPath_;
     /**
-     * <code>optional bytes file_name = 1;</code>
+     * <code>optional bytes dir_path = 1;</code>
      *
      * <pre>
-     * source or object file name.
+     * the directory path of a source file.
      * </pre>
      */
-    public boolean hasFileName() {
+    public boolean hasDirPath() {
       return ((bitField0_ & 0x00000001) == 0x00000001);
     }
     /**
-     * <code>optional bytes file_name = 1;</code>
+     * <code>optional bytes dir_path = 1;</code>
      *
      * <pre>
-     * source or object file name.
+     * the directory path of a source file.
+     * </pre>
+     */
+    public com.google.protobuf.ByteString getDirPath() {
+      return dirPath_;
+    }
+
+    // optional bytes file_name = 2;
+    public static final int FILE_NAME_FIELD_NUMBER = 2;
+    private com.google.protobuf.ByteString fileName_;
+    /**
+     * <code>optional bytes file_name = 2;</code>
+     *
+     * <pre>
+     * the name of the source file.
+     * </pre>
+     */
+    public boolean hasFileName() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional bytes file_name = 2;</code>
+     *
+     * <pre>
+     * the name of the source file.
      * </pre>
      */
     public com.google.protobuf.ByteString getFileName() {
       return fileName_;
     }
 
-    // optional bytes gcno = 11;
-    public static final int GCNO_FIELD_NUMBER = 11;
+    // optional bytes html = 3;
+    public static final int HTML_FIELD_NUMBER = 3;
+    private com.google.protobuf.ByteString html_;
+    /**
+     * <code>optional bytes html = 3;</code>
+     *
+     * <pre>
+     * produced html report.
+     * </pre>
+     */
+    public boolean hasHtml() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>optional bytes html = 3;</code>
+     *
+     * <pre>
+     * produced html report.
+     * </pre>
+     */
+    public com.google.protobuf.ByteString getHtml() {
+      return html_;
+    }
+
+    // optional bytes source_code = 11;
+    public static final int SOURCE_CODE_FIELD_NUMBER = 11;
+    private com.google.protobuf.ByteString sourceCode_;
+    /**
+     * <code>optional bytes source_code = 11;</code>
+     *
+     * <pre>
+     * the source file content.
+     * </pre>
+     */
+    public boolean hasSourceCode() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    /**
+     * <code>optional bytes source_code = 11;</code>
+     *
+     * <pre>
+     * the source file content.
+     * </pre>
+     */
+    public com.google.protobuf.ByteString getSourceCode() {
+      return sourceCode_;
+    }
+
+    // optional bytes gcno = 21;
+    public static final int GCNO_FIELD_NUMBER = 21;
     private com.google.protobuf.ByteString gcno_;
     /**
-     * <code>optional bytes gcno = 11;</code>
+     * <code>optional bytes gcno = 21;</code>
      *
      * <pre>
      * gcov produced data files.
      * </pre>
      */
     public boolean hasGcno() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
+      return ((bitField0_ & 0x00000010) == 0x00000010);
     }
     /**
-     * <code>optional bytes gcno = 11;</code>
+     * <code>optional bytes gcno = 21;</code>
      *
      * <pre>
      * gcov produced data files.
@@ -4387,27 +4551,27 @@
       return gcno_;
     }
 
-    // optional bytes gcda = 12;
-    public static final int GCDA_FIELD_NUMBER = 12;
+    // optional bytes gcda = 22;
+    public static final int GCDA_FIELD_NUMBER = 22;
     private com.google.protobuf.ByteString gcda_;
     /**
-     * <code>optional bytes gcda = 12;</code>
+     * <code>optional bytes gcda = 22;</code>
      */
     public boolean hasGcda() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
+      return ((bitField0_ & 0x00000020) == 0x00000020);
     }
     /**
-     * <code>optional bytes gcda = 12;</code>
+     * <code>optional bytes gcda = 22;</code>
      */
     public com.google.protobuf.ByteString getGcda() {
       return gcda_;
     }
 
-    // repeated bytes data = 101;
-    public static final int DATA_FIELD_NUMBER = 101;
+    // repeated bytes data = 31;
+    public static final int DATA_FIELD_NUMBER = 31;
     private java.util.List<com.google.protobuf.ByteString> data_;
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
@@ -4418,7 +4582,7 @@
       return data_;
     }
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
@@ -4428,7 +4592,7 @@
       return data_.size();
     }
     /**
-     * <code>repeated bytes data = 101;</code>
+     * <code>repeated bytes data = 31;</code>
      *
      * <pre>
      * measured coverage data.
@@ -4438,11 +4602,39 @@
       return data_.get(index);
     }
 
+    // optional bytes gcov = 32;
+    public static final int GCOV_FIELD_NUMBER = 32;
+    private com.google.protobuf.ByteString gcov_;
+    /**
+     * <code>optional bytes gcov = 32;</code>
+     *
+     * <pre>
+     * generated gcov data file.
+     * </pre>
+     */
+    public boolean hasGcov() {
+      return ((bitField0_ & 0x00000040) == 0x00000040);
+    }
+    /**
+     * <code>optional bytes gcov = 32;</code>
+     *
+     * <pre>
+     * generated gcov data file.
+     * </pre>
+     */
+    public com.google.protobuf.ByteString getGcov() {
+      return gcov_;
+    }
+
     private void initFields() {
+      dirPath_ = com.google.protobuf.ByteString.EMPTY;
       fileName_ = com.google.protobuf.ByteString.EMPTY;
+      html_ = com.google.protobuf.ByteString.EMPTY;
+      sourceCode_ = com.google.protobuf.ByteString.EMPTY;
       gcno_ = com.google.protobuf.ByteString.EMPTY;
       gcda_ = com.google.protobuf.ByteString.EMPTY;
       data_ = java.util.Collections.emptyList();
+      gcov_ = com.google.protobuf.ByteString.EMPTY;
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -4457,16 +4649,28 @@
                         throws java.io.IOException {
       getSerializedSize();
       if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, fileName_);
+        output.writeBytes(1, dirPath_);
       }
       if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(11, gcno_);
+        output.writeBytes(2, fileName_);
       }
       if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(12, gcda_);
+        output.writeBytes(3, html_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeBytes(11, sourceCode_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeBytes(21, gcno_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        output.writeBytes(22, gcda_);
       }
       for (int i = 0; i < data_.size(); i++) {
-        output.writeBytes(101, data_.get(i));
+        output.writeBytes(31, data_.get(i));
+      }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        output.writeBytes(32, gcov_);
       }
       getUnknownFields().writeTo(output);
     }
@@ -4479,15 +4683,27 @@
       size = 0;
       if (((bitField0_ & 0x00000001) == 0x00000001)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, fileName_);
+          .computeBytesSize(1, dirPath_);
       }
       if (((bitField0_ & 0x00000002) == 0x00000002)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, gcno_);
+          .computeBytesSize(2, fileName_);
       }
       if (((bitField0_ & 0x00000004) == 0x00000004)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, gcda_);
+          .computeBytesSize(3, html_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(11, sourceCode_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(21, gcno_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(22, gcda_);
       }
       {
         int dataSize = 0;
@@ -4498,6 +4714,10 @@
         size += dataSize;
         size += 2 * getDataList().size();
       }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(32, gcov_);
+      }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
       return size;
@@ -4618,14 +4838,22 @@
 
       public Builder clear() {
         super.clear();
-        fileName_ = com.google.protobuf.ByteString.EMPTY;
+        dirPath_ = com.google.protobuf.ByteString.EMPTY;
         bitField0_ = (bitField0_ & ~0x00000001);
-        gcno_ = com.google.protobuf.ByteString.EMPTY;
+        fileName_ = com.google.protobuf.ByteString.EMPTY;
         bitField0_ = (bitField0_ & ~0x00000002);
-        gcda_ = com.google.protobuf.ByteString.EMPTY;
+        html_ = com.google.protobuf.ByteString.EMPTY;
         bitField0_ = (bitField0_ & ~0x00000004);
-        data_ = java.util.Collections.emptyList();
+        sourceCode_ = com.google.protobuf.ByteString.EMPTY;
         bitField0_ = (bitField0_ & ~0x00000008);
+        gcno_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000010);
+        gcda_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000020);
+        data_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000040);
+        gcov_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000080);
         return this;
       }
 
@@ -4657,20 +4885,36 @@
         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
           to_bitField0_ |= 0x00000001;
         }
-        result.fileName_ = fileName_;
+        result.dirPath_ = dirPath_;
         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
           to_bitField0_ |= 0x00000002;
         }
-        result.gcno_ = gcno_;
+        result.fileName_ = fileName_;
         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
           to_bitField0_ |= 0x00000004;
         }
+        result.html_ = html_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.sourceCode_ = sourceCode_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.gcno_ = gcno_;
+        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+          to_bitField0_ |= 0x00000020;
+        }
         result.gcda_ = gcda_;
-        if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        if (((bitField0_ & 0x00000040) == 0x00000040)) {
           data_ = java.util.Collections.unmodifiableList(data_);
-          bitField0_ = (bitField0_ & ~0x00000008);
+          bitField0_ = (bitField0_ & ~0x00000040);
         }
         result.data_ = data_;
+        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+          to_bitField0_ |= 0x00000040;
+        }
+        result.gcov_ = gcov_;
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -4687,9 +4931,18 @@
 
       public Builder mergeFrom(com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage other) {
         if (other == com.google.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance()) return this;
+        if (other.hasDirPath()) {
+          setDirPath(other.getDirPath());
+        }
         if (other.hasFileName()) {
           setFileName(other.getFileName());
         }
+        if (other.hasHtml()) {
+          setHtml(other.getHtml());
+        }
+        if (other.hasSourceCode()) {
+          setSourceCode(other.getSourceCode());
+        }
         if (other.hasGcno()) {
           setGcno(other.getGcno());
         }
@@ -4699,13 +4952,16 @@
         if (!other.data_.isEmpty()) {
           if (data_.isEmpty()) {
             data_ = other.data_;
-            bitField0_ = (bitField0_ & ~0x00000008);
+            bitField0_ = (bitField0_ & ~0x00000040);
           } else {
             ensureDataIsMutable();
             data_.addAll(other.data_);
           }
           onChanged();
         }
+        if (other.hasGcov()) {
+          setGcov(other.getGcov());
+        }
         this.mergeUnknownFields(other.getUnknownFields());
         return this;
       }
@@ -4733,72 +4989,228 @@
       }
       private int bitField0_;
 
-      // optional bytes file_name = 1;
-      private com.google.protobuf.ByteString fileName_ = com.google.protobuf.ByteString.EMPTY;
+      // optional bytes dir_path = 1;
+      private com.google.protobuf.ByteString dirPath_ = com.google.protobuf.ByteString.EMPTY;
       /**
-       * <code>optional bytes file_name = 1;</code>
+       * <code>optional bytes dir_path = 1;</code>
        *
        * <pre>
-       * source or object file name.
+       * the directory path of a source file.
        * </pre>
        */
-      public boolean hasFileName() {
+      public boolean hasDirPath() {
         return ((bitField0_ & 0x00000001) == 0x00000001);
       }
       /**
-       * <code>optional bytes file_name = 1;</code>
+       * <code>optional bytes dir_path = 1;</code>
        *
        * <pre>
-       * source or object file name.
+       * the directory path of a source file.
+       * </pre>
+       */
+      public com.google.protobuf.ByteString getDirPath() {
+        return dirPath_;
+      }
+      /**
+       * <code>optional bytes dir_path = 1;</code>
+       *
+       * <pre>
+       * the directory path of a source file.
+       * </pre>
+       */
+      public Builder setDirPath(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        dirPath_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bytes dir_path = 1;</code>
+       *
+       * <pre>
+       * the directory path of a source file.
+       * </pre>
+       */
+      public Builder clearDirPath() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        dirPath_ = getDefaultInstance().getDirPath();
+        onChanged();
+        return this;
+      }
+
+      // optional bytes file_name = 2;
+      private com.google.protobuf.ByteString fileName_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>optional bytes file_name = 2;</code>
+       *
+       * <pre>
+       * the name of the source file.
+       * </pre>
+       */
+      public boolean hasFileName() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional bytes file_name = 2;</code>
+       *
+       * <pre>
+       * the name of the source file.
        * </pre>
        */
       public com.google.protobuf.ByteString getFileName() {
         return fileName_;
       }
       /**
-       * <code>optional bytes file_name = 1;</code>
+       * <code>optional bytes file_name = 2;</code>
        *
        * <pre>
-       * source or object file name.
+       * the name of the source file.
        * </pre>
        */
       public Builder setFileName(com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000001;
+  bitField0_ |= 0x00000002;
         fileName_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>optional bytes file_name = 1;</code>
+       * <code>optional bytes file_name = 2;</code>
        *
        * <pre>
-       * source or object file name.
+       * the name of the source file.
        * </pre>
        */
       public Builder clearFileName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
+        bitField0_ = (bitField0_ & ~0x00000002);
         fileName_ = getDefaultInstance().getFileName();
         onChanged();
         return this;
       }
 
-      // optional bytes gcno = 11;
+      // optional bytes html = 3;
+      private com.google.protobuf.ByteString html_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>optional bytes html = 3;</code>
+       *
+       * <pre>
+       * produced html report.
+       * </pre>
+       */
+      public boolean hasHtml() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>optional bytes html = 3;</code>
+       *
+       * <pre>
+       * produced html report.
+       * </pre>
+       */
+      public com.google.protobuf.ByteString getHtml() {
+        return html_;
+      }
+      /**
+       * <code>optional bytes html = 3;</code>
+       *
+       * <pre>
+       * produced html report.
+       * </pre>
+       */
+      public Builder setHtml(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        html_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bytes html = 3;</code>
+       *
+       * <pre>
+       * produced html report.
+       * </pre>
+       */
+      public Builder clearHtml() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        html_ = getDefaultInstance().getHtml();
+        onChanged();
+        return this;
+      }
+
+      // optional bytes source_code = 11;
+      private com.google.protobuf.ByteString sourceCode_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>optional bytes source_code = 11;</code>
+       *
+       * <pre>
+       * the source file content.
+       * </pre>
+       */
+      public boolean hasSourceCode() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      /**
+       * <code>optional bytes source_code = 11;</code>
+       *
+       * <pre>
+       * the source file content.
+       * </pre>
+       */
+      public com.google.protobuf.ByteString getSourceCode() {
+        return sourceCode_;
+      }
+      /**
+       * <code>optional bytes source_code = 11;</code>
+       *
+       * <pre>
+       * the source file content.
+       * </pre>
+       */
+      public Builder setSourceCode(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000008;
+        sourceCode_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bytes source_code = 11;</code>
+       *
+       * <pre>
+       * the source file content.
+       * </pre>
+       */
+      public Builder clearSourceCode() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        sourceCode_ = getDefaultInstance().getSourceCode();
+        onChanged();
+        return this;
+      }
+
+      // optional bytes gcno = 21;
       private com.google.protobuf.ByteString gcno_ = com.google.protobuf.ByteString.EMPTY;
       /**
-       * <code>optional bytes gcno = 11;</code>
+       * <code>optional bytes gcno = 21;</code>
        *
        * <pre>
        * gcov produced data files.
        * </pre>
        */
       public boolean hasGcno() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
+        return ((bitField0_ & 0x00000010) == 0x00000010);
       }
       /**
-       * <code>optional bytes gcno = 11;</code>
+       * <code>optional bytes gcno = 21;</code>
        *
        * <pre>
        * gcov produced data files.
@@ -4808,7 +5220,7 @@
         return gcno_;
       }
       /**
-       * <code>optional bytes gcno = 11;</code>
+       * <code>optional bytes gcno = 21;</code>
        *
        * <pre>
        * gcov produced data files.
@@ -4818,71 +5230,71 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000002;
+  bitField0_ |= 0x00000010;
         gcno_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>optional bytes gcno = 11;</code>
+       * <code>optional bytes gcno = 21;</code>
        *
        * <pre>
        * gcov produced data files.
        * </pre>
        */
       public Builder clearGcno() {
-        bitField0_ = (bitField0_ & ~0x00000002);
+        bitField0_ = (bitField0_ & ~0x00000010);
         gcno_ = getDefaultInstance().getGcno();
         onChanged();
         return this;
       }
 
-      // optional bytes gcda = 12;
+      // optional bytes gcda = 22;
       private com.google.protobuf.ByteString gcda_ = com.google.protobuf.ByteString.EMPTY;
       /**
-       * <code>optional bytes gcda = 12;</code>
+       * <code>optional bytes gcda = 22;</code>
        */
       public boolean hasGcda() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
+        return ((bitField0_ & 0x00000020) == 0x00000020);
       }
       /**
-       * <code>optional bytes gcda = 12;</code>
+       * <code>optional bytes gcda = 22;</code>
        */
       public com.google.protobuf.ByteString getGcda() {
         return gcda_;
       }
       /**
-       * <code>optional bytes gcda = 12;</code>
+       * <code>optional bytes gcda = 22;</code>
        */
       public Builder setGcda(com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000004;
+  bitField0_ |= 0x00000020;
         gcda_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>optional bytes gcda = 12;</code>
+       * <code>optional bytes gcda = 22;</code>
        */
       public Builder clearGcda() {
-        bitField0_ = (bitField0_ & ~0x00000004);
+        bitField0_ = (bitField0_ & ~0x00000020);
         gcda_ = getDefaultInstance().getGcda();
         onChanged();
         return this;
       }
 
-      // repeated bytes data = 101;
+      // repeated bytes data = 31;
       private java.util.List<com.google.protobuf.ByteString> data_ = java.util.Collections.emptyList();
       private void ensureDataIsMutable() {
-        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
+        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
           data_ = new java.util.ArrayList<com.google.protobuf.ByteString>(data_);
-          bitField0_ |= 0x00000008;
+          bitField0_ |= 0x00000040;
          }
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4893,7 +5305,7 @@
         return java.util.Collections.unmodifiableList(data_);
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4903,7 +5315,7 @@
         return data_.size();
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4913,7 +5325,7 @@
         return data_.get(index);
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4930,7 +5342,7 @@
         return this;
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4946,7 +5358,7 @@
         return this;
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4960,7 +5372,7 @@
         return this;
       }
       /**
-       * <code>repeated bytes data = 101;</code>
+       * <code>repeated bytes data = 31;</code>
        *
        * <pre>
        * measured coverage data.
@@ -4968,7 +5380,59 @@
        */
       public Builder clearData() {
         data_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000008);
+        bitField0_ = (bitField0_ & ~0x00000040);
+        onChanged();
+        return this;
+      }
+
+      // optional bytes gcov = 32;
+      private com.google.protobuf.ByteString gcov_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>optional bytes gcov = 32;</code>
+       *
+       * <pre>
+       * generated gcov data file.
+       * </pre>
+       */
+      public boolean hasGcov() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      /**
+       * <code>optional bytes gcov = 32;</code>
+       *
+       * <pre>
+       * generated gcov data file.
+       * </pre>
+       */
+      public com.google.protobuf.ByteString getGcov() {
+        return gcov_;
+      }
+      /**
+       * <code>optional bytes gcov = 32;</code>
+       *
+       * <pre>
+       * generated gcov data file.
+       * </pre>
+       */
+      public Builder setGcov(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000080;
+        gcov_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bytes gcov = 32;</code>
+       *
+       * <pre>
+       * generated gcov data file.
+       * </pre>
+       */
+      public Builder clearGcov() {
+        bitField0_ = (bitField0_ & ~0x00000080);
+        gcov_ = getDefaultInstance().getGcov();
         onChanged();
         return this;
       }
@@ -7582,28 +8046,30 @@
       "\026 \001(\003\0224\n\010coverage\030\037 \003(\0132\".android.vts.Co" +
       "verageReportMessage\"V\n\026ProfilingReportMe" +
       "ssage\022\014\n\004name\030\001 \001(\014\022\027\n\017start_timestamp\030\013" +
-      " \001(\003\022\025\n\rend_timestamp\030\014 \001(\003\"T\n\025CoverageR" +
-      "eportMessage\022\021\n\tfile_name\030\001 \001(\014\022\014\n\004gcno\030" +
-      "\013 \001(\014\022\014\n\004gcda\030\014 \001(\014\022\014\n\004data\030e \003(\014\"\360\002\n\021Te" +
-      "stReportMessage\022\022\n\ntest_suite\030\001 \001(\014\022\014\n\004t" +
-      "est\030\002 \001(\014\022+\n\ttest_type\030\003 \001(\0162\030.android.v" +
-      "ts.VtsTestType\022:\n\013device_info\030\004 \003(\0132%.an",
-      "droid.vts.AndroidDeviceInfoMessage\0221\n\nbu" +
-      "ild_info\030\005 \001(\0132\035.android.vts.AndroidBuil" +
-      "dInfo\0225\n\ttest_case\030\013 \003(\0132\".android.vts.T" +
-      "estCaseReportMessage\0226\n\tprofiling\030\025 \003(\0132" +
-      "#.android.vts.ProfilingReportMessage\022\027\n\017" +
-      "start_timestamp\030e \001(\003\022\025\n\rend_timestamp\030f" +
-      " \001(\003*\263\001\n\016TestCaseResult\022\022\n\016UNKNOWN_RESUL" +
-      "T\020\000\022\031\n\025TEST_CASE_RESULT_PASS\020\001\022\031\n\025TEST_C" +
-      "ASE_RESULT_FAIL\020\002\022\031\n\025TEST_CASE_RESULT_SK" +
-      "IP\020\003\022\036\n\032TEST_CASE_RESULT_EXCEPTION\020\004\022\034\n\030",
-      "TEST_CASE_RESULT_TIMEOUT\020\005*\234\001\n\013VtsTestTy" +
-      "pe\022\030\n\024UNKNOWN_VTS_TESTTYPE\020\000\022\036\n\032VTS_HOST" +
-      "_DRIVEN_STRUCTURAL\020\001\022\033\n\027VTS_HOST_DRIVEN_" +
-      "FUZZING\020\002\022\031\n\025VTS_TARGET_SIDE_GTEST\020\003\022\033\n\027" +
-      "VTS_TARGET_SIDE_FUZZING\020\004B0\n\034com.google." +
-      "android.vts.protoB\020VtsReportMessage"
+      " \001(\003\022\025\n\rend_timestamp\030\014 \001(\003\"\227\001\n\025Coverage" +
+      "ReportMessage\022\020\n\010dir_path\030\001 \001(\014\022\021\n\tfile_" +
+      "name\030\002 \001(\014\022\014\n\004html\030\003 \001(\014\022\023\n\013source_code\030" +
+      "\013 \001(\014\022\014\n\004gcno\030\025 \001(\014\022\014\n\004gcda\030\026 \001(\014\022\014\n\004dat" +
+      "a\030\037 \003(\014\022\014\n\004gcov\030  \001(\014\"\360\002\n\021TestReportMess" +
+      "age\022\022\n\ntest_suite\030\001 \001(\014\022\014\n\004test\030\002 \001(\014\022+\n",
+      "\ttest_type\030\003 \001(\0162\030.android.vts.VtsTestTy" +
+      "pe\022:\n\013device_info\030\004 \003(\0132%.android.vts.An" +
+      "droidDeviceInfoMessage\0221\n\nbuild_info\030\005 \001" +
+      "(\0132\035.android.vts.AndroidBuildInfo\0225\n\ttes" +
+      "t_case\030\013 \003(\0132\".android.vts.TestCaseRepor" +
+      "tMessage\0226\n\tprofiling\030\025 \003(\0132#.android.vt" +
+      "s.ProfilingReportMessage\022\027\n\017start_timest" +
+      "amp\030e \001(\003\022\025\n\rend_timestamp\030f \001(\003*\263\001\n\016Tes" +
+      "tCaseResult\022\022\n\016UNKNOWN_RESULT\020\000\022\031\n\025TEST_" +
+      "CASE_RESULT_PASS\020\001\022\031\n\025TEST_CASE_RESULT_F",
+      "AIL\020\002\022\031\n\025TEST_CASE_RESULT_SKIP\020\003\022\036\n\032TEST" +
+      "_CASE_RESULT_EXCEPTION\020\004\022\034\n\030TEST_CASE_RE" +
+      "SULT_TIMEOUT\020\005*\234\001\n\013VtsTestType\022\030\n\024UNKNOW" +
+      "N_VTS_TESTTYPE\020\000\022\036\n\032VTS_HOST_DRIVEN_STRU" +
+      "CTURAL\020\001\022\033\n\027VTS_HOST_DRIVEN_FUZZING\020\002\022\031\n" +
+      "\025VTS_TARGET_SIDE_GTEST\020\003\022\033\n\027VTS_TARGET_S" +
+      "IDE_FUZZING\020\004B0\n\034com.google.android.vts." +
+      "protoB\020VtsReportMessage"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
       new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -7639,7 +8105,7 @@
           internal_static_android_vts_CoverageReportMessage_fieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
               internal_static_android_vts_CoverageReportMessage_descriptor,
-              new java.lang.String[] { "FileName", "Gcno", "Gcda", "Data", });
+              new java.lang.String[] { "DirPath", "FileName", "Html", "SourceCode", "Gcno", "Gcda", "Data", "Gcov", });
           internal_static_android_vts_TestReportMessage_descriptor =
             getDescriptor().getMessageTypes().get(5);
           internal_static_android_vts_TestReportMessage_fieldAccessorTable = new